Ein lokaler AI Server - mit Solaris 11 mal eben aufgesetzt

Solaris 11 macht vieles neu, unter anderem auch den Installserver.  Wer, wie ich, seit (gefuehlten) 200 Jahren Jumpstart kennt, muss hier umlernen.  Dabei ist das ganze gar nicht so kompliziert.  Nur eben neu.

Mein Ziel war es, einen AI-Server zu bauen, den ich fuer Demo-Zwecke auch mal im Zug benutzen kann.  Damit sind auch die Hardware-Voraussetzungen klar: Tragbar sollte es schon sein.  Aber schoen der Reihe nach.

Als Erstes braucht man natuerlich ein OS-Image.  Das heisst in der neuen Solaris 11 Welt jetzt Repository.  Das Original dafuer kann man sich von der Solaris 11 Seite bei Oracle herunterladen.  Man braucht dazu das zweiteilige "Oracle Solaris 11 11/11 Repository Image", das man sich dann natuerlich mit cat zusammensetzt.  Die MD5 Pruefsummen gibt es uebrigens ebenfalls auf dieser Seite, nur etwas weiter oben.

Damit ist nun das Repository ganz schnell gemacht:

# zfs create -o mountpoint=/export/repo rpool/ai/repo
# zfs create rpool/ai/repo/sol11
# mount -o ro -F hsfs /tmp/sol-11-1111-repo-full.iso /mnt
# rsync -aP /mnt/repo /export/repo/sol11
# umount /mnt
# pkgrepo rebuild -s /export/repo/sol11/repo
# zfs snapshot rpool/ai/repo/sol11@fcs
# pkgrepo info -s  /export/repo/sol11/repo
PUBLISHER PACKAGES STATUS           UPDATED
solaris   4292     online           2012-03-12T20:47:15.378639Z
Und schon ist das Repository fertig. Zur Sicherheit gleich einen Snapshot anlegen, man weiss nie, wozu der noch gut ist. Um das Repository zu verwenden, koennte man es nun als Publisher auf Dateibasis eintragen:
# pkg set-publisher -g file:///export/repo/sol11/repo solaris
Falls ich das Repository spaeter auch per (virtuellem) Netzwerk verwenden moechte, jetzt noch schnell den Repository-Server aktiviert:
# svccfg -s application/pkg/server \
setprop pkg/inst_root=/export/repo/sol11/repo
# svccfg -s application/pkg/server setprop pkg/readonly=true
# svcadm refresh application/pkg/server
# svcadm enable application/pkg/server

Und schon kann man mit dem Browser auf http://localhost/ einen huebschen Repository-Server bewundern. Schritt 1 ist geschafft.  Das alles ist uebrigens in einem README, das im Repository-Image enthalten ist, gut beschrieben. 

Inzwischen gibt es natuerlich Updates, zu finden in MOS im Oracle Solaris 11 Support Repository Updates (SRU) Index.  Je nach Bedarf kann man diese Updates einfach in das bestehende Repository einpflegen oder sie als eigenstaendige Repositories betreiben.  Diese Updates sind jeweils selbststaendig, d.h. SRU4 enthaelt auch die Updates aus SRU2 und SRU3.  Mit einem kleinen ZFS-Trick kann man auch beides bekommen: Ein Gesamt-Repository und gleichzeitig fuer jedes Update ein eigenes:

# mount -o ro -F hsfs /tmp/sol-11-1111-sru4-05-incr-repo.iso /mnt
# pkgrecv -s /mnt/repo -d /export/repo/sol11/repo '*'
# umount /mnt
# pkgrepo rebuild -s /export/repo/sol11/repo
# zfs snapshot rpool/ai/repo/sol11@sru4
# zfs set snapdir=visible rpool/ai/repo/sol11
# svcadm restart svc:/application/pkg/server:default
Damit ist das normale Repository jetzt auf dem Stand von SRU4. Gleichzeitig gibt es dank der ZFS Snapshots in /export/repo/sol11/.zfs/snapshot/fcs ein gueltiges Repository ohne den Update. Wer moechte, kann dazu natuerlich auch einen zweiten Repository-Service auf einem zusaetzlichen Port betreiben.

Jetzt aber zum Installserver.  Mit nur wenig Lektuere der entsprechenden Dokumentation wird klar, dass man hierzu einen DHCP-Server betreiben muss.  Da ich vermeiden wollte, dass dieser meinem bereits bestehenden DHCP-Server (Teil meiner SunRay Installation) in die Quere kommt, und weil das fuer einen solchen Service sowieso eine gute Idee ist, soll er in einer eigenen Zone installiert werden.  Also erst mal schnell eine Zone erzeugen:

# zfs create -o mountpoint=/export/install rpool/ai/install
# zfs create -o mountpoint=/zones rpool/zones
# zonecfg -z ai-server
zonecfg:ai-server> create
create: Using system default template 'SYSdefault'
zonecfg:ai-server> set zonepath=/zones/ai-server
zonecfg:ai-server> add dataset
zonecfg:ai-server:dataset> set name=rpool/ai/install
zonecfg:ai-server:dataset> set alias=install
zonecfg:ai-server:dataset> end
zonecfg:ai-server> commit
zonecfg:ai-server> exit
# zoneadm -z ai-server install
# zoneadm -z ai-server boot ; zlogin -C ai-server
Beim ersten Boot dann einen Hostnamen und IP-Adresse vergeben, fertig ist die Zone.  Als Publisher fuer Solaris Pakete wie z.B. die AI Pakete verwendet sie dabei zwingend den Publisher der Global Zone. Das Filesystem /export/install ist natuerlich fuer den Installserver gedacht. Diesen gilt es jetzt aufzusetzen:
#zlogin ai-server
root@ai-server:~# pkg install install/installadm
root@ai-server:~# installadm create-service -n x86-fcs -a i386 \
-s pkg://solaris/install-image/solaris-auto-install@5.11,5.11-0.175.0.0.0.2.1482 \
-d /export/install/fcs -i 192.168.2.20 -c 3

Damit ist der Installserver selbst eigentlich schon fertig. Was ist hier passiert? Nun, natuerlich muss man erst einmal die notwendige Software installieren. Mit IPS ist das einfach, ggf. wird auch gleich der benoetigte DHCP-Server mit installiert. Achtung, es gibt zwei verschiedene DHCP-Server in Solaris 11, den aus Solaris 10 und frueher bekannten, und den von ISC. Letzterer wird fuer AI gebraucht. Die SMF-Namen der beiden unterscheiden sich nur wenig, der "alte" DHCP-Server heisst in SMF "svc:/network/dhcp-server:default". Der ISC-Server bringt verschiedene SMF-Services mit. Davon brauchen wir mindestens den Service "svc:/network/dhcp/server:ipv4". Mit dem Kommando "installadm create-service" wird nun ein Installations-Service aufgebaut. Er hat den Namen "x86-fcs", bedient die Architektur "i386" und bezieht sein Boot-Image aus dem Repository des System-Publishers in der Version 5.11,5.11-0.175.0.0.0.2.1482, das entspricht Solaris 11 11/11.  (Die Option "-a i386" in diesem Beispiel ist optional, da der Installserver auf einer x86-Maschine laeuft.) Die Boot-Umgebung fuer die Clients wird in /export/install/fcs angelegt, und der DHCP-Server wird fuer 3 IP-Adressen ab 192.168.2.20 konfiguriert.  Diese Konfiguration findet man in leicht verstaendlicher Form in /etc/inet/dhcpd4.conf.  Auf die gleiche Weise koennte man nun noch einen Service fuer SPARC Systeme aufsetzen.

Jetzt koennte man bereits den ersten Client registrieren und installieren.  Er bekaeme den Standard "solaris-large-server" mit dem Publisher "http://pkg.oracle.com/solaris/release" installiert und wuerde nach dem ersten Booten seine Konfiguration interaktiv abfragen.  Damit wird klar:  Der AI-Server ist eigentlich nur ein Boot-Server, die eigentliche Quelle fuer Pakete kann eine andere sein.  Da ich das so jedoch nicht haben moechte, konfiguriere ich mir meinen Client erst noch ein wenig zurecht.

Die Konfiguration von Install-Clients wird ueber sogenannte Manifeste und Profile gesteuert.  Dabei enthaelt das Manifest Informationen ueber zu installierende Pakete und Dateisystem-Konfiguration (und entspricht damit ein wenig der "rules.ok" Datei von Jumpstart).  Die Profile enthalten darueber hinausgehende Konfigurations-Angaben wie bspw. Root-PW, Primaerer User, IP-Adresse, Tastatur-Layout etc. und entsprechend damit in etwa der alten sysid.cfg. 

Am einfachsten kommt man an ein Template fuer ein Manifest, indem man sich das Default-Manifest vom Installserver geben laesst, dieses modifiziert und das Ergebnis dem Installserver bekannt gibt:

root@ai-server:~# mkdir -p /export/install/configs/manifests
root@ai-server:~# cd /export/install/configs/manifests
root@ai-server:~# installadm export -n x86-fcs -m orig_default \
-o orig_default.xml
root@ai-server:~# cp orig_default.xml s11-fcs.small.local.xml
root@ai-server:~# vi s11-fcs.small.local.xml
root@ai-server:~# more s11-fcs.small.local.xml
<!DOCTYPE auto_install SYSTEM "file:///usr/share/install/ai.dtd.1">
<auto_install>
  <ai_instance name="S11 Small fcs local">
    <target>
      <logical>
        <zpool name="rpool" is_root="true">
          <filesystem name="export" mountpoint="/export"/>
          <filesystem name="export/home"/>
          <be name="solaris"/>
        </zpool>
      </logical>
    </target>
    <software type="IPS">
      <destination>
        <image>
          <!-- Specify locales to install -->
          <facet set="false">facet.locale.*</facet>
          <facet set="true">facet.locale.de</facet>
          <facet set="true">facet.locale.de_DE</facet>
          <facet set="true">facet.locale.en</facet>
          <facet set="true">facet.locale.en_US</facet>
        </image>
      </destination>
      <source>
        <publisher name="solaris">
          <origin name="http://192.168.2.12/"/>
        </publisher>
      </source>
      <!--
        By default the latest build available, in the specified IPS
        repository, is installed.  If another build is required, the
        build number has to be appended to the 'entire' package in the
        following form:

            <name>pkg:/entire@0.5.11-0.build#</name>
      -->
      <software_data action="install">
        <name>pkg:/entire@0.5.11,5.11-0.175.0.0.0.2.0</name>
        <name>pkg:/group/system/solaris-small-server</name>
      </software_data>
    </software>
  </ai_instance>
</auto_install>

root@ai-server:~# installadm create-manifest -n x86-fcs -d \
-f ./s11-fcs.small.local.xml 
root@ai-server:~# installadm list -m -n x86-fcs
Manifest             Status    Criteria 
--------             ------    -------- 
S11 Small fcs local  Default   None
orig_default         Inactive  None

Die wesentlichen Punkte in diesem Manifest sind:

  • Es wird "solaris-small-server" installiert
  • Es gibt ein paar Locales weniger (die ich nicht haben wollte)
  • Als Publisher wird mein in der GZ laufender Package Service auf Adresse 192.168.2.12 verwendet
  • Von dort wird die FCS-Version von Solaris 11 installiert:  pkg:/entire@0.5.11,5.11-0.175.0.0.0.2.0

Auf ganz aehnliche Weise wird jetzt aus einem interaktiv erzeugten Default-Profil eine kleine Menge von Profil-Schnipseln erzeugt, was die Konfiguration von mehreren Clients spaeter leichter macht:

root@ai-server:~# mkdir -p /export/install/configs/profiles
root@ai-server:~# cd /export/install/configs/profiles
root@ai-server:~# sysconfig create-profile -o default.xml
root@ai-server:~# cp default.xml general.xml; cp default.xml mars.xml
root@ai-server:~# cp default.xml user.xml
root@ai-server:~# vi general.xml mars.xml user.xml
root@ai-server:~# more general.xml mars.xml user.xml
::::::::::::::
general.xml
::::::::::::::
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="profile" name="sysconfig">
  <service version="1" type="service" name="system/timezone">
    <instance enabled="true" name="default">
      <property_group type="application" name="timezone">
        <propval type="astring" name="localtime" value="Europe/Berlin"/>
      </property_group>
    </instance>
  </service>
  <service version="1" type="service" name="system/environment">
    <instance enabled="true" name="init">
      <property_group type="application" name="environment">
        <propval type="astring" name="LANG" value="C"/>
      </property_group>
    </instance>
  </service>
  <service version="1" type="service" name="system/keymap">
    <instance enabled="true" name="default">
      <property_group type="system" name="keymap">
        <propval type="astring" name="layout" value="US-English"/>
      </property_group>
    </instance>
  </service>
  <service version="1" type="service" name="system/console-login">
    <instance enabled="true" name="default">
      <property_group type="application" name="ttymon">
        <propval type="astring" name="terminal_type" value="vt100"/>
      </property_group>
    </instance>
  </service>
  <service version="1" type="service" name="network/physical">
    <instance enabled="true" name="default">
      <property_group type="application" name="netcfg">
        <propval type="astring" name="active_ncp" value="DefaultFixed"/>
      </property_group>
    </instance>
  </service>
  <service version="1" type="service" name="system/name-service/switch">
    <property_group type="application" name="config">
      <propval type="astring" name="default" value="files"/>
      <propval type="astring" name="host" value="files dns"/>
      <propval type="astring" name="printer" value="user files"/>
    </property_group>
    <instance enabled="true" name="default"/>
  </service>
  <service version="1" type="service" name="system/name-service/cache">
    <instance enabled="true" name="default"/>
  </service>
  <service version="1" type="service" name="network/dns/client">
    <property_group type="application" name="config">
      <property type="net_address" name="nameserver">
        <net_address_list>
          <value_node value="192.168.2.1"/>
        </net_address_list>
      </property>
    </property_group>
    <instance enabled="true" name="default"/>
  </service>
</service_bundle>
::::::::::::::
mars.xml
::::::::::::::
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="profile" name="sysconfig">
  <service version="1" type="service" name="network/install">
    <instance enabled="true" name="default">
      <property_group type="application" name="install_ipv4_interface">
        <propval type="astring" name="address_type" value="static"/>
        <propval type="net_address_v4" name="static_address" 
                 value="192.168.2.100/24"/>
        <propval type="astring" name="name" value="net0/v4"/>
        <propval type="net_address_v4" name="default_route" 
                 value="192.168.2.1"/>
      </property_group>
      <property_group type="application" name="install_ipv6_interface">
        <propval type="astring" name="stateful" value="yes"/>
        <propval type="astring" name="stateless" value="yes"/>
        <propval type="astring" name="address_type" value="addrconf"/>
        <propval type="astring" name="name" value="net0/v6"/>
      </property_group>
    </instance>
  </service>
  <service version="1" type="service" name="system/identity">
    <instance enabled="true" name="node">
      <property_group type="application" name="config">
        <propval type="astring" name="nodename" value="mars"/>
      </property_group>
    </instance>
  </service>
</service_bundle>
::::::::::::::
user.xml
::::::::::::::
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="profile" name="sysconfig">
  <service version="1" type="service" name="system/config-user">
    <instance enabled="true" name="default">
      <property_group type="application" name="root_account">
        <propval type="astring" name="login" value="root"/>
        <propval type="astring" name="password" 
                 value="noIWillNotTellYouMyPasswordNotEvenEncrypted"/>
        <propval type="astring" name="type" value="role"/>
      </property_group>
      <property_group type="application" name="user_account">
        <propval type="astring" name="login" value="stefan"/>
        <propval type="astring" name="password" 
                 value="noIWillNotTellYouMyPasswordNotEvenEncrypted"/>
        <propval type="astring" name="type" value="normal"/>
        <propval type="astring" name="description" value="Stefan Hinker"/>
        <propval type="count" name="uid" value="12345"/>
        <propval type="count" name="gid" value="10"/>
        <propval type="astring" name="shell" value="/usr/bin/bash"/>
        <propval type="astring" name="roles" value="root"/>
        <propval type="astring" name="profiles" value="System Administrator"/>
        <propval type="astring" name="sudoers" value="ALL=(ALL) ALL"/>
      </property_group>
    </instance>
  </service>
</service_bundle>
root@ai-server:~# installadm create-profile -n x86-fcs -f general.xml
root@ai-server:~# installadm create-profile -n x86-fcs -f user.xml
root@ai-server:~# installadm create-profile -n x86-fcs -f mars.xml \
-c ipv4=192.168.2.100
root@ai-server:~# installadm list -p

Service Name  Profile     
------------  -------     
x86-fcs       general.xml
              mars.xml
              user.xml

root@ai-server:~# installadm list -n x86-fcs -p

Profile      Criteria 
-------      -------- 
general.xml  None
mars.xml     ipv4 = 192.168.2.100
user.xml     None
In "general.xml" sind fuer viele Clients gueltige Einstellungen wie bspw. DNS-Server festgelegt. In "user.xml" die User, die einzutragen sind. Beide Profile gelten jedoch erst einmal ohne weitere Kriterien, also fuer alle Clients. Anders mars.xml, in dem die IP-Adresse fuer den Client mars festgelegt wird. Dieses Profil gilt nur fuer Install-Clients, die vom DHCP-Server die passende IP-Adresse bekommen haben. Damit das klappt, nun der letzte Schritt:
root@ai-server:~# installadm create-client -e 08:00:27:AA:3D:B1 -n x86-fcs
root@ai-server:~# vi /etc/inet/dhcpd4.conf
root@ai-server:~# tail -5 /etc/inet/dhcpd4.conf
host 080027AA3DB1 {
  hardware ethernet 08:00:27:AA:3D:B1;
  fixed-address 192.168.2.100;
  filename "01080027AA3DB1";
}

Damit ist der Client nun auch fertig vorbereitet. Damit der DHCP-Server keine Dummheiten macht, habe ich den Host-Eintrag in /etc/inet/dhcpd4.conf noch um die IP-Adresse fuer diesen Client ergaenzt. Damit bekommt dann nur dieser Install-Client diese Adresse, und nicht etwa ein unschuldiger anderer Rechner in diesem Netz...

Bemerkung: Das obige Beispiel zeigt die Konfiguration fuer ein x86-System.  Bei einem SPARC-System sieht die DHCP-Konfiguration etwas anders aus.  Hier wieder ein Beispiel mit kleinen manuellen Aenderungen, damit der DHCP-Server mir keine Sorgen macht ;-)

subnet 192.168.2.0 netmask 255.255.255.0 {
  range 192.168.2.200 192.168.2.201
  option broadcast-address 192.168.2.255;
  option routers 192.168.2.1;
  next-server 192.168.2.13;
}

class "SPARC" {
  match if not (substring(option vendor-class-identifier, 0, 9) = "PXEClient");
  filename "http://192.168.2.13:5555/cgi-bin/wanboot-cgi";
}

host sparcy {
   hardware ethernet 00:14:4f:fb:52:3c ;
   fixed-address 192.168.2.202 ;
}

 

Da die Installation aber natuerlich wirklich "Hands Off" ablaufen soll, muss nun noch das Boot-Menue fuer den Client leicht modifiziert werden.  Es steht in /etc/netboot.  Dort wird fuer jeden Client ein eigenes, ueber die MAC-Adresse identifiertes menu.lst angelegt.  Das Template dafuer steht in einem Verzeichnis, das den Namen des Install-Service traegt, in meinem Fall als in /etc/netboot/x86-fcs.  Wer das Boot-Menue also nicht fuer jeden Client einzeln aendern moechte, kann auch das Template selbst anfassen.
root@ai-server:~# cd /etc/netboot
root@ai-server:~# cp menu.lst.01080027AA3DB1 menu.lst.01080027AA3DB1.org
root@ai-server:~# vi menu.lst.01080027AA3DB1
root@ai-server:~# diff menu.lst.01080027AA3DB1 menu.lst.01080027AA3DB1.org
1,2c1,2
< default=1
< timeout=10
---
> default=0
> timeout=30
root@ai-server:~# more menu.lst.01080027AA3DB1
default=1
timeout=10
min_mem64=0

title Oracle Solaris 11 11/11 Text Installer and command line
	kernel$ /x86-fcs/platform/i86pc/kernel/$ISADIR/unix -B install_media=htt
p://$serverIP:5555//export/install/fcs,install_service=x86-fcs,install_svc_addre
ss=$serverIP:5555
	module$ /x86-fcs/platform/i86pc/$ISADIR/boot_archive

title Oracle Solaris 11 11/11 Automated Install
	kernel$ /x86-fcs/platform/i86pc/kernel/$ISADIR/unix -B install=true,inst
all_media=http://$serverIP:5555//export/install/fcs,install_service=x86-fcs,inst
all_svc_address=$serverIP:5555,livemode=text
	module$ /x86-fcs/platform/i86pc/$ISADIR/boot_archive

Einer Installation (mittels PXE-Boot) steht damit nichts mehr im Wege. Fuer meine Demo-Zwecke ist das natuerlich ein Client aus der Virtualbox. Bei einem SPARC-System wuerde man statt dessen das bekannte "boot net:dhcp - install" am OK Prompt eingeben und dann genuesslich der Installation zusehen.

Und auch, wenn dieser Blogeintrag ein wenig laenger ist - so schwer ist das nun auch wieder nicht ;-)

Kommentare:

Senden Sie einen Kommentar:
Kommentare sind ausgeschaltet.
About

Neuigkeiten, Tipps und Wissenswertes rund um SPARC, CMT, Performance und ihre Analyse sowie Erfahrungen mit Solaris auf dem Server und dem Laptop.

This is a bilingual blog (most of the time). Please select your prefered language:
.
The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.

Search

Categories
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