Mainframe im Terminal: CentOS 4.7 Repository lokal

Da CentOS 4.7 schon längere Zeit nicht mehr aktuell ist und auch die Repositories schon in den Vault verschoben wurden, habe ich ein wenig Sorge, dass die Repositories irgendwann komplett aus dem Netz verschwunden sein könnten. Also dachte ich, dass ein lokales Repository doch eine gute Idee wäre.

Spiegeln des offiziellen Repositories

Das erste, was wir tun müssen, ist natürlich eine passende Freigabe auf unserem Server einrichten. Bei mir ist das „/volume1/centos„.

Also spiegeln wir mal fleißig… wir brauchen aber nicht alles, wir brauchen nur die Repositories für S390 und S390x. Also bauen wir uns doch erst einmal eine Liste von URLs, die wir spiegeln möchten.

http://vault.centos.org/4.7/addons/s390x/
http://vault.centos.org/4.7/addons/s390/
http://vault.centos.org/4.7/centosplus/s390x/
http://vault.centos.org/4.7/centosplus/s390/
http://vault.centos.org/4.7/contrib/s390x/
http://vault.centos.org/4.7/contrib/s390/
http://vault.centos.org/4.7/extras/s390x/
http://vault.centos.org/4.7/extras/s390/
http://vault.centos.org/4.7/os/s390x/
http://vault.centos.org/4.7/os/s390/
http://vault.centos.org/4.7/testing/s390x/
http://vault.centos.org/4.7/testing/s390/
http://vault.centos.org/4.7/updates/s390x/
http://vault.centos.org/4.7/updates/s390/
http://vault.centos.org/RPM-GPG-KEY-centos4

Wer nur die 32/31-bit Variante benötigt, lässt einfach die „s390x“-URLs weg – und umgekehrt. In meinem Fall habe ich beide Varianten gespiegelt.

Diese Liste lassen wir jetzt per wget spiegeln.

cd /volume1/centos
wget --mirror --convert-links --no-parent -i liste.dat

Das dauert jetzt „ein wenig“. Sind ja immerhin ein paar hundert MB, genauer:

du -h vault.centos.org
[...]
5.0G    vault.centos.org

Neues Repository in CentOS einbinden

Wir haben ja vor der Spiegelaktion schon die passenden Freigaben auf unserem Server erstellt. Da wir mit einem Unix arbeiten, bietet sich da natürlich eine NFS-Freigabe an.

Die möchten wir jetzt auf unserem Mainframe auch nutzen. Also mounten wir das Baby:

showmount -e 192.168.0.200
Export list for 192.168.0.200:
/volume1/centos   192.168.*

Und einbinden

mkdir -p /var/yum
mount 192.168.0.200:/volume1/centos /var/yum

Den „mount“ könnten wir noch in „/etc/rc.local“ eintragen, damit das Repository nach einem Neustart auch noch eingebunden ist… ich habe dann bei dieser Gelegenheit noch in „/etc/hosts“ meine NAS dem Namen nach bekanntgegeben.

Repository in Yum einbinden

Dann müssen wir noch die Einstellungen für yum anpassen:

vim /etc/yum.repos.d/CentOS-Base.repo

Darin dann alle http://vault.centos.org gegen file:///var/yum/vault.centos.org tauschen (bitte baseurl und gpgkey!).

Wenn du übrigens da gerade in der Konfiguration herumbastelst, kannst du die beiden Repositories für „Extras“ und „Plus“ auch noch einschalten, indem du „enabled=1“ setzt.

Testlauf

Jetzt sind wir so weit… probieren wir es doch auch aus:

[root@hercules64 yum]# yum update
Setting up Update Process
Setting up repositories
update                    100% |=========================|  951 B    00:00
base                      100% |=========================| 1.1 kB    00:00
contrib                   100% |=========================|  951 B    00:00
centosplus                100% |=========================|  951 B    00:00
addons                    100% |=========================|  951 B    00:00
extras                    100% |=========================|  951 B    00:00
Reading repository metadata in from local files
primary.xml.gz            100% |=========================|  196 B    00:00
primary.xml.gz            100% |=========================|  199 B    00:00
No Packages marked for Update/Obsoletion

Das war zu erwarten, habe ja gerade erst ein Update gemacht. Deshalb installieren wir mal etwas testweise:

[root@hercules64 yum]# yum install mc
Setting up Install Process
Setting up repositories
Reading repository metadata in from local files
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for mc to pack into transaction set.
mc-4.6.1-0.8.5.s390x.rpm  100% |=========================|  35 kB    00:00
---> Package mc.s390x 1:4.6.1-0.8.5 set to be updated
--> Running transaction check

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 mc                      s390x      1:4.6.1-0.8.5    base              1.7 M

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 1.7 M

Scheint zu funktionieren 🙂

midnight commander mainframe
midnight commander mainframe

Aufräumen

Wenn man es jetzt ganz genau nimmt, könnten wir die gespiegelten Repositories doch noch ein wenig aufräumen, beispielsweise die KDE- und Gnome-Pakete entfernen (und auch sonstige X-Sachen). Wir bauen ja einen Server und keine Klickibunti-Maschine für Weicheier 🙂

Aber Vorsicht: Nicht alle Pakete, die dem Namen nach für die GUI zuständig sind, sind auch tatsächlich entbehrlich. Beispielsweise wird das GnomeVFS durchaus auch für die manche Konsolenprogramme gebraucht… ja das ist eine Seuche, aber es ist nun mal so.

 

Mainframe im Terminal: CentOS Installation

Nachdem wir im vorherigen Teil grob darüber gesprochen haben, dass mittels Hercules eine OS/390-Emulation möglich ist, sollten wir mal konkret werden.

Vorarbeiten für Hercules

Zunächst mal müssen wir Hercules ein paar DASDs zur Verfügung stellen. Das sind quasi die Festplatten („quasi“ deshalb, weil wir beim Mainframe eben von DASDs sprechen statt von Festplatten – das hat hysterische Gründe, technisch gesehen sind DASDs und Festplatten identisch).

Das ist schnell erledigt:

dasdinit -z -lfs sys1.dasd 3390-3 SYS1
dasdinit -z -lfs sys2.dasd 3390-3 SYS2

Damit legen wir zwei DASDs an, SYS1 und SYS2. Beide werden für die Installation und den Betrieb des Systems benötigt. Beide wachsen ggf. dynamisch mit und werden komprimiert auf der Host-Festplatte abgelegt.

Mit „Host“ bezeichnen wir in diesem Fall das gastgebende System, nicht die Mainframe (Host ist auch hier ein üblicher Begriff für den Großrechner an sich).

Danach ein bisschen hercules.cnf-Vodoo (Übersetzung: bitte die hercules.cnf genau so anlegen):

CPUSERIAL 002623
CPUMODEL  2096
MAINSIZE  780
XPNDSIZE  0
CNSLPORT  3270
HTTPPORT  9091
NUMCPU    1
NUMVEC    1
SYSEPOCH  1900
TZOFFSET  +0000
OSTAILOR  LINUX
PANRATE   SLOW
ARCHMODE  ESAME
PGMPRDOS  RESTRICTED

#DASD
0A01 3390 /Users/mirko/Documents/hercules/sys1.dasd
0A02 3390 /Users/mirko/Documents/hercules/sys2.dasd

# Channel to Channel
0c00.2 3088 CTCI /dev/tun0 1500 192.168.0.125 192.168.0.123 255.255.255.255

Was wir damit verbrechen ist folgendes:

  • Speicher 780MB
  • Eine CPU (per MAXCPU könnte man schon mal mehrere CPUs in die „Maschine“ stecken, Default scheint 3 zu sein, es wird aber erst mal nur eine CPU hochgefahren!)
  • Eine Vectoreinheit („mein“ Hercules unterstützt das nicht)
  • Architektur z/Architecture (= ESAME)
  • Zwei Platten mit jeweiliger ID (0A01 + 0A02) und Device-Type (3390).
  • CTC-Netzverbindung (Gast -> Host mit IP-Forwarding -> Internet)

Genauere/weitere Erklärungen findet ihr bei Hercules selbst.

OSX: tun0-Device & IP-Forwarding

Kleiner Ausflug in die OSX-Welt – wir brauchen ein tun0-Device. Das irgendwo im System herumfliegende utun0-Device reicht uns nicht.

Glücklicherweise hat Matthias Nissler da ein wenig gezaubert.

Also bitte erst mal TunTap installieren. Ist ein Nobrainer, ganz einfache Installation.

Danach müssen wir noch dafür sorgen, dass IP-Pakete von unserem OSX weitegeleitet werden dürfen/können:

[mac]➜ sudo sysctl -w net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1

OSX: Teil 2

Nach ernsthaft stundenlanger Problemlösungsversuche und erfolgloser Installationsversuche über NFS und FTP in diversen Konfigurationen… ist mir doch aufgefallen, dass der Hercules gar keine Verbindung zum Server aufbaut – und das obwohl es im Log so aussah -.- Ich möchte…

14:13:18 * going to do nfsGetSetup
14:13:22 * mounting nfs path 192.168.0.200:/volume1/nfs
14:13:22 * mounting nfs path 192.168.0.200:/volume1/nfs

Das sieht doch jetzt wirklich so aus, als ob das was sinnvolles passiert, oder? Fehlermeldung gibt es selbstredend viele, viele, viele Minuten später keine sinnvolle – nur allgemeines Gesülze von wegen „geht nix“. Entwickler sind doch humorvolle Gesellen, echt mal.

Aber… ARP fehlte. Durch Zufall herausgefunden, weil ich einfach alles probiert habe, was mein Gehirn oder Google hergegeben hat. Trial & Error – das gut abgehangene Verfahren zur Problemlösung in der IT – komm‘ mir jetzt bloß keiner, dass das niemand sonst macht…

Also… unbedingt noch folgendes einlöten:

Per ifconfig herausfinden, welche MAC-Adresse die Karte hat, die wir momentan nutzen.

en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether X1:X2:X3:X4:X5:X6

Jetzt die Macadresse mit dem/das/die/den ARP verknupsern – und zwar mit der IP-Adresse, die später unser z/OS resp. CentOS nutzen soll:

sudo arp -s 192.168.0.125 x1:x2:x3:x4:x5:x6 pub en1

Server: Wir brauchen einen NFS-Server

Genauer: Einen NFSv3-Server!

Für die Installation brauchen wir im weiteren Verlauf auch Zugriff auf die centos-Installationsdateien (= Inhalt des ISOs) über NFS. Im Prinzip wäre auch eine Freigabe über FTP oder HTTP möglich, aber nur NFS habe ich zum Laufen gebracht.

Also einen NFS-Server installieren, bitte. Und eine Freigabe erstellen, die die Installations-ISO und eine Kopie des „images„-Verzeichnisses enthält:

[jum/root]➜  /volume1/nfs ls -al
total 2049968
d---------+  3 root root       4096 Oct  8 15:44 .
drwxr-xr-x  36 root root       4096 Oct  8 15:42 ..
----------+  1 root root 2099142656 Oct  8 14:19 centos-4.7-s390-dvd.iso
drwxrwxrwx   2 root root       4096 Oct  8 14:19 images

Das ISO auf den NFS-Server kopieren – und innerhalb der Hercules-Hierarchie stehen lassen. Macht das Leben leichter (und wird für den ersten IPL auch benötigt – obwohl man es prinzipiell über ein gemounteten NFS-Share machen könnte, wenn man schnelles Ethernet hat).

Das „images„-Verzeichnis könnt ihr euch vom gemountete ISO (siehe dazu gleich) kopieren.

Ja ok, du kannst das NFS-Share natürlich auch in einem Unterverzeichnis der Hercules-Installation mounten… hier bitte:

sudo mount 192.168.0.200:/volume1/nfs iso

Wenn du das machst, pass bitte die nachfolgenden Pfade passend an.

CentOS-Installations-DVD

Die Installationsdateien haben wir uns ja per Torrent heruntergeladen. Das ISO dazu müssen wir jetzt noch mounten, damit wir nach dem Hochfahren von Hercules auch was zu tun haben.

[mac]➜ hdiutil attach -nomount centos-4.7-s390-dvd.iso
/dev/disk5
[mac]➜ mount_cd9660 /dev/disk5 iso
[mac]➜ ls iso
CentOS              RELEASE-NOTES       RPM-GPG-KEY-centos4 TRANS.TBL           headers             repodata
GPL                 RPM-GPG-KEY         SRPMS               generic.ins         images              yumgroups.xml

Damit haben das ISO gemounted und können darauf später auch zugreifen.

Hercules „hochfahren“

Hercules braucht für das CTC-Netzwerk Rootrechte – also starten wir Hercules mit Sudo:

sudo hercules -f hercules.cnf > hercules.log

Das geht flott. Hercules ist da.

IPL

So, jetzt wird gekuschelt. Wir machen einen Initial Program Load, um die Installation von CentOS zu beginnen.

ipl /Users/mirko/Documents/hercules/iso/generic.ins

Jetzt sollte der erste Teil der Installation hochfahren, nämlich der Kernel und ein SSH-Server.

Aber vorher brauchen wir noch Antworten auf ein paar Fragen des neugierigen Installationsprozesses. Hier die Antworten. Bitte ggf. anpassen, nur die Punkte nicht weglassen. Das ist die Anweisung an Hercules, dass die Eingabe bitte an die laufende Instanz durchgereicht werden soll.

Which kind of network device do you intend to use:
.ctc
Enter the bus ID and the device number of your CCW devices.
CTC/ESCON and LCS need two subchannels:
(e.g. "0.0.0600,0.0.0601" will configure the CTC or ESCON interface
with the subchannels 0x600 and 0x601)
QETH needs three subchannels p.e. 0.0.0300,0.0.0301,0.0.0302
.0.0.0cc0,0.0.0cc1
Enter the FQDN of your new Linux guest (e.g. s390.redhat.com):
.hercules.mirkos-mac.de
Enter the IP address of your new Linux guest:
.192.168.0.125
Enter the network address of the new Linux guest:
.192.168.0.0
Enter the IP of your CTC / ESCON / IUCV point-to-point partner:
.192.168.0.123
Select which protocol should be used for the CTC interface
0 for compatibility with p.e. VM TCP service machine (default)
1 for enhanced package checking for Linux peers
3 for compatibility with OS/390 or z/OS peers
.0
Enter your DNS server(s), separated by colons (:):
.192.168.0.1
Enter your DNS search domain(s) (if any), separated by colons (:):
.
Enter DASD range (e.g. 200-203   or  200,201,202,203)
Press <Enter> for autoprobing (not recommended):
.0a01-0a02

Starting telnetd and sshd to allow login over the network.

Connect now to 192.168.0.125 to start the installation.

CentOS-Installation per SSH

Wenn alles geklappt hat, steht jetzt unter der IP 192.168.0.125 ein SSH-Server bereit, mit dem wir uns verbinden, um die weitere Installation vorzunehmen.

Und jetzt wird es richtig geil 😀

Der SSH-Server der Installation läuft selbstredend über einen root-Account. Der kein Password hat.

Jaaaa…. egal, machen wir halt mit, wir spielen ja sowieso nur rum (und während der Installation bekommt root natürlich ein Password):

ssh root@192.168.0.125

Antwort

Welcome to the Red Hat Linux install environment 1.1 for S/390

… und es läuft … und läuft … und läuft …

Die nächsten Fragen der Installation kannst du sicher beantworten. Wenn du schön parallel ein paar Terminals laufen hast, dann kannst du auch erkennen, dass und was er ungefähr tut:

working
working

Das kann jetzt ein paar Stunden dauern 🙂

Übrigens. Im Hercules kannst du ESC drücken, dann bekommst du ein paar wirklich coole Zahlen zu sehen:

hercules monitor
hercules monitor

Das sind die verschiedenen Register und die Programmworte und so. Also genau das, was einen tatsächlich mal interessiert. Keine Ironie.

Aufräumarbeiten…

Bitte am Schluss dann noch aufräumen.

sudo umount iso

Den NFS-Server kannst du jetzt auch plattmachen, wenn er dich stört.

Nach der Installation

Wenn die Installation dann nach vielen Stunden durchgelaufen ist, möchte man vielleicht irgendwann den Hercules komplett runterfahren und irgendwann wieder starten (das Linux/CentOS natürlich auch, aber das weißt du ja schon).Der nächste IPL muss natürlich anders lauten, wir wollen nicht schon wieder installieren.

ipl 0a01

Damit starten wir den Bootprozess an der Adresse 0a01 bzw. eigentlich eher an der DASD-Adresse 0a01 – das ist unsere Bootloader-Platte resp. der Grub. Damit startet dann der CentOS-Server. Arbeiten können wir mit dem System weiterhin über SSH.

Übrigens. Man muss Hercules selbst nicht neustarten, wenn das System nach der Installation heruntergefahren ist und neustarten möchte. Dafür reicht ein

stop
ipl 0a01

Das „stop“ stoppt unsere eine CPU (falls wir mehrere haben, reicht ein „stopall“ – oder per „cpu X“ & „stop“ die CPUs einzeln) und das IPL habe ich oben schon erklärt. Hercules selbst könnt ihr mit „exit“ in der Herculeskonsole verlassen (bitte erst nach dem Herunterfahren vom CentOS und Stoppen der CPU).

17:28:01 stop
17:28:11 ipl 0a01
17:28:11 zIPL v1.3.2 interactive boot menu
17:28:11
17:28:11  0. default (linux)
17:28:11
17:28:11  1. linux
17:28:11
17:28:11 Please choose (default will boot in 15 seconds):
17:28:17 .0
17:28:17 Booting default (linux)...
17:28:17 HHCCP014I CPU0000: Addressing exception CODE=0005 ILC=6
17:28:17 PSW=00082000 8001011C INST=E50150000000 TPROT 0(5),0(0)              test_protection
17:28:17 R:30C00000: Translation exception 0005
17:28:17 R:00000000:K:06=00080000 80010000 06000218 60000090  ............-...
17:28:17 GR00=00000000  GR01=00020000  GR02=00000000  GR03=002AC254
17:28:17 GR04=00000000  GR05=30C00000  GR06=00000000  GR07=00000000
17:28:17 GR08=00000000  GR09=30C00000  GR10=00000010  GR11=0002D85C
17:28:17 GR12=00010400  GR13=80010002  GR14=80019DC0  GR15=0028FF08
17:28:17 HHCCP041I SYSCONS interface active
17:28:17 Linux version 2.6.9-78.EL (builder@c4s390) (gcc version 3.4.6 20060404 (Red Hat
17:28:17 3.4.6-10)) #1 SMP Sun Aug 3 22:58:41 EEST 2008
17:28:17 We are running native (31 bit mode)
17:28:17 This machine has an IEEE fpu
17:28:17 Built 1 zonelists
17:28:17 Kernel command line: root=/dev/VolGroup00/LogVol00 BOOT_IMAGE=0
17:28:17 PID hash table entries: 4096 (order: 12, 65536 bytes)
17:28:17 Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
17:28:17 Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
17:28:17 Memory: 780160k/794624k available (1969k kernel code, 0k reserved, 645k data, 96
17:28:17 k init)
17:28:17 Security Scaffold v1.0.0 initialized
17:28:17 SELinux:  Initializing.
17:28:17 selinux_register_security:  Registering secondary module capability
17:28:17 Capability LSM initialized as secondary
17:28:17 Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
17:28:17 Detected 1 CPU's
17:28:17 Boot cpu address  0
17:28:17 cpu 0 phys_idx=0 vers=00 ident=002623 machine=2096 unused=0000
17:28:17 Brought up 1 CPUs
17:28:17 checking if image is initramfs...
17:28:20  it is
17:28:22 Freeing initrd memory: 2262k freed
17:28:22 debug: Initialization complete
17:28:22 NET: Registered protocol family 16
17:28:22 cio: Was not able to determine available CHSCs.
17:28:22 appldata info: mem-ops registered
17:28:22 appldata info: os-ops registered
17:28:22 appldata info: net_sum-ops registered
17:28:22 audit: initializing netlink socket (disabled)
17:28:22 <pnl,color(green,black)>audit(1475940502.405:1): initialized
17:28:22 VFS: Disk quotas dquot_6.5.1
17:28:22 Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
17:28:22 Initializing Cryptographic API
17:28:22 ksign: Installing public key data
17:28:22 Loading keyring
17:28:22 - Added public key 300A44E8AC8686F0
17:28:22 - User ID: CentOS (Kernel Module GPG key)
17:28:22 HHCCP041I SYSCONS interface active
17:28:22 RAMDISK driver initialized: 16 RAM disks of 16384K size 1024 blocksize
17:28:22 md: md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27
17:28:22 Channel measurement facility using basic format (autodetected)
17:28:23 NET: Registered protocol family 2
17:28:23 IP route cache hash table entries: 32768 (order: 5, 131072 bytes)
17:28:23 TCP established hash table entries: 131072 (order: 9, 2097152 bytes)
17:28:23 TCP bind hash table entries: 131072 (order: 8, 1048576 bytes)
17:28:23 TCP: Hash tables configured (established 131072 bind 131072)
17:28:23 Initializing IPsec netlink socket
17:28:23 NET: Registered protocol family 1
17:28:23 NET: Registered protocol family 17
17:28:23 Freeing unused kernel memory: 96k freed
17:28:23 Red Hat nash version 4.2.1.13 starting
17:28:23 Mounted /proc filesystem
17:28:23 Mounting sysfs
17:28:23 Creating /dev
17:28:23 Starting udev
17:28:23 Loading dm-mod.ko module
17:28:23 Loading dasd_mod.ko module
17:28:23 device-mapper: 4.5.5-ioctl (2006-12-01) initialised: dm-devel@redhat.com
17:28:23 dasd(eckd): 0.0.0a01: PSF-SSC on storage subsystem HRC.ZZ000000000001.0a00 retur
17:28:23 ned rc=0
17:28:23 dasd(eckd): 0.0.0a01: 3390/0A(CU:3990/02) Cyl:3339 Head:15 Sec:224
17:28:23 Using cfq io scheduler
17:28:23 dasd(eckd): 0.0.0a01: (4kB blks): 2404080kB at 48kB/trk compatible disk layout
17:28:23  dasda:VOL1/  0X0A01: dasda1 dasda2
17:28:23 Loading dasd_eckd_mod.ko module
17:28:23 dasd(eckd): 0.0.0a02: 3390/0A(CU:3990/02) Cyl:3339 Head:15 Sec:224
17:28:23 dasd(eckd): 0.0.0a02: (4kB blks): 2404080kB at 48kB/trk compatible disk layout
17:28:23  dasdb:VOL1/  0X0A02: dasdb1
17:28:23 Loading dasd_fba_mod.ko module
17:28:23 Loading jbd.ko module
17:28:23 Loading ext3.ko module
17:28:23 Loading dm-mirror.ko module
17:28:23 Loading dm-zero.ko module
17:28:23 Loading dm-snapshot.ko module
17:28:23 Making device-mapper control node
17:28:23 Scanning logical volumes
17:28:23   Reading all physical volumes.  This may take a while...
17:28:24   Found volume group "VolGroup00" using metadata type lvm2
17:28:24 Activating logical volumes
17:28:24   2 logical volume(s) in volume group "VolGroup00" now active
17:28:24 Creating root device
17:28:24 Mounting root filesystem
17:28:24 Switching to new root
17:28:24 kjournald starting.  Commit interval 5 seconds
17:28:24 EXT3-fs: mounted filesystem with ordered data mode.
17:28:25 INIT: version 2.85 booting
17:28:26                 Welcome to  CentOS release 4.7 (Final)
17:28:26 System date: Sat Oct  8 17:28:26 CEST 2016
17:28:26    OK  !
17:28:26 Starting udev:
17:28:34    OK  !
17:28:34 Initializing hardware...
17:28:35  storage
17:28:49  network
17:29:05  audio done   OK  !
17:29:12 Configuring kernel parameters:
17:29:26    OK  !
17:29:34 Setting hostname hercules:

...