My static website generator using poole https://www.xythobuz.de
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

nas.de.html 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>IB-NAS6210 Linux - xythobuz.de</title>
  6. <meta name="description" content="Booting your own Linux on an Icybox NAS6210 box" />
  7. <meta name="keywords" content="xythobuz" />
  8. <link rel="author" href="/xythobuz@xythobuz.de">
  9. <link rel="shortcut icon" href="/img/favicon.ico">
  10. <script type="text/javascript" src="/js/sh_main.js"></script>
  11. <link type="text/css" rel="stylesheet" href="/css/sh_bright.min.css" />
  12. <link rel="stylesheet" href="/css/style.css" type="text/css" media="screen" />
  13. <link rel="alternate" type="application/rss+xml" title="Blog" href="/rss.xml">
  14. <link rel="stylesheet" href="/css/gh-fork-ribbon.css" />
  15. <link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
  16. <script type='text/javascript'>
  17. /* <![CDATA[ */
  18. (function() {
  19. var s = document.createElement('script');
  20. var t = document.getElementsByTagName('script')[0];
  21. s.type = 'text/javascript';
  22. s.async = true;
  23. s.src = '//api.flattr.com/js/0.6/load.js?mode=auto&uid=xythobuz&category=text';
  24. t.parentNode.insertBefore(s, t);
  25. })();
  26. /* ]]> */
  27. </script>
  28. </head>
  29. <body onload="sh_highlightDocument('/js/sh/', '.min.js');">
  30. <div id="header">
  31. <h1>xythobuz.de</h1>
  32. <h2>Kernel Hacking 101</h2>
  33. </div>
  34. <div id="lang"><span id="lang2">Translation:
  35. <a href='nas.de.html'>de</a> | <a href='nas.html'>en</a>
  36. </span></div>
  37. <div class="colmask leftmenu"><div class="colleft">
  38. <div class="content">
  39. <div id="flattr">
  40. <a class="FlattrButton" href="http://www.xythobuz.de/nas.de.html" title="IB-NAS6210 Linux">Booting your own Linux on an Icybox NAS6210 box</a>
  41. </div>
  42. <div id="twitter">
  43. <a href="https://twitter.com/share" class="twitter-share-button" data-via="xythobuz" data-dnt="true" data-related="xythobuz" data-count="vertical">Tweet</a><script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
  44. </div>
  45. <div id="reddit">
  46. <script type="text/javascript">reddit_url = "http://www.xythobuz.de/nas.de.html";</script>
  47. <script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script>
  48. </div>
  49. <h1>IB-NAS6210 Linux</h1>
  50. <p>Diese Anleitung gilt ebenso für den IB-NAS6220. Dieser besitzt 2 HDD Schächte und ein völlig anderes Webinterface. Über dieses ist es möglich, das root Passwort zu ändern (siehe diesen <a href="http://forum.nas-portal.org/showthread.php?12855-Ib-nas6220-b&amp;p=55718&amp;viewfull=1#post55718">Forenbeitrag</a>), was evtl. eine Neuinstallation einer Linux Distribution erübrigt.</p>
  51. <p>Der <a href="http://www.amazon.de/gp/product/B003DODPGG/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=xythobuzorg-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=B003DODPGG">Icy Box IB-NAS6210</a> (Affiliate Link) hat mit seiner hauseigenen Firmware nur einen beschränkten Funktionsumfang. Es ist kein <a href="http://de.wikipedia.org/wiki/Apple_Filing_Protocol">AFP</a> oder <a href="http://de.wikipedia.org/wiki/Digital_Audio_Access_Protocol">DAAP</a> möglich, was als Mac User von großem Nachteil ist. Deshalb muss Linux her, welches auf der verbauten ARM CPU hervorragend läuft. Es ist zwar bereits ein Linux System installiert, leider ist aber der root User nicht zugänglich.</p>
  52. <p>Die Basisplattform des NAS6210 bildet die Kirkwood Plattform, welche auch im <a href="http://de.wikipedia.org/wiki/SheevaPlug">SheevaPlug</a> und im <a href="http://open-rd.org/">OpenRD</a> zum Einsatz kommt. Dies erleichtert die Suche nach einer fertigen Linux Distribution.</p>
  53. <h2>Update</h2>
  54. <p>Jayare hat mir per E-Mail mitgeteilt, dass er einen Weg gefunden hat, root Zugang zum Installierten Linux System zu bekommen. Dafür folgende Schritte befolgen:</p>
  55. <ul>
  56. <li>Das Gerät normal in Betrieb nehmen.</li>
  57. <li>Einen Administrator Account anlegen oder den vorhandenen Haupt Account nutzen. Im folgenden Beispiel lautet der Benutzername admin.</li>
  58. <li>Mittels SSH eine Verbindung zum NAS herstellen.</li>
  59. <li>Benutzername nach folgendem Schema:
  60. <pre>
  61. [Benutzername]<em>hipserv2_raidsonic</em>[Produktcode]
  62. </pre></li>
  63. <li>In unserem Fall:
  64. <pre>
  65. admin_hipserv2_raidsonic_XXXX-XXXX-XXXX-XXXX
  66. </pre></li>
  67. <li>Das Passwort ist das, welches beim erstellen des Benutzers angegeben wurde.</li>
  68. <li>Nun hat man eingeschränkte Zugriffsrechte.</li>
  69. <li>Der Befehl:
  70. <pre>
  71. sudo -E -s
  72. </pre></li>
  73. <li>Die erneute Eingabe des Passwortes führt zur Ausgabe einer Fehlermeldung.</li>
  74. <li>Man hat nun trotzdem root Zugriff.</li>
  75. </ul>
  76. <p>Dies ähnelt den Methoden, die bei Netgear und Seagate Geräten zum root Zugriff führen. Vielen Dank dafür, Jayare!</p>
  77. <h2>Hardware Modifikation</h2>
  78. <p>Um das Starten einer anderen Linux Distribution über USB oder eSata zu ermöglichen, benötigen wir Zugang zum Bootloader <a href="http://sourceforge.net/projects/u-boot/">Das U-Boot</a>. Dieser gibt beim Booten Statusmeldungen über den internen Seriellen Port des NAS aus und ermöglicht, den Bootprozess zu unterbrechen. Anschliessend kann ein anderer Kernel und eine passende Ramdisk zum Booten ausgewählt werden. Eine bebilderte Anleitung zum aufspüren des Seriellen Ports findet sich, auf Englisch, <a href="http://simon.baatz.info/raidsonic-icy-box-ib-nas6210-my-new-sheevaplug/">hier</a>. Kurz zusammengefasst müssen die hintere Abdeckung und die hinteren Füße weggeschraubt werden, danach lässt sich die Platine mitsamt der Rückwand heraus schieben. Dabei sollte der Festplattenrahmen vorher entfernt worden sein. Unter dem Lüfter befinden sich einige Steckverbindungen auf der Platine. Davon ist eine 4 polige unbelegt. Dies ist der serielle Anschluss. Er arbeitet mit 3,3V Pegeln. Wenn der Stecker an der oberen linken Ecke sitzt, ist die Belegung wie folgt:</p>
  79. <pre>
  80. (GND) (TX) (RX) (3V3)
  81. </pre>
  82. <p>Ein passender Adapter um den Port an den Computer anzuschliessen ist schnell gemacht. Hierzu habe ich einen FT232R auf meine <a href="/ssop28.de.html">DIP Adapterplatine</a> gelötet und wie folgt beschaltet (Klick vergrößert):</p>
  83. <p><a href="/img/ft232plan.jpg"><img alt="Schaltplan" src="/img/ft232plansmall.jpg" /></a>
  84. <a href="/img/ft232fertig.jpg"><img alt="Fertiger Adapter" src="/img/ft232fertigsmall.jpg" /></a></p>
  85. <h2>Software</h2>
  86. <p>Nun besteht also eine Verbindung zwischen meinem Computer und dem NAS mit 115200bps. Wird letzterer nun gebootet, erscheinen U-Boots Statusmeldungen in meinem Terminal. Früher oder später erscheint ein Countdown. Wird dieser mit dem drücken einer beliebigen Taste unterbrochen, findet man sich in U-Boots Kommandozeile wieder. Hier kann zum Beispiel U-Boots eigenes USB System gestartet werden, damit ein Kernel von einem angeschlossenen USB Stick geladen werden kann. Alternativ kann ein Kernel von einem TFTP Server geladen und gestartet werden. Ausserdem können Umbgebungsvariablen angezeigt, geändert, und im NAND gespeichert werden:</p>
  87. <pre>
  88. printenv
  89. setenv name wert
  90. saveenv
  91. </pre>
  92. <p>Zum Starten eines anderen Kernels muss zunächst die Variable "mainlineLinux" auf "yes" gesetzt werden. Anschliessend ändern wir die "arcNumber" auf "2361". Dies gaukelt dem Debian Linux Kernel ein anderes System vor, da es den NAS6210 nicht kennt und deshalb sonst nicht booten will. Die Originale arcNumber lautet 3104. Nun wird noch "ipaddr" auf die gewünschte NAS IP gesetzt und "serverip" auf die IP des Rechners, der im nächsten Schritt einen TFTP Server startet. Geschrieben werden die Änderungen dann mit saveenv.</p>
  93. <pre>
  94. setenv mainlineLinux yes
  95. setenv arcNumber 2361
  96. setenv ipaddr 192.169.2.107
  97. setenv serverip 192.168.2.101
  98. saveenv
  99. </pre>
  100. <p>Nun wird auf einem Rechner im selben Netzwerk ein TFTP Server gestartet. Ich habe auf meinem Mac <a href="http://schimana.net/2008/03/it/tftp-server-fuer-mac-os-x/">TftpServer</a> verwendet. Dieser muss ein <a href="http://ftp.debian.org/debian/dists/stable/main/installer-armel/current/images/kirkwood/netboot/marvell/openrd/uImage">uImage</a> und eine <a href="http://ftp.debian.org/debian/dists/stable/main/installer-armel/current/images/kirkwood/netboot/marvell/openrd/uInitrd">uInitrd</a> zur Verfügung stellen. Die verlinkten Dateien sind die des <a href="http://ftp.debian.org/debian/dists/stable/main/installer-armel/current/images/kirkwood/netboot/marvell/openrd/">aktuellen Armel OpenRD Debian Installers</a>. Der Installer wird nun auf dem NAS gebootet:</p>
  101. <pre>
  102. tftpboot 0x01100000 uInitrd
  103. tftpboot 0x00800000 uImage
  104. setenv bootargs console=ttyS0,115200n8 base-installer/initramfs-tools/driver-policy=most
  105. bootm 0x00800000 0x01100000
  106. </pre>
  107. <p>Die Installation kann sowohl auf einem USB-Stick, einem eSATA oder einem internen SATA Laufwerk erfolgen. Ich habe Debian auf einen 8GB USB-Stick installiert. Beim Debian Support gibt es <a href="http://www.debian.org/releases/stable/armel/">Hilfe zur Installation</a>. Ist die Installation abgeschlossen, muss U-Boot konfiguriert werden, um sie zu starten. Zuerst die folgenden 2 Zeilen eingeben:</p>
  108. <pre>
  109. setenv bootargs_console console=ttyS0,115200
  110. setenv bootcmd 'setenv bootargs $(bootargs_console); run bootcmd_slk; bootm 0x00800000 0x01100000'
  111. </pre>
  112. <p>Für eine USB-Stick Installation nun folgendes Eingeben:</p>
  113. <pre>
  114. setenv bootcmd_slk 'usb start; ext2load usb 0:1 0x01100000 /uInitrd; ext2load usb 0:1 0x00800000 /uImage'
  115. </pre>
  116. <p>Dieses Kommando funktioniert so nur, wenn /boot auf der ersten, als ext2 formatierten Partition liegt. Ansonsten den Pfad anpassen. Ext3 und 4 werden von U-Boot nicht unterstützt.</p>
  117. <p>Für SATA oder eSATA:</p>
  118. <pre>
  119. setenv bootcmd_slk 'ide reset; ext2load ide 0:1 0x01100000 /uInitrd; ext2load ide 0:1 0x00800000 /uImage'
  120. </pre>
  121. <p>Nun noch ein "saveenv", um das ganze zu speichern. Jetzt reicht "run bootcmd" um die U-Boot Kommandozeile zu verlassen und das neu Installierte Debian zu booten.</p>
  122. <h2>Ein neuer Kernel muss her</h2>
  123. <p>Der Standard Kernel von Debian unterstützt den NAS6210 nicht wirklich, weshalb die grüne LED dauernd blinkt und das Gerät nach dem herunterfahren nicht ausgeht. Abhilfe schafft ein selbst kompilierter Linux Kernel mit dem richtigen Patch. Dieser ist auf der oben verlinkten Tutorial Seite zu finden, oder auch <a href="http://simon.baatz.info/downloads/linux-3.1-rc9.nas6210.patch">hier</a>. Wer sich die Mühe machen will, kann seinen eigenen Kernel nach <a href="http://kernel-handbook.alioth.debian.org/ch-common-tasks.html">diesem Ausschnitt des Debian Kernel Handbook</a> selbst konfigurieren und kompilieren. Ich habe mir diese Mühe bereits gemacht, und <a href="/files/linuxnas.zip">fertige .deb Pakete erstellt (18MB)</a>, welche nur noch mittels diesem Befehl installiert werden müssen:</p>
  124. <pre>
  125. dpkg -i linux-image-3.1.0-rc742_xy42_armel.deb
  126. </pre>
  127. <p>Im /boot Verzeichnis des NAS findet sich nun der neue Kernel als "vmlinuz-3.1.0-rc742" und die neue Ramdisk als "initrd.img-3.1.0-rc742". Diese 2 Dateien müssen nun mittels mkimage in U-Boot Images verwandelt werden:</p>
  128. <pre>
  129. mkimage -A arm -O linux -T kernel -C none -a 0x8000 -n Kernel -d vmlinuz-3.1.0-rc742 uImageN
  130. mkimage -A arm -O linux -T ramdisk -C gzip -a 0x8C800000 -n RamDisk -d initrd.img-3.1.0-rc742 uInitrdN
  131. </pre>
  132. <p>Das erzeugt die Dateien uInitrdN und uImageN, welche gebootet werden müssen. Dazu neu starten und folgendes im U-Boot Prompt eingeben:</p>
  133. <pre>
  134. setenv bootcmd_slk 'usb start; ext2load usb 0:1 0x01100000 /uInitrdN; ext2load usb 0:1 0x00800000 /uImageN'
  135. setenv arcNumber 3104
  136. saveenv
  137. </pre>
  138. <p>Ausserdem wird die arcNumber auf die des NAS6210 gestellt, welche dem neuen Kernel bekannt ist. Falls du nicht auf einen USB-Stick installiert hast, musst du das SATA Kommando von oben entsprechend anpassen.</p>
  139. <p>Das wars! Nun kann beliebige Software installiert werden, um den Server für die eigenen Bedürfnisse anzupassen. Bei mir läuft folgendes:</p>
  140. <ul>
  141. <li><a href="http://netatalk.sourceforge.net/">Netatalk</a></li>
  142. <li>Avahi als Zeroconf Implementation für Netatalk</li>
  143. <li><a href="http://httpd.apache.org/">Apache</a></li>
  144. <li><a href="http://www.mysql.de/">MySQL</a></li>
  145. <li><a href="http://www.php.net/">PHP</a></li>
  146. <li><a href="https://github.com/jasonmc/forked-daapd">forked-daapd</a></li>
  147. <li><a href="http://www.cups.org/">CUPS</a></li>
  148. <li><a href="http://www.webmin.com/">Webmin</a></li>
  149. <li><a href="http://www.transmissionbt.com/">Transmission für Torrents</a></li>
  150. </ul>
  151. <h2>Power Button nutzen</h2>
  152. <p>Per E-Mail hat mich Waepu auf seinen Weg aufmerksam gemacht, den Power Button nutzbar zu machen. Dafür muss ein neuer Kernel kompiliert werden. Neben dem oben verlinkten Patch muss folgende kleine Änderung angewendet werden:</p>
  153. <pre class="sh_c">
  154. static unsigned int nas6210_mpp_config[] __initdata = {
  155. MPP0_NF_IO2,
  156. MPP1_NF_IO3,
  157. MPP2_NF_IO4,
  158. MPP3_NF_IO5,
  159. MPP4_NF_IO6,
  160. MPP5_NF_IO7,
  161. MPP18_NF_IO0,
  162. MPP19_NF_IO1,
  163. MPP20_SATA1_ACTn, /* HD1 LED red */
  164. MPP21_SATA0_ACTn, /* HD0 LED red */
  165. MPP22_GPIO, /* Power LED red */
  166. MPP23_GPIO, /* Power button */
  167. MPP24_GPIO, /* Power off device */
  168. MPP25_GPIO, /* Power LED green */
  169. MPP27_GPIO, /* USB transfer LED */
  170. MPP28_GPIO, /* Reset button */
  171. MPP29_GPIO, /* USB Copy button */
  172. 0
  173. };
  174. </pre>
  175. <p>Erst wenn im Struct MPP23_GPIO hinzugefügt wird, funktioniert folgendes Bash Script.</p>
  176. <pre class="sh_sh">
  177. #!/bin/sh
  178. echo 23 > /sys/class/gpio/export
  179. while : ; do
  180. s=`cat /sys/class/gpio/gpio23/value`
  181. if test "$s" == 0 ; then
  182. shutdown -h now
  183. exit 0
  184. fi
  185. sleep 1
  186. done
  187. </pre>
  188. <p>Der Button auf MPP23_GPIO hat eine Art Flip-Flop Funktion. Wenn man den Button für ein paar Sekunden hält, ändert sich der Status von MPP23_GPIO und bleibt so bis zum Reboot.</p>
  189. <p>Ersetzt man im Kernel MPP20_SATA1_ACTn und MPP21_SATA0_ACTn durch MPP20_GPIO und MPP21_GPIO können per Bash auch die HDD LEDs angesteuert werden. Dann funktioniert jedoch die Anzeige der Festplattenaktivität nicht mehr.</p>
  190. <p>Vielen Dank an Waepu hierfür!</p>
  191. <script>var pfHeaderImgUrl = '';var pfHeaderTagline = '';var pfdisableClickToDel = 0;var pfHideImages = 0;var pfImageDisplayStyle = 'right';var pfDisablePDF = 0;var pfDisableEmail = 0;var pfDisablePrint = 0;var pfCustomCSS = '';var pfBtVersion='1';(function(){var js, pf;pf = document.createElement('script');pf.type = 'text/javascript';if('https:' == document.location.protocol){js='https://pf-cdn.printfriendly.com/ssl/main.js'}else{js='http://cdn.printfriendly.com/printfriendly.js'}pf.src=js;document.getElementsByTagName('head')[0].appendChild(pf)})();</script><a href="http://www.printfriendly.com" style="color:#6D9F00;text-decoration:none;" class="printfriendly" onclick="window.print();return false;" title="Printer Friendly and PDF"><img style="border:none;margin:0 6px" src="https://pf-cdn.printfriendly.com/images/icons/pf-print-icon.gif" width="16" height="15" alt="Print Friendly Version of this page" />Print <img style="border:none;margin:0 6px" src="https://pf-cdn.printfriendly.com/images/icons/pf-pdf-icon.gif" width="12" height="12" alt="Get a PDF version of this webpage" />PDF</a>
  192. <div id="disqus_thread"></div>
  193. <script type="text/javascript">
  194. var disqus_shortname = "xythobuz";
  195. (function() {
  196. var dsq = document.createElement("script"); dsq.type = "text/javascript"; dsq.async = true;
  197. dsq.src = "http://" + disqus_shortname + ".disqus.com/embed.js";
  198. (document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]).appendChild(dsq);
  199. })();
  200. </script>
  201. <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
  202. <a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
  203. </div>
  204. <div class="nav">
  205. <h3>Thomas Buck</h3>
  206. <div id="logo"><img id="logoImg" src="http://www.gravatar.com/avatar/8d18fec40a74782052fb4c007d212475?s=180" alt="Avatar"></div>
  207. <p id="bio">
  208. I'm a 19 year old Information Engineering student from Germany, mostly building cool stuff with AVR microcontrollers. All of my projects are released as Free Software.
  209. </p>
  210. <ul id="menuList">
  211. <li><a href="/index.html">Home</a></li>
  212. <li><a href="/blog.html">Blog</a></li>
  213. <li><a href="/contact.html">Contact</a></li>
  214. <li>&nbsp;</li>
  215. <li><a href="/ledcube.html">8x8x8 LED Cube</a></li>
  216. <li><a href="/yasab.html">YASAB AVR Bootloader</a></li>
  217. <li><a href="/avrnetstack.html">avrNetStack</a></li>
  218. <li><a href="/avrserial.html">AVR Serial Library</a></li>
  219. <li><a href="/serialdebug.html">Serial Debug</a></li>
  220. <li><a href="/ledmatrix.html">LED Matrix</a></li>
  221. <li><a href="/ssop28.html">SSOP28 - DIL Adapter</a></li>
  222. <li><a href="/xyrobot.html">xyRobot</a></li>
  223. <li><a href="/bluetooth.html">Bluetooth UART (BTM-222)</a></li>
  224. <li><a href="/k6x4008.html">K6x4008 SRAM</a></li>
  225. <li><a href="/xyrobotremote.html">xyRobotRemote</a></li>
  226. <li><a href="/rremote.html">rRemote</a></li>
  227. <li>&nbsp;</li>
  228. <li><a href="/c250.html">Mio C250 Unlock</a></li>
  229. <li><a href="/nas.html">IB-NAS6210 Linux</a></li>
  230. <li><a href="/ultimatenotifier.html">Ultimate Notifier Script</a></li>
  231. <li><a href="/serialhelper.html">Serial Helper</a></li>
  232. </ul>
  233. <div id="recent">
  234. Recent blog posts:
  235. <ul id="recentList">
  236. <li class="recentList"><a href="/2013_04_11_rss.html">RSS Probleme</a></li><li class="recentDate">2013-04-11</li>
  237. <li class="recentList"><a href="/2013_04_04_html5.html">Kein DRM in HTML5</a></li><li class="recentDate">2013-04-04</li>
  238. <li class="recentList"><a href="/2013_04_02_zaphod.html">Neuer Webserver</a></li><li class="recentDate">2013-04-02</li>
  239. <li class="recentList"><a href="/2013_03_25_doxygen.html">xyControl Doxygen Dokumentation</a></li><li class="recentDate">2013-03-25</li>
  240. <li class="recentList"><a href="/2013_03_16_pid.html">xyCopter PID-Parameter</a></li><li class="recentDate">2013-03-16</li>
  241. </ul>
  242. </div>
  243. </div>
  244. </div></div>
  245. <img id="dude" alt="The Dude abides..." src="/img/dude.png">
  246. <img id="walter" alt="Mark it zero!" src="/img/walter.png">
  247. <div id="footer">
  248. Built with <a href="http://bitbucket.org/obensonne/poole">Poole</a>
  249. &middot;
  250. Licensed as <a href="http://creativecommons.org/licenses/by/3.0">CC-BY</a>
  251. &middot;
  252. <a href="http://validator.w3.org/check?uri=referer">Validate HTML</a>
  253. &middot;
  254. <a href="http://jigsaw.w3.org/css-validator/validator?uri=xythobuz.de%2Fstyle.css&amp;profile=css3">Validate CSS</a>
  255. &middot;
  256. <a href="http://feed1.w3.org/check.cgi?url=http://www.xythobuz.de/rss.xml">Validate RSS</a>
  257. &middot;
  258. <a href="http://www.validome.org/google/validate?url=http://www.xythobuz.de&amp;googleTyp=SITEMAP">Validate Sitemap</a>
  259. </div>
  260. <img src="/stats/count.php?img" alt="Analytics">
  261. <script src="http://gitforked.com/api/1.1/button.js" type="text/javascript"></script>
  262. </body>
  263. </html>