Auteur Sujet: Comprendre d'où vient l'erreur "Failed unmounting /home"  (Lu 8437 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 41 706
    • Twitter LaFibre.info
Comprendre d'où vient l'erreur "Failed unmounting /home"
« le: 07 avril 2019 à 11:08:23 »
Quand je redémarre un serveur, j'ai de nombreuses minutes de blocage lié à l'erreur "Failed unmounting /home"

J'aimerais bien comprendre à quoi est du cette erreur.
Je ne vois rien dans /var/log/kern.log ou /var/log syslog, où trouver le log pour comprendre à quoi est du l’erreur ?

J'ai pensé au débit que l'erreur était lié aux deux ramdisque (tmpfs) qui étaient dans /home pour nPerf et speedtest. J'ai donc déplacé ces ramdisque tmpfs à la racine, mais /home est toujours en erreur.


Thornhill

  • Abonné SFR fibre FttH
  • *
  • Messages: 3 967
  • Saint-Médard-en-Jalles (33)
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #1 le: 07 avril 2019 à 11:52:59 »
Surement un process non arrêté.

Insère un script d'arrêt avec un lsof sur /home le plus près possible du démontage.

kgersen

  • Modérateur
  • Abonné Free Pro
  • *
  • Messages: 8 261
  • Paris (75)
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #2 le: 07 avril 2019 à 12:35:01 »
Je ne vois rien dans /var/log/kern.log ou /var/log syslog, où trouver le log pour comprendre à quoi est du l’erreur ?

en 2019 si t'es sous systemd tout est en dans journalctl , t'as pas besoin d'utiliser d'autre commande que journatctl (meme dmesg est inclus la dedans).

Suivant la config par défaut de ta distrib, elle conserve ou pas les journaux des boots précédents:

sudo journalctl --list-boots
te permet de voir cela (suivant tes réglages de sécu le sudo peut-etre omis). Si ta distrib ne le fait pas défaut: https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs

Ensuite "sudo journalctl -b -1" par exemple permet de voir tout les logs du boot précédent (shift-g pour aller a la fin puis tu peux remonter, / pour chercher une chaine, h pour voir l'aide). 

Il y a plein d'options pour faciliter la recherche et filtrer, par exemple "sudo journalctl -b -1 -p 3" n'affiche que les erreurs ou plus grave.

man journalctl  ou des tuto en ligne.

Franchement en 2019, y'a vraiment que 2 commandes d'admin a apprendre et maîtriser sous les distrib Linux systemd: systemctl (controler et gerer les service) et journalctl.
quasi toutes les distribs majeures l'ont adopté: https://en.wikipedia.org/wiki/Systemd#Adoption

J'en vois trop encore qui continu a utiliser des vielles habitudes sur des distrib qui sont depuis longtemps passé sous systemd. Formez vous au présent ;) le gain de temps est phénoménal ensuite.





BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 510
  • Malissard (26)
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #3 le: 07 avril 2019 à 13:02:51 »
Surement un process non arrêté.

Insère un script d'arrêt avec un lsof sur /home le plus près possible du démontage.

+1 pour lsof, contrôler la liste des processus l'utilisant avant de lancer son arrêt.

Autre solution, passer en single-user pour contrôler avec lsof qui utilise encore /home.

vivien

  • Administrateur
  • *
  • Messages: 41 706
    • Twitter LaFibre.info
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #4 le: 07 avril 2019 à 13:17:35 »
Parfait.

Ubuntu garde les 32 précédents boot (-1 à -32) + l'actuel (0)

C'est bien un process qui bloque :
avril 07 12:50:05 tests systemd[1]: home.mount: Mount process exited, code=exited status=32
avril 07 12:50:05 tests systemd[1]: Failed unmounting /home.

Le process en question, c'est le serveur Ookla.

La documentation donne peu d'information pour le lancer :

Ensure server daemon starts automatically

The OoklaServer Daemon can easily be configured to start automatically. CentOS, Fedora, Debian, and most distributions derived from any of the three, all execute a script called rc.local once all system processes have started. Editing this script to include a reference to the OoklaServer Daemon will cause the daemon to start automatically at boot.

CentOS/Fedora based systems: /etc/rc.d/rc.local
Debian based systems: /etc/rc.local

If you do not want to run OoklaServer as root (recommended) create a user to run OoklaServer.
Edit rc.local to include the following command to start the OoklaServer Daemon silently in the background. Change "ooklauser" to your non-root user that will run OoklaServer.
su ooklauser -c './full_path_to_your_Ookla_Server_Daemon/OoklaServer --daemon'

/etc/rc.local n'existe même plus avec les Ubuntu récents.

Perso j'ai créé un fichier /etc/cron.d/speedtest qui le lance au démarrage et qui vérifie toutes les 5minutes si il est toujours là
# Auto restart on reboot
@reboot         speedtest   sleep 1 ; /home/speedtest/check_speedtest.sh
@reboot         speedtest   sleep 2 ; cp -r /home/speedtest/files/* /home/speedtest/tmpfs

# Auto restart SpeedTest on crash
*/5 * * * *     speedtest   sleep 20 ; /home/speedtest/check_speedtest.sh

Note: Même sans mon crontab qui se lance toutes les 5 minutes, j'ai le problème.

Le contenu du script lancé :/home/speedtest/check_speedtest.sh
#!/bin/dash
if [ `ps -C OoklaServer | wc -l` = "1" ]
then
  date >> /tmp/plantage_speedtest.log
  cd /home/speedtest/bin
  /home/speedtest/bin/OoklaServer --daemon >> /tmp/plantage_speedtest.log 2>&1
fi

kgersen

  • Modérateur
  • Abonné Free Pro
  • *
  • Messages: 8 261
  • Paris (75)
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #5 le: 07 avril 2019 à 15:02:37 »
encore une fois c'est systemd la solution. /etc/rc, init, cron, etc tout ca c'est dans systemd maintenant.

c'est étonnant et inconséquent de la part de speedtest de ne pas fournit une install propre pour systemd (franchement aller mentionner rc.local c'est de la fainéantise de leur part).

y'a tout ce qu'il faut dans systemd pour lancer un service 'speedtest', le relancer s'il plante , l'arreter proprement au shutdown de la machine.

créer le fichier suivant:  /etc/systemd/system/speedtest.service

avec dedans:

[Unit]
Description=service speedtest Ookla
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/full_path_to_your_Ookla_Server_Daemon/OoklaServer --daemon
Restart=always
RestartSec=15
User=monuser

[Install]
WantedBy=multi-user.target

quelques explications:

- La Type=simple indique est le programme a lancer est un executable (ligne ExecStart) qui tourne et ne s'arrete pas.
Si "OoklaServer --daemon" fork un process et rend la main il faut mettre "ExecStart=forking" et tracker le PID du process dans une option "PIDFile="

- la ligne "User=" est optionnelle et défini le compte utilisateur qui sera utilisé pour faire tourner le service. si tu veux pas que ce soit root.

- RestartSec est le delai en seconde a attendre avant de redémarrer le service

- Restart=always va redemarrer le service s'il est down

- Lors d'un shutdown , systemd va arrêter le service en envoyant un signal d'arret (personalisable). Si cela ne suffit pas a l’arrêter correctement voir https://www.freedesktop.org/software/systemd/man/systemd.kill.html

Pour installer le service:

sudo systemctl daemon-reload   // à faire toutle temps apres une ajout/modif d'un fichier systemd
sudo systemctl enable speedtest.service // ce activera le service au boot

pour démarrer a la main:
sudo systemctl start speedtest.service // le .service peut être omis si y'a pas d’ambiguïté avec autre chose

pour voir l'état :
sudo systemctl status speedtest.service

pour arreter:
sudo systemctl stop speedtest.service

pour voir le journal concernant ce service depuis le démarrage en cours:
sudo journalctl -b -u speedtest.service // penser 'u' = unit

pour désactiver le service:
sudo systemctl disable speedtest.service

pour finir je conseille fortement de lire: https://www.freedesktop.org/software/systemd/man/systemd.service.html et la doc de systemd en général.

vivien

  • Administrateur
  • *
  • Messages: 41 706
    • Twitter LaFibre.info
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #6 le: 19 juin 2021 à 23:16:17 »
Je vois que j'ai oublié de faire un retour.

Le Type=simple ne fonctionne pas pour OoklaServer.

Voici ce que j'ai fait, avec Type=forking

sudo nano /etc/systemd/system/speedtest.service

[Unit]
Description=service speedtest Ookla
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/home/speedtest/bin/OoklaServer --daemon
Restart=always
RestartSec=15
User=speedtest

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl enable speedtest.service
(pour installer le service)
sudo reboot

Cela fonctionne bien, le service est bien disponible, mais je n'ai pas réglé mon problème de lenteur au reboot du serveur.

Une petite vidéo pour montrer ça simplement :


kgersen

  • Modérateur
  • Abonné Free Pro
  • *
  • Messages: 8 261
  • Paris (75)
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #7 le: 20 juin 2021 à 16:29:43 »
90s est le DefaultTimeoutStopSec du system car y'a pas de TimeoutStopSec defini specifiquement pour ce service.

systemd n'arrive pas arreter proprement le service.

Soit celui-ce ne répond pas correctement a un SIGTERM, systemd attend TimeoutStopSec  (= DefaultTimeoutStopSec si pas défini) avant d'envoyer un SIGKILL
Soit le forking ne detecte peut-etre pas bien le PID du process (et y'a pas PIDFile)
 

Essai plutôt de ne pas forker:
  type=Simple et enleve le "--daemon"

si ca marche (démarre) mais c'est aussi lent a stopper c'est que le programme ne respecte pas les standards et il faut le tuer violement.
ajoute un TimeoutStopSec (dans la section [Service]) avec une valeur courte:

[Unit]
Description=service speedtest Ookla
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/home/speedtest/bin/OoklaServer
Restart=always
RestartSec=15
User=speedtest
TimeoutStopSec=10s
[Install]
WantedBy=multi-user.target


sinon reste en Type=forking mais passe un PID a systemd:

ajoute "--pidfile=/run/OoklaServer.pid" a la fin de l'ExecStart (a priori OoklaServer supporte cet option)
ainsi que: PIDFile=OoklaServer.pid


[Unit]
Description=service speedtest Ookla
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/home/speedtest/bin/OoklaServer --daemon --pidfile=/run/OoklaServer.pid
PIDFile=OoklaServer.pid
Restart=always
RestartSec=15
User=speedtest
TimeoutStopSec=90s
[Install]
WantedBy=multi-user.target

s'il s'arrete pas rapidement non plus, change 90s a un 10s par exemple.
tu peux tester avec "systemctl start/stop speedtest" plutot que rebooter le serveur.

La méthode "Type=simple" est quand meme plus recommandée car plus moderne.

vivien

  • Administrateur
  • *
  • Messages: 41 706
    • Twitter LaFibre.info
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #8 le: 20 juin 2021 à 17:28:15 »
Essai plutôt de ne pas forker:
  type=Simple et enleve le "--daemon"
Cela ne change rien, il n'arrive pas à terminer le programme.

ajoute un TimeoutStopSec (dans la section [Service]) avec une valeur courte:
Cela permet de réduire bien le délais.

sinon reste en Type=forking mais passe un PID a systemd:

ajoute "--pidfile=/run/OoklaServer.pid" a la fin de l'ExecStart (a priori OoklaServer supporte cet option)
ainsi que: PIDFile=OoklaServer.pid
Là OoklaServer ne fonctionne pas.

Il faut ouvrir des droit pour pouvoir écrit sur /run/OoklaServer.pid ?

$ sudo service speedtest status
● speedtest.service - service speedtest Ookla
     Loaded: loaded (/etc/systemd/system/speedtest.service; enabled; vendor preset: enabled)
     Active: activating (start) since Sun 2021-06-20 15:22:39 UTC; 1min 20s ago
    Process: 694 ExecStart=/home/speedtest/bin/OoklaServer --daemon --pidfile=/run/OoklaServer.pid (code=exited, status=0/SUCCESS)
      Tasks: 1 (limit: 9339)
     Memory: 6.3M
     CGroup: /system.slice/speedtest.service
             └─737 /home/speedtest/bin/OoklaServer --daemon --pidfile=/run/OoklaServer.pid

juin 20 15:22:39 hp systemd[1]: Starting service speedtest Ookla...
juin 20 15:22:39 hp systemd[1]: speedtest.service: Can't open PID file /run/OoklaServer.pid (yet?) after start: Operation not permitted

kgersen

  • Modérateur
  • Abonné Free Pro
  • *
  • Messages: 8 261
  • Paris (75)
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #9 le: 20 juin 2021 à 17:50:16 »
revient comme avant et met juste un TimeoutStopSec dans ce cas. le programme est mal écrit ou faut co,nfigurer ton compte utilisateur.

vivien

  • Administrateur
  • *
  • Messages: 41 706
    • Twitter LaFibre.info
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #10 le: 20 juin 2021 à 18:10:41 »
En utilisant le PID existant le serveur se lance bien, mais met toujours du temps pour s’arrêter :

[Unit]
Description=service speedtest Ookla
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/home/speedtest/bin/OoklaServer --daemon --pidfile=/home/speedtest/bin/OoklaServer.pid
PIDFile=/home/speedtest/bin/OoklaServer.pid
Restart=always
RestartSec=15
User=speedtest
TimeoutStopSec=60s

[Install]
WantedBy=multi-user.target

Il y a en effet un fichier /home/speedtest/bin/OoklaServer.pid existant :

$ ls -l /home/speedtest/bin/
total 17644
-rwxr-xr-x 1 speedtest speedtest 18044475 juin  16  2020 OoklaServer
-rw-r----- 1 speedtest speedtest        4 juin  20 16:06 OoklaServer.pid
-rw-r--r-- 1 speedtest speedtest     3897 juin  19 20:41 OoklaServer.properties
-rw-r--r-- 1 speedtest speedtest     3907 juin  16  2020 OoklaServer.properties.default
-rwxrwxr-x 1 speedtest speedtest     6708 août  15  2018 ooklaserver.sh

Je découvre aussi un /home/speedtest/bin/ooklaserver.sh qu'il ont eu la bonne idée de rajouter pour gérer le serveur.

Voici son contenu :
#!/bin/sh
# OoklaServer install and management script
BASE_DOWNLOAD_PATH='https://install.speedtest.net/ooklaserver/stable/'
INSTALL_DIR=''
DAEMON_FILE='OoklaServer'
PID_FILE="$DAEMON_FILE.pid"


display_usage() {
echo "This script can be used to install or control a Ookla Server."
echo  "Usage:"
echo  "$0 [-f|--force] [-i|--installdir <dir>] command"
echo  ""
echo  "  Valid commands: install, start, stop, restart"
echo  "   install - downloads and installs the Ookla server"
echo  "   start   - starts the server if not running"
echo  "   stop    - stops the server if running"
echo  "   restart - stops the server if running, and restarts it"
echo  " "
echo  "  -f|--force           Do not prompt before install"
echo  "  -i|--install <dir>   Install to specified folder instead of the current folder"
echo  "  -h|--help            This help"
echo  ""
}

has_command() {
type "$1" >/dev/null 2>&1
}

detect_platform() {
# detect operating system
case $( uname -s ) in
Darwin)
server_package='macosx'
;;
Linux)
server_package='linux32'
arch=`uname -m`
if [ "$arch" = "x86_64" ]; then
server_package='linux64'
fi
;;
FreeBSD)
server_package='freebsd32'
arch=`uname -m`
if [ "$arch" = "amd64" ]; then
server_package='freebsd64'
fi
;;
*)
echo "Please Select the server Platform : "
echo "1) macOS"
echo "2) Linux (32bit)"
echo "3) Linux (64bit)"
echo "4) FreeBSD (32bit)"
echo "5) FreeBSD (64bit)"

read n
case $n in
1) server_package='macosx';;
2) server_package='linux32';;
3) server_package='linux64';;
4) server_package='freebsd32';;
5) server_package='freebsd64';;
esac
esac

echo "Server Platform is $server_package"
}

confirm_install() {
if [ "$INSTALL_DIR" != "" ]; then
printf "This will install the Ookla server for $server_package to folder $INSTALL_DIR. Please confirm (y/n) > "
else
printf "This will install the Ookla server for $server_package to the current folder. Please confirm (y/n) > "
fi
    read response
    if [ "$response" != "y" ]; then
echo "Exiting program."
exit 1
   fi
}

goto_speedtest_folder() {
# determine if base install folder exists
dir_full=`pwd`
dir_base=`basename $dir_full`

echo "Checking Directory Structure"
if [ "$INSTALL_DIR" != "" ]; then
if [ "$dir_base" != "$INSTALL_DIR" ]; then
if [ ! -d "$INSTALL_DIR" ]; then
mkdir "$INSTALL_DIR"
scriptname=`basename $0`
# copy script to folder
cp "$scriptname" "$INSTALL_DIR"
fi

cd "$INSTALL_DIR"
fi
fi
}

download_install() {
# download the v3 server files with either wget or curl or fetch
gzip_download_file="OoklaServer-$server_package.tgz"
gzip_download_url="$BASE_DOWNLOAD_PATH$gzip_download_file"

curl_path=`command -v curl`
wget_path=`command -v wget`
fetch_path=`command -v fetch`

echo "Downloading Server Files"
if [ -n "$curl_path" ]; then
curl -O $gzip_download_url

elif [ -n "$wget_path" ]; then
wget "$gzip_download_url" -O "$gzip_download_file"

elif [ -n "$fetch_path" ]; then
# fetch is found in base OS in FreeBSD
fetch -o "$gzip_download_file" "$gzip_download_url"
else
echo "This script requires CURL or WGET or FETCH"
exit 1
fi

# extract package
if [ -f "$gzip_download_file" ]; then
echo "Extracting Server Files"
tar -zxovf "$gzip_download_file"
rm "$gzip_download_file"
if [ ! -f "${DAEMON_FILE}.properties" ]; then
cp "${DAEMON_FILE}.properties.default" "${DAEMON_FILE}.properties"
fi
else
echo "Error download server package"
exit 1
fi

}

restart_if_running() {
stop_if_running
start
}

stop_process() {
daemon_pid="$1"
printf "Stopping $DAEMON_FILE Daemon ($daemon_pid)"
kill "$daemon_pid" >/dev/null 2>&1
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
if kill -0 "$daemon_pid" >/dev/null 2>&1 ; then
sleep 1
printf " ."
else
break
fi
done
echo ""
}

stop_if_running() {
if [ -f "$PID_FILE" ]; then
daemon_pid=`cat $PID_FILE`
if [ $daemon_pid ]; then
stop_process "$daemon_pid"
if has_command pgrep; then
pids=$(pgrep OoklaServer 2>&1)
if [ -n "$pids" ]; then
echo "Additional $DAEMON_FILE processes running; stopping"
for daemon_pid in $pids; do
stop_process "$daemon_pid"
done
pids=$(pgrep OoklaServer 2>&1)
if [ -n "$pids" ]; then
echo "Lingering $DAEMON_FILE processes running; killing ($pids)"
kill -9 $pids
fi
fi
fi
fi
fi
}

start_if_not_running() {
if [ -f "$PID_FILE" ]; then
daemon_pid=`cat $PID_FILE`
if [ $daemon_pid ]; then
if kill -0 "$daemon_pid" > /dev/null 2>&1 ; then
echo "$DAEMON_FILE ($daemon_pid) is already running"
exit 1
fi
fi
fi
start
}

start() {
printf "Starting $DAEMON_FILE"
dir_full=`pwd`
if [ -f "$DAEMON_FILE" ]; then
chmod +x "$DAEMON_FILE"
daemon_cmd="./$DAEMON_FILE --daemon --pidfile=$dir_full/$PID_FILE"
# echo "$daemon_cmd"
`$daemon_cmd`
else
echo ""
echo "Daemon not installed. Please run install first."
exit 1
fi

# wait for PID file to be created and verify daemon started

for i in 1 2 3 4 5 6 7 8 9 10; do
sleep 1
if [ -f "$PID_FILE" ]; then break; fi
printf " ."
done
echo ""
    if [ -f "$PID_FILE" ]; then
daemon_pid=`cat $PID_FILE`
echo "Daemon Started ($daemon_pid)"
else
echo "Failed to Start Daemon"
fi
}

##### Main

prompt=1
action=help
while [ "$1" != "" ]; do
    case $1 in
install ) action=install
;;
stop ) action=stop
;;
start ) action=start
;;
restart ) action=restart
;;
help ) action=help
;;
        -i | --installdir )        shift
                                INSTALL_DIR=$1
                                ;;
        -f | --force )    prompt=0
                                ;;
        -h | --help )           display_usage
                                exit
                                ;;
        * )                     display_usage
                                exit 1
    esac
    shift
done

if [ "$action" = "restart" ]; then
restart_if_running
fi

if [ "$action" = "start" ]; then
start_if_not_running
fi

if [ "$action" = "stop" ]; then
stop_if_running
fi


if [ "$action" = "help" ]; then
display_usage
fi

if [ "$action" = "install" ]; then
detect_platform
if [ "$prompt" = "1" ]; then
confirm_install
fi

goto_speedtest_folder

download_install

restart_if_running

echo "NOTE:"
echo ""
echo "We strongly recommend following instructions at"
echo ""
echo "   https://www.ookla.com/support/a87011938/"
echo ""
echo "to ensure your daemon starts automatically when the system reboots"
echo ""
fi

kgersen

  • Modérateur
  • Abonné Free Pro
  • *
  • Messages: 8 261
  • Paris (75)
Comprendre d'où vient l'erreur "Failed unmounting /home"
« Réponse #11 le: 21 juin 2021 à 10:15:13 »
L'inconvient de mettre le fichier pid a cet endroit est qu'en cas de reboot violent du serveur ce fichier n'est pas supprimé ce qui pourrait empêcher le service de démarrer.

Il faudrait tester si la présence du fichier pid avant le lancement du programme gene ou pas.

L'avantage de /run est qu'il n'est pas permanent et ne survie pas a un reboot donc le fichier pid est supprimé meme en cas de reboot violent (coupure électrique par exemple).

essai plutôt avec le dossier /run/user/xxxxx (ou xxxx est le résultat de 'id -u speedtest').