Fsck désactivé!

Bonjour à tous

Je crois que nous avons un problème sur le fsck de Yunohost (pas encore eu le temps d’aller jeter un oeil sur debian), En ce qui me concerne, mes disques dur n’ont pas été vérifié depuis le 31 juillet 2014, date d’installation de Yunohost…

sudo dumpe2fs /dev/sda1 | grep "Maximum mount count"
Indique -1, soit aucune vérification automatique en fonction du nombre de montage.
Et
sudo dumpe2fs /dev/sda1 | grep "Check interval"
Indique 0 (<none>), soit aucune vérification forcée après un certain laps de temps.

En somme, aucun fsck automatique des disques n’est programmé sur le système.


Je viens de faire quelques recherches sur debian. Qui est touché de la même manière.
Ce n’est pas une erreur!
https://www.linuxquestions.org/questions/slackware-14/are-ext4-file-system-checks-disabled-by-default-on-14-0-a-4175433189/

Toutefois, est-ce judicieux pour Yunohost? Devrions-nous changer ce comportement et garder un fsck sur une durée maximale?

Pour ma part, je compte mettre en place un fsck régulier avec reboot automatique pour ne pas être surpris sur un redémarrage manuel.

Comment le faire manuellement pour tous les disques ?

Je vais me préparer des scripts en cron pour faire ça avec un envoi du log par mail. Et après des essais concluants, je posterais ça.

Merci beaucoup ! Heureusement que tu es là !

L’affaire est plus complexe qu’elle n’y parait. Il semble qu’il y ai des check disk opéré par systemd à chaque démarrage. Mais il n’est pas possible de les forcer ou de les arrêter. De plus, je doute qu’un fsck complet soit réellement fait si le volume n’est pas indiqué comme non clean.
J’ai un disque de 3To, pourtant mes démarrages sont très rapide…

Je prépare donc un script à placer en cron. Le principe étant de forcer un fsck au démarrage en redémarrant sur sysvinit au lieu de systemd. Envoyer par mail le résultat des fsck et restaurer le démarrage par systemd.
Ceci permettra d’avoir des check disk régulier (j’envisage 2 ou 3 mois) avec un log et l’assurance que tout est clean.

Voila le script terminé et testé.

#!/bin/bash

HEURE_CRON=4    # Cron à 4h du matin
EMPLACEMENT_SCRIPT="/CHEMIN/ABSOLU"

if [ $1 -eq 0 ]        # Argument 0, pré-exécution du script.
then
# Écriture du contenu du mail à envoyer.
echo "Une vérification des disques durs est prévu cette nuit à $HEURE_CRON h. Le serveur redémarrera plusieurs fois durant le processus." | sudo tee $EMPLACEMENT_SCRIPT/fsck_log
echo "Un mail sera envoyé à l'issue de cette opération de maintenance." | sudo tee -a $EMPLACEMENT_SCRIPT/fsck_log
echo -e "\nPour annuler cette maintenance, supprimer le fichier '/etc/cron.d/auto_fsck'." | sudo tee -a $EMPLACEMENT_SCRIPT/fsck_log
# Envoi d'un mail pour informer de l'opération de maintenance à venir.
mail -a "Content-Type: text/plain; charset=UTF-8" -s "Maintenance fsck" root < $EMPLACEMENT_SCRIPT/fsck_log
# Mise en place d'un cron pour démarrage de la maintenance dans la journée.
echo -e "# Exécution d'un fsck forcé à $HEURE_CRON h.\n\n0 $HEURE_CRON * * * root cd \"$EMPLACEMENT_SCRIPT\" && ./full_auto_fsck.sh 1 2>> /var/log/fsck/auto_fsck.log > /dev/null" | sudo tee /etc/cron.d/auto_fsck
fi


if [ $1 -eq 1 ]        # Argument 1, préparation du fsck.
then
# Note l'heure de début de maintenance
echo -n "BEGIN=" | sudo tee $EMPLACEMENT_SCRIPT/fsck_log
echo $(date +%s) | sudo tee -a $EMPLACEMENT_SCRIPT/fsck_log
# Créer une sauvegarde du fichier /etc/default/grub avant modification
sudo cp -a /etc/default/grub /etc/default/grub_copie_fsck
# Ajoute au paramètres de démarrage du noyau le changement d'init pour forcer un démarrage sur sysvinit.
sudo sed -i "s@GRUB_CMDLINE_LINUX=\"@GRUB_CMDLINE_LINUX=\"init=/lib/sysvinit/init @g" /etc/default/grub
# Mise à jour des paramètres de grub
sudo update-grub
# Mise en place du /forcefsck pour forcer le check disk au démarrage.
sudo touch /forcefsck
# Ajoute le script au démarrage du système pour continuer le travail après le redémarrage.
sudo sed -i "s@^exit 0\$@cd \"$EMPLACEMENT_SCRIPT\" \&\& sudo ./full_auto_fsck.sh 2 2>> /var/log/fsck/auto_fsck.log\nexit 0@g" /etc/rc.local
# Redémarrage du système avec sysvinit et exécution du fsck.
sudo reboot
fi


if [ $1 -eq 2 ]        # Argument 2, restauration des paramètres de boot.
then
# Parsing des 2 logs de fsck
echo -e "La maintenance des disques durs vient de se terminer.\n" | sudo tee -a $EMPLACEMENT_SCRIPT/fsck_log
sudo cat /var/log/fsck/checkroot | sudo tee -a $EMPLACEMENT_SCRIPT/fsck_log    # A nettoyer un peu
sudo cat /var/log/fsck/checkfs | sudo tee -a $EMPLACEMENT_SCRIPT/fsck_log    # A nettoyer un peu
# Restauration du fichier grub original.
sudo mv -f /etc/default/grub_copie_fsck /etc/default/grub
# Mise à jour des paramètres de grub
sudo update-grub
# Changement de l'argument du script dans /etc/rc.local pour passer à la 3e étape.
sudo sed -i "s@full_auto_fsck.sh 2@full_auto_fsck.sh 3@g" /etc/rc.local
# Redémarrage du système avec systemd pour un redémarrage normal
sudo reboot
fi


if [ $1 -eq 3 ]        # Argument 3, fin de maintenance.
then
# Détermine le temps pris pour la maintenance.
TIMEA=$(cat $EMPLACEMENT_SCRIPT/fsck_log | head -n1 | cut -d "=" -f2)    # Reprend l'heure de début de maintenance
TIMEB=$(date +%s)    # Prend l'heure actuelle
DIFFTIME=`expr $TIMEB - $TIMEA`    # Calcule le temps écoulé depuis le début d'exécution du script.
HEURES=0
MINUTES=0
while [ $DIFFTIME -ge 60 ]
do    #Calcul le nombre de minutes écoulées.
    MINUTES=$(($MINUTES + 1))
    DIFFTIME=$(($DIFFTIME - 60))
done
while [ $MINUTES -ge 60 ]
do    #Calcul le nombre d'heures écoulées.
    HEURES=$(($HEURES + 1))
    MINUTES=$(($MINUTES - 60))
done
# Supprime la ligne de l'heure de démarrage dans le fichier fsck_log
sed -i '/^BEGIN=/d' $EMPLACEMENT_SCRIPT/fsck_log
# Écriture du contenu du mail à envoyer.
echo -e "\nLe temps d'immobilisation du serveur pour cette opération de maintenance a été de $HEURES heures, $MINUTES minutes et $DIFFTIME secondes." | sudo tee -a $EMPLACEMENT_SCRIPT/fsck_log
# Envoi d'un mail pour informer du résultat de l'opération de maintenance.
mail -a "Content-Type: text/plain; charset=UTF-8" -s "Maintenance fsck terminée" root < $EMPLACEMENT_SCRIPT/fsck_log
# Supprime l'appel au script dans /etc/rc.local
sudo sed -i '/full_auto_fsck.sh/d' /etc/rc.local
# Supprime le cron secondaire.
sudo rm /etc/cron.d/auto_fsck
sudo rm $EMPLACEMENT_SCRIPT/fsck_log
fi

Le nom de domaine sert uniquement à l’envoi de mail. C’est con, je pense que c’est pas utile. J’ai pas essayé…

Le script est à placer dans un cron tout les 2 ou 3 mois, au libre choix. Le reste sera automatique.
Je n’ai pas encore de retour sur l’analyse d’un gros disque, la machine de test avait 15go seulement.

En espérant que ça puisse servir :wink:

Merci beaucoup :slight_smile: Petite question : comment l’intégrer au serveur ?

Tu copies le script où tu veux.
Tu renseignes les variables au début (le domain faut que je m’en occupe, c’est vraiment inutile!)
Tu rends le script exécutable.
Et tu fais un cron pour démarrer le script à intervalle régulier.

Faut que je le mette sur mon serveur (c’est toujours pas fait…), je te montrerais éventuellement mon cron

J’ai viré le domain, c’est réglé.

Donc, j’ai copié le script sur le serveur, modifié la variable EMPLACEMENT_SCRIPT pour indiquer le path.
Et créé un cron pour lancer le script périodiquement.

sudo nano /etc/cron.d/full_auto_fsck

Le fichier contient simplement ceci:

# Vérification des disques dur tout les 60 jours
0 10 */60 * * root cd "/media/data/scripts" && ./full_auto_fsck.sh 0 2>> /var/log/fsck/auto_fsck.log > /dev/null

Le script sera lancé tout les 60 jours à 10h du matin. Soit l’envoi du mail d’avertissement et le déclenchement de tout le processus, avec la maintenance la nuit suivante à 4h du matin.

Et vérifie bien que le script soit exécutable, sinon il ne se passera rien.

Je m’aperçois que je ne maitrise pas encore bien les scripts… Je n’arrive pas encore à bien faire des sauvegardes.

Je ne comprends pas ce que tu veux dire.
Quel rapport avec les sauvegardes ?