{"id":65,"date":"2006-05-12T10:41:14","date_gmt":"2006-05-12T08:41:14","guid":{"rendered":"http:\/\/my.stargazer.at\/?p=65"},"modified":"2015-04-01T11:53:00","modified_gmt":"2015-04-01T09:53:00","slug":"mit-gentoo-im-geschwindigkeitsrausch","status":"publish","type":"post","link":"https:\/\/my.stargazer.at\/de\/2006\/05\/12\/mit-gentoo-im-geschwindigkeitsrausch\/","title":{"rendered":"Mit Gentoo im Geschwindigkeitsrausch"},"content":{"rendered":"<p>Gentoo ist dazu da, um an unsere Bed\u00fcrfnisse angepasst zu werden. Dies beinhaltet f\u00fcr manche Leute auch, die Optimierung auf Geschwindigkeit.<\/p>\n<p>Zuerst sollten wir uns mit der Frage besch\u00e4ftigen, was den PC langsam macht. Dateizugriffe auf Festplatten und andere Laufwerke bremsen dabei das System am Meisten. Der Grund daf\u00fcr ist darin zu suchen, dass der Computer dabei meist auf Daten warten muss um etwas tun zu k\u00f6nnen. Was w\u00e4re, wenn alles im RAM liegen w\u00fcrde?<\/p>\n<p><!--more--><\/p>\n<p>Exakt. Genau das wollen wir machen. Wir verlegen die meist gebrauchten Teile in den RAM, genauergesagt in ein Ramdrive. Nach langem Experimentieren hat sich herausgestellt, dass es den gr\u00f6ssten Geschwindigkeitsvorteil bringt, wenn man nur folgende Teile auf ein Ramdrive schiebt:<\/p>\n<blockquote>\n<ol>\n<li>\/usr\/lib<\/li>\n<li>\/lib<\/li>\n<li>\/usr\/bin<\/li>\n<li>\/usr\/sbin<\/li>\n<li>\/sbin<\/li>\n<li>\/bin<\/li>\n<\/ol>\n<\/blockquote>\n<p>Es macht keinen Sinn alle Daten in einem Ramdrive zu lagern, da immer das Risiko besteht, dass die dort gelagerten Daten verlorengehen. Daher ist es n\u00f6tig, unser Disk-Layout etwas anzupassen um eine entsprechend sichere L\u00f6sung zu konstruieren:<\/p>\n<blockquote>\n<ul>\n<li>\/usr sollte auf eine eigene Partition<\/li>\n<li>\/home ist als Datenspeicher auf einer eigenen Partition<\/li>\n<li>\/root ist analog zu \/home zu behandeln (oder ein Symlink zu \/home\/root)<\/li>\n<li>\/var ist der Platz f\u00fcr Logs und Portage-Caches<\/li>\n<\/ul>\n<\/blockquote>\n<p>Die Installation selbst sollte nach Handbuch erfolgen. Zu guterletzt erstellen wir noch ein leeres Verzeichnis <em>\/newroot<\/em> welches uns als Mountpoint dienen wird.<\/p>\n<p>Wenn wir nun am System Dateien ver\u00e4ndern wollen wir nat\u00fcrlich, dass diese permanent ver\u00e4ndert werden. Die Datei \/etc\/conf.d\/local.stop leistet uns dabei gute Dienste:<\/p>\n<blockquote>\n<p>##############<br \/>\n#!\/bin\/sh<br \/>\nCURRDIR=`\/bin\/pwd`<br \/>\nSTORE=&#8220;root&#8220;<br \/>\ncd \/<br \/>\n#Exclude anything that&#8217;s on it&#8217;s own partition here<br \/>\ntar cfp ${STORE}\/fs.tar * &#8211;exclude=usr\/* &#8211;exclude=root\/* &#8211;exclude=home\/* \\<br \/>\n        &#8211;exclude=proc\/* &#8211;exclude=sys\/* &#8211;exclude=tmp\/* &#8211;exclude=var\/*  \\<br \/>\n        &#8211;exclude=opt\/*<br \/>\ncd \/usr\/<br \/>\n# rm -fr \/usr\/bin \/usr\/sbin \/usr\/lib<br \/>\n# cp -a \/usr\/.bin \/usr\/bin<br \/>\n# cp -a \/usr\/.sbin \/usr\/sbin<br \/>\n# cp -a \/usr\/.lib \/usr\/lib<br \/>\ncd bin &amp;&amp; tar cfp \/${STORE}\/usr_bin.tar *<br \/>\ncd ..\/sbin &amp;&amp; tar cfp \/${STORE}\/usr_sbin.tar *<br \/>\ncd ..\/lib &amp;&amp; tar cfp \/${STORE}\/usr_lib.tar *<br \/>\n# rm -fr \/usr\/bin \/usr\/sbin \/usr\/lib<br \/>\n# mkdir \/usr\/bin \/usr\/sbin \/usr\/lib<br \/>\ncd $CURRDIR<\/p>\n<\/blockquote>\n<p>Dieses Script sollte in dem vorhin Erw\u00e4hnten beim Shutdown aufgerufen werden. Aus Wartungstechnischen Gr\u00fcnden empfiehlt es sich es (wie oben) in einem eigenen File abzulegen. Ein guter Platz daf\u00fcr ist \/sbin.<\/p>\n<p>Um \/ in einem Ramdrive zu haben (ja, ich bin mir bewusst, ich neige zu \u00dcbertreibungen) m\u00fcssen wir uns einen eigenen initrd konstruieren der die erforderlichen Schritte durchf\u00fchrt:<\/p>\n<blockquote>\n<p>mount \/boot<br \/>\ntouch \/boot\/initrd<br \/>\ndd if=\/dev\/zero of=\/boot\/initrd bs=1024k count=8<br \/>\nlosetup \/dev\/loop0 \/boot\/initrd<br \/>\nmke2fs \/dev\/loop0<br \/>\nmkdir \/mnt\/initrd<br \/>\nmount \/dev\/loop0 \/mnt\/initrd<br \/>\ncd \/mnt\/initrd<br \/>\nmkdir etc dev lib bin proc new store<br \/>\ntouch linuxrc etc\/mtab etc\/fstab<br \/>\nchmod +x linuxrc<br \/>\nfor I in sh cat mount umount mkdir chroot tar; do cp \/bin\/$I bin\/; done<br \/>\ncp \/sbin\/pivot_root bin\/<\/p>\n<\/blockquote>\n<p>Da wir im initrd nicht nur statische Binaries verwenden m\u00fcssen wir die verwendeten Dateien mit Hilfe von ldd \u00fcberpr\u00fcfen:<\/p>\n<blockquote>\n<p>ldd \/bin\/sh<br \/>\n linux-gate.so.1 =&gt;  (0xffffe000)<br \/>\n        libdl.so.2 =&gt; \/lib\/libdl.so.2 (0xb7fe2000)<br \/>\n        libc.so.6 =&gt; \/lib\/tls\/libc.so.6 (0xb7eca000)<br \/>\n        \/lib\/ld-linux.so.2 (0xb7feb000)<\/p>\n<\/blockquote>\n<p><strong>Wichtig dabei ist, dass ihr die \u00dcberpr\u00fcfung selbst macht, damit ihr wirklich alle wichtigen Dateien habt!!<\/strong><\/p>\n<p>Unser n\u00e4chster Schritt besteht im Erstellen eines linuxrc-Scripts welches wie folgt aussieht:<\/p>\n<blockquote>\n<p>cat \/mnt\/initrd\/linuxrc<br \/>\n################<br \/>\n#!\/bin\/sh<br \/>\nexport PATH=\/bin<br \/>\nSTOREDEV=\/dev\/hda10<br \/>\nSTORE=\/store<br \/>\nROOTSIZE=128m<\/p>\n<p># Get kernel CMDLINE<br \/>\nmount -t proc none \/proc<br \/>\nCMDLINE=`cat \/proc\/cmdline`<br \/>\numount \/proc<\/p>\n<p>mount $STOREDEV $STORE<\/p>\n<p># Mount root and create read-write directories<br \/>\nmount -t tmpfs -o size=$ROOTSIZE none \/new\/ &gt; \/dev\/null 2&gt;&amp;1<br \/>\ncd \/new\/ &amp;&amp; tar xpf $STORE\/fs.tar &gt; \/dev\/null 2&gt;&amp;1<br \/>\numount $STOREDEV<br \/>\n# Pivot root and start real init<br \/>\ncd \/new<br \/>\npivot_root . newroot<br \/>\nexec chroot . \/bin\/sh &lt;&lt;- EOF &gt;dev\/console 2&gt;&amp;1<br \/>\nexec \/sbin\/init ${CMDLINE}<br \/>\nEOF<\/p>\n<\/blockquote>\n<p>Es folgt das Erstellen der Devicenodes, da wir keinen Devicemanager wie udev verwenden. Hilfreiche Dokumentationen finden sich in \/usr\/src\/linux\/Documentation\/devices.txt:<\/p>\n<blockquote>\n<p>mknod \/mnt\/initrd\/dev\/console c 5 1<br \/>\nmknod \/mnt\/initrd\/dev\/null c 1 3<br \/>\nmknod \/mnt\/initrd\/dev\/hda b 3 0<br \/>\nmknod \/mnt\/initrd\/dev\/hda4 b 3 4<br \/>\nmknod \/mnt\/initrd\/dev\/hda10 b 3  10<\/p>\n<\/blockquote>\n<p>Dann unmounten wir den initrd und widmen uns der Datei \/etc\/init.d\/localmount nach folgender Vorlage:<\/p>\n<blockquote>\n<p>start() {<br \/>\n        USRBINSIZE=32m<br \/>\n        USRSBINSIZE=2m<br \/>\n        USRLIBSIZE=256m<\/p>\n<p>        # Mount local filesystems in \/etc\/fstab.<br \/>\n        ebegin &#8222;Mounting local filesystems&#8220;<br \/>\n        mount -at nocoda,nonfs,noproc,noncpfs,nosmbfs,noshm &gt;\/dev\/null<br \/>\n        eend $? &#8222;Some local filesystem failed to mount&#8220;<\/p>\n<p>        ebegin &#8222;Mounting RAM filesystems&#8220;<br \/>\n        mount -t tmpfs -o size=$USRBINSIZE none \/usr\/bin &gt; \/dev\/null 2&gt;&amp;1<br \/>\n        mount -t tmpfs -o size=$USRSBINSIZE none \/usr\/sbin &gt; \/dev\/null 2&gt;&amp;1<br \/>\n        mount -t tmpfs -o size=$USRLIBSIZE none \/usr\/lib &gt; \/dev\/null 2&gt;&amp;1<br \/>\n        cd \/usr\/bin &amp;&amp; tar xpf \/root\/usr_bin.tar &gt; \/dev\/null 2&gt;&amp;1<br \/>\n        cd \/usr\/sbin &amp;&amp; tar xpf \/root\/usr_sbin.tar &gt; \/dev\/null 2&gt;&amp;1<br \/>\n        cd \/usr\/lib &amp;&amp; tar xpf \/root\/usr_lib.tar &gt; \/dev\/null 2&gt;&amp;1<br \/>\n        eend $? &#8222;Some RAM filesystems did not mount&#8220;<\/p>\n<\/blockquote>\n<p>Wenn \/usr\/lib zu gross ausf\u00e4llt besteht der beste Workaround darin, ein paar Dateien wegzubewegen und mit entsprechenden Symlinks zu ersetzen:<\/p>\n<blockquote>\n<p>cd \/usr\/lib<br \/>\nfor I in perl5 python2.3 portage modules gcc gcc-lib; do<br \/>\nmv $I ..\/local\/lib\/<br \/>\nln -s ..\/local\/lib\/$I $I<br \/>\ndone<\/p>\n<\/blockquote>\n<p>Letzte Schritte:<\/p>\n<blockquote>\n<p>mv \/usr\/sbin \/usr\/.sbin<br \/>\nmv \/usr\/bin \/usr\/.bin<br \/>\nmv \/usr\/lib \/usr\/.lib<br \/>\nupdate-balls<br \/>\nreboot<\/p>\n<\/blockquote>\n<p>Gl\u00e4ubige Leute k\u00f6nnen an dieser Stelle noch ein Gebet sprechen, jedoch ist dies optional. Viel Gl\u00fcck.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gentoo ist dazu da, um an unsere Bed\u00fcrfnisse angepasst zu werden. Dies beinhaltet f\u00fcr manche Leute auch, die Optimierung auf Geschwindigkeit. Zuerst sollten wir uns mit der Frage besch\u00e4ftigen, was den PC langsam macht. Dateizugriffe auf Festplatten und andere Laufwerke bremsen dabei das System am Meisten. Der Grund daf\u00fcr ist darin zu suchen, dass der Computer dabei meist [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[234,39],"class_list":["post-65","post","type-post","status-publish","format-standard","hentry","category-it-related-stuff","tag-speed","tag-gentoo"],"_links":{"self":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/comments?post=65"}],"version-history":[{"count":0,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts\/65\/revisions"}],"wp:attachment":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/media?parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/categories?post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/tags?post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}