ISO Library für XenServer erstellen

Habe ich seit Jahren eine wunderbare ISO Library mit etlichen ISO Images verschiedenster Hersteller in beiden Bit-Tiefen, in mehreren Sprachen? Klar! Wer nicht? Um hier noch den Überblick zu behalten habe ich natürlich Verzeichnisse und Unterverzeichnisse angelegt, eine typische Struktur einer ISO Library sieht also wie folgt aus:

  • Microsoft
    • Windows
      • XP
      • Vista
      • 7
        • EN
          • 32
          • 64
        • DE
          • 32
          • 64
  • Citrix
    • XenApp
      • 4
      • 4.5
      • 5
      • 6
      • 7
    • XenDesktop
    • XenServer
  • Other
Vielleicht auch tiefer, umfangreicher - wie auch immer. Wie importiere ich so eine ISO Library zum XenServer? XenServer erwartet eine CIFS/NFS Share, interessiert sich jedoch nur für das erste Level, die "Root" der Share. XenServer unterstützt auch Deep-Links, also anstelle von file://fileserver/freigabe könnte ich auch auf file://fileserver/freigabe/verzeichnis verweisen. Ich könnte auch noch prima mit zwei XenServer ISO Libraries leben, Microsoft und Citrix. Aber will ich für jedes Verzeichnis (Citrix\XenApp\5\32bit\DE) ein eigenes SR erstellen? Bestimmt nicht.

Was viele Leute nun tun, ist die CDs aus den Unterverzeichnissen der Library in die Root zu kopieren, damit XenServer die ISOs sieht. Oder direkt ganz woanders eine neue Library nur für XenServer zu erstellen. Inakzeptabel. Laaaaaangweilig.
Sofern die bestehende ISO Library auf NTFS basiert könnten wir doch auch Hardlinks erstellen - so würde jedes ISO File zweimal auftauchen (am Originalen Ort in einem Unterverzeichnis und in der Root der Share) - allerdings ohne zweimal den Speicherplatz zu belegen. Hardlinks sind ja lediglich Zeiger auf einen Inhalt im Dateisystem. Wird mein ISO halt von zwei Seiten ansprechbar :-)
Ich habe in einigen Kursen Teilnehmer auf diese Möglichkeit hingewiesen - stets in der Hoffnung jemanden zu treffen, dessen Skriptfähigkeiten ausreichen, um so einen ISOlinker "mal eben" zu erstellen. Fehlanzeige. Hier in Stuttgart fiel mir dann auf, dass ich mit dieser Strategie nun seit fast einem Jahr nicht erfolgreich war - das Skript fehlte mir noch immer.
Getrieben von der jüngst entdeckten Leidenschaft, kleine Hilfen vor allem für meine CCI-Kollegen (aber auch für ADN Kunden und prinzipiell jeden, der Spass daran hat) zu realisieren, habe ich mir im Hotelzimmer nun die Zeit dafür genommen.

Das Skript sollte als Admin gestartet werden und benutzt für das Verlinken den Win7/Win2008 internen Befehl mklink.exe. Ein Startverzeichnis ist anzugeben. Alle ISO Files unterhalb dieses Verzeichnisses werden dann im anzugebenen Quellverzeichnis als Hardlink erstellt. Dabei wird die Ordnerstruktur des jeweiligen ISO Files verwendet, um daraus den Dateinamen zu bilden (weniger Konflikte, bessere Lesbarkeit und Zuordnung).
Quell- und Zielpfad müssen auf der gleichen Partition liegen.

Hier ist das Skript, copy & paste fertig - just add water:


@echo off
rem ### contact daniel.wipperfuerth@adn.de for info / improvements.
echo ######
echo ### script to crawl recursively through your ISO file library
echo ### and linking each found ISO file to a specified directory.
echo ### Pathnames will be used to give the created hardlinks a
echo ### meaningful name - at least if your folders had meaningful names.
echo ### BE SURE YOU UNDERSTAND WHAT THIS SKRIPT IS DOING BEFORE RUNNING IT
echo ######

rem ### Declaring variables - you should customize these
setlocal
rem ### src specifies the starting path - where are all your isos located?
rem ### dst specifies the root of the share that you want XenServer to use
rem ### as ISO Storage Repository (CIFS/NFS).
rem ### bear in mind that src and dst have to be on the same partition.
set src=c:\testlab\_isolinker\lurch
set dst=c:\testlab\_isolinker\share

rem ### SECTION ONE - gathering info
rem ### do the directories exist at all? I will check.
if not exist "%src%" goto :nosrc
if not exist "%dst%" goto :nodst
rem ### main loop - find isos using recursion of dst path
for /F "usebackq delims=/" %%n in (`dir /a:-d /b /s %src%\*.iso`) do call :linkerbell "%%n" %src% %dst%
goto :end

rem ### SECTION TWO - prepare the parameters for the link-command
rem ### process the found isos
:linkerbell
set foundisofile=%1
rem ### filter out the empty line returned by the dir command
if not defined foundisofile goto :EoF
set srcpath=%2
set dstpath=%3

rem ### shorten path, subtract src from found iso path
call set isofile=%%foundisofile:*%srcpath%\=%%

rem ### SECTION THREE - link files like there was no tomorrow
rem ### replace backslashes with underscores for readability
call set isofile2=%isofile:\=_%
mklink /h "%dstpath%\%isofile2% %foundisofile%

goto :EoF

goto :end
rem ### different endings to our wonderful story
:nosrc
echo Your so called source directory has been stolen - get a new one.
echo The directory i did not find was: %src%
goto :end
:nodst
echo The destination directory smells like teen spirit - get a new one.
echo The directory i did not find was: %dst%
goto :end
rem ### cleaning up
:end
endlocal
pause

Kommentare

Beliebte Posts aus diesem Blog

Auf NFS Shares mit Windows zugreifen

Citrix Default Passwords

XenServer mit Software-Raid einrichten