Als ich in letzter Zeit malwieder zwei Freistunden hatte, hab ich unser Terminalserver missbraucht, um einen (kleinen) Blender Cluster mit etwa 100 Nodes zu bauen. Dies Alles basiert auf den tollen Post von EisFrei auf http://blog.netzpfa.de/2008/03/26/blender-renderfarm-unter-linux-aufsetzen/
Vorraussetzungen:
- Ubuntu oder Debian System
- funktionierender LTSP Dienst (http://wiki.ubuntuusers.de/LTSP)
- einige freie Rechner/Server, mit 100MBit, am besten 1GBit Netzwerkanschluss
- ein paar grundlegende Linux Kentnisse (falls ihr irgendwas nicht versteht im ubuntuuser Wiki nachgucken)
Erstmal etwas Theorie, wie funktioniert ein solcher (einfacher) Cluster überhaupt?
Zuerst sollte man wissen, dass es in diesem einen Main Server und viele Nodes gibt. Die Nodes können beliebig eingehangen werden und booten über LTSP.
Jeder Node greift beim Booten automatisch auf die Freigabe zu, die bei dem Main Server liegt und bindet ein Ordner in sein Dateisystem ein. (über NFS)
Auf jedem Node liegt ein Programm, das vollkommen parallel zu den anderen Nodes Bilder aus der .blend Datei erstellt und diese abspeichert. Das rendern der Bilder wird dadurch parallelisiert, dass jeder Frame in Unterbilder unterteilt wird, die von jedem Node erstellt werden und nachher zusammengeschnitten werden (http://www.youtube.com/watch?v=4VUWrZRCtI8 ab 1:30 wirds unintressant)
So jetzt genug Theorie, kommen wir zur Praxis:
Zuerst müssen wir die Freigabe von unserem Mainserver erstellen:
mkdir /usr/local/share/blender/ vim /etc/exports
folgenden Eintrag hinzufügen (Achtung dies ermöglicht allen Clients im Netzwerk auf eure Festplatte zu schreiben und sollte deswegen nur in vertraulichen oder abgeschotteten gemacht werden) :
/usr/local/share/blender *(rw,no_root_squash,async,no_subtree_check)
und startet den Dienst neu:
/etc/init.d/nfs-kernel-server restart
Als nächstes legt man die Dateien render.py in die Blender Freigabe (Link steht oben) und auch eine Test Datei zum Rendern.
Wenn ihr dies gemacht habt, kann man mit der Modifikation des Image anfangen (ich gehe jetzt mal von einem 32bit Image aus, sonst einfach i386 immer durch amd64 ersetzten)
Zuerst erstellt ihr in /opt/ltsp/i386/usr/share/ltsp/screen.d/ die Datei render, mit folgendem Inhalt:
#!/bin/bash if [ "True" != "$LTSP_CONFIG" ]; then . usr/share/ltsp/ltsp_config fi # chvt to the right screen [ -n "${SCREEN_NUM}" ] && openvt chvt ${SCREEN_NUM} # Clear the screen, to place cursor at the top clear if [ -z `ls / | grep blender` ]; then echo "Fatal Error: NFS Share funktioniert nicht! /blend ist nicht gemountet!"; sleep 100; fi htop & #in den Ordner wechseln cd /blender; #Prozessor Anzahl ermitteln proc=$(cat /proc/cpuinfo | grep processor | wc -l) #Pro Prozessor zwei Prozesse starten proc=$[proc*2]; while [ 1 ] do #Blender Datei ermitteln blend_data=$(ls /blender | grep .blend| head -n 1); #warten bis die Datei zum starten des Rendern erstellt wurde while [ `ls /blender| grep nowRender | wc -l` -le 1 ] do sleep 1; done #So lange durchlaufen bis alle Render Prozesse gestartet sind count=0 while [ $count -le $proc ] do nohup /usr/bin/blender -b $blend_data -P /usr/local/bin/render.py -a & count=$[$count+1] done #in 10 Sekunden muss nowRender wieder entfernt sein, da sonst die Prozess nochmal neu starten sleep 10; done
und sagen LTSP, dass er dieses Skript auf Screen 7 legen soll, in /opt/ltsp/i386/etc/lts.conf:
SCREEN_07=render
dann lassen wir ihn auf die Freigabe zugreifen:
mkdir /opt/ltsp/i386/blender vim /opt/ltsp/i386/etc/rc.local
mount <ip des main servers>:/usr/local/share/blender /blender
Die Modifikationen des Image ist fertig und nun kann dieses neu generiert werden:
ltsp-update-image --arch i386
Wenn man nun ein Terminal startet, dann erscheint htop und im hintergrund wird gewartet, dass mit dem Rendern begonnen wird.
Es muss die Blender Datei vorhanden sein und dann kann das Rendern mit erstellen der Datei nowRender gestartet werden (alles nach /usr/local/share/blender/)
touch /usr/local/share/blender/nowRender && sleep 2 && rm /usr/local/share/blender/nowRender
Man sollte nun sehen wie die Nodes ausgelastet werden und es sollten Bilder in dem Ordner erscheinen.
Nachdem sich die Prozesse auf den Nodes beendet haben, erstellt man in /usr/local/share/blender/blender/ die Datei merge.pl, die Sources findet man im Link oben und schneidet die Bilder mit:
./merge.pl
zusammen
Am Ende kann man die zusammengesetzte Bilder zu einem Video zusammenfügen:
mencoder "mf://projekt_fr_*.jpg" -mf fps=25 -o output.avi -ovc lavc -lavcopts vcodec=mpeg4