ich habe gestern versucht, ein neu installiertes Windows XP auf den aktuellen Stand zu bringen. Für den Download der Updates habe ich das Linux-Skript DownloadUpdates.sh in der Version 8.4 benutzt. Ich konnte den Fehler aber auch mit der aktuellen Version 8.6 verifizieren.
Die Betriebssystemauswahl und die weiteren Eingaben in der Konsole waren:
- Code: Select all
OS: 1, Windows XP
Sprache: b, deutsch
Servicepacks: y
.Net framwork: y
Microsoft Security Essentials: n
Windows Defender: n
Proxy: keiner
ISO-Image: n
Bei der Installation der Pakete unter Windows habe ich eine Fehlermeldung bei der Installation des .Net Frameworks 3.5 bekommen:
- Code: Select all
Checking .NET Framework 3.5 SP1 installation state...
Installing .NET Framework 3.5 SP1...
Verifying integrity of ..\dotnet\dotnetfx35.exe...
hashdeep.exe: Unable to load any matching files.
Try `hashdeep.exe -h` for more information.
ERROR: File hash does not match stored value (file: ..\dotnet\dotnetfx35.exe).
ERROR: Installation of ..\dotnet\dotnetfx35.exe failed (errorlevel: ).
Warning: .NET Framework 3.5 SP1 Language Pack installation file (..\dotnet\x86-glb\dotnetfx35langpack_x86de*.exe) not found.
Warning: Update kb958481 not found.
Warning: Update kb958483 not found.
Warning: Update kb958484 not found.
Installation successful. Please reboot your system now and recall Update afterwards.
Die Installation ist bei meinen Versuchen zweimal an derselben Stelle abgebrochen. Obwohl offensichtlich ein Fehler aufgetreten ist und das .Net Framework 3.5 nicht installiert wurde, und auch keine weiteren Updates, hieß es am Ende "Installation successful". Das ist wahrscheinlich ein Bug im Installationsskript DoUpdate.cmd. Aber ich wollte mich ja auf die Linux-Seite konzentrieren...
Das Problem war offenbar die Integritätsprüfung bei der Installation. Nachdem ich die Integritätsprüfung deaktiviert hatte, konnte ich auch das .Net Framework 3.5 ohne Fehlermeldungen installieren.
Tatsächlich enthält der Ordner "client/dotnet" fünf Exe-Dateien für die Frameworks 3.5, 4.0 und 4.5:
- Code: Select all
dotnetfx35.exe
dotNetFx40_Full_x86_x64.exe
dotNetFx40LP_Full_x86_x64de.exe
dotnetfx45_full_x86_x64.exe
dotNetFx45LP_Full_x86_x64de.exe
Die Datei client/md/hashes-dotnet.txt enthält aber nur Hashwerte für die letzte dieser Dateien, während die Prüfsummen für die ersten vier Dateien fehlen.
Der Fehler muss im Shellskript DownloadUpdates.sh liegen, in diesem Block ab Zeile 843:
- Code: Select all
echo "Creating integrity database for .Net ..."
cd ../client/bin
for Datei in ../dotnet/*.exe
do
test -s "$Datei" && \
hashdeep -c md5,sha1,sha256 -l "$Datei" | tr '/' '\\' > ../md/hashes-dotnet.txt
done
cd "$PATH_PWD"
Nun gibt es einen feinen Unterschied zwischen "Redirecting Output" (>) und "Appending Redirected Output" (>>). So wie es aussieht, wird die Datei hashes-dotnet.txt in der for-Schleife viermal auf Null zurückgesetzt.
Als einfachen Patch könnte man schreiben:
- Code: Select all
echo "Creating integrity database for .Net ..."
cd ../client/bin
rm --force ../md/hashes-dotnet.txt
for Datei in ../dotnet/*.exe
do
test -s "$Datei" && \
hashdeep -c md5,sha1,sha256 -l "$Datei" | tr '/' '\\' >> ../md/hashes-dotnet.txt
done
cd "$PATH_PWD"
Oder, wenn die Idee ist, auf leere Dateien zu testen und diese zu überspringen, dann kann man diese leeren Dateien auch gleich ganz löschen:
- Code: Select all
echo "Creating integrity database for .Net ..."
cd ../client/bin
for Datei in ../dotnet/*.exe
do
test -s "$Datei" || rm "$Datei"
done
hashdeep -c md5,sha1,sha256 -l ../dotnet/*.exe | tr '/' '\\' > ../md/hashes-dotnet.txt
cd "$PATH_PWD"
Ausserdem scheint der Ordnername "client/dotnet/x86-deu" falsch zu sein. Erwartet wird im Skript eher "client/dotnet/x86-glb", sodass das deutsche Languagepack nicht gefunden wird (siehe Fehlermeldung oben). Die Datei client/md/hashes-dotnet-x86-glb.txt ist ganz leer (0 Bytes). Oder vielleicht sollten es tatsächlich zwei getrennte Ordner sein?
Als Fix habe ich einmal einen symbolischen Link im Verzeichnis client/dotnet/ erstellt:
- Code: Select all
ln -s x86-deu x86-glb
Nach dem nächsten Aufruf von DownloadUpdates.sh hatte die Datei hashes-dotnet-x86-glb.txt nun eine Größe von 19,4 KB.
Leider unterstützt Windows XP keine symbolischen Links (Windows Vista angeblich schon). Ich musste den Ordner client\dotnet\x86-deu deshalb noch einmal nach client\dotnet\x86-glb kopieren. Dann hatte der UpdateInstaller.exe aber noch einmal 15 zusätzliche Updates installiert, alle aus dem Verzeichnis client\dotnet\x86-glb.
Viele Grüße,
Hartmut Buhrmester