Linux en général LINUX - ajouter/modifier SWAP Si un fichier de swap existe déjà et qu'il faut en modifier la taille, commencer par le désactiver swapoff /swapfile Ensuite créer ou modifier le fichier (ex : 4G) dd if=/dev/zero of=/swapfile bs=1024 count=4194304 sync mkswap /swapfile chmod 600 /swapfile swapon /swapfile swapon --show Ajouter le fichier à fstab vi /etc/fstab /swapfile swap swap defaults 0 0CentOS en mode Rescue + xfs_repair 1. Boot grub, edit your default command line ("e")2. Remove "rhgb" and "quiet" from the "linux" command line so you can see boot messages3. Add "rescue" in their place4. System boots to rescue mode (Ctrl-X)5. Enter your root PW when prompted6. execute the command "mount -o remount,ro /" to remount root as read only7. execute the command "xfs_repair -d /dev/"8. cross fingers, wait and reboot immediately when completePeut nécessiter d'être lancé 2 fois pour tout réparer. Si on ne passe pas en mode "rescue", on ne peut pas remonter / en RO car il est verrouillé par des process.Tunnel SSH via un serveur intermédiaire A partir d'un poste, on veut atteindre un serveur externe, sur un port exotique (222, 81, 444, ...) ou standard (25, 443, ...) mais fermé en sortie par un proxy. La syntaxe : ssh -C -N -f -L port-local:serveur-cible:port-du-serveur-cible user@serveur-intermediaire Un tunnel est ouvert entre le poste local et le serveur intermédiaire par SSH. Serveur-intermediaire redirige les requêtes vers serveur-cible.En toutes lettres : en allant sur port-local ("-L port-local") du poste local (127.0.0.1, par défaut) on accède à serveur-intermediaire en ssh (user@serveur-intermediaire) qui renvoie les requêtes vers serveur-cible sur le port port-du-serveur-cible (serveur-cible:port-du-serveur-cible) Pour utiliser un certificat (par exemple une connexion root entre le poste et serveur-intermediaire sans mot de passe, avec échange de clés DSA) reprendre les options standards de ssh : ssh -C -N -f -L port-local:ip-du-serveur-final:port-du-serveur-cible user@serveur-intermediaire -i //// En général, les certificats générés par ssh-keygen sont conservés sous $HOME/.ssh/id_dsa. De même pour utiliser un port ssh alternatif sur serveur intermediaire : ssh -C -N -f -L port-local:ip-du-serveur-final:port-du-serveur-cible user@serveur-intermediaire -p Toutes ces options sont évidemment combinables entre elles. Exemples Si on veut atteindre le port 443 (HTTPS) d'un serveur-cible, mais les seuls ports disponibles pour notre poste (sur un réseau derrière un proxy, par exemple) sont le 80 (HTTP) et le 22 (SSH) : ssh -C -N -f -L 80:www.serveur-cible.tld:443 user@serveur-intermediaire "user" doit avoir le droit de se connecter sur serveur-intermediaire. Dans un navigateur, l'URL : https://localhost:80 accèdera par le tunnel au HTTPS (443) de serveur-cible, en utilisant uniquement le port 22. Autre exemple : on veut ouvrir une connexion RDP (3389) vers un serveur qui n'autorise qu'une seule adresse IP en entrée, celle d'un serveur linux, et pas celle du poste qui lancera le client RDP. ssh -C -N -f -L 3389:serveur-cible:3389 user@serveur-intermediaire "serveur-cible" recevra une requête 3389 (RDP) provenant de "serveur-intermediaire" dont l'IP est autorisée. Dans le client RDP, en mettant "localhost" comme nom de serveur, on accède au bureau à distance ou à TSE de serveur-cible, par le tunnel. En enlevant l’intermédiaire ! Et oui, ce n'était pas l'objet initial de ce tuto, mais si le réseau le permet (pas de proxy ou firewall) on peut directement créer le tunnel vers le serveur final. On ouvre un port sur le poste local (localhost) relié par ssh à un port d'un serveur distant. Exemple avec Mysql : ssh -L 3306:localhost:3306 -f -N root@dbserver.domain.com Puis on peut s'y connecter directement : mysql -h 127.0.0.1 -u root -p "-h 127.0.0.1" est obligatoire ici pour dire au client mysql ne se connecter en TCP au port 3306 local (par défaut), et non pas en socket unix local.Extension disque virtuel + LVM + XFS Préalable Extension du disque virtuel et reboot (arrêt physique/redémarrage) de la VM pour la prendre en compte. Alternative à tester pour éviter le reboot : echo 1 > /sys/class/block/sda/device/rescan 1. CREATION D'UNE NOUVELLE PARTITION (parted < 3.1) parted /dev/sda Utilisation de /dev/sdaBievenue sur GNU Parted ! Tapez 'help' pour voir la liste des commandes.(parted) print freeModèle: VMware Virtual disk (scsi)Disque /dev/sda : 387GBTaille des secteurs (logiques/physiques): 512B/512BTable de partitions : msdosDisk Flags:Numéro Début Fin Taille Type Système de fichiers Fanions32,3kB 1049kB 1016kB Espace libre1 1049kB 525MB 524MB primary xfs démarrage2 525MB 62,7GB 62,2GB primary lvm (gestionnaire de volumes logiques)3 62,7GB 322GB 259GB primary lvm (gestionnaire de volumes logiques)322GB 387GB 64,4GB Espace libre <-------------(parted) mkpartType de partition ? primary/primaire/extended/étendue? primaryType de système de fichiers ? [ext2]? xfsDébut ? 322GBFin ? 387GBset 4 lvm on(parted) print freeNuméro Début Fin Taille Type Système de fichiers Fanions32,3kB 1049kB 1016kB Espace libre1 1049kB 525MB 524MB primary xfs démarrage2 525MB 62,7GB 62,2GB primary lvm (gestionnaire de volumes logiques)3 62,7GB 322GB 259GB primary lvm (gestionnaire de volumes logiques)4 322GB 387GB 64,4GB primary lvm (gestionnaire de volumes logiques) Ajout de la partition au groupe de volumes pvcreate /dev/sda4vgextend vg1 /dev/sda4 2. EXTENSION D'UNE PARTITION EXISTANTE (parted >= 3.1) parted 3.1.0 n'a plus la commande resize, et pas encore resizepart qui semble revenir avec la 3.1.32 Procédure 1 - Sans "resizepart" SANS SORTIR DE PARTED !on supprime la partition pour la recréer tout de suite à la taille maximum. On note le secteur de départ, il faudra redonner exactement le même. parted /dev/sda unit s  -> (affichage en mode secteurs)print allprint freerm 4mkpart primary [start]s [end]s (ou : 100%)print allprint free Procédure 2 - Avec "resizepart" print  -> (noter la taille max du disque, par ex 502GB)resizepart 4Fin [247GB] : 502GBq Suite : Extension LVM (si nécessaire) Affichage des informations et noms des groupes de volumes et volumes logiques # vgdisplay --- Volume group ---VG Name vg1..... # lvdisplay --- Logical volume ---LV Path /dev/vg1/root.....--- Logical volume ---LV Path /dev/vg1/swap.....--- Logical volume ---LV Path /dev/vg1/u01....LV Size 241,63 GiB Prise en  compte de l'extension dans LVM # pvscan # pvresize /dev/sda4 Extension du volume logique # lvresize -l +100%FREE /dev/rhel/u01 # lvdisplay ...--- Logical volume ---LV Path /dev/rhel/u01...LV Size 301,62 GiB 3. EXTENSION DU SYSTEME DE FICHIERS XFS # xfs_growfs /u01Restauration d'un VG si un disque perd son uuid Booter en mode rescue (mode par défaut proposé par linux si une partition ne monte pas). Remonter la racine en RW # mount -o remount / Voir le volume en cause : # pvscan Couldn't find device with uuid yF12vQ-Pcsb-MDXA-D85j-02ci-ivJd-yR92mi PV /dev/sda2 VG VGRoot lvm2 [24,59 GB / 0 free] Total: 1 [24,59 GB] / in use: 1 [24,59 GB] / in no VG: 0 [0 ] PV /dev/sdb1 VG VGData lvm2 [249,88 GB / 0 free] Total: 1 [249,88 GB] / in use: 1 [249,88 GB] / in no VG: 0 [0 ] Ici, bien qu'affiché tout de suite, le message concerne le second volume /dev/sdb1. Lister les sauvegardes (automatiques) de la configuration LVM : # vgcfgrestore --list VGData File: /etc/lvm/archive/VGData_00000.vg VG name: VGData Description: Created *before* executing '/sbin/vgs --noheadings -o name' Backup Time: Wed Oct 5 17:13:17 2011 File: /etc/lvm/backup/VGData VG name: VGData Description: Created *after* executing '/sbin/vgs --noheadings -o name' Backup Time: Wed Oct 5 17:13:17 2011 On recrée le volume physique en forçant l'UUID. A priori, cette opération ne touche pas aux données de la partition, mais on ne peut jamais être sûr... C'est donc sans garantie. # pvcreate /dev/sdb1 --uuid yF12vQ-Pcsb-MDXA-D85j-02ci-ivJd-yR92mi --restorefile /etc/lvm/backup/VGData Couldn't find device with uuid yF12vQ-Pcsb-MDXA-D85j-02ci-ivJd-yR92mi. Writing physical volume data to disk "/dev/sdb1" Physical volume "/dev/sdb1" successfully created On vérifie les UUIDs : # pvs -o +uuid PV VG Fmt Attr PSize PFree PV UUID /dev/sda2 VGRoot lvm2 a-- 25,59g 18,62g AYR30X-PoeE-4dZi-iexU-XqWw-I9OB-ewOdyx /dev/sdb1 lvm2 a-- 250,48g 931,51g yF12vQ-Pcsb-MDXA-D85j-02ci-ivJd-yR92mi On restore définitivement le groupe de volumes : # vgcfgrestore VGData Restored volume group VGData On vérifie que les groupes de volumes ne renvoient plus d'erreurs : # vgscan Reading all physical volumes. This may take a while... Found volume group "VGRoot" using metadata type lvm2 Found volume group "VGData" using metadata type lvm2 On active le groupe de volumes qui vient d'être restauré : # vgchange -ay 1 logical volume(s) in volume group "VGRoot" now active 3 logical volume(s) in volume group "VGData" now active Il reste à remonter le ou les volumes logiques : # mount /dev/mapper/VGData-LVData /dataAnti-DDOS par iptables et sysctl.conf ANTI-DDOS par les iptables https://javapipe.com/ddos/blog/iptables-ddos-protection/ ### 1: Drop invalid packets ###/sbin/iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP### 2: Drop TCP packets that are new and are not SYN ###/sbin/iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP### 3: Drop SYN packets with suspicious MSS value ###/sbin/iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP### 4: Block packets with bogus TCP flags ###/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP### 5: Block spoofed packets ###/sbin/iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP/sbin/iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP/sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP/sbin/iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP/sbin/iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP/sbin/iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP/sbin/iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP/sbin/iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP/sbin/iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP### 6: Drop ICMP (you usually don't need this protocol) ###/sbin/iptables -t mangle -A PREROUTING -p icmp -j DROP### 7: Drop fragments in all chains ###/sbin/iptables -t mangle -A PREROUTING -f -j DROP### 8: Limit connections per source IP ###/sbin/iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset### 9: Limit RST packets ###/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP### 10: Limit new TCP connections per second per source IP ###/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP### 11: Use SYNPROXY on all ports (disables connection limiting rule) ###### !!! EVITER SYNPROXY SUR TOUS LES PORTS ! PEUT BLOQUER SSH ET PLUS ! LIMITER AUX PORTS SENSIBLES ###### you can just add --dport 80 to each of the rules if you want to use SYNPROXY on port 80 onlyiptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrackiptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460iptables -A INPUT -m conntrack --ctstate INVALID -j DROP Bonus Rules : ### SSH brute-force protection ###/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP### Protection against port scanning ###/sbin/iptables -N port-scanning/sbin/iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN/sbin/iptables -A port-scanning -j DROP ANTI-DDOS par sysctl.conf kernel.printk = 4 4 1 7kernel.panic = 10kernel.sysrq = 0kernel.shmmax = 4294967296kernel.shmall = 4194304kernel.core_uses_pid = 1kernel.msgmnb = 65536kernel.msgmax = 65536vm.swappiness = 20vm.dirty_ratio = 80vm.dirty_background_ratio = 5fs.file-max = 2097152net.core.netdev_max_backlog = 262144net.core.rmem_default = 31457280net.core.rmem_max = 67108864net.core.wmem_default = 31457280net.core.wmem_max = 67108864net.core.somaxconn = 65535net.core.optmem_max = 25165824net.ipv4.neigh.default.gc_thresh1 = 4096net.ipv4.neigh.default.gc_thresh2 = 8192net.ipv4.neigh.default.gc_thresh3 = 16384net.ipv4.neigh.default.gc_interval = 5net.ipv4.neigh.default.gc_stale_time = 120net.netfilter.nf_conntrack_max = 10000000net.netfilter.nf_conntrack_tcp_loose = 0net.netfilter.nf_conntrack_tcp_timeout_established = 1800net.netfilter.nf_conntrack_tcp_timeout_close = 10net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 20net.netfilter.nf_conntrack_tcp_timeout_last_ack = 20net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 20net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10net.ipv4.tcp_slow_start_after_idle = 0net.ipv4.ip_local_port_range = 1024 65000net.ipv4.ip_no_pmtu_disc = 1net.ipv4.route.flush = 1net.ipv4.route.max_size = 8048576net.ipv4.icmp_echo_ignore_broadcasts = 1net.ipv4.icmp_ignore_bogus_error_responses = 1net.ipv4.tcp_congestion_control = htcpnet.ipv4.tcp_mem = 65536 131072 262144net.ipv4.udp_mem = 65536 131072 262144net.ipv4.tcp_rmem = 4096 87380 33554432net.ipv4.udp_rmem_min = 16384net.ipv4.tcp_wmem = 4096 87380 33554432net.ipv4.udp_wmem_min = 16384net.ipv4.tcp_max_tw_buckets = 1440000net.ipv4.tcp_tw_recycle = 0net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_max_orphans = 400000net.ipv4.tcp_window_scaling = 1net.ipv4.tcp_rfc1337 = 1net.ipv4.tcp_syncookies = 1net.ipv4.tcp_synack_retries = 1net.ipv4.tcp_syn_retries = 2net.ipv4.tcp_max_syn_backlog = 16384net.ipv4.tcp_timestamps = 1net.ipv4.tcp_sack = 1net.ipv4.tcp_fack = 1net.ipv4.tcp_ecn = 2net.ipv4.tcp_fin_timeout = 10net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_intvl = 60net.ipv4.tcp_keepalive_probes = 10net.ipv4.tcp_no_metrics_save = 1net.ipv4.ip_forward = 0net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.all.send_redirects = 0net.ipv4.conf.all.accept_source_route = 0net.ipv4.conf.all.rp_filter = 1 RAID logiciel : mdadm Un article de Le wiki de 2 noisettes - noisette.ch. Mdadm est un logiciel de gestion de RAID logiciel. Il est très complet au point que je le conseille même pour un environnement de production. Cet article explique comment créer un RAID, assembler plusieurs disques ayant déjà fait parti d'un array, ou comment réagir en cas de panne. Pour les commandes données en exemple, nous ferons du RAID1 avec 2 disques partitionnés en 4, respectivement /boot, swap, / et /home. Création Configurer les disques Une fois le logiciel mdadm installé sur l'ordinateur, il faut configurer les disques fdisk /dev/sda fdisk /dev/sdb pour que les partitions qui vont accueillir du RAID soient de type Linux raid autodetect (fd). Puis on va les assembler avec mdadm pour finalement pouvoir les formater et installer le le system dessus. La configuration des disques sera la suivante : /dev/*1 --> /boot, 100MB /dev/*2 --> swap, 1-2GB / dev/*3 --> /, 20GB /dev/*4 --> /home, le reste (bien que mettre /var serait plus judicieux sur une gentoo. Noyau Compilez le noyau avec les options suivantes (et sélectionner un autre mode de RAID si souhaité) Device Drivers ---> Multi-device support (RAID and LVM) ---> [*] Multiple devices driver support (RAID and LVM) [*] RAID support [*] RAID-1 (mirroring) mode Si vous démarrez d'un live CD, il faut charger le module (raid1 par exemple) : modprobe raid1 Créer les nodes /dev/mdX mknod /dev/md1 b 9 1 mknod /dev/md3 b 9 3 mknod /dev/md4 b 9 4 Création des arrays Pour les assembler avec mdadm, la commande ressemble à la suivante mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1 mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3 mdadm --create /dev/md4 --level=1 --raid-devices=2 /dev/sda4 /dev/sdb4 Une fois l'array créé, reste les formatage et le montage à l'endroit voulu. mke2fs /dev/md1 mkreiserfs /dev/md3 mkreiserfs /dev/md4 mkswap /dev/sda2 && mkswap /dev/sdb2 swapon /dev/sda2 && swapon /dev/sdb2 mount /dev/md3 /mnt mkdir -p /mnt/boot && mount /dev/md1 /mnt/boot mkdir -p /mnt/home && mount /dev/md4 /mnt/home On peut maintenant consulter les informations sur les disques, et insérer ces informations dans /etc/mdadm.conf : mdadm --detail --scan >> /etc/mdadm.conf Créer un raid10 mdadm -v --create /dev/md2 --level=raid10 --raid-devices=12 /dev/sd[a-l]2 Créer un raid 50 Commencer par créer 4 baies de trois disques en RAID5 : mdadm --create /dev/md21 -v --raid-devices=3 --level=5 /dev/sd[a-c]2 mdadm --create /dev/md22 -v --raid-devices=3 --level=5 /dev/sd[d-f]2 mdadm --create /dev/md23 -v --raid-devices=3 --level=5 /dev/sd[g-i]2 mdadm --create /dev/md24 -v --raid-devices=3 --level=5 /dev/sd[j-l]2 Pour créer un raid 0 avec ces 4 RAID5 : mdadm --create /dev/md2 -v --raid-devices=4 --level=0 /dev/md21 /dev/md22 /dev/md23 /dev/md24 Si par la suite on veut étendre le raid : Recréer une baie de raid5 : mdadm --create /dev/md25 -v --raid-devices=3 --level=5 /dev/sd[l-n]2 L'ajouter daans le raid0 existant : mdadm --manage /dev/md2 --add /dev/md25 Définir le nombre de Baies pour le raid0 : mdadm --grow /dev/md2 --raid-devices=5 (Ré)Assemblage Une fois le RAID créé et des données dessus, on ne veut plus nécessairement le reformater et le recréer quand on l'a démonté. La solution sera donc de le réassemblé avec mdadm. La première étape conciste à examiner une partition pour contrôler si elle fait bien partie d'un RAID (pour ceux qui on une mauvaise mémoire à très court terme) : mdadm --examine /dev/sda1 La sortie nous dit si oui ou non la partition fait partie d'un RAID, et si oui quels autres disques en font aussi partie. Une fois en possession de ces informations, il nous reste à assembler l'ARRAY : mdadm --assemble /dev/md1 /dev/sda1 /dev/sdb1 mdadm --assemble /dev/md3 /dev/sda3 /dev/sdb3 mdadm --assemble /dev/md4 /dev/sda4 /dev/sdb4 Reste le montage à l'endroit voulu. Reconstruction J'ai fait des tests de tolérence sur le RAID logiciel. J'ai commencé par enlever des disques à chaud (et j'ai pu bien constater qu'IDE était hot-déswap mais pas hot-swap), puis en utilisant l'option --fail pour simuler une panne. Les résultat étaient assez intéressants, mais le problème était de reconstruire le raid après la panne simulée. Une fois la panne détectée (une véritable panne ou une simulée), on identifie le disque défectueux (avec dmesg ou /proc/mdstat) et on le retire de l'array : mdadm --manage /dev/md1 --remove /dev/sdb1 Si on n'a pas de SATA pour enlever et remettre un disque à chaud, on arrête la machine et on la redémarre avec le nouveau disque. Puis on ajoute le nouveau disque à l'array : mdadm --manage /dev/md1 --add /dev/sdb1 Suppression Supprimer le raid existant Passer le status des disques à fail : mdadm --manage /dev/md2 --fail /dev/sd[a-l]2 Puis les retirer du raid : mdadm --manage /dev/md2 --remove /dev/sd[a-l]2 Arrêter le raid : mdadm --manage --stop /dev/md2 Commenter la ligne correspondant à md2 dans /etc/mdadm.conf Initialiser les périphériques pour effacer toute trace et redémarrer la machine: mdadm --zero-superblock /dev/sd[a-l]2 reboot Monitoring Mdadm offre une option de monitoring des arrays : --monitor. Pouvant être directement lancé sur centos avec le daemon mdmonitor : service mdmonitor start chkconfig mdmonitor on Notifications de base Ajouter dans /etc/mdadm.conf MAILADDR youremail@domain.com MAILFROM my-server-name tester : mdadm --monitor --scan --test --oneshot Notification à l'aide d'un script Mdmonitor peut appeler un script externe lors d'un événement (bon ou mauvais). Pour cela rajouter dans /etc/mdadm.conf : PROGRAM /opt/systools/handle-mdadm-events.sh Les arguments passés au script seront les suivants : * $1 : une chaine de caractère qui décrit l'évènement qui s'est produit o 'SparesMissing' : une panne est détectée mais aucun disque de remplacement n'est présent o 'Fail' : un disque est détecté comme déféctueux o 'RebuildStarted' : un nouveau disque est ajouté à l'array et la reconstruction commence o 'Rebuild20' : la reconstruction est à 20% o 'Rebuild40' : la reconstruction est à 40% o 'Rebuild60' : la reconstruction est à 60% o 'Rebuild80' : la reconstruction est à 80% o 'RebuildFinished' : la reconstruction est terminée o 'SpareActive' : un disque de réserve est ajouté à un array * $2 : le nom de la device md : /dev/mdX $1 et $2 étant le premier et le deuxième argument passé en paramètre. Voici le script : #!/bin/bash CONFIG="/etc/mdadm.conf" MAILADDR="pbrun@systea.net" # support@systea.net" #espace entre les mails parse_event() { echo "Hôte : $HOSTNAME" if [ -z "$1" ]; then echo "Événement : Test message" else echo "MD Device : $2" echo "Événement : $1" if [ -n "$3" ]; then echo "Élément en cause: $3" fi fi echo "" echo "/proc/mdstat dump:" FAIL=0 DEGRADED=0 while read LINE; do echo -n "$LINE" if [ -n "$(echo "$LINE" |grep 'active raid')" ]; then if [ -n "$(echo "$LINE" |grep '\(F\)')" ]; then FAIL=$(($FAIL + 1)) echo -n " (ATTENTION: DISQUE(S) DÉFÉCTUEUX!)" fi if [ -n "$(echo "$LINE" |grep '\(S\)')" ]; then echo -n " (Hotspare(s) disponibles)" else echo -n " (NOTE: Pas de hotspare?!)" fi fi if [ -n "$(echo "$LINE" |grep 'blocks')" ]; then if [ -n "$(echo "$LINE" |grep '_')" ]; then DEGRADED=$(($DEGRADED + 1)) echo -n " (DEGRADED!!!)" fi fi echo "" done < /proc/mdstat if [ $FAIL -gt 0 ]; then echo "" echo "** ATTENTION: Un ou plusieurs RAID ont un ou plusieurs disques déféctueux! **" fi if [ $DEGRADED -gt 0 ]; then echo "" echo "** ATTENTION: Un ou plusieurs RAID fonctionnent en mode dégradé! **" fi } # main line: # Get MAILADDR from mdadm.conf config file, if not set already if [ -z "$MAILADDR" ] && [ -f "$CONFIG" ]; then MAILADDR=`grep MAILADDR "$CONFIG" |cut -d' ' -f2` if [ -z "$MAILADDR" ]; then MAILADDR="root" fi fi # Call the parser and send it to the configured address parse_event $* |mail -s"Événement RAID(MD) sur $HOSTNAME" "$MAILADDR" exit 0 Afin de ne pas recevoir deux mails pour chaque alerte il est conseillé de commenter les deux lignes : MAILADDR youremail@domain.com MAILFROM my-server-name - mdadm Un script plus simple... #!/bin/bash MAIL=admin@domain.com if [ $(date +\%w) -ne 0 ] then STATE=$(/sbin/mdadm --query --detail /dev/md1 | grep State | grep -v Major | awk '{print $3}') if [ "$STATE" != "clean" -a "$STATE" != "active" ] then (/sbin/mdadm --query --detail /dev/md1 )| mail -s "PROBLEME RAID sur $(hostname) $(date +%d/%m)" $MAIL fi fi Notes Vérifier d'avoir une version > 2.5.0, car elle souffre d'un gros memory leak quand mdadm est lancé en monitoring. Activation de X11 avec un poste Windows+putty, et sudo Le premier problème est de pouvoir afficher les écran X11 venant de linux, sur un poste Windows. Pour ça on utilise XMing. A partir du poste Windows, on se connecte au serveur linux avec putty. Sur le poste Windows : Lancer XMing, éventuellement ajouter "-ac" au bout de la ligne de commande du raccourci pour avoir les ACLs.Activer X11 Forwarding dans Putty (sous SSH / X11)ouvrir le terminal en se connectant "root" (ce n'est évidemment pas recommandé mais c'est pour la bonne cause) Dans le terminal (sur le serveur linux, donc) # xauth list LINUXSRV.domaine.com:10 MIT-MAGIC-COOKIE-1 696c660216329786ae629df72781d43f # echo $DISPLAY 10.0.0.207:10.0 L'affichage X11 doit fonctionner à ce point. Tester en lançant soit l'horloge si elle est installée : xclock Soit, si Oracle est installé sur le serveur, on peut aussi utiliser les commandes : xwininfo xdpyinfo pour connaitre la configuration X11, et tester l'échange client-serveur. Passer sous un autre utilisateur avec su su - user1 xauth list si la réponse est  "Xauthority not found", le créer xauth add LINUXSRV.domaine.com:10 MIT-MAGIC-COOKIE-1 696c660216329786ae629df72781d43f Sinon, et si le cookie "LINUXSRV.domaine.com:10 MIT-MAGIC-COOKIE..." affiché par "xauth list" est le même qu'avant "su - user1", il n'y aura plus besoin de relancer "xauth add" par la suite; MAIS ATTENTION, IL PEUT CHANGER D'UNE SESSION A L'AUTRE. Il reste ensuite à déclarer la variable DISPLAY export DISPLAY=10.0.0.207:10.0 Si X11 ne fonctionne pas, essayer de supprimer le .Xauthority, vérifier xauth list sur la session avant su, et relancer xauth addNetwork bonding sur linux Redonder plusieurs cartes réseau sous Linux Modes bonding Les modes peuvent être indiqués numériquement ou par des mots clés mode=0 ou mode=balance-rr  : equilibrage de charge mode=1 ou mode=active-backup  : sauvegarde active mode=2 ou mode=balance-xor  : balance xor mode=3 ou mode=broadcast  : broadcast mode=4 ou mode=802.3ad  : Norme 802.3ad mode=5 ou mode=balance-tlb  : balance TLB mode=6 ou mode=balance-alb  : balance ALB Le paramètre "miimon" (fréquence de monitoring des 2 interfaces, en millisecondes) est le seul paramètre obligatoire. Sur Debian Sur Debian vérifier que le paquet ifenslave-2.6 (pour kernel 2.6) est installé. Configurer le réseau Editer /etc/network/interfaces : # network interface settings auto lo iface lo inet loopback auto bond0 iface bond0 inet static address 192.168.37.110 netmask 255.255.255.0 network 192.168.37.0 broadcast 192.168.37.255 gateway 192.168.37.254 slaves eth0 eth1 Charger le module de « bonding » dans le kernel Ajouter un fichier de configuration pour le module bonding : vi /etc/modprobe.d/aliases-bond Y ajouter : alias bond0 bonding options bonding mode=1 miimon=100 Pour tester, charger le module de « bonding » puis redémarrer le service réseau : # modprobe bonding # /etc/init.d/networking restart Sur CentOS Configurer le réseau Créer le fichier de configuration de la carte bond0 dans le fichier /etc/sysconfig/network-scripts/ifcfg-bond0 : DEVICE=bond0 IPADDR=192.168.1.100 //votre adresse ip NETWORK=192.168.1.0 //l’adresse ip de votre reseau NETMASK=255.255.255.0 //votre masque de sous-réseau USERCTL=no BOOTPROTO=none ONBOOT=yes Editer les fichiers de configuration des différentes cartes réseau (/etc/sysconfig/network-scripts/ifcfg-XXXX).Remplacer ou rajouter les lignes suivantes aux fichiers : DEVICE=XXXX //à modifier avec nom de votre carte « eth? » USERCTL=no ONBOOT=yes MASTER=bond0 SLAVE=yes BOOTPROTO=none Charger le module de « bonding » dans le kernel Editer le fichier de configuration des modules de kernel /etc/modprobe.conf, y ajouter : alias bond0 bonding options bond0 mode=balance-alb miimon=100 Pour tester, charger le module de « bonding » puis redémarrer le service réseau : # modprobe bonding # service network restart Vérifications Vérifier que la carte virtuelle est bien démarrée et que les cartes physique lui sont bien liées : # less /proc/net/bonding/bond0 Qui retournera une sortie plus ou moins identique à ça : Bonding Mode: load balancing (round-robin) MII Status: up MII Polling Interval (ms): 0 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth0 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:50:56:c0:00:08 Slave Interface: eth1 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:50:56:c0:00:01 Slave Interface: eth2 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:50:56:c0:00:03 Débrancher les cartes une à une afin de vérifier que le serveur ne perd pas la connexion (en mode 1, active backup. En load balancing le poste client est connecté sur une seule carte à un instant T et il perd quand même la connexion si c'est cette carte-là qui est débranchée : il faudra relancer la connexion).