Débogage d'erreur de système VMs

Débogage d'une erreur "Java not running" sur une SSVM dans Apache CloudStack

Contexte

La Secondary Storage Virtual Machine (SSVM) dans Apache CloudStack gère les templates, ISOs, et snapshots. Lors de l'exécution du script /usr/local/cloud/systemvm/ssvm-check.sh, une erreur "Java not running" indique que le processus Java du CloudStack Agent ne fonctionne pas correctement. Ce guide détaille les étapes que j'ai suivi pour diagnostiquer et résoudre ce problème, basées sur une session de débogage réelle.

Prérequis

  • Accès root à la SSVM via SSH ou console : ssh sur l'ip de la link locale par clé dans le .ssh de root : ssh -i /root/.ssh/id_rsa.cloud 169.254.237.213 -p 3922

  • Interface d'administration CloudStack pour vérifier l'état des System VMs.

  • Connaissance de l'adresse IP du management server (par exemple, 192.168.1.30:8250).

  • Accès au stockage NFS configuré pour la SSVM.

Erreurs spécifiques que j'ai rencontrées

  • Problèmes DNS : Les System VMs (SSVM et Console Proxy) ne résolvaient pas correctement les noms DNS des nœuds et des hôtes KVM en raison d'un préfixe de domaine de recherche (domain.tld) manquant dans /etc/resolv.conf.

  • Processus Java non exécuté : Le processus Java nécessaire au fonctionnement du CloudStack Agent ne tournait pas, provoquant l'erreur "Java not running".

  • Scripts d'exécution manquants : Les scripts d'exécution dans /usr/local/cloud/systemvm/ pour le service cloud-early-config.service étaient absents, empêchant le démarrage correct de l'agent.

  • Problème avec cloud-agent.zip : Le fichier cloud-agent.zip était corrompu ou non synchronisé, empêchant l'agent CloudStack de répondre correctement.

Étapes de diagnostic et de résolution

1. Vérification initiale de l'environnement

Vérifiez l'état général du système pour identifier les problèmes de base.

a) Vérification de l'espace disque

df -h

Assurez-vous que le système de fichiers n'est pas plein, ce qui pourrait empêcher le démarrage des services.

b) Exploration des fichiers système

Listez les fichiers et scripts pertinents dans le répertoire de la SSVM :

ls /usr/local/cloud/systemvm/
find /usr/local/cloud/systemvm/ -name *.sh

Localisez le script ssvm-check.sh pour analyse ultérieure.

ssvm-check.sh
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.


# Health check script for the Secondary Storage VM

# DNS server is specified.


CMDLINE=/var/cache/cloud/cmdline
for i in `cat $CMDLINE`
do
   key=`echo $i | cut -d= -f1`
   value=`echo $i | cut -d= -f2`
   case $key in
      host)
         MGMTSERVER=$value
         ;;
   esac
done

isCifs() {
 mount | grep "type cifs" > /dev/null
 echo $?
}

# ping dns server
echo ================================================
DNSSERVER=`egrep '^nameserver' /etc/resolv.conf  | awk '{print $2}'| head -1`
echo "First DNS server is " $DNSSERVER
ping -c 2  $DNSSERVER
if [ $? -eq 0 ]
then
    echo "Good: Can ping DNS server"
else
    echo "WARNING: cannot ping DNS server"
    echo "route follows"
    route -n
fi


# check dns resolve
echo ================================================
nslookup cloudstack.apache.org 1> /tmp/dns 2>&1
grep 'no servers could' /tmp/dns 1> /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "ERROR: DNS not resolving cloudstack.apache.org"
    echo resolv.conf follows
    cat /etc/resolv.conf
    exit 2
else
    echo "Good: DNS resolves cloudstack.apache.org"
fi


# check to see if we have the NFS volume mounted
echo ================================================
storage="cifs"
if [ $(isCifs) -ne 0 ] ;
 then
   storage="nfs"
fi

mount|grep -v sunrpc|grep -v rpc_pipefs|grep $storage 1> /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "$storage is currently mounted"
    # check for write access
    for MOUNTPT in `mount|grep -v sunrpc|grep -v rpc_pipefs|grep $storage| awk '{print $3}'`
    do
        if [ $MOUNTPT != "/proc/xen" ] # mounted by xen
        then
            echo Mount point is $MOUNTPT
            touch $MOUNTPT/foo
            if [ $? -eq 0 ]
            then
                echo "Good: Can write to mount point"
                rm $MOUNTPT/foo
            else
                echo "ERROR: Cannot write to mount point"
                echo "You need to export with norootsquash"
            fi
        fi
     done
else
    echo "ERROR: Storage $storage is not currently mounted"
    echo "Verifying if we can at least ping the storage"
    STORAGE_ADDRESSES=`grep "secondaryStorageServerAddress" $CMDLINE | sed -E 's/.*secondaryStorageServerAddress=([^ ]*).*/\1/g'`

    if [[ -z "$STORAGE_ADDRESSES" ]]
    then
      STORAGE_NETWORK_GATEWAY=`grep "storagegateway" $CMDLINE | sed -E 's/.*storagegateway=([^ ]*).*/\1/g'`
      echo "Storage address list is empty, trying to ping storage network gateway instead ($STORAGE_NETWORK_GATEWAY)"
      ping -c 2  $STORAGE_NETWORK_GATEWAY
      if [ $? -eq 0 ]
      then
        echo "Good: Can ping $storage storage network gateway"
      else
        echo "WARNING: Cannot ping $storage storage network gateway"
        echo routing table follows
        route -n
      fi
    else
      echo "Storage address(s): $STORAGE_ADDRESSES, trying to ping"
      STORAGE_ADDRESS_LIST=$(echo $STORAGE_ADDRESSES | tr "," "\n")
      for STORAGE_ADDRESS in $STORAGE_ADDRESS_LIST
      do
        echo "Pinging storage address: $STORAGE_ADDRESS"
        ping -c 2  $STORAGE_ADDRESS
        if [ $? -eq 0 ]
        then
          echo "Good: Can ping $storage storage address"
        else
          echo "WARNING: Cannot ping $storage storage address"
          echo routing table follows
          route -n
        fi
      done
    fi

fi


# check for connectivity to the management server
echo ================================================
echo Management server is $MGMTSERVER.  Checking connectivity.
IFS=',' read -r -a hosts <<< "$MGMTSERVER"
for host in "${hosts[@]}"
do
    socatout=$(echo | socat - TCP:$host:8250,connect-timeout=3 | tr -d '\0' 2>&1)
    if [ $? -eq 0 ]
    then
        echo "Good: Can connect to management server $host port 8250"
    else
        echo "ERROR: Cannot connect to $host port 8250"
        echo $socatout
        exit 4
    fi
done


# check for the java process running
echo ================================================
ps -eaf|grep -v grep|grep java 1> /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "Good: Java process is running"
else
    echo "ERROR: Java process not running.  Try restarting the SSVM."
    exit 3
fi

echo ================================================
echo Tests Complete. Look for ERROR or WARNING above.

exit 0

c) Vérification de la connectivité réseau

Vérifiez la configuration réseau et la connectivité avec le management server :

ip a
ping 1.1.1.1
ping 192.168.1.30
telnet 192.168.1.30 8250

Confirmez que la SSVM peut atteindre le management server sur le port 8250.

2. Diagnostic du problème Java

Analysez l'état de Java et du CloudStack Agent.

a) Vérification de l'installation de Java

Vérifiez si Java est installé et accessible :

java -version
which java

Attendez-vous à voir une version comme OpenJDK 17 avec cloudstack 4.20. Si Java est absent, installez-le :

apt update
apt install openjdk-17-jre -y

b) Vérification des processus Java

Vérifiez si un processus Java est en cours d'exécution :

ps -aux | grep java
ps -eaf | grep -v grep | grep java

Si aucun processus Java n'est trouvé, le CloudStack Agent ne fonctionne pas.

c) Inspection du script ssvm-check.sh

Analysez le script pour comprendre comment il détecte l'erreur :

grep -i java /usr/local/cloud/systemvm/ssvm-check.sh

Le script vérifie probablement la présence d'un processus Java spécifique.

3. Correction des problèmes de montage NFS

Le stockage secondaire doit être correctement monté pour que la SSVM fonctionne.

a) Configuration du montage NFS

Ajoutez une entrée NFS dans /etc/fstab :

mkdir /mnt/secondary
echo "nfs.skyfik.lan:/mnt/pool-01/cloudstack_secondary_strg-az-1 /mnt/secondary nfs defaults 0 0" >> /etc/fstab
systemctl daemon-reload
mount -a
df -h

Vérifiez que le montage est réussi avec df -h.

4. Configuration de l'environnement Java

Assurez-vous que Java est correctement configuré.

a) Définition de JAVA_HOME

Vérifiez et configurez la variable JAVA_HOME :

echo $JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk" >> /etc/environment
source /etc/environment
echo $JAVA_HOME

5. Réparation du CloudStack Agent

Réparez les fichiers et services du CloudStack Agent.

a) Analyse des journaux

Vérifiez les journaux pour identifier les erreurs :

cat /var/log/cloud.log
cat /var/log/cloudstack/agent/agent.log

b) Mise à jour des fichiers de l'agent

Extrayez et remplacez les fichiers de l'agent :

find / -name cloudstack-agent.jar
ls -l /var/cache/cloud/agent.zip
mkdir /tmp/agent
unzip /var/cache/cloud/agent.zip -d /tmp/agent
cp -r /tmp/agent/* /usr/local/cloud/systemvm/
ls -l /usr/local/cloud/systemvm/cloud-agent-4.20.0.0.jar

c) Configuration des permissions

Ajustez les permissions des fichiers critiques :

chmod 555 /usr/local/cloud/systemvm/ssvm-check.sh
mkdir -p /etc/cloudstack/agent
cp /usr/local/cloud/systemvm/conf/agent.properties /etc/cloudstack/agent/
chmod 644 /etc/cloudstack/agent/agent.properties

6. Résolution des problèmes DNS et hôtes

Assurez-vous que la résolution de noms fonctionne correctement.

a) Configuration de /etc/hosts

Ajoutez des entrées pour résoudre les noms locaux :

echo "127.0.0.1 localhost s-53-VM" | tee -a /etc/hosts
echo "192.168.1.185 s-53-VM" | tee -a /etc/hosts
cat /etc/hosts

b) Configuration DNS

Ajoutez un domaine de recherche DNS :

echo "search skyfik.lan" >> /etc/resolv.conf
nslookup s-53-VM 192.168.1.3
ping s-53-VM

7. Redémarrage des services

Appliquez les modifications et redémarrez les services.

a) Redémarrage du service CloudStack

Redémarrez le service cloud-early-config :

systemctl daemon-reload
systemctl restart cloud-early-config.service
systemctl status cloud-early-config.service

b) Exécution manuelle de l'agent

Supprimez un fichier PID obsolète et lancez l'agent manuellement :

rm -f /var/run/agent.SecStorage.pid
cd /usr/local/cloud/systemvm
nohup ./_run.sh &

8. Vérification finale

Validez que le problème est résolu.

a) Exécution du script ssvm-check.sh

/usr/local/cloud/systemvm/ssvm-check.sh

Vérifiez que l'erreur "Java not running" ne se produit plus.

b) Surveillance des journaux

Surveillez les journaux en temps réel :

tail -f /var/log/cloud.log

Confirmez que l'agent fonctionne sans erreurs.

Résolution

L'erreur "Java not running" a été résolue en :

  1. Configurant correctement JAVA_HOME.

  2. Montant le stockage NFS.

  3. Mettant à jour les fichiers du CloudStack Agent.

  4. Corrigeant la résolution DNS via /etc/hosts et /etc/resolv.conf.

  5. Redémarrant les services et exécutant _run.sh manuellement.

Bonnes pratiques

  • Surveillez régulièrement l'espace disque avec df -h.

  • Vérifiez que JAVA_HOME est défini dans /etc/environment.

  • Assurez-vous que les fichiers de l'agent sont synchronisés avec le management server.

  • Configurez correctement le DNS pour éviter les problèmes de résolution.

  • Consultez les journaux (/var/log/cloud.log, /var/log/cloudstack/agent/agent.log) pour un diagnostic rapide.

Last updated

Was this helpful?