---
title: Capitolo 10. Compatibilità con i Binari di Linux
part: Parte II. Compiti Ordinari
prev: books/handbook/printing
next: books/handbook/partiii
---

[[linuxemu]]
= Compatibilità con i Binari di Linux
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:source-highlighter: rouge
:experimental:
:skip-front-matter:
:toc-title: Indice
:table-caption: Tabella
:figure-caption: Figura
:example-caption: Esempio
:xrefstyle: basic
:relfileprefix: ../
:outfilesuffix:
:sectnumoffset: 10

ifeval::["{backend}" == "html5"]
:imagesdir: ../../../images/books/handbook/linuxemu/
endif::[]

ifeval::["{backend}" == "pdf"]
:imagesdir: ../../../../static/images/books/handbook/linuxemu/
endif::[]

ifeval::["{backend}" == "epub3"]
:imagesdir: ../../../../static/images/books/handbook/linuxemu/
endif::[]

include::shared/authors.adoc[]
include::shared/releases.adoc[]
include::shared/it/mailing-lists.adoc[]
include::shared/it/urls.adoc[]

toc::[]

[[linuxemu-synopsis]]
== Sinossi

FreeBSD fornisce la compatibilità con molti altri sisitemi operativi di tipo UNIX(R), compreso linux. A questo punto, potresti chiederti perché FreeBSD dovrebbe essere in grado di far girare binari linux. La risposta a questa domanda è piuttosto semplice. Molte aziende e sviluppatori sviluppano solo per Linux, dal momento che ` l'ultimo "disco caldo" nel mondo dell'informatica. Questo costringe il resto di noi utenti di FreeBSD a lamentarci con queste aziende e questi sviluppatori di distribuire versioni delle loro applicazioni native per FreeBSD. Il problema è che molte di queste aziende non realizzano quante persone userebbero il loro prodotto se ci fosse anche una versione per FreeBSD, e molte continuano a sviluppare solo per Linux. Allora cosa deve fare un utente FreeBSD? E qui entra in giocolo la compatibilità con i binari di Linux.

In breve, la compatibilità permette agli utenti FreeBSD di utilizzare circa il 90% di tutte le applicazioni Linux senza modifiche. Questo include applicazioni come StarOffice(TM) , la versione Linux di man:getenv[3], Adobe(R) Acrobat(R), RealPlayer(R), VMware, Oracle(R), WordPerfect(R), Doom, Quake, e tanti altri. È stato riportato che in qualche situazione i binari per Linux sono più prestanti sotto FreeBSD che sotto Linux.

Nonostante questo, ci sono alcune caratteristiche specifiche del sistema operativo Linux che non sono supportate da FreeBSD. I binari di Linux non funzioneranno sotto FreeBSD se usano parecchie chiamate specifiche per i386(TM), come l'attivazione della modalità 8086 virtuale

Dopo aver letto questo capitolo, saprai:

* Come abilitare la compatibilità con i binari Linux sul tuo sistema.
* Come installare ulteriori librerie condivise per Linux.
* Come installare gli applicativi di Linux sul tuo sistema FreeBSD.
* I dettagli dell'implementazione della compatibilità Linux in FreeBSD.

Prima di leggere questo capitolo, dovresti:

* Sapere come installare software di terzi (crossref:ports[ports,Installazione delle Applicazioni. Port e Package]).

[[linuxemu-lbc-install]]
== Installazione

La compatibilità con i binari Linux non è normalmente attivata. Il modo più facile per abilitare questa funzionalità è caricare l'oggetto KLD ("Kernel LoaDable object") `linux`. Puoi caricare questo modulo digitando il comando seguente come `root`:

[source,bash]
....
# kldload linux
....

Se vuoi che la compatiblità sia sempre attivata, dovresti aggiungere questa linea a [.filename]#/etc/rc.conf#:

[.programlisting]
....
linux_enable="YES"
....

Il comando man:kldstat[8] può essere usato per verificare se KLD sia stato caricato:

[source,bash]
....
% kldstat
Id Refs Address    Size     Name
 1    2 0xc0100000 16bdb8   kernel
 7    1 0xc24db000 d000     linux.ko
....

Se per qualche ragione non vuoi o non puoi caricare KLD, puoi collegare staticamente la compatibilità Linux nel kernel aggiungendo `options COMPAT_LINUX` al file di configurazione del kernel. Fatto questo puoi installare il nuovo kernel come descritto in crossref:kernelconfig[kernelconfig,Configurazione del Kernel di FreeBSD].

=== Installazione delle Librerie Runtime di Linux

Questo può essere fatto in due modi, o usando il port <<linuxemu-libs-port,linux_base>>, oppure installandole <<linuxemu-libs-manually,manualmente>>.

[[linuxemu-libs-port]]
==== Installazione Usando il Port linux_base

Questo è di gran lunga il metodo più facile da usare per installare le librerie runtime. È proprio come installare qualunque altro port dalla link:file://localhost/usr/ports/[Collezione dei Port]. Semplicemente fai come segue:

[source,bash]
....
# cd /usr/ports/emulators/linux_base-fc4
# make install distclean
....

In questo modo dovresti avere una compatibilità con i binari di Linux funzionante. Alcuni programmi potrebbero lamentarsi per qualche versione minore delle librerie di sistema. In generale, comunque, questo non dovrebbe essere un problema.

[NOTE]
====
Potrebbero essere disponibili più versioni del port package:emulators/linux_base[], corrispondenti a differenti versioni di distribuzioni Linux. Dovresti installare il port che più soddisfa le richieste della applicazione Linux che vuoi installare.
====

[[linuxemu-libs-manually]]
==== Installazione Manuale delle Librerie

Se non hai installata la collezione di "ports", puoi comunque installare le librerie manualmente. Hai bisogno delle librerie condivise di Linux da cui il programma dipende e del runtime linker. In più dovrai creare una directory "shadow root", [.filename]#/compat/linux#, per le librerie Linux sul tuo sistema FreeBSD. Tutte le librerie condivise aperte da programmi Linux che girano sotto FreeBSD cercheranno prima in questo albero. Per cui, se un programma Linux carica, per esempio, [.filename]#/lib/libc.so#, FreeBSD prima cercherà di aprire [.filename]#/compat/linux/lib/libc.so#, e se questa non esiste, proverà con [.filename]#/lib/libc.so#. Le librerie condivise dovrebbero essere installate nell'albero shadow [.filename]#/compat/linux/lib# piuttosto che nei path che riporta `ld.so` di Linux.

Generalmente avrai bisogno di cercare le librerie condivise da cui dipendono i binari di Linux solo per le prime poche installazioni di programmi Linux sul tuo sistema FreeBSD. Dopo un po' avrai a disposizione sul tuo sistema un insieme sufficiente di librerie condivise per Linux da far girare nuovi binari Linux senza alcun sforzo ulteriore.

==== Come Installare Ulteriori Librerie Condivise

Cosa succede se installi il port [.filename]#linux_base# e la tua applicazione si lamenta ancora di librerie condivise che mancano? Come fare a sapere quali librerie condivise necessita il binario di Linux e dove trovarle? Essenzialmente ci sono 2 possibilità (per seguire queste istruzioni dovrai essere `root` sul tuo sistema FreeBSD).

Se hai accesso ad un sistema Linux, guarda quali librerie condivise servono all'applicazione e copiale nel tuo sistema FreeBSD. Guarda all'esempio che segue:

Poniamo che tramite FTP tu abbia recuperato il binario per Linux di Doom, e l'abbia messo su un sistema Linux a cui hai accesso. Puoi controllare quali librerie condivise servono eseguendo `ldd linuxdoom`, così:

[source,bash]
....
% ldd linuxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29
....

Potresti aver bisogno di recuperare tutti i file dall'ultima colonna, e di metterli sotto [.filename]#/compat/linux#, con i nomi nella prima colonna come link simbolici che puntino ad essi. Questo significa che alla fine avrai questi file sul tuo sistema FreeBSD:

[source,bash]
....
/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
....

[NOTE]
====
Nota che se hai già una libreria condivisa di Linux con un numero di revisione maggiore di quello della prima colonna dell'output di `ldd`, non dovrai copiare nel tuo sistema il file elencato nell'ultima colonna, quello che hai dovrebbe funzionare. Si raccomanda di copiare comunque la libreria condivisa se è una versione più recente. Puoi rimuovere quella vecchia, dal momento che crei il link simbolico che punta a quella nuova. Quindi, se hai queste librerie sul tuo sistema:

[source,bash]
....
/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27
....

e vedi che un nuovo binario richiede una versione più recente in base all'output di `ldd`:

[source,bash]
....
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
....

Se si tratta solo di una o due versioni precedenti in base alla cifra finale allora non preoccuparti di copiare anche [.filename]#/lib/libc.so.4.6.29#, perché il programma dovrebbe funzionare bene anche con una versione di poco più vecchia. In ogni caso, se vuoi, puoi decidere di rimpiazzare comunque [.filename]#libc.so#, e dovrebbe lasciarti con:

[source,bash]
....
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
....

====

[NOTE]
====
Il meccanismo dei link simbolici è richiesto _solo_ per i binari di Linux. Il runtime linker di FreeBSD si occupa da solo di cercare corrispondenti numeri di revisione maggiori e non devi preoccuparti di questo.
====

=== Installazione di Binari ELF di Linux

I binari ELF possono richiedere un ulteriore passo di "marchiatura". Se provi a far girare un binario ELF non marchiato, incorrerai in un messaggio come il seguente:

[source,bash]
....
% ./my-linux-elf-binary
ELF binary type not known
Abort
....

Per aiutare il kernel di FreeBSD a distinguere un binario ELF di FreeBSD da uno di Linux, usa l'utility man:brandelf[1].

[source,bash]
....
% brandelf -t Linux my-linux-elf-binary
....

Oggi, la GNU toolchain inserisce automaticamente l'appropriata informazione di marchiatura nei binari ELF, così questo passo dovrebbe divenire sempre meno necessario nel futuro.

=== Configurazione del Hostname Resolver

Se il DNS non funziona o da questo messaggio:

[source,bash]
....
resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword
....

Dovrai configurare un file [.filename]#/compat/linux/etc/host.conf# contentente:

[.programlisting]
....
order hosts, bind
multi on
....

Qui, l'ordine specifica che [.filename]#/etc/hosts# viene cercato per primo e il DNS per secondo. Quando [.filename]#/compat/linux/etc/host.conf# non è installato, le applicazioni Linux trovano il [.filename]#/etc/host.conf# di FreeBSD e si lamentano della sintassi incompatibile di FreeBSD. Dovresti rimuovere `bind` se non hai configurato un name server usando il file [.filename]#/etc/resolv.conf#.

[[linuxemu-mathematica]]
== Installazione di Mathematica(R)

Questo documento descive il processo di installazione della versione Linux di Mathematica(R) 5.X su un sistema FreeBSD.

La versione Linux di Mathematica(R) o di Mathematica(R) for Students può essere ordinata direttamente da Wolfram all'indirizzo http://www.wolfram.com/[http://www.wolfram.com/].

=== Avviare l'Installer di Mathematica(R)

Prima di tutto, devi indicare a FreeBSD che i binari Linux di Mathematica(R) usano le ABI di Linux. Il modo più facile di farlo è di settare il tipo di ELF a Linux per tutti i binari non marchiati con il comando:

[source,bash]
....
# sysctl kern.fallback_elf_brand=3
....

In questo modo FreeBSD assume che tutti i binari ELF non marchiati usino l'ABI di Linux e quindi dovresti essere in grado di eseguire l'installer direttamente dal CDROM.

Ora, copia il file [.filename]#MathInstaller# sul tuo disco:

[source,bash]
....
# mount /cdrom
# cp /cdrom/Unix/Installers/Linux/MathInstaller /localdir/
....

e in questo file, rimpiazza la prima riga `/bin/sh` con `/compat/linux/bin/sh`. Questo assicura che l'installer viene eseguito dalla versione Linux di man:sh[1]. Poi, rimpiazza tutte le occorrenze di `Linux)` con `FreeBSD)` utilizzando un editor di testo o lo script mostrato nella prossima sezione. Questo indica all'installer di Mathematica(R), che chiama `uname -s` per determinare il sistema operativo, per trattare FreeBSD come un sistema operativo Linux-like. Invocando `MathInstaller` verrà installato Mathematica(R).

=== Modifica degli Eseguibili di Mathematica(R)

Gli script di shell che Mathematica(R) crea durante l'installazione devono essere modificati prima di poterli usare. Se hai scelto di mettere gli eseguibili di Mathematica(R) nella directory [.filename]#/usr/local/bin#, troverai in questa directory dei link simbolici chiamati [.filename]#math#, [.filename]#mathematica#, [.filename]#Mathematica#, e [.filename]#MathKernel#. In ognuno di questi, sostituisci `Linux)` con `FreeBSD)` usando un editor di testo o il seguente script di shell:

[.programlisting]
....
#!/bin/sh
cd /usr/local/bin
for i in math mathematica Mathematica MathKernel
  do sed 's/Linux)/FreeBSD)/g' $i > $i.tmp
  sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp > $i
  rm $i.tmp
  chmod a+x $i
done
....

=== Ottenere la Tua Password per Mathematica(R)

Quando avvii Mathematica(R) per la prima volta, ti verrà richiesta una password. Se non hai ancora ottenuto una password da Wolfram, esegui il programma `mathinfo` nella directory di installazione per ottenere il tuo "ID di macchina". Questo ID è basato esclusivamente sull'indirizzo MAC della tua prima scheda di Ethernet, quindi non puoi eseguire la tua copia di Mathematica(R) su macchine diverse.

Quando ti registri alla Wolfram, sia per email, telefono o fax, gli darai il "machine ID" e loro ti restituiranno una password corrispondente che consiste di un gruppo di numeri.

=== Lancio del Frontend di Mathematica(R) in una Rete

Mathematica(R) usa alcuni font speciali per visualizzare caratteri non presenti in alcun insieme standard di font (integrali, sommatorie, lettere greche, ecc.). Il protocollo X necessita che questi font siano installati _localmente_. Questo significa che dovrai fare una copia di questi font sulla tua macchina locale dal CDROM o da un host con Mathematica(R) installato. Questi font si trovano normalmente in [.filename]#/cdrom/Unix/Files/SystemFiles/Fonts# sul CDROM, oppure [.filename]#/usr/local/mathematica/SystemFiles/Fonts# sul tuo disco rigido. I font sono nelle sottodirectory [.filename]#Type1# e [.filename]#X#. Ci sono molti modi di usarli, come descritto sotto.

Il primo modo è di copiarli dentro una delle directory di font esistenti in [.filename]#/usr/X11R6/lib/X11/fonts#. Questo comporterà la modifica del file [.filename]#fonts.dir#, aggiungendovi i nomi dei font e cambiando il numero di font nella prima riga. In alternativa, dovresti anche essere in grado di lanciare man:mkfontdir[1] nella directory in cui li hai copiati.

Il secondo modo di farlo è copiare le directory in [.filename]#/usr/X11R6/lib/X11/fonts#:

[source,bash]
....
# cd /usr/X11R6/lib/X11/fonts
# mkdir X
# mkdir MathType1
# cd /cdrom/Unix/Files/SystemFiles/Fonts
# cp X/* /usr/X11R6/lib/X11/fonts/X
# cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1
# cd /usr/X11R6/lib/X11/fonts/X
# mkfontdir
# cd ../MathType1
# mkfontdir
....

Poi aggiungi le nuove directory di font nel tuo path dei font:

[source,bash]
....
# xset fp+ /usr/X11R6/lib/X11/fonts/X
# xset fp+ /usr/X11R6/lib/X11/fonts/MathType1
# xset fp rehash
....

Se stai utilizzando il server Xorg, puoi caricare automaticamente queste directory di font aggiungendole nel file [.filename]#xorg.conf#.

[NOTE]
====
Per i server XFree86(TM), il file di configurazione è [.filename]#XF86Config#.
====

Se ancora _non_ hai una directory chiamata [.filename]#/usr/X11R6/lib/X11/fonts/Type1#, puoi cambiare il nome della directory [.filename]#MathType1# dell'esempio sopra in [.filename]#Type1#.

[[linuxemu-maple]]
== Installazione di Maple(TM)

Maple(TM) è un programma commerciale di matematica simile a Mathematica(R). Devi acquistare questo software da http://www.maplesoft.com/[http://www.maplesoft.com/] e quindi registrarti per un file di licenza. Per installare questo software su FreeBSD, segui i passi seguenti.

[.procedure]
====
. Esegui lo script di shell [.filename]#INSTALL# dalla distribuzione del prodotto. Scegli l'opzione "RedHat" quando richiesto dal programma di installazione. Una tipica directory di installazione potrebbe essere [.filename]#/usr/local/maple#.
. Se ancora non l'hai fatto, ordina una licenza per Maple(TM) dalla Maple Waterloo Software (http://register.maplesoft.com/[http://register.maplesoft.com/]) e copiala in [.filename]#/usr/local/maple/license/license.dat#.
. Installa il gestore della licenza FLEXlm lanciando lo shell script di installazione [.filename]#INSTALL_LIC#, distribuito assieme a Maple(TM). Specifica l'hostname primario della la tua macchina per il server delle licenze.
. Modifica il file [.filename]#/usr/local/maple/bin/maple.system.type# aggiungendo:
+
[.programlisting]
....
   ----- snip ------------------
*** maple.system.type.orig      Sun Jul  8 16:35:33 2001
--- maple.system.type   Sun Jul  8 16:35:51 2001
***************
*** 72,77 ****
--- 72,78 ----
          # the IBM RS/6000 AIX case
          MAPLE_BIN="bin.IBM_RISC_UNIX"
          ;;
+     "FreeBSD"|\
      "Linux")
          # the Linux/x86 case
        # We have two Linux implementations, one for Red Hat and
   ----- snip end of patch -----
....
+ 
Nota che dopo `"FreeBSD"|\` non ci devono essere altri spazi bianchi.
+ 
Questa patch dice a Maple(TM) di riconoscere "FreeBSD" come un tipo di sistema Linux. Lo shell script [.filename]#bin/maple# richiama lo shell script [.filename]#bin/maple.system.type# che a sua volta chiama `uname -a` per determinare il nome del sistema operativo. A seconda del nome del SO capirà quali binari utilizzare.
. Avviare il server delle licenze.
+ 
Lo script seguente, installato come [.filename]#/usr/local/etc/rc.d/lmgrd.sh# è un modo facile per far partire `lmgrd`:
+
[.programlisting]
....
   ----- snip ------------

#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX
export PATH

LICENSE_FILE=/usr/local/maple/license/license.dat
LOG=/var/log/lmgrd.log

case "$1" in
start)
        lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2
        echo -n " lmgrd"
        ;;
stop)
        llmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" 1>&2
        exit 64
        ;;
esac

exit 0
   ----- snip ------------
....
+
. Fai un test di avvio di Maple(TM):
+
[source,bash]
....
% cd /usr/local/maple/bin
% ./xmaple
....
+ 
Dovrebbe funzionare. Assicurati di scrivere alla Maplesoft per fargli sapere che vorresti avere una versione nativa per FreeBSD!
====

=== Problemi Comuni

* Il gestore della licenza FLEXlm può essere uno strumento difficile con cui lavorare. A questo riguardo si può trovare della documentazione in più a http://www.globetrotter.com/[http://www.globetrotter.com/].
* Si sa che `lmgrd` è molto esigente riguardo al file della licenza e che va in core dump per qualunque problema. Un buon file della licenza dovrebbe essere così:
+
[.programlisting]
....
# =======================================================
# License File for UNIX Installations ("Pointer File")
# =======================================================
SERVER chillig ANY
#USE_SERVER
VENDOR maplelmg

FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
         PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \
         ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
         SN=XXXXXXXXX
....
+
[NOTE]
====
Il numero seriale e la chiave sono sostituiti dalle 'X'. `chillig` è un hostname.
====
+ 
Modificare il file della licenza funziona fino a quando non tocchi la linea "FEATURE" (che è protetta dalla chiave della licenza).

[[linuxemu-matlab]]
== Installazione di MATLAB(R)

Questo documento descrive il processo di installazione della versione Linux di MATLAB(R) versione 6.5 su un sistema FreeBSD. Funziona abbastanza bene, con l'eccezione per la Java Virtual Machine(TM) (vedi <<matlab-jre>>).

La versione Linux di MATLAB(R) può essere ordinata direttamente dalla MathWorks all'indirizzo http://www.mathworks.com[http://www.mathworks.com]. Assicurati di avere il file della licenza o le istruzioni per crearlo. Già che ci sei, fagli sapere che vorresti una versione nativa per FreeBSD del loro software.

=== Installazione di MATLAB(R)

Per installare MATLAB(R), fai come segue:

[.procedure]
====
. Inserisci il CD di installazione e montalo. Diventa `root`, come consigliato dallo script di installazione. Per avviare lo script di installazione scrivi:
+
[source,bash]
....
# /compat/linux/bin/sh /cdrom/install
....
+
[TIP]
======

L'installer è grafico. Se ottieni errori riguardo all'impossibilità ad aprire un display, scrivi `setenv HOME ~USER`, dove _USER_ è l'utente che hai fatto man:su[1].
======
+
. Quando viene chiesta la directory root per MATLAB(R), scrivi: `/compat/linux/usr/local/matlab`.
+
[TIP]
======

Per una più facile scrittura nel resto del processo di installazione, scrivi questo nella linea di comando della shell: `set MATLAB=/compat/linux/usr/local/matlab`
======
+
. Modifica il file della licenza secondo le istruzioni avute quando hai ottenuto la licenza di MATLAB(R).
+
[TIP]
======

Puoi preparare questo file in anticipo usando il tuo editor preferito, e copiarlo in [.filename]#$MATLAB/license.dat# prima che l'installer ti chieda di modificarlo.
======
+
. Completare il processo di installazione.
====

A questo punto la tua installazione di MATLAB(R) è completa. I punti seguenti applicano una "colla" per connetterlo al tuo sistema FreeBSD.

=== Avvio del License Manager

[.procedure]
====
. Crea dei symlink per gli script del gestore della licenza:
+
[source,bash]
....
# ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW
# ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW
....
+
. Crea un file d'avvio in [.filename]#/usr/local/etc/rc.d/flexlm.sh#. L'esempio qui sotto è una versione modificata del [.filename]#$MATLAB/etc/rc.lm.glnx86# venduto. I cambiamenti sono le posizioni del file e l'avvio del license manager sotto l'emulazione Linux.
+
[.programlisting]
....
#!/bin/sh
case "$1" in
  start)
        if [ -f /usr/local/etc/lmboot_TMW ]; then
              /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u username && echo 'MATLAB_lmgrd'
        fi
        ;;
  stop)
        if [ -f /usr/local/etc/lmdown_TMW ]; then
            /compat/linux/bin/sh /usr/local/etc/lmdown_TMW  > /dev/null 2>&1
        fi
        ;;
  *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac

exit 0
....
+
[IMPORTANT]
======
Il file deve essere reso eseguibile:

[source,bash]
....
# chmod +x /usr/local/etc/rc.d/flexlm.sh
....

In aggiunta sostituisci _username_ sopra con il nome di un utente valido sul tuo sistema (e non `root`).
======
+
. Avvia il gestore della licenza con il comando:
+
[source,bash]
....
# /usr/local/etc/rc.d/flexlm.sh start
....
====

[[matlab-jre]]
=== Collegare il Java(TM) Runtime Environment

Cambia il link al Java(TM) Runtime Environment (JRE) con uno che funzioni sotto FreeBSD:

[source,bash]
....
# cd $MATLAB/sys/java/jre/glnx86/
# unlink jre; ln -s ./jre1.1.8 ./jre
....

=== Creazione di uno Script di Avvio per MATLAB(R)

[.procedure]
====
. Poni il seguente script di avvio in [.filename]#/usr/local/bin/matlab#: 
+
[.programlisting]
....
#!/bin/sh
/compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"
....
+
. Quindi scrivi il comando `chmod +x /usr/local/bin/matlab`.
====

[TIP]
====

A seconda della tua versione di package:emulators/linux_base[], potresti incorrere in errori quando lanci questo script. Per evitarli, modifica il file [.filename]#/compat/linux/usr/local/matlab/bin/matlab#, e cambia la riga che dice:

[.programlisting]
....
if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then
....

(nella versione 13.0.1 è alla riga 410) con questa riga:

[.programlisting]
....
if test -L $newbase; then
....

====

=== Creazione di uno script di arresto per MATLAB(R)

Quello che segue serve per risolvere un problema con MATLAB(R) quando non si chiude correttamente.

[.procedure]
====

. Crea un file [.filename]#$MATLAB/toolbox/local/finish.m#, e scrivici l'unica riga:
+
[.programlisting]
....
! $MATLAB/bin/finish.sh
....
+
[NOTE]
======
`$MATLAB` è letterale.
======
+
[TIP]
======

Nella stessa directory troverai i file [.filename]#finishsav.m# e [.filename]#finishdlg.m#, che permettono di salvare il tuo lavoro all'uscita. Se ne usi uno, inserisci la riga sopra immediatamente dopo il comando `save`.
======
+
. Crea un file [.filename]#$MATLAB/bin/finish.sh#, che contiene ciò che segue:
+
[.programlisting]
....
#!/usr/compat/linux/bin/sh
(sleep 5; killall -1 matlab_helper) &
exit 0
....
+
. Rendi il file eseguibile:
+
[source,bash]
....
# chmod +x $MATLAB/bin/finish.sh
....
====

[[matlab-using]]
=== Uso di MATLAB(R)

A questo punto sei pronto per scrivere `matlab` e cominciare ad usarlo.

[[linuxemu-oracle]]
== Installazione di Oracle(R)

=== Prefazione

Questo documento descrive il processo di installazione per Oracle(R) 8.0.5 e Oracle(R) 8.0.5.1 Enterprise Edition per Linux su una macchina FreeBSD.

=== Installazione dell'Ambiente Linux

Assicurati di avere installati sia package:emulators/linux_base[] che package:devel/linux_devtools[] dalla collezione dei port. Se hai difficoltà con questi port, potresti dover usare i pacchetti o versioni più vecchie disponibili nella collezione dei port.

Se vuoi far girare l'intelligent agent, dovrai anche installare il pacchetto Tcl di Red Hat :[.filename]##tcl-8.0.3-20.i386.rpm##. Il comando generale per l'installazione dei pacchetti con il port degli RPM ufficiali (package:archivers/rpm[]) è:

[source,bash]
....
# rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm pacchetto
....

L'installazione del _pacchetto_ non dovrebbe generare alcun errore.

=== Creazione dell'ambiente Oracle(R)

Prima di installare Oracle(R), devi impostare un ambiente appropriato. Questo documento descrive solo cosa fare _in particolare_ per far girare Oracle(R) per Linux su FreeBSD, non cosa è descritto nella guida di installazione di Oracle(R).

[[linuxemu-kernel-tuning]]
==== Affinamento del Kernel

Come viene descritto nella guida di installazione di Oracle(R), devi impostare la dimensione massima di memoria condivisa. Non usare `SHMMAX` sotto FreeBSD. `SHMMAX` è soltanto calcolato a partire da `SHMMAXPGS` e `PGSIZE`. Di conseguenza definisci `SHMMAXPGS`. Tutte le altre opzioni possono essere usate come descritte nella guida. Per esempio:

[.programlisting]
....
options SHMMAXPGS=10000
options SHMMNI=100
options SHMSEG=10
options SEMMNS=200
options SEMMNI=70
options SEMMSL=61
....

Imposta queste opzioni per ottenere l'uso desiderato di Oracle(R).

In più, assicurati di avere le seguenti opzioni nel file di configurazione del tuo kernel:

[.programlisting]
....
options SYSVSHM #SysV shared memory
options SYSVSEM #SysV semaphores
options SYSVMSG #SysV interprocess communication
....

[[linuxemu-oracle-account]]
==== Account di Oracle(R)

Crea un account `oracle` proprio come faresti per creare qualunque altro account. L'account `oracle` è speciale solo se hai bisogno di usarlo in una shell di Linux. Aggiungi `/compat/linux/bin/bash` a [.filename]#/etc/shells# e imposta la shell per l'account di `oracle` in [.filename]#/compat/linux/bin/bash#.

[[linuxemu-environment]]
==== Ambiente

A fianco dele normali variabili Oracle(R), come `ORACLE_HOME` e `ORACLE_SID` devi impostare le seguenti variabili d'ambiente:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Variabile
| Valore

|`LD_LIBRARY_PATH`
|`$ORACLE_HOME/lib`

|`CLASSPATH`
|`$ORACLE_HOME/jdbc/lib/classes111.zip`

|`PATH`
|`/compat/linux/bin /compat/linux/sbin /compat/linux/usr/bin /compat/linux/usr/sbin /bin /sbin /usr/bin /usr/sbin /usr/local/bin $ORACLE_HOME/bin`
|===

Si raccomanda di impostare tutte le variabili d'ambiente in [.filename]#.profile#. Un esempio completo:

[.programlisting]
....
ORACLE_BASE=/oracle; export ORACLE_BASE
ORACLE_HOME=/oracle; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH
ORACLE_SID=ORCL; export ORACLE_SID
ORACLE_TERM=386x; export ORACLE_TERM
CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
export CLASSPATH
PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin
PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin
PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
export PATH
....

=== Installazione di Oracle(R)

A causa di una leggera inconsistenza nell'emulatore Linux, devi creare una directory chiamata [.filename]#.oracle# in [.filename]#/var/tmp# prima di avviare l'installer. Fallo appartenere dall'utente `oracle` e dovresti essere in grado di installare Oracle(R) senza alcun problema. Se hai problemi, controlla prima la tua distribuzione e/o configurazione di Oracle(R)! Dopo che hai installato Oracle(R), applica le patch descritte nelle prossime due sottosezioni.

Un problema frequente è che l'adattatore del protocollo TCP non è installato corretamente. Di conseguenza non puoi avviare alcun listener TCP. Le seguenti azioni aiutano a risolvere questo problema:

[source,bash]
....
# cd $ORACLE_HOME/network/lib
# make -f ins_network.mk ntcontab.o
# cd $ORACLE_HOME/lib
# ar r libnetwork.a ntcontab.o
# cd $ORACLE_HOME/network/lib
# make -f ins_network.mk install
....

Non dimenticarti di eseguire [.filename]#root.sh# ancora!

[[linuxemu-patch-root]]
==== Modifiche a root.sh

Nell'installazione di Oracle(R), alcune azioni, che vanno eseguite come `root`, sono registrate in uno script di shell chiamato [.filename]#root.sh#. Questo script si trova nella directory [.filename]#orainst#. Applica questa patch a [.filename]#root.sh#, in modo che usi propriamente `chown` o, in alternativa, esegui lo script in una shell nativa di Linux.

[.programlisting]
....
*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998
--- orainst/root.sh Mon Dec 28 15:58:53 1998
***************
*** 31,37 ****
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/bin/chown
#
# Define variables to be used in this script
--- 31,37 ----
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/usr/sbin/chown
#
# Define variables to be used in this script
....

Se non installi Oracle(R) dal CD, puoi aggiungere la patch al sorgente di [.filename]#root.sh#. Si chiama [.filename]#rthd.sh# e si trova nella directory [.filename]#orainst# nell'albero dei sorgenti.

[[linuxemu-patch-tcl]]
==== Modifiche a genclntsh

Lo script `genclntsh` viene usato per creare una singola libreria condivisa del client. Si usa quando si compilano le demo. Applica la patch seguente per decommentare la definizione di `PATH`:

[.programlisting]
....
*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998
--- bin/genclntsh Tue Dec 22 15:36:49 1998
***************
*** 32,38 ****
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst
--- 32,38 ----
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst
....

=== Avvio di Oracle(R)

Se hai seguito le istruzioni, dovresti essere in grado di avviare Oracle(R) proprio come se fosse su Linux.

[[sapr3]]
== Installazione di SAP(R) R/3(R)

Le installazioni di sistemi SAP(R) usando FreeBSD non sono supportate dal team di supporto SAP(R) - offrono supporto solo per piattaforme certificate.

[[preface]]
=== Prefazione

Questo documento descrive un modo possibile per installare un sistema SAP(R) R/3(R) con un database Oracle(R) per Linux su una macchina FreeBSD, inclusa l'installazione di FreeBSD e Oracle(R). Sono descritte due diverse configurazioni:

* SAP(R) R/3(R) 4.6B (IDES) con Oracle(R) 8.0.5 su FreeBSD 4.3-STABLE
* SAP(R) R/3(R) 4.6C con Oracle(R) 8.1.7 su FreeBSD 4.5-STABLE

Anche se questo documento tenta di descrivere tutti i passi importanti in dettaglio, non è insteso come un sostituto delle guide di installazione di Oracle(R) e SAP(R) R/3(R).

Per favore, controlla la documentazione unita all'edizione Linux di SAP(R) R/3(R) per questioni specifiche su SAP(R) e Oracle(R), e anche le risorse da Oracle(R) e SAP(R) OSS.

[[software]]
=== Software

Sono stati usati i seguenti CD-ROM per le installazioni di SAP(R):

[[software-46b]]
==== SAP(R) R/3(R) 4.6B, Oracle(R) 8.0.5

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| Nome
| Numero
| Descrizione

|KERNEL
|51009113
|SAP Kernel Oracle / Installation / AIX, Linux, Solaris

|RDBMS
|51007558
|Oracle / RDBMS 8.0.5.X / Linux

|EXPORT1
|51010208
|IDES / DB-Export / Disco 1 di 6

|EXPORT2
|51010209
|IDES / DB-Export / Disco 2 di 6

|EXPORT3
|51010210
|IDES / DB-Export / Disco 3 di 6

|EXPORT4
|51010211
|IDES / DB-Export / Disco 4 di 6

|EXPORT5
|51010212
|IDES / DB-Export / Disco 5 di 6

|EXPORT6
|51010213
|IDES / DB-Export / Disco 6 di 6
|===

Abbiamo usato anche il CD di Oracle(R) 8 Server (versione preproduzione 8.0.5 per Linux, versione del kernel 2.0.33) che non è non strettamente necessario, e FreeBSD 4.3-STABLE (uscita pochi giorni dopo 4.3 RELEASE).

[[software-46c]]
==== SAP(R) R/3(R) 4.6C SR2, Oracle(R) 8.1.7

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| Nome
| Numero
| Descrizione

|KERNEL
|51014004
|SAP Kernel Oracle / SAP Kernel Version 4.6D / DEC, Linux

|RDBMS
|51012930
|Oracle 8.1.7/ RDBMS / Linux

|EXPORT1
|51013953
|Release 4.6C SR2 / Export / Disco 1 di 4

|EXPORT1
|51013953
|Release 4.6C SR2 / Export / Disco 2 di 4

|EXPORT1
|51013953
|Release 4.6C SR2 / Export / Disco 3 di 4

|EXPORT1
|51013953
|Release 4.6C SR2 / Export / Disco 4 di 4

|LANG1
|51013954
|Release 4.6C SR2 / Language / DE, EN, FR / Disco 1 di 3
|===

Dipendentemente dalle lingue che vuoi installare, potrebbero essere necessari altri CD per le lingue. Qui usiamo solo DE e EN, così da utilizzare solo il primo CD per le lingue. Come piccola nota, i numeri per tutti i quattro CD EXPORT sono uguali. Tutti e tre i CD per le lingue hanno pure lo stesso numero (diversamente dalla numerazione della release 4.6B IDES). Mentre stiamo scrivendo, questa installazione sta girando su FreeBSD 4.5-STABLE (20.03.2002).

[[sap-notes]]
=== Note di SAP(R)

Le seguenti note dovrebbero essere lette prima di installare SAP(R) R/3(R) e dovrebbero tornare utili durante l'installazione:

[[sap-notes-46b]]
==== SAP(R) R/3(R) 4.6B, Oracle(R) 8.0.5

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Numero
| Titolo

|0171356
|Software SAP su Linux: Commenti Essenziali

|0201147
|INST: 4.6C R/3 Inst. su UNIX - Oracle

|0373203
|Aggiornamento / Migrazione Oracle 8.0.5 --> 8.0.6/8.1.6 LINUX

|0072984
|Rilascio di Digital UNIX 4.0B per Oracle

|0130581
|R3SETUP passo DIPGNTAB termina

|0144978
|Il tuo sistema non è stato installato correttamente

|0162266
|Domande e suggerimenti per R3SETUP su Windows NT / W2K
|===

[[sap-notes-46c]]
==== SAP(R) R/3(R) 4.6C, Oracle(R) 8.1.7

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Numero
| Titolo

|0015023
|Inizializzazione della tabella TCPDB (RSXP0004) (EBCDIC)

|0045619
|R/3 con molti linguaggi o caratteri

|0171356
|Software SAP su Linux: Commenti Essenziali

|0195603
|RedHat 6.1 Enterprise version: Problemi Conosciuti

|0212876
|Il nuovo strumento di archiviazione SAPCAR

|0300900
|Linux: Hardware DELL Rilasciato

|0377187
|RedHat 6.2: Note importanti

|0387074
|INST: R/3 4.6C SR2 Installazione su UNIX

|0387077
|INST: R/3 4.6C SR2 Inst. su UNIX - Oracle

|0387078
|Software SAP su UNIX: Dipendenze del SO per 4.6C SR2
|===

[[hardware-requirements]]
=== Requisiti Hardware

La strumentazione che segue è sufficiente per l'installazione di un sistema SAP(R) R/3(R). Per un uso in produzione, è necessario un dimensionamento più preciso:

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| Componente
| 4.6B
| 4.6C

|Processore
|2 x 800MHz Pentium(R) III
|2 x 800MHz Pentium(R) III

|Memoria
|1GB ECC
|2GB ECC

|Spazio sul Disco Fisso
|50-60GB (IDES)
|50-60GB (IDES)
|===

Per l'uso in produzione si raccomandano processori Xeon(TM), con una grande cache, dischi ad accesso ad alta velocità (SCSI, controller hardware RAID), sono raccomandati USV e ECC-RAM. La grande quantità di spazio sul disco fisso è dovuta al sistema IDES preconfigurato, che, durante l'installazione, crea 27 GB di file per il database. Questo spazio è sufficiente per sistemi in produzione e per i dati delle applicazioni iniziali.

[[hardware-46b]]
==== SAP(R) R/3(R) 4.6B, Oracle(R) 8.0.5

È stato usato il seguente hardware in disuso: una scheda biprocessore con 2 processori Pentium(R) III da 800 MHz, adattatore SCSI Adaptec(R) 29160 Ultra160 (per accedere ad un unità nastro DLT da 40/80 GB e al CDROM), Mylex(R) AcceleRAID(TM) (2 canali, firmware 6.00-1-00 con 32 MB RAM). Al controller RAID Mylex(R) sono attaccati due dischi fissi da 17 GB (mirrored) e quattro dischi fissi da 36 GB (RAID 5).

[[hardware-46c]]
==== SAP(R) R/3(R) 4.6C, Oracle(R) 8.1.7

Per questa installazione è stato usato un Dell(TM) PowerEdge(TM) 2500: una scheda biprocessore con due processori Pentium(R) III da 1000 MHz (256 kB di cache), 2 GB PC133 ECC SDRAM, controller RAID PERC/3 DC PCI con 128 MB, e un drive EIDE DVD-ROM. Al controller RAID controller sono attaccati due dischi fissi da 18 GB (mirrored) e quattro dischi fissi da 36 GB (RAID 5).

[[installation]]
=== Installazione di FreeBSD

Prima devi installare FreeBSD. Ci sono molti modi per farlo, per maggiori informazioni leggi la crossref:install[install-diff-media,Preparare i Propri Media di Installazione].

[[disk-layout]]
==== Layuot del Disco

Per farla semplice, abbiamo usato lo stesso layout del disco sia per l'installazione di SAP(R) R/3(R) 46B che di SAP(R) R/3(R) 46C SR2. Cambiano solo i nomi dei dispositivi, dal momento che le installazioni sono state eseguite su hardware differenti (rispettivamente [.filename]#/dev/da# e [.filename]#/dev/amr#, così se si usa un AMI MegaRAID(R), si vedrà [.filename]#/dev/amr0s1a# invece che [.filename]#/dev/da0s1a#):

[.informaltable]
[cols="1,1,1,1", frame="none", options="header"]
|===
| File system
| Dimensione (1k-blocks)
| Dimensione (GB)
| Montato su

|[.filename]#/dev/da0s1a#
|1.016.303
|1
|[.filename]#/#

|[.filename]#/dev/da0s1b#
|
|6
|swap

|[.filename]#/dev/da0s1e#
|2.032.623
|2
|[.filename]#/var#

|[.filename]#/dev/da0s1f#
|8.205.339
|8
|[.filename]#/usr#

|[.filename]#/dev/da1s1e#
|45.734.361
|45
|[.filename]#/compat/linux/oracle#

|[.filename]#/dev/da1s1f#
|2.032.623
|2
|[.filename]#/compat/linux/sapmnt#

|[.filename]#/dev/da1s1g#
|2.032.623
|2
|[.filename]#/compat/linux/usr/sap#
|===

Configura in anticipo e inizializza i due drive logici con il software Mylex(R) o PERC/3 RAID. Il software può essere lanciato durante la fase di avvio del BIOS.

Nota che il layout di questo disco differisce leggermente dalle raccomandazioni di SAP(R), giacché SAP(R) suggerisce di montare le sottodirectory di Oracle(R) (e qualche altra) separatamente - abbiamo deciso di crearle come vere sottodirectory per semplicità.

[[makeworldandnewkernel]]
==== `make world` e il Nuovo Kernel

Scarica gli ultimi sorgenti -STABLE. Ricompila world e il tuo kernel personalizzato dopo averne modificato il file di configurazione. In questo dovresti includere anche i <<kerneltuning,parametri del kernel>> che sono richiesti sia per SAP(R) R/3(R) che per Oracle(R).

[[installingthelinuxenviornment]]
=== Installazione dell'Ambiente Linux

[[installinglinuxbase-system]]
==== Installazione del Sistema Linux di Base

Per primo bisogna installare il port <<linuxemu-libs-port,linux_base>> (come `root`):

[source,bash]
....
# cd /usr/ports/emulators/linux_base
# make install distclean
....

[[installinglinuxdevelopment]]
==== Installazione dell'Ambiente di Sviluppo di Linux

È richiesto l'ambiente di sviluppo di linux, se vuoi installare Oracle(R) su FreeBSD secondo la <<linuxemu-oracle>>:

[source,bash]
....
# cd /usr/ports/devel/linux_devtools
# make install distclean
....

L'ambiente di sviluppo di Linux è stato installato solo durante l'installazione di SAP(R) R/3(R) 46B IDES. Non è necessario, se Oracle(R) DB non è ricollegata sul sistema FreeBSD. Questo è il caso se stai usando il tarball di Oracle(R) da un sistema Linux.

[[installingnecessaryrpms]]
==== Installazione degli RPM necessari

Per avviare il programma `R3SETUP`, c'è bisogno del supporto PAM. Durante la prima installazione di SAP(R) su FreeBSD 4.3-STABLE abbiamo tentato di installare PAM con tutti i pacchetti richiesti: alla fine abbiamo forzato l'installazione del pacchetto di PAM, ed ha funzionato. Per SAP(R) R/3(R) 4.6C SR2 abbiamo subito forzato l'installazione degli RPM di PAM, ed ha pure funzionato, sembra quindi che i pacchetti dipendenti non siano necessari:

[source,bash]
....
# rpm -i --ignoreos --nodeps --root /compat/linux --dbpath /var/lib/rpm \
pam-0.68-7.i386.rpm
....

Per fare in modo che Oracle(R) 8.0.5 avvii l'intelligent agent, dobbiamo anche installare il paccheto Tcl di RedHat [.filename]#tcl-8.0.5-30.i386.rpm# (altrimenti il ricollegamento durante l'installazione di Oracle(R) non funzionerà). Ci sono altri punti riguardanti il ricollegamento di Oracle(R), ma è un problema di Oracle(R) per Linux, non specifico di FreeBSD.

[[linuxprocandfallbackelfbrand]]
==== Alcuni Suggerimenti

Potrebbe essere una buona idea aggiungere `linprocfs` a [.filename]#/etc/fstab#, per maggiori informazioni guarda la pagina del manuale di man:linprocfs[5]. Un altro parametro da impostare è `kern.fallback_elf_brand=3`, da fare nel file [.filename]#/etc/sysctl.conf#.

[[creatingsapr3env]]
=== Creazione dell'Ambiente SAP(R) R/3(R)

[[filesystemsandmountpoints]]
==== Creazione dei File System Necessari e dei Punti di Mount

Per una installazione semplice è sufficiente creare i seguenti file system:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| punto di mount
| dimensione in GB

|[.filename]#/compat/linux/oracle#
|45 GB

|[.filename]#/compat/linux/sapmnt#
|2 GB

|[.filename]#/compat/linux/usr/sap#
|2 GB
|===

È necessario anche creare qualche collegamento, altrimenti l'installer di SAP(R) si lamenterà, perché controlla i collegamenti creati:

[source,bash]
....
# ln -s /compat/linux/oracle /oracle
# ln -s /compat/linux/sapmnt /sapmnt
# ln -s /compat/linux/usr/sap /usr/sap
....

Possibili messaggi d'errore durante l'installazione (qui con il sistema _PRD_ e l'installazione di SAP(R) R/3(R) 4.6C SR2):

[source,bash]
....
INFO 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:200
    Checking existence of symbolic link /usr/sap/PRD/SYS/exe/dbg to
    /sapmnt/PRD/exe. Creating if it does not exist...

WARNING 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:400
    Link /usr/sap/PRD/SYS/exe/dbg exists but it points to file
    /compat/linux/sapmnt/PRD/exe instead of /sapmnt/PRD/exe. The
    program cannot go on as long as this link exists at this
    location. Move the link to another location.

ERROR 2002-03-19 16:45:36 R3LINKS_IND_IND Ins_SetupLinks:0
    can not setup link '/usr/sap/PRD/SYS/exe/dbg' with content
    '/sapmnt/PRD/exe'
....

[[creatingusersanddirectories]]
==== Creazione degli Utenti e delle Directory

SAP(R) R/3(R) ha bisogno di due utenti e tre gruppi. I nomi degli utenti dipendono dal SAP(R) system ID (SID) che consta di tre lettere. Alcuni di questi SID sono riservati da SAP(R) (per esempio `SAP` e `NIX`. Per una lista completa controlla la documentazione SAP(R)). Per l'installazione di IDES abbiamo usato `IDS`, per l'installazione di 4.6C SR2 `PRD`, poiché quel sistema è inteso per l'uso in produzione. Abbiamo quindi i seguenti gruppi (gli ID dei gruppi potrebbero differire, questi sono solo i valori che abbiamo usato nella nostra installazione):

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| ID del gruppo
| nome del gruppo
| descrizione

|100
|dba
|Amministratore del Database

|101
|sapsys
|Sistema SAP(R)

|102
|oper
|Operatore del Database
|===

In una installazione normale di Oracle(R), si usa solo il gruppo `dba`. Come gruppo `oper`, si usa anche il gruppo `dba` (per maggiori informazioni, vedi la documentazione di Oracle(R) e di SAP(R)).

Abbiamo bisogno anche dei seguenti utenti:

[.informaltable]
[cols="1,1,1,1,1,1", frame="none", options="header"]
|===
| ID utente
| nome utente
| nome generico
| gruppo
| gruppi addizionali
| descrizione

|1000
|idsadm/prdadm
|__sid__adm
|sapsys
|oper
|Amministratore SAP(R)

|1002
|oraids/oraprd
|ora__sid__
|dba
|oper
|Amministratore Oracle(R)
|===

Aggiungere gli utenti con man:adduser[8] richiede l'inserimento di questo per l'"Amministratore SAP(R)" (notare la shell e la directory home):

[.programlisting]
....
Name: sidadm
Password: ******
Fullname: SAP Administrator SID
Uid: 1000
Gid: 101 (sapsys)
Class:
Groups: sapsys dba
HOME: /home/sidadm
Shell: bash  (/compat/linux/bin/bash)
....

e per l'"Amministratore Oracle(R)":

[.programlisting]
....
Name: orasid
Password: ******
Fullname: Oracle Administrator SID
Uid: 1002
Gid: 100 (dba)
Class:
Groups: dba
HOME: /oracle/sid
Shell: bash  (/compat/linux/bin/bash)
....

Questo dovrebbe includere anche il gruppo `oper` nel caso tu stia usando entrambi i gruppi `dba` e `oper`.

[[creatingdirectories]]
==== Creazione delle Directory

Queste directory solitamente sono create come file system separati, dipende esclusivamente dalle tue necessità. Noi abbiamo scelto di crearle come semplici directory, dal momento che, comunque, si trovano sullo stesso RAID 5:

Prima impostiamo le appartenenze ed i diritti per alcune directory (come utente `root`):

[source,bash]
....
# chmod 775 /oracle
# chmod 777 /sapmnt
# chown root:dba /oracle
# chown sidadm:sapsys /compat/linux/usr/sap
# chmod 775 /compat/linux/usr/sap
....

Successivamente creiamo le directory come utente `ora__sid__`. Queste saranno tutte le sottodirectory di [.filename]#/oracle/SID#:

[source,bash]
....
# su - orasid
# cd /oracle/SID
# mkdir mirrlogA mirrlogB origlogA origlogB
# mkdir sapdata1 sapdata2 sapdata3 sapdata4 sapdata5 sapdata6
# mkdir saparch sapreorg
# exit
....

Per l'installazione di Oracle(R) 8.1.7 sono necessarie alcune altre directory:

[source,bash]
....
# su - orasid
# cd /oracle
# mkdir 805_32
# mkdir client stage
# mkdir client/80x_32
# mkdir stage/817_32
# cd /oracle/SID
# mkdir 817_32
....

[NOTE]
====
La directory [.filename]#client/80x_32# è usata esattamente con questo nome. Non rimpiazzare la _x_ con dei numeri o altro.
====

Nel terzo passo creiamo le directory come `__sid__adm`:

[source,bash]
....
# su - sidadm
# cd /usr/sap
# mkdir SID
# mkdir trans
# exit
....

[[entriesinslashetcslashservices]]
==== Definizioni in [.filename]#/etc/services#

SAP(R) R/3(R) richiede alcune definizioni nel file [.filename]#/etc/services#, che non sono impostate correttamente durante l'installazione sotto FreeBSD. Aggiungi le seguenti righe (hai bisogno almeno di queste definizioni, corrispondenti al numero di istanza - in questo caso, `00`. Non fa danni aggiungere tutte le definizioni da `00` a `99` per `dp`, `gw`, `sp` e `ms`). Se userai un SAProuter o avrai bisogno di accedere a SAP(R) OSS, hai bisogno di `99`, dal momento che la porta 3299 è normalmente utilizzata per il processo SAProuter sul sistema target:

[.programlisting]
....

sapdp00    3200/tcp # SAP Dispatcher.      3200 + Instance-Number
sapgw00  3300/tcp # SAP Gateway.         3300 + Instance-Number
sapsp00  3400/tcp #                      3400 + Instance-Number
sapms00  3500/tcp #                      3500 + Instance-Number
sapmsSID 3600/tcp # SAP Message Server.  3600 + Instance-Number
sapgw00s   4800/tcp # SAP Secure Gateway   4800 + Instance-Number
....

[[necessarylocales]]
==== Internazionalizzazioni Necessarie

SAP(R) richiede almeno due internazionalizzazioni che non fanno parte dell'installazione standard di RedHat. SAP(R) offre gli RPM richiesti, scaricabili dal loro server FTP (che è accessibile solo se sei un cliente con accesso OSS). Vedi la nota 0171356 per una lista degli RPM di cui hai bisogno.

È pure possibile creare solamente i collegamenti appropriati (per esempio da _de_DE_ e _en_US_ ), ma non lo raccomandiamo per un sistema in produzione (anche se ha funzionato con il sistema IDES senza alcun problema). Le seguenti internazionalizzazioni sono necessarie:

[.programlisting]
....
de_DE.ISO-8859-1
en_US.ISO-8859-1
....

Crea i collegamenti come questi:

[source,bash]
....
# cd /compat/linux/usr/shared/locale
# ln -s de_DE de_DE.ISO-8859-1
# ln -s en_US en_US.ISO-8859-1
....

Se non sono presenti, ci sarà qualche problema durante l'installazione. Se vengono ignorati (impostando `STATUS` dei punti con errore a `OK` nel file [.filename]#CENTRDB.R3S#), sarà impossibile autenticarsi nel sistema SAP(R) senza qualche ulteriore sforzo.

[[kerneltuning]]
==== Affinamento del Kernel

I sistemi SAP(R) R/3(R) necessitano di molte risorse. Di conseguenza abbiamo aggiunto i seguenti parametri al file di configurazione del kernel:

[.programlisting]
....
# Set these for memory pigs (SAP and Oracle):
options MAXDSIZ="(1024*1024*1024)"
options DFLDSIZ="(1024*1024*1024)"
# System V options needed.
options SYSVSHM #SYSV-style shared memory
options SHMMAXPGS=262144 #max amount of shared mem. pages
#options SHMMAXPGS=393216 #use this for the 46C inst.parameters
options SHMMNI=256 #max number of shared memory ident if.
options SHMSEG=100 #max shared mem.segs per process
options SYSVMSG #SYSV-style message queues
options MSGSEG=32767 #max num. of mes.segments in system
options MSGSSZ=32 #size of msg-seg. MUST be power of 2
options MSGMNB=65535 #max char. per message queue
options MSGTQL=2046 #max amount of msgs in system
options SYSVSEM #SYSV-style semaphores
options SEMMNU=256 #number of semaphore UNDO structures
options SEMMNS=1024 #number of semaphores in system
options SEMMNI=520 #number of semaphore identifiers
options SEMUME=100       #number of UNDO keys
....

I valori minimi sono specificati nella documentazione fornita con SAP(R). Dal momento che non v'è alcuna descrizione per Linux, vedi nella sezione HP-UX (32-bit) per ulteriori informazioni. Siccome il sistema per l'installazione di 4.6C SR2 ha più memoria principale, il segmento condiviso può essere più grande sia per SAP(R) che per Oracle(R), quindi scegli un numero maggiore di pagine di memoria condivisa.

[NOTE]
====
Con l'installazione di default di FreeBSD su i386(TM), lascia `MAXDSIZ` e `DFLDSIZ` ad un massimo di 1 GB. In caso contrario potrebbero accadere strani errori, come `ORA-27102: out of memory` e `Linux Error: 12: Cannot allocate memory`.
====

[[installingsapr3]]
=== Installazione di SAP(R) R/3(R)

[[preparingsapcdroms]]
==== Preparazione dei CD-ROM di SAP(R)

Ci sono molti CD-ROM da montare e smontare durante l'installazione. Ad avere abbastanza drive CD-ROM, puoi montarli tutti. Abbiamo deciso di copiare i contenuti dei CD-ROM nelle directory corrispondenti:

[.programlisting]
....
/oracle/SID/sapreorg/cd-name
....

dove _cd-name_ era uno tra [.filename]#KERNEL#, [.filename]#RDBMS#, [.filename]#EXPORT1#, [.filename]#EXPORT2#, [.filename]#EXPORT3#, [.filename]#EXPORT4#, [.filename]#EXPORT5# e [.filename]#EXPORT6# per l'installazione di 4.6B/IDES, e [.filename]#KERNEL#, [.filename]#RDBMS#, [.filename]#DISK1#, [.filename]#DISK2#, [.filename]#DISK3#, [.filename]#DISK4# e [.filename]#LANG# per l'installazione di 4.6C SR2. Tutti i nomi dei file sui CD montati dovrebbero essere in lettere maiuscole. In caso contrario usa l'opzione `-g` per montare, cioè usa questi comandi:

[source,bash]
....
# mount_cd9660 -g /dev/cd0a /mnt
# cp -R /mnt/* /oracle/SID/sapreorg/cd-name
# umount /mnt
....

[[runningtheinstall-script]]
==== Avvio dello Script di Installazione

Per prima cosa devi creare una directory [.filename]#install#:

[source,bash]
....
# cd /oracle/SID/sapreorg
# mkdir install
# cd install
....

Quindi viene lanciato lo script di installazione, che copia quasi tutti i file rilevanti dentro alla directory [.filename]#install#:

[source,bash]
....
# /oracle/SID/sapreorg/KERNEL/UNIX/INSTTOOL.SH
....

L'installazione (4.6B) è data con un sistema di dimostrazione SAP(R) R/3(R) completamente personalizzato, per questo ci sono sei CD EXPORT invece che tre. A questo punto il modello [.filename]#CENTRDB.R3S# serve per l'installazione di una istanza centrale standard (R/3(R) e database), non l'instanza centrale IDES, quindi bisogna copiare il corrispondente [.filename]#CENTRDB.R3S# dalla directory [.filename]#EXPORT1#, altrimenti `R3SETUP` chiederà solo tre CD EXPORT.

La nuova distribuzione di SAP(R) 4.6C SR2 viene venduta con quattro CD EXPORT. Il file che controlla i passi dell'installazione è [.filename]#CENTRAL.R3S#. Contrariamente alle versioni precedenti non ci sono modelli di installazione per una istanza centrale con o senza database. SAP(R) usa un modello diverso per l'installazione del database. Per riavviare l'installazione in un secondo momento, è comunque sufficiente riavviare con il file originale.

Durante e dopo l'installazione, SAP(R) richiede `hostname` per restituire solamente il nome del computer, non il nome completo del dominio. Quindi imposta l'hostname in questo modo, oppure imposta un alias con `alias hostname='hostname -s'` per entrambi `ora__sid__` e `__sid__adm` (e per `root` almeno per i punti eseguiti come `root`). È anche possibile modificare i file [.filename]#.profile# e [.filename]#.login# installati di entrambi gli utenti creati durante l'installazione di SAP(R).

[[startr3setup-46B]]
==== Avviare `R3SETUP` 4.6B

Assicurati che `LD_LIBRARY_PATH` sia impostato correttamente:

[source,bash]
....
# export LD_LIBRARY_PATH=/oracle/IDS/lib:/sapmnt/IDS/exe:/oracle/805_32/lib
....

Avvia `R3SETUP` come `root` dalla directory di installazione:

[source,bash]
....
# cd /oracle/IDS/sapreorg/install
# ./R3SETUP -f CENTRDB.R3S
....

Lo script, quindi, fa alcune domande (i default sono tra parentesi, seguite dal vero input):

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| Domanda
| Default
| Input

|Enter SAP System ID
|[C11]
|IDSkbd:[Enter]

|Enter SAP Instance Number
|[00]
|kbd:[Enter]

|Enter SAPMOUNT Directory
|[/sapmnt]
|kbd:[Enter]

|Enter name of SAP central host
|[troubadix.domain.de]
|kbd:[Enter]

|Enter name of SAP db host
|[troubadix]
|kbd:[Enter]

|Select character set
|[1] (WE8DEC)
|kbd:[Enter]

|Enter Oracle server version (1) Oracle 8.0.5, (2) Oracle 8.0.6, (3) Oracle 8.1.5, (4) Oracle 8.1.6
|
|1kbd:[Enter]

|Extract Oracle Client archive
|[1] (Yes, extract)
|kbd:[Enter]

|Enter path to KERNEL CD
|[/sapcd]
|/oracle/IDS/sapreorg/KERNEL

|Enter path to RDBMS CD
|[/sapcd]
|/oracle/IDS/sapreorg/RDBMS

|Enter path to EXPORT1 CD
|[/sapcd]
|/oracle/IDS/sapreorg/EXPORT1

|Directory to copy EXPORT1 CD
|[/oracle/IDS/sapreorg/CD4_DIR]
|kbd:[Enter]

|Enter path to EXPORT2 CD
|[/sapcd]
|/oracle/IDS/sapreorg/EXPORT2

|Directory to copy EXPORT2 CD
|[/oracle/IDS/sapreorg/CD5_DIR]
|kbd:[Enter]

|Enter path to EXPORT3 CD
|[/sapcd]
|/oracle/IDS/sapreorg/EXPORT3

|Directory to copy EXPORT3 CD
|[/oracle/IDS/sapreorg/CD6_DIR]
|kbd:[Enter]

|Enter path to EXPORT4 CD
|[/sapcd]
|/oracle/IDS/sapreorg/EXPORT4

|Directory to copy EXPORT4 CD
|[/oracle/IDS/sapreorg/CD7_DIR]
|kbd:[Enter]

|Enter path to EXPORT5 CD
|[/sapcd]
|/oracle/IDS/sapreorg/EXPORT5

|Directory to copy EXPORT5 CD
|[/oracle/IDS/sapreorg/CD8_DIR]
|kbd:[Enter]

|Enter path to EXPORT6 CD
|[/sapcd]
|/oracle/IDS/sapreorg/EXPORT6

|Directory to copy EXPORT6 CD
|[/oracle/IDS/sapreorg/CD9_DIR]
|kbd:[Enter]

|Enter amount of RAM for SAP + DB
|
|850kbd:[Enter] (in Megabytes)

|Service Entry Message Server
|[3600]
|kbd:[Enter]

|Enter Group-ID of sapsys
|[101]
|kbd:[Enter]

|Enter Group-ID of oper
|[102]
|kbd:[Enter]

|Enter Group-ID of dba
|[100]
|kbd:[Enter]

|Enter User-ID of __sid__adm
|[1000]
|kbd:[Enter]

|Enter User-ID of ora__sid__
|[1002]
|kbd:[Enter]

|Number of parallel procs
|[2]
|kbd:[Enter]
|===

Se non hai copiato i CD in posizioni diverse, l'installer di SAP(R) non può tyrovare i CD necessari (identificati dal file [.filename]#LABEL.ASC# sul CD) e quindi ti chiederà di inserire e montare il CD e di confermare o di inserire il path al mount.

[.filename]#CENTRDB.R3S# potrebbe non essere scevro di errori. Nel nostro caso, ha richiesto il CD EXPORT4 un'altra volta ma indicando la chiave corretta (6_LOCATION, quindi 7_LOCATION, ecc.), così bisogna continuare ad inserire i valori corretti.

A parte alcuni problemi sopra menzionati, ogni cosa dovrebbe andare bene fino al punto dove bisogna installare il database Oracle(R).

[[startr3setup-46C]]
==== Avviare `R3SETUP` 4.6C SR2

Assicurati che `LD_LIBRARY_PATH` sia impostato correttamente. Ha un valore diverso dall'installazione di 4.6B con Oracle(R) 8.0.5:

[source,bash]
....
# export LD_LIBRARY_PATH=/sapmnt/PRD/exe:/oracle/PRD/817_32/lib
....

Avvia `R3SETUP` come `root` dalla directory di installazione:

[source,bash]
....
# cd /oracle/PRD/sapreorg/install
# ./R3SETUP -f CENTRAL.R3S
....

Lo script, quindi, fa alcune domande (i default sono tra parentesi, seguite dal vero input):

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| Domanda
| Default
| Input

|Enter SAP System ID
|[C11]
|PRDkbd:[Enter]

|Enter SAP Instance Number
|[00]
|kbd:[Enter]

|Enter SAPMOUNT Directory
|[/sapmnt]
|kbd:[Enter]

|Enter name of SAP central host
|[majestix]
|kbd:[Enter]

|Enter Database System ID
|[PRD]
|PRDkbd:[Enter]

|Enter name of SAP db host
|[majestix]
|kbd:[Enter]

|Select character set
|[1] (WE8DEC)
|kbd:[Enter]

|Enter Oracle server version (2) Oracle 8.1.7
|
|2kbd:[Enter]

|Extract Oracle Client archive
|[1] (Yes, extract)
|kbd:[Enter]

|Enter path to KERNEL CD
|[/sapcd]
|/oracle/PRD/sapreorg/KERNEL

|Enter amount of RAM for SAP + DB
|2044
|1800kbd:[Enter] (in Megabytes)

|Service Entry Message Server
|[3600]
|kbd:[Enter]

|Enter Group-ID of sapsys
|[100]
|kbd:[Enter]

|Enter Group-ID of oper
|[101]
|kbd:[Enter]

|Enter Group-ID of dba
|[102]
|kbd:[Enter]

|Enter User-ID of `oraprd`
|[1002]
|kbd:[Enter]

|Enter User-ID of `prdadm`
|[1000]
|kbd:[Enter]

|LDAP support
|
|3kbd:[Enter] (no support)

|Installation step completed
|[1] (continue)
|kbd:[Enter]

|Choose installation service
|[1] (DB inst,file)
|kbd:[Enter]
|===

Al momento la creazione degli utenti genera un errore durante l'installazione nelle fasi OSUSERDBSID_IND_ORA (nel creare l'utente `ora__sid__`) e OSUSERSIDADM_IND_ORA (nel creare l'utente `__sid__adm`).

A parte qualche problema descritto sopra, tutto dovrebbe andare liscio fino al punto dove bisogna installare il database Oracle(R).

[[installingoracle805]]
=== Installazione di Oracle(R) 8.0.5

Per favore, leggi le corrispondenti note di SAP(R) e i [.filename]#Readme# di Oracle(R) riguardanti Linux e Oracle(R) DB per possibili problemi. Molti, se non tutti, i problemi nascono da librerie incompatibili.

Per maggiori informazioni riguardo all'installazione di Oracle(R), riferirsi al <<linuxemu-oracle,capitolo Installare Oracle(R)>>.

[[installingtheoracle805withorainst]]
==== Installazione di Oracle(R) 8.0.5 con `orainst`

Se bisogna usare Oracle(R) 8.0.5, sono richeste alcune librerie in più per un ricollegamento funzionante, perché Oracle(R) 8.0.5 è stata collegata con una vecchia glibc (RedHat 6.0), anche se RedHat 6.1 già usa una nuova glibc. Per questo devi installare i seguenti pacchetti per essere sicuro che il collegamento funzioni:

[.filename]#compat-libs-5.2-2.i386.rpm#

[.filename]#compat-glibc-5.2-2.0.7.2.i386.rpm#

[.filename]#compat-egcs-5.2-1.0.3a.1.i386.rpm#

[.filename]#compat-egcs-c++-5.2-1.0.3a.1.i386.rpm#

[.filename]#compat-binutils-5.2-2.9.1.0.23.1.i386.rpm#

Per maggiori informazioni, leggi le corrispondenti note di SAP(R) o i [.filename]#Readme# di Oracle(R). Se non hai questa opzione (al momento dell'installazione non abbiamo avuto abbastanza tempo per controllare), si possono usare i binari originali, oppure usare i binari ricollegati da un sistema RedHat originale.

Per compilare l'intelligent agent, bisogna installare il pacchetto Tcl di RedHat. Se non puoi recuperare [.filename]#tcl-8.0.3-20.i386.rpm#, dovrebbe funzionare uno più nuovo come [.filename]#tcl-8.0.5-30.i386.rpm# da RedHat 6.1.

A parte il ricollegamento, l'installazione è diretta:

[source,bash]
....
# su - oraids
# export TERM=xterm
# export ORACLE_TERM=xterm
# export ORACLE_HOME=/oracle/IDS
# cd $ORACLE_HOME/orainst_sap
# ./orainst
....

Conferma tutti i comandi con kbd:[Enter] fino a che il software non è installato, a parte il _Oracle(R) On-Line Text Viewer_, che non è disponibile per Linux. Oracle(R), quindi, si ricolleghi con `i386-glibc20-linux-gcc` invece dei disponibili `gcc`, `egcs` o `i386-redhat-linux-gcc`.

A causa di limitazioni di tempo, abbiamo deciso di usare i binari da una distribuzione di Oracle(R) 8.0.5 PreProduction, dopo il primo tentativo, fallito, di far funzionare la versione dal CD del RDBMS, e trovare e accedere agli RPM corretti era un incubo in quel momento.

[[installingtheoracle805preproduction]]
==== Installzione della Distribuzione Oracle(R) 8.0.5 Pre-production per Linux (Kernel 2.0.33)

Questa installazione è piuttosto semplice. Monta il CD e avvia l'installer. Ti chiederà l'ubicazione della directory home di Oracle(R) e vi copierà i file. Noi, comunque, Non abbiamo cancellato ciò che è rimasto dei precedenti tentativi di installazione del RDBMS.

Subito dopo, il database Oracle(R) può essere lanciato senza problemi.

[[installingoracle817]]
=== Installazione del Tarball di Oracle(R) 8.1.7 per Linux

Prendi il tarball [.filename]#oracle81732.tgz# che hai prodotto dalla directory di installazione su un sistema Linux e estrailo in [.filename]#/oracle/SID/817_32/#.

[[continuewithsapr4installation]]
=== Continuare con l'Installazione di SAP(R) R/3(R)

Prima controlla le impostazioni d'ambiente degli utenti `idsamd` (__sid__adm) e `oraids` (ora__sid__). Ora dovrebbero avere i file [.filename]#.profile#, [.filename]#.login# e [.filename]#.cshrc# che usano tutti `hostname`. Nel caso l'hostname del sistema sia il nome completamente qualificato, devi cambiare `hostname` in `hostname -s` dentro a tutti i file.

[[databaseload]]
==== Caricamento del Database

Dopo di ciò, `R3SETUP` può essere riavviato o continuato (a seconda che se ne sia usciti o no). `R3SETUP`, quindi, crea le tabelle e carica i dati nel database con `R3load` (per 46B IDES, da EXPORT1 a EXPORT6, per 46C da DISK1 a DISK4).

Quando il caricamento del database è finito (potrebbe richiedere qualche ora), vengono richieste alcune password. Per installazioni di prova, si possono usare le ben note password di default (usane di diverse se la sicurezza è un problema!):

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Domanda
| Input

|Enter Password for sapr3
|sapkbd:[Enter]

|Confirum Password for sapr3
|sapkbd:[Enter]

|Enter Password for sys
|change_on_installkbd:[Enter]

|Confirm Password for sys
|change_on_installkbd:[Enter]

|Enter Password for system
|managerkbd:[Enter]

|Confirm Password for system
|managerkbd:[Enter]
|===

A questo punto abbiamo avuto qualche problema con `dipgntab` durante l'installazione di 4.6B.

[[listener]]
==== Listener

Avvia il listener di Oracle(R) come utente `ora__sid__` come segue:

[source,bash]
....
% umask 0; lsnrctl start
....

Altrimenti potresti incorrere nell'errore ORA-12546 poiché i socket non hanno i permessi giusti. Vedi la nota di SAP(R) 072984.

[[mnlstables]]
==== Aggiornare le Tabelle MNLS

Se pensi di importare le lingue non-Latin-1 nel sistema SAP(R), devi aggiornare le tabelle Multi National Language Support. Questo è descritto nelle note di SAP(R) OSS 15023 e 45619. Altrimenti puoi saltare questa domanda durante l'installazione di SAP(R).

[NOTE]
====
Se non hai bisogno del MNLS, è comunque necessario controllare la tabella TCPDB e inizializzarla se ancora non è stato fatto. Per maggiori informazioni, vedi le note di SAP(R) 0015023 e 0045619.
====

[[postinstallationsteps]]
=== Dopo l'Installazione

[[requestsapr3licensekey]]
==== Richiesta della Chiave di Licenza di SAP(R) R/3(R)

Devi richiedere la tua chiave di licenza per SAP(R) R/3(R). È necessaria, dal momento che la licenza temporanea che è stata usata durante l'installazione era valida solo per quattro settimane. Prima di tutto recupera la chiave hardware. Autenticati come utente `idsadm` e lancia `saplicense`:

[source,bash]
....
# /sapmnt/IDS/exe/saplicense -get
....

Lanciando `saplicense` senza paramentri, viene restituita una lista di opzioni. Quando si riceve la chiave di licenza, può essere installata usando:

[source,bash]
....
# /sapmnt/IDS/exe/saplicense -install
....

Ti viene richiesto di inserire i seguenti valori:

[.programlisting]
....
SAP SYSTEM ID   = SID, 3 chars
CUSTOMER KEY    = hardware key, 11 chars
INSTALLATION NO = installation, 10 digits
EXPIRATION DATE = yyyymmdd, usually "99991231"
LICENSE KEY     = license key, 24 chars
....

[[creatingusers]]
==== Creazione degli Utenti

Crea un utente dentro il client 000 (richiesto per qualche azione da eseguire dentro al client 000, ma con un utente diverso dagli utenti `sap*` e `ddic`). Come nome utente, noi solitamente scegliamo `wartung` (o `servizio` in italiano). I profili richiesti sono `sap_new` e `sap_all`. Per maggiore sicurezza, le password degli utenti di default dentro a tutti i client dovrebbero essere cambiate (compresi gli utenti `sap*` e `ddic`).

[[configtranssysprofileopermodesetc]]
==== Configurare il Sistema di Trasporto, il Profilo, i Modi di Operare, Ecc.

Dentro al client 000, per gli utenti diversi da `ddic` e `sap*`, fai almeno questo:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Azione
| Transazione

|Configura il Sistema di Trasporto, p.e. come _Stand-Alone Transport Domain Entity_
|STMS

|Crea / Modifica il Profilo per il Sistema
|RZ10

|Controlla le Istanze e i Modi di Operare
|RZ04
|===

Questi e tutti gli altri punti dopo l'installazione sono estesamente descritti nelle guide di installazione di SAP(R).

[[editintsidsap]]
==== Modificare [.filename]#initsid.sap# ([.filename]#initIDS.sap#)

Il file [.filename]#/oracle/IDS/dbs/initIDS.sap# contiene il profilo di backup di SAP(R). Qui la dimensione del nastro da usare, il tipo di compressione e tutto il resto sono da definire. Per farlo funzionare con `sapdba` / `brbackup`, abbiamo cambiato i seguenti valori:

[.programlisting]
....
compress = hardware
archive_function = copy_delete_save
cpio_flags = "-ov --format=newc --block-size=128 --quiet"
cpio_in_flags = "-iuv --block-size=128 --quiet"
tape_size = 38000M
tape_address = /dev/nsa0
tape_address_rew = /dev/sa0
....

Spiegazioni:

`compress`: Il nastro che usiamo è un HP DLT1 che ha compressione hardware .

`archive_function`: Questa definisce il comportamento normale per salvare i log dell'archivio di Oracle(R): i nuovi file di log sono salvati sul nastro, quelli già salvati sono salvati ancora e poi cancellati. Questo previene molti problemi se devi recuperare il database e uno dei nastri d'archivio si è rovinato.

`cpio_flags`: Di default si usa `-B` che imposta la dimensione dei blocchi a 5120 Bytes. Per i nastri DLT, HP raccomanda una dimensione dei blocchi di almeno 32 K, per cui abbiamo usato `--block-size=128` per 64 K. `--format=newc` è necessaria perché abbiamo un numero di inode maggiore di 65535. L'ultima opzione `--quiet` è necessaria perché altrimenti `brbackup` si lamenta non appena `cpio` restituisce il numero di blocchi salvato.

`cpio_in_flags`: Etichetta necessaria per caricare i dati dal nastro. Il formato è riconosciuto automaticamente.

`tape_size`: Solitamente questo indica la capacità di archiviazione del nastro. Per ragioni di sicurezza (usiamo la compressione hardware), il valore è leggermente più bassp del valore reale.

`tape_address`: Il dispositivo non riavvolgibile da usare con `cpio`.

`tape_address_rew`: Il dispositivo riavvolgibile da usare con `cpio`.

==== Configurazione dopo l'Installazione

I seguenti parametri di SAP(R) dovrebbero essere rivisti dopo l'installazione (esempi per IDES 46B, con 1 GB di memoria):

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Nome
| Valore

|ztta/roll_extension
|250000000

|abap/heap_area_dia
|300000000

|abap/heap_area_nondia
|400000000

|em/initial_size_MB
|256

|em/blocksize_kB
|1024

|ipc/shm_psize_40
|70000000
|===

Nota SAP(R) 0013026:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Nome
| Valore

|ztta/dynpro_area
|2500000
|===

Nota SAP(R) 0157246:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Nome
| Valore

|rdisp/ROLL_MAXFS
|16000

|rdisp/PG_MAXFS
|30000
|===

[NOTE]
====
Con i parametri descritti, su un sistema con 1 gigabyte di memoria, si troverà un consumo di memoria simile a:

[.programlisting]
....
Mem: 547M Active, 305M Inact, 109M Wired, 40M Cache, 112M Buf, 3492K Free
....

====

[[problemsduringinstallation]]
=== Problemi Durante l'Installazione

[[restartr3setup]]
==== Riavviare `R3SETUP` dopo la Risoluzione di un Problema

`R3SETUP` si ferma se incorre in un errore. Se hai guardato al file di log corrispondente e corretto l'errore, devi riavviare `R3SETUP`, solitamente selezionando REPEAT come opzione per l'ultimo passo per cui `R3SETUP` si è lamentato.

Per riavviare `R3SETUP`, avvialo con il corrispondente file [.filename]#R3S#:

[source,bash]
....
# ./R3SETUP -f CENTRDB.R3S
....

per 4.6B, oppure con

[source,bash]
....
# ./R3SETUP -f CENTRAL.R3S
....

per 4.6C, non importa che errore sia accaduto con [.filename]#CENTRAL.R3S# o [.filename]#DATABASE.R3S#.

[NOTE]
====
In alcuni punti, `R3SETUP` assume che sia il database che i processi di SAP(R) stiano girando (come fossero passi già completati). Se dovessero accadere errori e, per esempio, il database non fosse avviato, dovresti avviare sia il database che SAP(R) a mano, dopo aver corretto gli errori e prima di avviare ancora `R3SETUP`.

Non dimenticarti di avviare ancora il listener di Oracle(R) (come `ora__sid__` con `umask 0; lsnrctl start`) se è stato fermato (per esempio a causa di un reboot necessario del sistema).
====

[[indoraduringduringr3setup]]
==== OSUSERSIDADM_IND_ORA Durante `R3SETUP`

Se `R3SETUP` si lamentasse a questo punto, modifica il file modello `R3SETUP` usato prima ([.filename]#CENTRDB.R3S# (4.6B) o anche [.filename]#CENTRAL.R3S# o [.filename]#DATABASE.R3S# (4.6C)). Individua `[OSUSERSIDADM_IND_ORA]` o cerca solo la definizione `STATUS=ERROR` e modificala con i seguenti valori:

[.programlisting]
....
HOME=/home/sidadm (era vuota)
STATUS=OK (era uguale a ERROR)
....

Quindi puoi riavviare ancora `R3SETUP`.

[[indoraduringr3setup]]
==== OSUSERDBSID_IND_ORA Durante `R3SETUP`

`R3SETUP` potrebbe anche lamentarsi a questo punto. L'errore, qui, è simile a quello nella fase OSUSERSIDADM_IND_ORA. Modifica il file modello `R3SETUP` usato allora ([.filename]#CENTRDB.R3S# (4.6B) oppure [.filename]#CENTRAL.R3S# o [.filename]#DATABASE.R3S# (4.6C)). Individua `[OSUSERDBSID_IND_ORA]` o cerca solo la definizione `STATUS=ERROR` e modifica questi valori in quella sezione:

[.programlisting]
....
STATUS=OK
....

Riavvia, quindi, `R3SETUP`.

[[oraviewvrffilenotfound]]
==== `oraview.vrf FILE NOT FOUND` Durante l'Installazione di Oracle(R)

Non hai deselezionato _Oracle(R) On-Line Text Viewer_ prima di cominciare l'installazione. Questo è contrassegnato per l'installazine anche se l'opzione non è disponibile per Linux. Deseleziona questo prodotto nel menù di installazione di Oracle(R) e riavvia l'installazione.

[[textenvincalid]]
==== `TEXTENV_INVALID` Durante `R3SETUP`, RFC o l'Avvio di SAPgui

Se si incorre in questo errore, allora manca la corretta internazionalizzazione. La nota di SAP(R) 0171356 elenca gli RPM necessari da installare (p.e. [.filename]#saplocales-1.0-3#, [.filename]#saposcheck-1.0-1# per RedHat 6.1). Nel caso tu abbia ignorato tutti i relativi errori ed impostato lo `STATUS` corrispondente da `ERROR` a `OK` (in [.filename]#CENTRDB.R3S#) ogni volta che `R3SETUP` si è lamentato e riavviato `R3SETUP`, il sistema SAP(R) non sarà configurato correttamente e non sarai in grado di connetterti al sistema tramite una SAPgui, anche se il sistema può essere avviato. Provando a connetterci con la vecchia SAPgui abbiamo avuto questi messaggi:

[.programlisting]
....
Sat May 5 14:23:14 2001
*** ERROR => no valid userarea given [trgmsgo. 0401]
Sat May 5 14:23:22 2001
*** ERROR => ERROR NR 24 occured [trgmsgi. 0410]
*** ERROR => Error when generating text environment. [trgmsgi. 0435]
*** ERROR => function failed [trgmsgi. 0447]
*** ERROR => no socket operation allowed [trxio.c 3363]
Speicherzugriffsfehler
....

Questo comportamento è imputabile a SAP(R) R/3(R) che non è in grado di assegnare correttamente una internazionalizzazione e che non è ben configurato (definizioni mancanti in alcune tabelle del database). Per essere in grado di connettersi a SAP(R), aggiungi queste definizioni nel file [.filename]#DEFAULT.PFL# (vedi nota 0043288):

[.programlisting]
....
abap/set_etct_env_at_new_mode = 0
install/collate/active = 0
rscp/TCP0B = TCP0B
....

Riavvia il sistema SAP(R). Ora puoi connetterti al sistema, anche se le impostazioni della lingua specifiche per il paese potrebbero non funzionare come desiderato. Dopo aver corretto le impostazioni del paese (e aver fornito le internazionalizzazioni esatte), queste definizioni possono essere riomsse da [.filename]#DEFAULT.PFL# e il sistema SAP(R) può essere riavviato.

[[ora-00001]]
==== ORA-00001

Questo errore è accaduto solo con Oracle(R) 8.1.7 su FreeBSD. La ragione era che il database Oracle(R) non poteva inizializzarsi correttamente e andava in crash, lasciando i semafori e la memoria condivisa sul sistema. Il tentativo successivo di lanciare il database, ritornava ORA-00001.

Trovali con `ipcs -a` e rimuovili con `ipcrm`.

[[ora-00445pmon]]
==== ORA-00445 (Background Process PMON Did Not Start)

Questo errore è accaduto con Oracle(R) 8.1.7. Viene riportato se il database è avviato con il solito script `startsap` (per esempio `startsap_majestix_00`) come utente `prdadm`.

Un modo per aggirarlo è lanciare il database come utente `oraprd`, con `svrmgrl`:

[source,bash]
....
% svrmgrl
SVRMGR> connect internal;
SVRMGR> startup;
SVRMGR> exit
....

[[ora-12546]]
==== ORA-12546 (Start Listener with Correct Permissions)

Avvia il listener di Oracle(R) come utente `oraids` con i seguenti comandi:

[source,bash]
....
# umask 0; lsnrctl start
....

Altrimenti potresti ottenere ORA-12546 poiché i socket non hanno i permessi corretti. Vedi la nota di SAP(R) 0072984.

[[ora-27102]]
==== ORA-27102 (Out of Memory)

Questo errore è accaduto mentre tentavamo di usare i valori per `MAXDSIZ` e `DFLDSIZ` maggiori di 1 GB (1024x1024x1024). In più ci siamo ritrovati `Linux Error 12: Cannot allocate memory`.

[[dipgntabindind]]
==== [DIPGNTAB_IND_IND] Durante `R3SETUP`

In generale, vedi la nota di SAP(R) 0130581 (il punto `R3SETUP` termina `DIPGNTAB`). Per qualche ragione, durante l'installazione specifica per IDES, il processo di installazione non usava il giusto nome "IDS" del sistema SAP(R), ma piuttosto la stringa vuota `""`. Questo porta a qualche piccolo problema con l'accesso alle directory, dal momento che i path sono generati dinamicamente usando _SID_ (in questo caso IDS). Quindi, invece di accedere a:

[.programlisting]
....
/usr/sap/IDS/SYS/...
/usr/sap/IDS/DVMGS00
....

venivano usati questi path:

[.programlisting]
....
/usr/sap//SYS/...
/usr/sap/D00
....

Per continuare con l'installazione, abbiamo creato un collegamento e una direcotry addizionale:

[source,bash]
....
# pwd
/compat/linux/usr/sap
# ls -l
total 4
drwxr-xr-x 3  idsadm sapsys 512 May 5 11:20 D00
drwxr-x--x 5  idsadm sapsys 512 May 5 11:35 IDS
lrwxr-xr-x 1  root   sapsys 7 May 5 11:35 SYS -> IDS/SYS
drwxrwxr-x 2  idsadm sapsys 512 May 5 13:00 tmp
drwxrwxr-x 11 idsadm sapsys 512 May 4 14:20 trans
....

Abbiamo trovato note di SAP(R) che descrivono questo comportamento (0029227 e 0008401). Non siamo incorsi in alcuno di questi problemi installando SAP(R) 4.6C.

[[rfcrswboiniindind]]
==== [RFCRSWBOINI_IND_IND] Durante `R3SETUP`

Durante l'installazione di SAP(R) 4.6C, questo errore era la conseguenza di un altro errore avvenuto in precedenza. In questo caso, controlla nei file di log e correggi il vero problema.

Se dopo aver guardato nei log questo errore è effettivamente quello corretto (controlla le note di SAP(R)), puoi impostare lo `STATUS` dei punti sbagliati da `ERROR` a `OK` (file [.filename]#CENTRDB.R3S#) e riavviare `R3SETUP`. Dopo l'installazione, devi eseguire il rapporto `RSWBOINS` dalla transazione SE38. Per maggiori informazioni sulle fasi `RFCRSWBOINI` e `RFCRADDBDIF`, vedi la nota di SAP(R) 0162266.

[[rfcraddbdifindind]]
==== [RFCRADDBDIF_IND_IND] durante `R3SETUP`

Qui si applicano le stesse restrizioni: assicurati di controllare nei file di log che questo errore non sia causato da qualche problema precedente.

Se puoi confermare ciò che dice la nota 0162266 di SAP(R), imposta lo `STATUS` del punto errato da `ERROR` a `OK` (file [.filename]#CENTRDB.R3S#) e riavvia `R3SETUP`. Dopo l'installazione, devi eseguire il rapporto `RADDBDIF` dalla transazione SE38.

[[sigactionsig31]]
==== sigaction sig31: File size limit exceeded

Questo errore è avvenuto all'avvio dei processi SAP(R)_disp+work_. Se si sta avviando SAP(R) con lo script `startsap`, i sottoprocessi avviati si staccano e fanno il lavoro sporco di avviare tutti gli altri processi SAP(R). Come risultato, lo script stesso non noterà se qualcosa sia andato storto.

Per controllare se i processi SAP(R) non sono partiti correttamente, dai un'occhiata al loro stato con `ps ax | grep SID`, che ti darà una lista di tutti i processi Oracle(R) e SAP(R). Se ti sembra che qualche processo manchi o se non puoi connetterti al sistema SAP(R), guarda nei log corrispondenti che possono essere trovati in [.filename]#/usr/sap/SID/DVEBMGSnr/work/#. I file in cui guardare sono [.filename]#dev_ms# e [.filename]#dev_disp#.

Il segnale 31 avviene qui se la quantità di memoria condivisa utilizzata da Oracle(R) e SAP(R) supera quella definita nel file di configurazione del kernel e può essere risolto usando un valore maggiore:

[.programlisting]
....
# larger value for 46C production systems:
options SHMMAXPGS=393216
# smaller value sufficient for 46B:
#options SHMMAXPGS=262144
....

[[saposcolfails]]
==== Fallimento dell'avvio di `saposcol`

Ci sono alcuni problemi con il programma `saposcol` (versione 4.6D). Il sistema SAP(R) usa `saposcol` per raccogliere dati a proposito delle prestazioni del sistema. Questo programma non è necessario per usare il sistema SAP(R), quindi può essere considerato un problema minore. La versione più vecchia (4.6B) funziona, ma non raccoglie tutti i dati (molte chiamate ritorneranno 0, per esempio l'utilizzo della CPU).

[[linuxemu-advanced]]
== Argomenti Avanzati

Se sei curioso di come funziona la compatibilità con i binari di Linux, questa è la sezione da leggere. Molto di ciò che segue è basato pesantemente su una email scritta a {freebsd-chat} da Terry Lambert mailto:tlambert@primenet.com[tlambert@primenet.com] (ID del messaggio: `<199906020108.SAA07001@usr09.primenet.com>`).

=== Come Funziona?

FreeBSD ha una astrazione chiamata un "loader della classe di esecuzione". Questo ` un cuneo nella chiamata di sistema man:execve[2].

Cosa succede è che FreeBSD ha una lista di loader, piuttosto che un singolo loader con un ritorno nel loader `#!`, per lanciare qualunque inteprete o script della shell.

Storicamente, l'unico loader nella piattaforma UNIX(R) esaminava il numero magico (generalmente i primi 4 o 8 byte del file) per vedere se il binario fosse conosciuto dal sistema e, nel caso, invocava il loader del binario.

Se non era un tipo di binario per il sistea, la chiamata man:execve[2] ritornava un errore, e la shell tentava di avviare eseguendolo come comando della shell.

L'assunzione era un default, "qualunque fosse la shell".

Più tardi, è stato fatto un hack per man:sh[1] per esaminare i primi due caratteri. Se erano `:\n`, allora invocava la shell man:csh[1] (crediamo sia stata SCO a fare per prima questo hack).

Ciò che ora fa FreeBSD è scorrere una lista di loader, con un loader `#!` generico che riconosce gli interpreti dai caratteri che seguono lo spazio successivo vicino alla fine, seguito da un ritorno a [.filename]##/bin/sh##.

Per il supporto alle ABI di Linux, FreeBSD vede il numero magico come un binario ELF (a questo punto non fa distinzione tra FreeBSD, Solaris(TM), Linux, o qualunque altro SO che ha un tipo di immagine ELF).

Il loader di ELF cerca un _marchio_ specializzato, che ` una sezione di commento nell'immagine ELF e che non è presente sui binari ELF SVR4/Solaris(TM).

I binari di Linux, per funzionare, devono essere _marchiati_ come tipo `Linux` da man:brandelf[1]:

[source,bash]
....
# brandelf -t Linux file
....

Quando viene fatto questo, il loader ELF vedrà il marchio di `Linux` sul file.

Quando il loader ELF vede il marchio di `Linux`, il loader sostituisce un puntatore nella struttura `proc`. Tutte le chiamate di sistema sono indicizzate attraverso questo puntatore (in un sistema UNIX(R) tradizionale questo sarebbe l'array di strutture `sysent[]`, contentente le chiamate di sistema). In aggiunta;, il processo è etichettato per un trattamento speciale del vettore trappola per il codice del segnale di lancio, e molti altri (minori) aggiustamenti che sono gestiti dal modulo Linux del kernel.

Il vettore delle chiamate di sistema di Linux contiene, tra le altre cose, una lista di valori `sysent[]` i cui indirizzi risiedono nel modulo del kernel.

Quando una chiamata di sistema è fatta dal binario di Linux, il codice trappola derefereizia il puntatore alla funzione della chiamata di sistema dalla struttura `proc`, e prende i punti di ingresso delle chiamate di sistema di Linux, non di FreeBSD.

In più, la modalità Linux _ridefinisce la root_ dinamicamente; questo, in effetti, è quello che fa l'opzione `union` al montaggio del file system (_non_ il tipo di file system `unionfs`!). Un tentativo viene prima fatto per cercare il file nella directory [.filename]#/compat/linux/original-path#, _quindi_, solo se fallisce, la ricerca ` fatta nella directory [.filename]#/original-path#. Questo assicura che possano funzionare i binari che per richiedono altri binari (p.e., la toolchain di Linux può funzionare tutta sotto il supporto ABI di Linux). Questo significa anche che i binari di Linux possono caricare ed eseguire binari di FreeBSD, se non sono presenti i corrispondenti binari di Linux, e che puoi mettere un comando man:uname[1] nell'albero della directory [.filename]#/compat/linux# per essere sicuro che i binari di Linux non possano capire che non stanno girando sotto Linux.

In effeti c'è un kernel Linux nel kernel FreeBSD le varie funzioni sottostanti che implementano tutti i servizi forniti dal kernel sono identiche sia nelle definizioni delle tabelle delle chiamate di sistema di FreeBSD che di Linux: le operazioni sul file system, le operazioni nella memoria virtuale, la consegna dei segnali, le IPC System V, ecc... L'unica differenza è che i binari di FreeBSD prendono le funzioni _colla_ di FreeBSD, e i binari di Linux prendono le funzioni _colla_ di Linux (molti dei vecchi SO hanno solo le loro funzioni _colla_: gli indirizzi delle funzioni in un array di strutture `sysent[]` statico globale, invece che indirizzi di funzioni dereferenziate da un puntatore inizializzato dinamicamente nella struttura `proc` del processo che fa la chiamata).

Qual è la ABI nativa per FreeBSD? Non importa. Essenzialmente l'unica differenza è che (attualmente: questo potrebbe facilmente essere cambiato in distribuzioni future, e probabilmente sarà fatto) le funzioni _colla_ di FreeBSD sono collegate staticamente nel kernel, e le funzioni _colla_ di Linux possono essere collegate staticamente o vi si può accedere attraverso un modulo del kernel.

Si, ma è davvero emulazione? No. è implementazione delle ABI, non emulazione. Non è coinvolto nessun emulatore (o simulatore, per evitare la prossima domanda).

Allora perché talvolta viene chiamata "emulazione Linux"? Per rendere difficile vendere FreeBSD! Seriamente, è perché l'implementazione storica è stata fatta in un momento in cui non c'era altro termine per descrivere ciò che stava succedendo; dire che FreeBSD lanciava i binari di Linux non era vero, se non compilavi il codice o caricavi un modulo, e c'era bisogno di un termine per descrivere cosa veniva caricato- da qui "l'emulatore Linux".
