{"id":282,"date":"2014-09-10T05:57:19","date_gmt":"2014-09-10T03:57:19","guid":{"rendered":"http:\/\/grenzdebiel.no-ip.biz\/wordpress\/?p=282"},"modified":"2015-07-24T16:53:38","modified_gmt":"2015-07-24T14:53:38","slug":"lxc-chroot-auf-steroide","status":"publish","type":"post","link":"https:\/\/blog.grenzdebiel.dynv6.net\/?p=282","title":{"rendered":"LXC &#8211; chroot auf Steroide"},"content":{"rendered":"<p><strong>LXC<\/strong> &#8211; <strong>L<\/strong>inu<strong>X<\/strong> <strong>C<\/strong>ontainer ist eine Virtualisierung welche auf Betriebssystemebene wie z.b. Linux-VServer arbeitet. Es kann auch mit BSD-Jails verglichen werden.<\/p>\n<p>Mit LXC ist es m\u00f6glich verschiedene Container isoliert voneinander auf dem gleichen System laufen zu lassen. Dabei muss nicht ein komplettes root-Dateisystem vorhandensein mit LXC ist es auch m\u00f6glich einzelne Applikationen isoliert zu starten.<!--more--><\/p>\n<p>Es wird nicht wie z.b. bei KVM oder VMWare eine Virtuelle Maschine erzeugt sondern ein root-Dateisystem mit dem gleichen Kernel des Host als &#8222;Container&#8220; gestartet.<\/p>\n<p>Mit den &#8222;Namespaces&#8220; und &#8222;Control groups&#8220; ergibt sich eine flexible m\u00f6glichkeit Resourcenschonend mehrere Virtuelle Instanzen zu erstellen, diese isoliert voneinander zu betreiben und die Resourcen des Host f\u00fcr die Virtuellen Instanzen zu kontrollieren .<\/p>\n<p>Ich nutze die m\u00f6glichkeit verschiedene Instanzen um Programme auf meinem &#8222;Cubietruck&#8220; zu testen. Auf ein ARM-SoC KVM oder Qemu laufen zu lassen w\u00e4re die denkbar schlechteste Idee.<\/p>\n<p>Legen wir los, als erstes installieren lxc und ein paar tools die uns das leben vereinfachen.<\/p>\n<pre class=\"lang:sh decode:true brush: text; gutter: false\">apt-get install lxc lxctl bridge-utils libvirt-bin debootstrap dnsmasq-base ebtables gawk libxml2-utils netcat-openbsd<\/pre>\n<p>Um &#8222;Control groups&#8220; nutzen zu k\u00f6nnen m\u00fcsst Ihr dies &#8222;mounten&#8220;. Tragt folgendes in eure \/etc\/fstab ein:<\/p>\n<p>\/etc\/fstab:<\/p>\n<pre class=\"lang:ini decode:true brush: text; gutter: false   \"># cgroup for lxc \/ docker\r\ncgroup \/sys\/fs\/cgroup cgroup defaults 0 0<\/pre>\n<p>Und mountet es mit &#8222;<strong>mount \/sys\/fs\/cgroup<\/strong>&#8222;.<\/p>\n<p>libvirt wurde aus zwei Gr\u00fcnden installiert, erstens es kann u.a. lxc steuern(und kvm, xen, qemu &#8230;) und es wird die virtuelle Netzwerkbr\u00fccke samt dhcp-Server installiert und konfiguriert.<\/p>\n<p>Im folgenden wird die Virtuelle Netzwerkbr\u00fccke &#8222;virbr0&#8220; erzeugt und konfiguriert:<\/p>\n<pre class=\"lang:sh decode:true brush: text; gutter: false\">root@test:~# virsh net-edit default<\/pre>\n<p>Euer Editor der Wahl \u00f6ffnet die default.xml in der Ihr das IP-Netzwerk, die IP-Adresse eures dhcp-Server und die &#8222;range&#8220; aus welchen Bereich die Adressen vergeben werden sollen konfiguriert.<br \/>\nAnschliessend startet ihr die Netzwerkbr\u00fccke mit:<\/p>\n<pre class=\"lang:sh decode:true brush: text; gutter: false\">root@test:~# virsh net-start default<\/pre>\n<p>Mit &#8222;ifconfig&#8220; k\u00f6nnt ihr euch vergewissern das diese gestartet wurde.<\/p>\n<p>Jetzt pr\u00fcfen wir mit &#8222;<strong>lxc-checkconfig<\/strong>&#8220; ob die vorraussetzungen f\u00fcr lxc vorhanden sind bzw. welche m\u00f6glichkeiten der Steuerung vorhanden sind:<\/p>\n<pre class=\"lang:ini decode:true brush: text; gutter: false\">root@test:~# lxc-checkconfig\r\n--- Namespaces ---\r\nNamespaces: enabled\r\nUtsname namespace: enabled\r\nIpc namespace: enabled\r\nPid namespace: enabled\r\nUser namespace: enabled\r\nNetwork namespace: enabled\r\nMultiple \/dev\/pts instances: enabled\r\n\r\n--- Control groups ---\r\nCgroup: enabled\r\nCgroup clone_children flag: enabled\r\nCgroup device: enabled\r\nCgroup sched: enabled\r\nCgroup cpu account: enabled\r\nCgroup memory controller: enabled\r\nCgroup cpuset: enabled\r\n\r\n--- Misc ---\r\nVeth pair device: enabled\r\nMacvlan: enabled\r\nVlan: enabled\r\nFile capabilities: enabled\r\n\r\nNote : Before booting a new kernel, you can check its configuration\r\nusage : CONFIG=\/path\/to\/config \/usr\/bin\/lxc-checkconfig<\/pre>\n<p>Im Idealfall sieht eure Ausgabe \u00e4hnlich aus. Sollte bei &#8222;Control groups&#8220; ein &#8222;missing&#8220; erscheinen ist dies nicht unbedingt ein Fehlschlag &#8211; es fehlt dann nur z.b. eine m\u00f6glichkeit eine Instanz einzuschr\u00e4nken.<\/p>\n<p>Instanz bzw. root-Dateisystem erzeugen:<\/p>\n<pre class=\"lang:sh decode:true brush: text; gutter: false\">root@test:~# lxc-create -n test1 -t debian<\/pre>\n<p>Es wird mithilfe von &#8222;debootstrap&#8220; das root-Daateisystem heruntergeladen und vorkonfiguriert. Mit den Schaltern &#8222;-n&#8220; legen wir fest wie die Instanz benannt werden soll mit &#8222;-t&#8220; welches template genutzt werden soll. Wir\/Ich habe\/n uns f\u00fcr Debian entschieden eine Ubuntu, Redhat usw. w\u00e4re auch m\u00f6glich und mithilfe von debootstrap erzeugt und eingerichtet.<\/p>\n<p>Bevor Ihr die Instanz startet konfiguriert ein paar Parameter:<\/p>\n<pre class=\"lang:sh decode:true brush: text; gutter: false\">root@test:~# vim \/var\/lib\/lxc\/&lt;name der Instanz&gt;\/config<\/pre>\n<p>Und f\u00fcgt folgendes hinzu:<\/p>\n<pre class=\"lang:ini decode:true brush: text; gutter: true\">lxc.utsname = &lt;containername&gt;\r\n# network\r\nlxc.network.type = veth \r\nlxc.network.flags = up \r\nlxc.network.link = virbr0 \r\nlxc.network.ipv4 = \/\r\nlxc.network.hwaddr = 00:1E:62:CH:GE:ME<\/pre>\n<p>Bitte beachtet das Ihr den korrekten Hostname, die korrekte IP-Adresse und eine &#8222;vern\u00fcnftige&#8220; MAC-Adresse angebet (CH:GE:ME wechseln zu z.b. 00:00:01).<\/p>\n<p>Jetzt k\u00f6nnt Ihr eure Instanz starten:<\/p>\n<pre class=\"lang:sh decode:true brush: text; gutter: false\">root@test:~# lxc-start -n test1<\/pre>\n<p>Wenn Ihr Debian als Template gew\u00e4hlt habt ist das Passwort f\u00fcr root: &#8222;root&#8220;.<br \/>\nAus der Konsole kommt Ihr mit &lt;STRG&gt;+a und anschlessenden &#8222;q&#8220;.<\/p>\n<p><strong>PS<\/strong>: solltet ihr z.b. Putty benutzen funktioniert &lt;STRG&gt;+a und q nicht. Stellt dann euren &#8222;Terminal-type-string&#8220; unter Connection -&gt; Data auf &#8222;linux&#8220;.<\/p>\n<hr \/>\n<p>Links:<br \/>\n<a title=\"https:\/\/de.wikipedia.org\/wiki\/LXC\" href=\"https:\/\/de.wikipedia.org\/wiki\/LXC\" target=\"_blank\"> [1] &#8211; https:\/\/de.wikipedia.org\/wiki\/LXC<\/a><br \/>\n<a title=\"https:\/\/help.ubuntu.com\/12.04\/serverguide\/lxc.html\" href=\"https:\/\/help.ubuntu.com\/12.04\/serverguide\/lxc.html\" target=\"_blank\">[2] &#8211; https:\/\/help.ubuntu.com\/12.04\/serverguide\/lxc.html<\/a><br \/>\n<a title=\"http:\/\/lxc.sourceforge.net\/man\/lxc.html\" href=\"http:\/\/lxc.sourceforge.net\/man\/lxc.html\" target=\"_blank\">[3] &#8211; http:\/\/lxc.sourceforge.net\/man\/lxc.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>LXC &#8211; LinuX Container ist eine Virtualisierung welche auf Betriebssystemebene wie z.b. Linux-VServer arbeitet. Es kann auch mit BSD-Jails verglichen werden. Mit LXC ist es m\u00f6glich verschiedene Container isoliert voneinander auf dem gleichen System laufen zu lassen. Dabei muss nicht ein komplettes root-Dateisystem vorhandensein mit LXC ist es auch m\u00f6glich einzelne Applikationen isoliert zu starten.<\/p>\n","protected":false},"author":3,"featured_media":383,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43,27,12],"tags":[75,31,74,76],"class_list":["post-282","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cubietruck","category-linux","category-software-pi","tag-cgroup","tag-chroot","tag-lxc","tag-namespace"],"_links":{"self":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/282","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=282"}],"version-history":[{"count":1,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/282\/revisions"}],"predecessor-version":[{"id":301,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/282\/revisions\/301"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/media\/383"}],"wp:attachment":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}