Le serveur démarre mais reste bloqué sur le logo Windows
Il peut arriver que le redémarrage d’un serveur Windows Server 2003 ne fonctionne pas comme il le faudrait.
Divers symptômes peuvent apparaître dont celui de l’écran noir avec le logo Windows et la barre de progression qui tourne en boucle avec parfois un cursor qui clignote en haut à gauche de l’écran.
Après avoir essayé tous les modes de démarrage proposé par Windows (mode sans échec, avec ou sans réseau, mode VGA, …), le serveur ne parvient toujours pas à démarrer.
Quelques fiches techniques traitent de ce dysfontionnement :
- KB325375 - How to troubleshoot startup problems in Windows Server 2003
- KB244905 - How to Disable a Service or Device that Prevents Windows from Booting
- KB316434 - How to perform advanced clean-boot troubleshooting in Windows XP
- KB199175 - Situations in Which Windows May Not Start in Safe Mode
Processus de démarrage
Tout d’abord, il est intéressant de connaître le méchanisme de démarrage de Windows que l’on peut découper en cinq phases (il y en a quatre mais j’ai découpé la première en deux).
Je les ai décrites ci-après de manière très succinte mais suffisament pour identifier quel composant impliquer lors d’un problème de démarrage.
La première étape est purement matérielle et est connue sous l’appellation P.O.S.T. (Power On Self Test). Cette phase consiste à effectuer des vérification au niveau de la carte mère, du CPU, etc…
Cette étape est “software agnostic”.
A cette étape, le BIOS va tenter d’accéder au premier périphérique de démarrage comme spécifié dans les options du BIOS afin d’y trouver le premier secteur du disque afin de vérifier la présence du MBR (Master Boot Record). Le MBR étant identifié, il s’agit de lire le Boot Sector de la partition active.
A cet instant, le Boot Sector de la partition active va se charger et chercher NTLDR pour l’exécuter.
NTLDR se charge et bascule le mode d’exécution du processeur du mode réel en mode 32 bit puis il charge le mini driver NTFS contenu dans son code.
Le fichier BOOT.INI est lu afin de lister les options de démarrage qui seront affichée à l’écran (si plus d’une option sont présentes dans le BOOT.INI).
Le démarrage commence par le chargement de NTDETECT.COM qui va énumérer tout les périphériques supportés et les renvoyer à NTLDR.
NTLDR va alors charger NTOSKRNL.EXE et HAL.DLL en mémoire puis charger la ruche SYSTEM de la base de registre en mémoire afin de construire la branche HKLM\System\CurrentControlSet.
NTLDR lit la clé HKLM\System\Select\Current afin de déterminer quel version de CurrentControlSet il doit utiliser.
NTLDR copie alors la branche CurrentControlSet sélectionnée dans HKLM\System\CurrentControlSet.
NTLDR énumère la branche HKLM\System\CurrentControlSet\Services pour identifier les drivers qui ont un statut de démarrage à 0x0 afin de les charger en mémoire.
NTLDR exécute alors NTOSKRNL.EXE et lui passe la liste des périphériques identifiés par NTDETECT.COM et le contrôle du processus de démarrage.
Le kernel affiche le logo Windows et la barre de progression.
Le kernel créé la branche HKLM\Hardware avec les données qui lui ont été transmises par NTLDR.
Le kernel créé la branche HKLM\System\Clone à partir du contenu du CurrentControlSet sélectionné au démarrage.
Le kernel initialise les drivers ayant un statut de démarrage à 0xà identifiés par NTLDR.
Le kernel énumère la branche HKLM\System\CurrentControlSet\Services pour identifier les drivers qui ont un statut de démarrage à 0x1 afin de les charger en mémoire et les initialiser.
Le kernel exécute SMSS.EXE (Session Manager Subsystem).
SMSS.EXE démarre les autres subsystems et les services, vérifie si un ChkDsk doit être exécuté, initialise la base de registre, détermine et configure la configuration de pagination, et enfin charge CSRSS.EXE (Client/Server Run-time SubSystem ).
CSRSS.EXE initie Winlogon.
SMSS.EXE démarre les drivers ayant un statut de démarrage à 0x2.
WINLOGON.EXE exécute LSASS.EXE (Local Security Authority Subsystem) qui permet d’interroger la base SAM et/ou Active Directory.
WINLOGON.EXE affiche la fenêtre d’authentification (Ctrl+Alt+Del)
SERVICES.EXE (précédemment chargé par SMSS.EXE) identifie les services ayant un statut de démarrage à 0x2 n’étant pas encore chargé.
SERVICES.EXE va tenter de démarrer les drivers ayant un statut de démarrage à 0x3.
Pour le reste du processus de logon concernant l’authentification, ce n’est plus du ressort de l’équipe Core et je ne m’aventurerais pas sur ce terrain mais nous avons l’essentiel.
Plus de détails sur les deux premières phases sont disponibles ici :
Revenons à notre problème de démarrage. Nous pouvons sans trop nous avancer dire qu’il est situé dans l’étape assumée par le kernel.
Donc potentiellement, il peut y avoir plusieurs causes à ce problème et je vais tenter d’en aborder certaines :
- Partition système corrompue (impossibilité de charge les ruches de la base de registre car fichier inaccessible, …)
- Corruption de la base de registre
- Driver filtre défectueux ou ne fonctionnant pas correctment
- Disque physique défectueux
- …
De quoi a t’on besoin pour traiter ce problème ?
Les outils indispensables pour traiter ce type de problème :
- WinPE 2.1
- Un CD-ROM original Windows Server 2003 (de la même version que le serveur installé, i.e. SP1, SP2)
- Les drivers de la carte de stockage
- De la même architecture et pour la bonne version de l’image WinPE
- De la même architecture et pour la bonne version de la version installée de Windows
- Un logiciel permettant de graver les fichiers ISO (DVDBURN et CDBURN sont les seuls outils supportés par Microsoft pour graver des fichiers ISO bootables)
- Un lecteur de disquettes (USB ou intégré au serveur) et une disquette (comme quoi, vous avez eu raison de ne pas tout jeter à la benne !)
Il est tout a fait possible de se passer de WinPE mais il s’avère souvent qu’il est plus pratique de l’utiliser que la Recovery Console.
Création d’une image WinPE 2.1
- Télécharger et extraire les drivers de la carte de stockage (dans C:\Temp\Drv par exemple)
- Télécharger le WAIK (téléchargement)
- Lancer Windows PE Tools Command Prompt depuis Start | Programs | Microsoft Windows AIK
- Tapez les commandes suivantes :
- COPYPE x86 C:\Temp\WinPE_x86 –> création d’une structure de répertoires permettant de personnaliser une image WinPE
- IMAGEX /MOUNTRW C:\Temp\WinPE_x86\ISO\Sources\boot.wim 1 C:\Temp\WinPE_x86\Mount –> on monte l’image WinPE pour pouvoir la personnaliser
- PEIMG /INF:C:\Temp\Drv\driver.inf C:\Temp\WinPE_x86\Mount\Windows (où driver.inf représente le fichier .INF présent dans le package du driver) –> injection du driver de stockage
- IMAGEX /UNMOUNT C:\Temp\WinPE_x86\mount /COMMIT –> démontage de l’image WinPE avec prise en compte des modifications
- OSCDIMG –n –m –betfsboot.com C:\Temp\WinPE_x86\ISO C:\Temp\WinPE_x86\WinPE_x86.ISO –> création d’un fichier ISO bootable
- CDBURN D: C:\Temp\WinPE_x86\WinPE_x86.ISO –> gravure du fichier ISO
Méthode 1 – Vérification de la consistence du volume système
- Démarrer sur le CD gravé précédement
- A l’invite de commande, exécuter la commande suivante : CHKDSK C: /F /R
Un volume sain présentera le résultat suivant :
Dans le cas contraire, il sera présenté un certain nombre d’erreurs et le statut de Check Disk devrait indiquer ce qui a été corrigé ou non.
En fonction du nombre et de l’importance des erreurs, un redémarrage pourra être effectué afin de vérifier si le problème de démarrage survient toujours.
Si oui, passer à la méthode suivante.
Méthode 2 – Utilisation d’une copie antérieure de la base de registre
Après le premier logon suivant l’installation de Windows, une copie des ruches de la base de registre est effectuée dans le dossier C:\Windows\Repair.
Additionnellement, a chaque fois qu’une sauvegarde impliquant un System State complet est initiée, cette copie est effectuée.
L’idée ici est de démarrer Windows sur une version antérieure de la base de registre qui serait jugée fonctionnelle.
- Démarrer sur le CD gravé précédement
- A l’invite de commande :
- Aller dans C:\Windows\System32\Config
- Renommer les fichier SOFTWARE et SYSTEM en SOFTWARE.BCK et SYSTEM.BCK (ex: REN SOFTWARE SOFTWARE.BCK)
- Copier les fichiers SOFTWARE et SYSTEM présents dans C:\Windows\Repair dans C:\Windows\System32\Config (ex: COPY C:\Windows\Repair\SOFTWARE C:\Windows\System32\Config)
- Redémarrer le serveur
Si cela ne résoud pas le problème, effectuer le manipulation dans l’autre sens :
- Démarrer sur le CD gravé précédement
- A l’invite de commande :
- Aller dans C:\Windows\System32\Config
- Supprimer les fichier SOFTWARE et SYSTEM
- Renommer les fichier SOFTWARE.BCK et SYSTEM.BCK en SOFTWARE et SYSTEM (ex: REN SOFTWARE.BCK SOFTWARE)
Passer à la méthode suivante.
Méthode 3 – Désactivation de drivers filtre – méthode simple
Dans les modes de démarrage sans échec, un nombre limité de driver sont chargés en mémoire mais il se peut qu’une application ait modifié la liste initiale de ces drivers pour pouvoir être chargé dans tous les cas.
Un driver de stockage pourrait éventuellement avoir besoin d’être chargé même en mode sans échec.
Cette méthode consiste à désactiver les drivers filtres internant très tôt dans le processus de démarrage afin de vérifier s’ils interviennent dans le dysfonctionnement.
Elle a pour avantage de respecter les meilleures pratiques mais se révèle fastidieuse vu le nombre de drivers et services qui sont listés.
Il faut donc évaluer la complexité de cette méthode avec la méthode suivante (n’oublions pas que même en mode sans échec, le serveur ne démarre pas) qui permet d’identifier plus rapidement un driver posant potentiellement problème.
- Démarrer sur le CD originel de Windows Server 2003
- Si un driver de stockage est requis, insérer la disquette contenant les fichiers du driver de stockage pour Windows Server 2003 et appuyer sur F6 lorsque le setup le demande (attention : cette étape passe très vite)
- A l’affichage du premier écran, appuyer sur R
- Dans l’écran suivant, sélectionner l’installation à réparer et taper le mot de passe Administrateur local (attention clavier anglais sur installations Windows Server 2003 en anglais) :
- Aller dans C:\Windows\System32 et taper la commande : LISTSVC
- Une fois identifié les drivers à désactiver, taper la commande suivante pour chacun d’eux (ex: driver du clavier) : DISABLE Kbdclass
- Redémarrer le serveur
Si le serveur démarre, faire en sorte de réinstaller une version stable du ou des drivers qui ont été désactivés.
Sinon, suivre la procédure suivante.
Méthode 3 bis – Désactivation de drivers filtre du mode Safe Mode (Mode sans échec) – méthode avancée
Cette méthode a l’avantage de permettre l’identification d’un driver qui poserait problème dans une liste très réduite puis de le désactiver pour un démarrage normal.
Cependant, elle recquiert une certaine prudence car l’on manipule la base de registre. Donc, comme diraient certains : Use with caution ! En tout cas, avec l’aide d’un ingénieur support, vous ne vous poserez pas de questions.
- Démarrer sur le CD gravé précédement
- A l’invite de commande exécuter REGEDIT
- Charge la ruche SYSTEM du serveur dans Regedit:
- Sélectionner HKEY_LOCALE_MACHINE
- Menu File | Load Hive…
- Sélectionner le fichier C:\Windows\System32\Config\SYSTEM
- Cliquer sur Open
- Donner un nom temporaire a cette branche (ex: SSRV_SYSTEM)
- Aller dans HKLM\SRV_SYSTEM\Select et identifier la valeur de Current (cette valeur permet d’identifier dans quel ControlSet travailler)
- Aller dans HKLM\SRV_SYSTEM\ControlSetX\Control\SafeBoot\Minimal (ou X est la valeur identifiée précédement)
- Exporter toute la branche sélectionnée (sur le disque C:)
- Identifier les drivers qui pourraient être impliqués dans le problème de démarrage et supprimer la clé correspondante (ex: PCMCIA Adapter) :
- Sélectionner HKLM\System\SRV_SYSTEM
- Menu File | Unload Hive…
- Redémarrer le serveur en mode sans échec
Note : identifier les drivers Anti-Virus, gestionnaires de quota, filter drivers OEM, drivers de carte de stockage OEM, …
Si le serveur démarre, désactiver le ou les drivers de manière permanente depuis Device Manager :
Après le démarrage, faire en sorte de réinstaller une version stable du ou des drivers qui ont été désactivés.
Si le serveur ne démarre toujours pas… il ne reste que peu de solutions… très peu.
Suivre donc la méthode suivante.
Méthode 4 – Réparation de l’installation
- Démarrer sur le CD originel de Windows Server 2003
- Si un driver de stockage est requis, insérer la disquette contenant les fichiers du driver de stockage pour Windows Server 2003 et appuyer sur F6 lorsque le setup le demande (attention : cette étape passe très vite)
- A l’affichage du premier écran, appuyer sur ENTER
- Appuyer sur F8 pour accepter l’accord de licence
- A l’affichage de l’écran suivant, appuyer sur R :
- Le setup va alors entamer la réinstallation de Windows en préservant les paramètres existants
Note : munissez vous de la clé produit car lors des phases du setup en mode graphique un certain nombre d’informations, dont celle-ci, seront demandées.
Si la réparation ne permet toujours pas de démarrer le serveur… il n’y a plus qu’une solution…
Méthode 5 – Reinstallation et/ou restauration du système
Parfois il vaut mieux gagner du temps et rendre le service disponible plus rapidement en passant par une réinstallation de Windows suivi (dans le meilleur des cas) par une restauration éventuelle du système mais surtout des données.
Tout dépend de la complexité de la configuration du serveur et de sa criticité.
Guillaume
Windows Core Support Escalation Engineer