Montag Aug 05, 2013

Linux Container (LXC) — Teil 2: Arbeiten mit Containern

Teil 1 dieser Artikelserie vermittelte einen Überblick über die Linux-Container-Technologie. In diesem zweiten Teil soll der Umgang mit Containern anhand einiger Beispiele erläutert werden. Diese lassen sich auf einem aktuellen Oracle Linux 6 System nachvollziehen. Für die ersten Schritte empfiehlt sich die Installation von Oracle Linux in einer virtuellen Umgebung wie z.B. Oracle VM VirtualBox. Für diese Plattform bietet Oracle ein bereits vorinstalliertes Oracle Linux 6 Image zum Download vom Oracle Technology Network (OTN) an.

Die Administration von Linux-Containern erfolgt auf der Kommandozeile; bisher existiert noch keine Integration oder Unterstützung von Linux-Containern in Applikationen wie dem Oracle VM Manager oder dem Oracle Enterprise Manager. Viele von Oracle entwickelte Verbesserungen sind jedoch in das in Oracle Linux 6.4 enthaltene lxc-Paket eingeflossen; diese wurden auch an das LXC-Projekt übergeben und sind damit Bestandteil aktueller LXC-Versionen. Die Unterstützung von Linux-Containern ist weiterhin in das libvirt-Projekt integriert, welches eine grafische Oberfläche für die komfortable Verwaltung von virtuellen Maschinen oder Linux-Containern mit Hilfe des virt-manager (und anderen Werkzeugen) ermöglicht. Libvirt ist ebenfalls Bestandteil von Oracle Linux.

Das Anlegen eines Oracle Linux-Containers ist aber auch mit Hilfe der LXC-Kommandozeilenwerkzeuge in wenigen Schritten erledigt. Zuerst sollte ein dediziertes Verzeichnis für die Container-Dateisysteme angelegt werden, als Standard wird /container als Verzeichnis-Name vorgegeben. Wird dieses Verzeichnis auf einem Btrfs-Dateisystem angelegt, ergeben sich einige weitere interessante Möglichkeiten, wie z.B. das "Einfrieren" eines Container-Dateisystems zu einem bestimmten Zeitpunkt oder das schnelle Erzeugen (Clonen) von weiteren Containern, basierend auf einer "Muster-Vorlage" (Template). Das Clonen mit Hilfe von Btrfs-Snapshots erfolgt extrem schnell und platzsparend; nur die Veränderungen zum "Template" werden gespeichert. Die Erstellung und Verwaltung von Btrfs-Dateisystemen wird im Kapitel " The Btrfs File System" des "Oracle Linux Administrator's Solutions Guide for Release 6" im Detail erläutert.

Um beispielsweise ein Btrfs-Dateisystem auf einem zweiten Festplattenlaufwerk anzulegen und es unter /container als Verzeichnis einzuhängen, können folgende Kommandos verwendet werden:

# mkfs.btrfs /dev/sdb

WARNING! - Btrfs v0.20-rc1 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

fs created label (null) on /dev/sdb
	nodesize 4096 leafsize 4096 sectorsize 4096 size 4.00GB
Btrfs v0.20-rc1

# mdkir -v /container
mkdir: created directory `/container'
# mount -v /dev/sdb /container
mount: you didn't specify a filesystem type for /dev/sdb
       I will try type btrfs
/dev/sdb on /container type btrfs (rw)

Anschließend können Sie einen Container mit dem Kommando lxc-create erzeugen. Dessen Option "-t" bestimmt den generellen Distributions-Typ der erstellt werden soll (das sogenannte "Template"), z.B. "oracle", "ubuntu" oder "fedora". Je nach ausgewählten Template lassen sich nach den zwei Trennzeichen ("--") weitere Template-spezifische Optionen angeben. Für das Oracle-Template läßt sich z.B. mit der "--release"-Option die Distributions-Version auswählen, z.B. "5.8", "6.3" oder "6.latest". Weitere Informationen über die hier verfügbaren Konfigurationsmöglichkeiten finden Sie im Kapitel "About the lxc-oracle Template Script" des Oracle Linux 6 Administrator's Solutions Guide.

Um also beispielsweise einen Container mit dem Namen "ol6cont1" mit der aktuellsten Version von Oracle Linux 6 und Standardvorgaben zu erzeugen verwenden Sie folgendes Kommando:

# lxc-create -n ol6cont1 -t oracle -- --release=6.latest
/usr/share/lxc/templates/lxc-oracle is /usr/share/lxc/templates/lxc-oracle
Note: Usually the template option is called with a configuration
file option too, mostly to configure the network.
For more information look at lxc.conf (5)

Host is OracleServer 6.4
Create configuration file /container/ol6cont1/config
Downloading release 6.latest for x86_64
Loaded plugins: refresh-packagekit, security
ol6_latest                                               | 1.4 kB     00:00     
ol6_latest/primary                                       |  31 MB     01:23     
ol6_latest                                                          21879/21879
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package chkconfig.x86_64 0:1.3.49.3-2.el6 will be installed
--> Processing Dependency: libc.so.6(GLIBC_2.4)(64bit) for package: chkconfig-1.3.49.3-2.el6.x86_64
--> Processing Dependency: libc.so.6(GLIBC_2.3.4)(64bit) for package: chkconfig-1.3.49.3-2.el6.x86_64
[...]
--> Processing Dependency: rpm-python for package: yum-3.2.29-40.0.1.el6.noarch
--> Running transaction check
---> Package audit-libs.x86_64 0:2.2-2.el6 will be installed
---> Package bash.x86_64 0:4.1.2-15.el6_4 will be installed
[...]
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package               Arch   Version                          Repository  Size
================================================================================
Installing:
 chkconfig             x86_64 1.3.49.3-2.el6                   ol6_latest 158 k
 dhclient              x86_64 12:4.1.1-34.P1.0.1.el6           ol6_latest 316 k
[...]
 yum                   noarch 3.2.29-40.0.1.el6                ol6_latest 995 k
Installing for dependencies:
 MAKEDEV               x86_64 3.24-6.el6                       ol6_latest  88 k
 audit-libs            x86_64 2.2-2.el6                        ol6_latest  60 k
 basesystem            noarch 10.0-4.0.1.el6                   ol6_latest 4.3 k
[...]
 yum-metadata-parser   x86_64 1.1.2-16.el6                     ol6_latest  26 k
 zlib                  x86_64 1.2.3-29.el6                     ol6_latest  72 k

Transaction Summary
================================================================================
Install     135 Package(s)

Total download size: 79 M
Installed size: 294 M
Downloading Packages:
(1/135): MAKEDEV-3.24-6.el6.x86_64.rpm                   |  88 kB     00:00     
(2/135): audit-libs-2.2-2.el6.x86_64.rpm                 |  60 kB     00:00     
[...]
(135/135): zlib-1.2.3-29.el6.x86_64.rpm                  |  72 kB     00:00     
--------------------------------------------------------------------------------
Total                                           271 kB/s |  79 MB     04:59     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : libgcc-4.4.7-3.el6.x86_64                                  1/135 
  Installing : setup-2.8.14-20.el6.noarch                                 2/135 
[...]
  Installing : rootfiles-8.1-6.1.el6.noarch                             135/135 
  Verifying  : gamin-0.1.10-9.el6.x86_64                                  1/135 
  Verifying  : procps-3.2.8-25.el6.x86_64                                 2/135 
[...]
  Verifying  : 1:findutils-4.4.2-6.el6.x86_64                           135/135 

Installed:
  chkconfig.x86_64 0:1.3.49.3-2.el6                                             
  dhclient.x86_64 12:4.1.1-34.P1.0.1.el6                                        
[...]
Dependency Installed:
  MAKEDEV.x86_64 0:3.24-6.el6                                                   
  audit-libs.x86_64 0:2.2-2.el6                                                 
[...]
  zlib.x86_64 0:1.2.3-29.el6                                                    

Complete!
Rebuilding rpm database
Configuring container for Oracle Linux 6.4
Added container user:oracle password:oracle
Added container user:root password:root
Container : /container/ol6cont1/rootfs
Config    : /container/ol6cont1/config
Network   : eth0 () on virbr0
'oracle' template installed
'ol6cont1' created

Das Script lädt hierbei die erforderlichen RPM-Pakete von Oracles "public-yum" Server herunter, um eine Minimalinstallation (ca. 400 MB) der aktuellsten Oracle Linux 6 Version zu erstellen. Die Verzeichnis-Struktur des Containers befindet sich unter /container/ol6cont1/rootfs und kann vom Host-System aus wie eine reguläre Verzeichnisstruktur eingesehen werden. Das Script legt weiterhin zwei Benutzerkonten "root" und "oracle" an und konfiguriert eine virtuelle Netzwerk-Schnittstelle, die ihre IP-Adresse per DHCP vom zu libvirt gehörenden DHCP-Server bezieht. Die von lxc-create generierte Container-Konfigurationsdatei befindet sich in /container/ol6cont1/config und kann mit einem herkömmlichen Text-Editor an die eigenen Bedürfnisse angepasst werden. Vorab empfiehlt es sich, vom frisch installierten Container einen Snapshot zu erzeugen, von dem sich bei Bedarf schnell weitere Container erzeugen lassen:

# lxc-clone -o ol6cont1 -n ol6cont2
Tweaking configuration
Copying rootfs...
Create a snapshot of '/container/ol6cont1/rootfs' in '/container/ol6cont2/rootfs'
Updating rootfs...
'ol6cont2' created
# lxc-ls -1
ol6cont1
ol6cont2

Gestartet wird der Container anschließend mit dem folgenden Kommando:

# lxc-start -n ol6cont1 -d -o /container/ol6cont1/ol6cont1.log
# lxc-info -n ol6cont1
state:   RUNNING
pid:       311
# lxc-info -n ol6cont2
state:   STOPPED
pid:        -1

Der Container wird nun im Hintergrund gestartet; eventuelle log-Meldungen werden in die Datei ol6cont.log umgeleitet. Wie der Ausgabe von lxc-info entommen werden kann, wurde nur der Container ol6cont1 gestartet, während ol6cont2 sich weiterhin im gestoppen Zustand befindet, bis er ebenfalls mit lxc-start hochgefahren wird.

Anschließend können Sie sich mit dem folgenden Kommando an der Konsole des Linux-Containers anmelden. Die Systemkonfiguration kann nun mit den üblichen Bordmitteln (z.B. yum/rpm zur Software-Installation) innerhalb des laufenden Containers angepasst werden.

#  lxc-console -n ol6cont1

Oracle Linux Server release 6.4
Kernel 2.6.39-400.109.4.el6uek.x86_64 on an x86_64

ol6cont1 login: root
Password: 
[root@ol6cont1 ~]# ps x
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 /sbin/init
  184 ?        Ss     0:00 /sbin/dhclient -H ol6cont1 -1 -q -lf /var/lib/dhclien
  207 ?        Sl     0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
  249 ?        Ss     0:00 /usr/sbin/sshd
  256 lxc/console Ss+   0:00 /sbin/mingetty /dev/console
  260 ?        Ss     0:00 login -- root     
  262 lxc/tty2 Ss+    0:00 /sbin/mingetty /dev/tty2
  264 lxc/tty3 Ss+    0:00 /sbin/mingetty /dev/tty3
  266 lxc/tty4 Ss+    0:00 /sbin/mingetty /dev/tty4
  267 lxc/tty1 Ss     0:00 -bash
  278 lxc/tty1 R+     0:00 ps x
[root@ol6cont1 ~]# logout

Oracle Linux Server release 6.4
Kernel 2.6.39-400.109.4.el6uek.x86_64 on an x86_64

ol6cont1 login: CTRL-A Q
Die Tastensequenz CTRL-A, Q beendet die Konsolen-Sitzung. Alternativ ist es auch möglich, sich vom Host aus mittels SSH am Container-System anzumelden. Alle Container haben eine eigene IP-Adresse und sind standardmäßig über eine virtuelle Ethernet-Brücke virbr0 miteinander verbunden, die auch vom Host-System aus erreichbar ist. Auf diesem Weg lassen sich z.B. recht schnell einfache Client-Server-Architekturen innerhalb eines Host-Systems aufsetzen.

Ein laufender Container läßt sich jederzeit mit dem Kommando lxc-freeze im aktuellen Zustand "einfrieren". Die laufenden Prozesse werden hierbei angehalten und verbrauchen keine CPU-Ressourcen mehr, bis der Container mittels lxc-unfreeze wieder freigegeben wird. Da Linux-Container auf den Linux-Control Groups (CGroups) basieren, ist es weiterhin auch möglich, den Ressourcenverbrauch eines Containers zu limitieren.

Heruntergefahren werden kann ein Container auf verschiedene Weise: Entweder vom Host-System aus mittels lxc-stop, oder innerhalb des Containers mit den üblichen Kommandos wie shutdown -h oder poweroff. Nicht mehr benötigte Container lassen sich mit Hilfe des Kommandos lxc-destroy entfernen.

Dem Thema "Linux Container" wird im Oracle Linux Administrator's Solutions Guide ebenfalls ein eigenes Kapitel gewidmet. Dieses behandelt im Detail unter anderem das Erstellen, Konfigurieren und Starten von Linux-Containern, sowie dem Monitoring und Herunterfahren. Auch die Erstellung eines Container-Repositories auf einem Btrfs-Dateisystem und wie sich bestehende Container sehr schnell und platzsparend duplizieren (klonen) lassen wird dort ausführlich beschrieben.

Weitere Links zum Thema Linux Container:

Mittwoch Mai 29, 2013

Linux-Container (LXC) — Teil 1: Überblick

[Dies ist ein Gastartikel von Lenz Grimmer. Er arbeitet bei Oracle im Product Management Team für Oracle Linux.]

Linux-Container (LXC) erlauben die Isolation von einzelnen Diensten und Applikationen oder eines kompletten Linux-Betriebssystems. Jeder Container verfügt dafür über seine eigenen Netzwerk-Schnittstellen, IP-Adressen und Prozess-Tabelle — die laufenden Prozesse anderer Container oder des Host-Systems sind innerhalb des Containers nicht sichtbar. Linux-Container ermöglichen darüber hinaus eine sehr fein granulierte Kontrolle des Ressourcen-Verbrauchs (z.B. RAM, CPU, Disk-I/O).

Generell verfolgen Linux-Container einen komplett anderen Ansatz als klassische Virtualisierungstechnologien wie KVM oder Xen (auf dem z.B. Oracle VM Server für x86 basiert). Eine innerhalb des Containers laufende Anwendung wird direkt auf dem Betriebssystem-Kern des Host-Systems ausgeführt, was eine sehr direkte und faire Verteilung von CPU- und I/O-Ressourcen ermöglicht. Linux-Container bieten daher bestmögliche Performance und sehr ausgefeilte Möglichkeiten, die zur Verfügung stehenden Ressourcen zu verwalten und aufzuteilen.

Im Gegensatz zur "klassischen" Virtualisierung und ähnlich wie bei den Containern (Zonen) in Oracle Solaris oder auch den "Jails" auf FreeBSD, läuft also auf dem Host und in den Containern die gleiche Betriebssystem-Version; es ist nicht möglich, andere Linux-Kernelversionen oder gar andere Betriebssysteme wie z.B. Windows oder Oracle Solaris/x86 innerhalb eines Linux-Containers laufen zu lassen. Vom Host abweichende Linux-Distributionen (z.B. ein Fedora Linux als Container auf einem Oracle Linux Host) sind möglich, so lange sie die auf dem Host laufende Linux-Kernelversion unterstützen. Der Unbreakable Enterprise Kernel (UEK) Release 2 (2.6.39) unterstützt beispielsweise sowohl Oracle Linux 5 und 6. Es ist damit z.B. möglich, Oracle Linux 5 Instanzen als Container auf einem Oracle Linux 6 Host-System zu betreiben. Da Linux-Container vollständig auf Betriebssystem-Ebene realisiert werden, lassen sie sich übrigens ohne Weiteres auch mit anderen Virtualisierungstechnologien kombinieren. So ist es z.B. durchaus möglich, Linux-Container innerhalb einer virtualisierten Linux-Instanz (z.B. auf Oracle VM Server oder Oracle VM VirtualBox) zu erstellen.

Die Anwendungsbereiche für Linux-Container sind vielfältig:

  • Konsolidierung mehrerer einzelner Linux Systeme auf einem Server: Linux-Instanzen, die nicht performance-kritisch sind und unter Umständen nur sporadisch zum Einsatz kommen (z.B. Fax- oder Printserver, Intranet-Services), benötigen oft nicht notwendigerweise einen dedizierten Server für ihren Betrieb. Diese lassen sich energiesparend in separaten Containern auf einem einzelnen Server zusammenfassen.
  • Paralleler Betrieb mehrerer Instanzen einer Applikation, z.B. für unterschiedliche Anwender/Kunden. Jeder Anwender erhält "seine" eigene Applikationsinstanz, bei Bedarf mit einer definierten, zugesicherten Systemleistung. Dies verhindert, daß eine "Amok laufende" Applikation das gesamte Server-System in die Knie zwingt und stellt sicher, dass jeder Anwender nur Zugriff auf seine eigenen Daten hat.
  • Schnell zu erstellende "Sandbox"-Umgebungen für Entwicklungs- oder Testzwecke: einmal erstellte und konfigurierte Linux-Container können als Vorlage (Template) archiviert werden und bei Bedarf schnell dupliziert (geklont) werden. Nach Beendigung der Aktivität kann dieser Klon einfach gelöscht werden. Dies ermöglicht beispielsweise jederzeit reproduzierbare Software-Builds und Test-Ergebnisse, da die Umgebung stets wieder in ihren Urzustand zurück versetzt werden kann. Linux-Container booten üblicherweise auch erheblich schneller als "klassische" virtuelle Maschinen, was einen deutlichen Zeitgewinn bei der Entwicklung und dem Test von Applikationen bedeuten kann.
  • Gesicherter Betrieb einer bestimmten Anwendung: das Host-System und andere Container bleiben geschützt, falls die Anwendung aufgrund einer Sicherheitslücke kompromittiert werden sollte und der Angreifer damit Zugriff auf die Betriebssystem-Instanz erlangen würde. Der angerichtete Schaden kann somit minimiert und direkt vom Host-System aus analysiert und behoben werden.

Achtung: bitte berücksichtigen Sie, dass Linux-Container auf Oracle Linux 6 mit dem Unbreakable Enterprise Kernel Release 2 (2.6.39) derzeit noch den Status "Technology Preview" tragen. Der Einsatz wird daher im Moment nur für Test- und Evaluierungszwecke empfohlen.

Das Open-Source-Projekt "Linux Containers" (LXC) treibt die Entwicklung der auf der "Control Groups"- und "Name Spaces"-Funktionalität des Linux-Betriebssystemkerns basierenden Container-Technologie stetig weiter voran. Control Groups (Cgroups) ermöglichen es, die Ressourcen-Zuteilung für einzelne Prozesse oder Prozessgruppen unter Linux zu regeln und zu überwachen. So lassen sich z.B. die Menge des zur Verfügung stehenden Hauptspeichers, der verfügbare Anteil an CPU-Zeit oder der maximal mögliche Durchsatz zum Festplattenspeicher für eine Applikation festlegen.

Mit Hilfe der "Name Spaces" lassen sich diese Prozessgruppen noch zusätzlich gegeneinander abschirmen, z.B. was die Sichtbarkeit anderer auf dem System laufender Prozesse angeht, oder den exklusiven Zugriff auf eine Netzwerk-Schnittstelle. Auch eine Einschränkung der sichtbaren Dateisystem-Hierarchie lässt sich mit Hilfe von Name Spaces realisieren (ähnlich wie es bei einer klassischen "chroot"-Umgebung der Fall ist).

CGroups und Name Spaces bilden das Fundament, auf dem Linux-Container basieren; sie lassen sich allerdings auch unabhängig davon nutzen.

Wie genau das Erstellen von Linux-Containern funktioniert erläutert der zweite Teil dieses Artikels, inkl. eines Beispiels.

Weitere Links zum Thema Linux Container:


Montag Okt 29, 2012

Wozu eigentlich Oracle Linux?

Zur Abwechslung gibt es heute mal einen kürzeren Artikel, und zwar zum Thema "Oracle Linux".

Der eine oder andere mag sich vielleicht schon mal gefragt haben, warum man sich mit diesem "Red Hat Klon" überhaupt auseinandersetzen sollte. Gibt es neben dem "Support aus einer Hand"-Argument noch andere Gründe, warum sich Kunden dafür entscheiden, Oracle Linux einzusetzen?

Diese und ähnliche Fragen hat eine kürzlich erschienene IDC-Studie beleuchtet. Sie trägt den Titel: "Oracle Linux Takes Its Place in the Operating Systems Market". Interessant ist vor allem ein konkretes Kundenbeispiel am Ende der Studie.

Da es thematisch gerade passt sei zum Schluss noch ein kleiner Hinweis in eigener Sache erlaubt:
Viele der in dem Paper erwähnten Aspekte und Features (wie z.B. KSplice für Reboot-freie Kernel-Updates) werden auch auf der diesjährigen DOAG-Konferenz in Nürnberg behandelt. Mein Kollege Lenz Grimmer und ich halten dort einen Vortrag mit dem Titel:

"Oracle Linux - Best Practices und Nutzen (nicht nur) für die Oracle DB"

20.11.2012, 15:00 - 15:45 Uhr, Raum Kiew

About

Dieses Blog befasst sich mit Themen rund um Oracle Linux, Virtualisierung (primär mit Oracle VM) sowie Cloud Computing mit Oracle Produkten. Es wird betreut von Manuel Hoßfeld
- - - - - - - - - - - - - - - - - - - -
DISCLAIMER: Die Artikel und Kommentare in diesem Blog entsprechen den Meinungen der jeweiligen Autoren, und nicht notwendigerweise denen der Oracle Deutschland B.V. & Co. KG oder der Oracle Corporation.

Search

Archives
« April 2014
MoDiMiDoFrSaSo
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    
       
Heute