{"id":98,"date":"2013-12-19T21:17:35","date_gmt":"2013-12-19T19:17:35","guid":{"rendered":"http:\/\/grenzdebiel.dyndns.org\/wordpress\/?p=98"},"modified":"2015-07-24T16:27:48","modified_gmt":"2015-07-24T14:27:48","slug":"sd-karte-wear-level-bzw-tmpfs","status":"publish","type":"post","link":"https:\/\/blog.grenzdebiel.dynv6.net\/?p=98","title":{"rendered":"SD-Karte &#8211; Wear-Level bzw. tmpfs"},"content":{"rendered":"<p>Wieviele andere auch habe ich mir gedanken dar\u00fcber gemacht das die SD-Karte durch h\u00e4ufige Schreib- \/ L\u00f6schzyklen zu stark verschlei\u00dft.<br \/>\nDa die meisten Zugriffe auf Logfiles oder tempor\u00e4r ben\u00f6tigter Dateien sind habe ich beschlossen die Verzeichnisse als Ramdrives per tmpfs zu mounten.<br \/>\n<!--more--><br \/>\nFolgende einstellungen sind nur f\u00fcr Raspbian getestet.<\/p>\n<p><strong>\/etc\/defaults\/tmpfs<\/strong><\/p>\n<pre class=\"brush: bash; gutter: true\">RAMLOCK=yes\r\nRAMSHM=yes\r\nRAMTMP=yes\r\n\r\nTMPFS_SIZE=10%VM\r\nRUN_SIZE=10M\r\nLOCK_SIZE=5M\r\nSHM_SIZE=10M\r\nTMP_SIZE=25M<\/pre>\n<p>Desweiteren habe ich das &#8222;\/var\/log&#8220;-Verzeichnis als tmpfs per \/etc\/fstab gemountet.<br \/>\n<strong>\/etc\/fstab<\/strong><\/p>\n<pre class=\"brush: bash; gutter: true\">tmpfs           \/var\/log        tmpfs   defaults,noatime,mode=0755,size=10M     0       0<\/pre>\n<p>Da es einige Programme gibt welche nicht starten wenn &#8222;ihr&#8220; Verzeichnis mit evtl. &#8222;ihren&#8220; Rechten nicht exestiert habe ich noch ein Init-Script geschrieben welche diese anlegt und egebenfalls die Rechte setzt:<br \/>\n<strong><br \/>\n\/etc\/init.d\/prepare-dirs<\/strong><\/p>\n<pre class=\"brush: bash; gutter: true\">#!\/bin\/bash\r\n#\r\n### BEGIN INIT INFO\r\n# Provides:          prepare-dirs\r\n# Default-Start:     2 3 4 5\r\n# Default-Stop:      0 1 6\r\n# Required-Start:\r\n# Required-Stop:\r\n# Short-Description: Create needed directories on \/var\/log\/ for tmpfs at startup\r\n# Description:       Create needed directories on \/var\/log\/ for tmpfs at startup\r\n### END INIT INFO\r\n\r\n# needed Dirs\r\nDIR[0]=\/var\/log\/nginx\r\nDIR[1]=\/var\/log\/apache2\r\nDIR[2]=\/var\/log\/apt\r\nDIR[3]=\/var\/log\/ConsoleKit\r\nDIR[4]=\/var\/log\/fsck\r\nDIR[5]=\/var\/log\/news\r\nDIR[6]=\/var\/log\/ntpstats\r\nDIR[7]=\/var\/log\/samba\r\nDIR[8]=\/var\/log\/lastlog\r\nDIR[9]=\/var\/log\/trafficserver\r\n\r\ncase \"${1:-''}\" in\r\n  start)\r\n        typeset -i i=0 max=${#DIR[*]}\r\n        while (( i &lt; max ))\r\n        do\r\n                mkdir  ${DIR[$i]}\r\n                chmod 755 ${DIR[$i]}\r\n                i=i+1\r\n        done\r\n        # set rights\r\n        chown trafficserver ${DIR[9]}\r\n    ;;\r\n  stop)\r\n    ;;\r\n  restart)\r\n   ;;\r\n  reload|force-reload)\r\n   ;;\r\n  status)\r\n   ;;\r\n  *)\r\n   echo \"Usage: $SELF start\"\r\n   exit 1\r\n   ;;\r\nesac<\/pre>\n<p>Jetzt m\u00fcssen wir nur noch das Skript zum richtigen Zeitpunkt ausf\u00fchren lassen:<\/p>\n<pre class=\"brush: applescript; gutter: false\">update-rc.d prepare-dirs defaults 00<\/pre>\n<p>Beim n\u00e4chsten start des Systems werden die Verzeichnisse \/run, \/run\/shm, \/run\/lock, \/tmp und \/var\/log als Ramdrive(tmpfs) gemountet und mit dem Script die ben\u00f6tigten Verzeichnisse mit den entsprechenden Rechten gesetzt.<\/p>\n<p>Solltet ihr wie ich ext3 oder besser ext4 benutzen so kann man auch dort etwas am wear-leveling drehen. Es sollte wenn m\u00f6glich ext4 verwendet werden da dies auch f\u00fcr den Betrieb auf SSDs ausgerichtet ist.<\/p>\n<p>Feind eines l\u00e4ngeren durchhalten ist das das Journal. Das Journal kann komplett abgeschaltet werden oder durch ein paar Befehlen auf das n\u00f6tigste zusammengeschrumpft werden. Die Zugriffe werden auch dadurch minimiert das nicht jedesmal die Zugriffszeit geschrieben wird(Mountoptionen).<\/p>\n<p>!!! Vorsicht ein paar Optionen, nobh, barrier=0 und data=writeback, sorgen zwar f\u00fcr etwas mehr Performance und weniger Schreibzyklen machen das System aber anf\u00e4llig f\u00fcr Datenverlust bei nicht korrekten herunterfahren des Dateisystems(Stromausfall) !!!<\/p>\n<p>Journal im &#8222;writeback&#8220;-Modus betreiben:<\/p>\n<pre class=\"lang:sh decode:true\">tune2fs -o journal_data_writeback &lt;partition&gt;<\/pre>\n<p>In der <code>\/etc\/fstab<\/code> folgende Mountoptionen an die einzelnen einzuh\u00e4ngenden Partitionen hinzuf\u00fcgen oder ersetzen:<\/p>\n<pre class=\"lang:sh decode:true \">defaults,noatime,nodirtime,discard,nobh,barrier=0,data=writeback,errors=remount-ro (f\u00fcr Journal \"writeback)<\/pre>\n<p>&nbsp;<\/p>\n<p>Was die einzelnen Optionen bedeuten lest ihr hier nach: <a href=\"https:\/\/www.kernel.org\/doc\/Documentation\/filesystems\/ext4.txt\">https:\/\/www.kernel.org\/doc\/Documentation\/filesystems\/ext4.txt<\/a>.<\/p>\n<p><strong>Update:<\/strong><\/p>\n<p>Dank eines Updates des Kernel auf Version 3.10+ in Raspbian kann man das &#8222;Flash-friendly-Filesystem&#8220; f2fs nutzen. Dieses wurde von Samsung in die Welt gesetzt und verspricht ein besseres Wear-leveling von NAND-Speichern bzw. \u00fcberhaupt ein Wear-Leveling. Hier ist es nicht in einem Subsystem wie z.b. bei jffs oder ubifs sondern direkt im Filesystem integriert.<\/p>\n<p>Seit Version 1.2 exestiert auch ein fsck.f2fs. Wie immer wird das FS angelegt in dem man ein:<\/p>\n<pre class=\"lang:sh decode:true \">mkfs.f2fs -l &lt;Label&gt; &lt;Device&gt;<\/pre>\n<p>aufruft. Laut Benchmarks im Internet arbeitet f2fs schneller als seine Kollegen jffs und ubifs &#8211; hier soll jeder seine eigenen erfahrungen machen.<\/p>\n<p>Das FS eignet sich so wunderbar f\u00fcr die SD-Karte, den USB-Stick oder einen integrierten NAND-Flash wie z.b. auf dem Cubieboard. Soweit es das Wear-Leveling angeht glaube ich allerdings nicht das f2fs sich auf einer SSD besser macht da hier in der Regel ein entsprechendes Wear-Level Management implementiert ist. Auch sollte man sich im klaren sein das f2fs auf journaling verzichtet &#8211; wie wichtig dies ist muss auch hier jeder f\u00fcr sich entscheiden.<\/p>\n<p>Interessanter Artikel dazu: <a title=\"An f2fs teardown - LWN\" href=\"http:\/\/lwn.net\/Articles\/518988\/\" target=\"_blank\">An f2fs teardown &#8211; LWN<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wieviele andere auch habe ich mir gedanken dar\u00fcber gemacht das die SD-Karte durch h\u00e4ufige Schreib- \/ L\u00f6schzyklen zu stark verschlei\u00dft. Da die meisten Zugriffe auf Logfiles oder tempor\u00e4r ben\u00f6tigter Dateien sind habe ich beschlossen die Verzeichnisse als Ramdrives per tmpfs zu mounten.<\/p>\n","protected":false},"author":3,"featured_media":189,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[36,35,37,22,26,23,25,24],"class_list":["post-98","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-pi","tag-ext3","tag-ext4","tag-journal","tag-raspbian","tag-sd-card","tag-tmpfs","tag-wear","tag-wear-level"],"_links":{"self":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/98","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=98"}],"version-history":[{"count":2,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/98\/revisions"}],"predecessor-version":[{"id":163,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/98\/revisions\/163"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/media\/189"}],"wp:attachment":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=98"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=98"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=98"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}