---
title: Capítulo 10. Compatibilidad binaria con Linux
part: Parte II. Tareas comunes
prev: books/handbook/printing
next: books/handbook/partiii
showBookMenu: true
weight: 13
params:
  path: "/books/handbook/linuxemu/"
---

[[linuxemu]]
= Compatibilidad binaria con Linux
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 10
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/linuxemu/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[linuxemu-synopsis]]
== Sinopsis

FreeBSD proporciona compatibilidad de binarios con muchos otros sistemas operativos tipo UNIX(R), incluyendo Linux. Puede estarse preguntando ?por qué necesita FreeBSD ejecutar binarios de Linux? La respuesta a esa pregunta es muy simple. Muchos desarrolladores y compañías desarrollan sólo para Linux, ya que últimamente es el blanco de todas las miradas dentro del mundo de las tecnologís de la información. Esto hace que la comunidad FreeBSD tenga que exigir a esas compañías y desarrolladores que produzcan versiones nativas de sus aplicaciones para FreeBSD. El problema es que la mayoría de esas compañías no suelen saber realmente cuánta gente utilizaría su producto si existieran esas versiones para FreeBSD, y la mayoría continúa desarrollando únicamente para Linux. Vista la situación ?que puede hacer un usuario de FreeBSD? Aquí es donde entra en juego la compatibilidad binaria con Linux.

Para expresarlo en pocas palabras, dicha compabitilidad permite a los usuarios de FreeBSD cerca del 90% de las aplicaciones de Linux sin tener que modificarlas en absoluto. Entre estas está StarOffice(TM), la versión Linux de man:getenv[3], Adobe(R) Acrobat(R), RealPlayer, VMware, Oracle(R), WordPerfect, Doom, Quake y muchas más. En determinados casos los binarios Linux rinden mejor en FreeBSD que en Linux.

Existen, por desgracia, ciertas características específicas de Linux que no funcionan en FreeBSD. Los binarios Linux no funcionarán en FreeBSD si recurren a llamadas específicas de i386(TM) como la activación del modo virtual 8086.

Tras leer este capítulo sabrá usted:

* cómo activar la compatibilidad binaria con Linux en su sistema.
* cómo instalar bibliotecas compartidas de Linux que pueda necesitar. 
* cómo instalar aplicaciones de Linux en su sistema FreeBSD.
* cuáles son los detalles de la implementación de compatibilidad binaria con Linux en FreeBSD.

Antes de leer este capítulo es necesario que sepa:

* cómo instalar software de terceros (crossref:ports[ports,Instalación de aplicaciones: «packages» y ports]).

[[linuxemu-lbc-install]]
== Instalación

La compatibilidad binaria con Linux no viene activada por omisión. La forma más sencilla de habilitarla es cargar el KLD ("objeto cargable en el kernel") `linux`. Como usuario `root` proceda del siguiente modo:

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

Si quiere que la compatibilidad con Linux esté siempre activada tendrá que añadir la siguiente línea en [.filename]#/etc/rc.conf#:

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

Utilice man:kldstat[8] para verificar que el KLD esté cargado:

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

Si por alguna razón no desea o no puede cargar el KLD, entonces puede enlazar estáticamente la compatibilidad de binarios Linux en el kernel agregando `options COMPAT_LINUX` a su fichero de configuración del kernel. Luego instale su nuevo kernel como se describe en crossref:kernelconfig[kernelconfig,Configuración del kernel de FreeBSD].

=== Instalación de bibliotecas de ejecución Linux

Puede hacerse de dos maneras, ya sea usando el port <<linuxemu-libs-port,linux_base>>, o instalándolas <<linuxemu-libs-manually,de forma manual>>.

[[linuxemu-libs-port]]
==== Instalación usando el port linux_base

Este es con mucho el método mas sencillo para instalar bibliotecas de ejecución. Es como instalar cualquier otro port de la link:file://localhost/usr/ports/[Colección de Ports]. Es tan sencillo como esto:

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

Hecho esto debería disponer de compatibilidad binaria con Linux. Algunos programas pueden "quejarse" por la presencia de versiones antiguas de algunas bibliotecas del sistema. Generalmente esto no suele ser un problema muy grave.

[NOTE]
====
Pueden coexistir múltiples versiones del port package:emulators/linux_base[] disponibles correspondientes a distintas versiones de diversas distribuciones de Linux. Tendrá que instalar el port que más se ajuste a las necesidades de las aplicaciones de Linux que quiera instalar.
====

[[linuxemu-libs-manually]]
==== Instalación manual de bibliotecas

Si, por el motivo que fuese, no tiene instalada la colección de ports puede instalar las bibliotecas que necesite de forma manual. Necesitará las bibliotecas compartidas Linux de las que depende el programa y el enlazador en tiempo de ejecución ("runtime linker"). Necesitará también crear un directorio [.filename]#/compat/linux# donde alojar las bibliotecas Linux en su sistema FreeBSD Cualquier biblioteca compartida a la que haya recurrido un programa de Linux ejecutado en FreeBSD buscará en primer lugar en dicho directorio. Por lo tanto, si se carga un programa Linux, por ejemplo [.filename]#/lib/libc.so#, FreeBSD intentará en primer lugar abrir [.filename]#/compat/linux/lib/libc.so# y, si no existe, lo intentará con [.filename]#/lib/libc.so#. Las bibliotecas compartidas deben instalarse en [.filename]#/compat/linux/lib# en lugar de las rutas que el `ld.so` de Linux proporcione.

En general, necesitará buscar las bibliotecas compartidas de las que los binarios Linux dependen sólamente las primeras veces que instale un programa Linux en su FreeBSD. Más adelante tendrá un conjunto suficiente de bibliotecas compartidas Linux en su sistema para poder ejecutar binarios Linux sin que tenga que hacer nada más.

==== Cómo instalar bibliotecas compartidas adicionales

?Que pasaría si instalara el port [.filename]#linux_base# y su aplicación todavía tuviera problemas debido a bibliotecas compartidas que no encuentra en el sistema? ?Cómo saber qué bibliotecas compartidas necesitan los binarios Linux? Básicamente hay dos posibilidades (para poder ejecutar las siguientes instrucciones necesitará estar como `root`

Si tiene acceso a un sistema Linux busque en él qué bibliotecas necesita la aplicación, y cópielas a su sistema FreeBSD. Veamos unos ejemplos: 

Asumiremos que utilizó FTP para conseguir los binarios Linux de Doom y los puso en un sistema Linux. Para ver qué bibliotecas compartidas necesitará ejecute `ldd linuxdoom`:

[source,shell]
....
% 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
....

Necesitaría todos los ficheros de la segunda columna, y tendrá que ponerlos en [.filename]#/compat/linux# con los nombres de la primera columna como enlaces simbólicos apuntando hacia ellos. De este modo tendría en su sistema FreeBSD los siguientes ficheros: 

[source,shell]
....
/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]
====
Recuerde que si ya tiene una biblioteca compartida Linux con un número de versión mayor que coincida con la primera columna de la salida de `ldd` no necesitará copiar el fichero que aparece en la última columna; el que tiene debería funcionar, aunque se aconseja copiar la biblioteca compartida de todas maneras si es una nueva versión. Puede eliminar la vieja siempre que haga que el enlace simbólico apunte a la nueva. Si tiene estas bibliotecas en su sistema:

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

y un binario requiere una versión más reciente (como indica la siguiente salida de `ldd`):

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

si solo ve una o dos versiones desfasadas en los últimos dígitos no se preocupe de copiar [.filename]#/lib/libc.so.4.6.29#, el programa debería funcionar bien con una versión ligeramente antigua. De todas formas, si así lo prefiere, puede actualizar [.filename]#libc.so#; el resultado sería este:

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

====

[NOTE]
====
El mecanismo de enlazado simbólico _sólamente_ es necesario con binarios Linux. El enlazador en tiempo de ejecución de FreeBSD se encarga de buscar él mismo las versiones correctas, así que no tendrá que preocuparse usted de hacerlo.
====

=== Instalar binarios ELF Linux

Los binarios ELF algunas veces requieren un paso extra de "marcado". Si trata de ejecutar un binario ELF no marcado recibirá un mensaje de error como el siguiente:

[source,shell]
....
% ./mi-binario-elf
ELF binary type not known
Abort
....

Para ayudar al kernel de FreeBSD a distinguir entre un binario ELF de FreeBSD y uno de Linux utilice man:brandelf[1].

[source,shell]
....
% brandelf -t Linux mi-binario-elf-de-linux
....

Las herramientas GNU se encargan de ubicar automáticamente la marca apropiada en los binarios ELF, por lo tanto este paso será innecesario en un futuro próximo.

=== Configuración de la resolución de nombres de equipos

Si el DNS no funciona u obtiene este mensaje:

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

Necesitará un fichero [.filename]#/compat/linux/etc/host.conf# con el siguiente contenido:

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

Significa que [.filename]#/etc/hosts# seráanalizado en primer lugar y después se usará DNS. Si [.filename]#/compat/linux/etc/host.conf# no está instalado, las aplicaciones Linux usan el [.filename]#/etc/host.conf# de FreeBSD y chocan con la sintaxis (incompatible) de FreeBSD. Borre `bind` de su [.filename]#/etc/resolv.conf# si no tiene configurado un servidor de nombres.

[[linuxemu-mathematica]]
== Instalación de Mathematica(R)

Este documento describe el proceso de instalación de la versión para Linux de Mathematica(R) 5.X en un sistema FreeBSD.

Puede pedir a Wolfram, el fabricante, La versión para para Linux de Mathematica(R) o la versión de Mathematica(R) para estudiantes en su sitio web, http://www.wolfram.com/[http://www.wolfram.com/].

=== El instalador de Mathematica(R)

Lo primero que tiene que hacer es decirle a FreeBSD que los binarios de Mathematica(R) para Linux utilizan la ABI Linux. La forma más sencilla de hacerlo es marcar por omisión todos los binarios sin marcas como Linux ELF.

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

Hecho esto FreeBSD asumirá que cualquier binario sin marca que encuentre utiliza la ABI Linux; de este modo podrá ejecutar el binario directamente desde el CDROM.

Copie el fichero [.filename]#MathInstaller# en su disco duro

[source,shell]
....
# mount /cdrom
# cp /cdrom/Unix/Installers/Linux/MathInstaller /directoriolocal/
....

Edite este fichero y sustituya la primera línea, `/bin/sh`, por `/compat/linux/bin/sh` para asegurarnos de que lo que ejecute el instalador sea la verión de man:sh[1] de Linux. El siguiente paso es sustituir todos los `Linux)` por `FreeBSD)` con un editor de texto on con el script que encontrará en la siguiente sección. Esto se hace para ayudar al instalador de Mathematica(R), el cual en un cierto momento invoca a `uname -s` para determinar el sistema operativo, a tratar a FreeBSD como si fuera un sistema operativo muy similar a Linux. Hecho todo esto, cuando ejecute `MathInstaller` podrá instalar Mathematica(R).

=== Modificación de los ejecutables de Mathematica(R)

Debe modificar los scripts de shell que Mathematica(R) creó durante la instalación antes de usarlos. Si eligió ubicar en [.filename]#/usr/local/bin# los ejecutables de Mathematica(R) verá que en ese directorio hay enlaces simbólicos a ficheros como [.filename]#math#, [.filename]#mathematica#, [.filename]#Mathematica# y [.filename]#MathKernel#. En cada uno de esos ficheros debe sustituir `Linux)` por `FreeBSD)` con un editor de texto o bien con el siguiente script de 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
....

=== Cómo obtener una contraseña de Mathematica(R)

Cuando arranque Mathematica(R) por primera vez se le pedirá una contraseña. Si Wolfram no le ha enviado ya necesita un "machine ID", para lo cual debe ir al directorio de instalación y ejecutar `mathinfo`. Este "machine IDE" se obtiene de la dirección MAC de la primera tarjeta Ethernet de la máquina y tiene como objetivo que no pueda ejecutar Mathematica(R) en más de una máquina.

Durante el proceso de registro en Wolfram (ya sea por correo electrónico, teléfono o fax) les dará el "machine ID" y Wolfram le enviará una contraseña relacionada con él, consistente en grupos de números.

=== Ejecución del «frontend» de Mathematica(R) través de una red

Mathematica(R) usa unos cuantos tipos especiales para mostrar caracteres que no están en ningún conjunto estándar de tipos: integrales, sumas, letras griegas, etc. El protocolo X exige que los tipos estén instalados _en local_, es decir, tiene que copiar los tipos del CDROM o la máquina desde la que ha instalado Mathematica(R) a su máquina. Los tipos están en el directorio del CDDROM [.filename]#/cdrom/Unix/Files/SystemFiles/Fonts# y se supone que deben estar en su disco duro en el directorio [.filename]#/usr/local/mathematica/SystemFiles/Fonts#. Los tipos están realmente en los subdirectorios [.filename]#Type1# y [.filename]#X#. Hay varias formas de utilizarlos.

La primera es copiarlos en uno de los directorios de tipos que hay en [.filename]#/usr/X11R6/lib/X11/fonts#, antes de lo cual tendrá que añadir a [.filename]#fonts.dir# los nombres de los tipos; tendrá también que cambiar el número de tipos en la primera línea. Por otra parte, todo esto puede hacerse ejecutando man:mkfontdir[1] en el directorio donde haya copiado los tipos.

La segunda forma de utilizar estos tipos es copiarlos bajo [.filename]#/usr/X11R6/lib/X11/fonts#:

[source,shell]
....
# 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
....

Añada los nuevos directorios de tipos a su ruta de tipos:

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

Si usa el servidor Xorg puede cargar los tipos automáticamente añadiéndolos al fichero [.filename]#xorg.conf#.

[NOTE]
====
En servidores XFree86(TM) el fichero de configuración es [.filename]#XF86Config#.
====

Si _no_ tiene ya en su sistema un directorio [.filename]#/usr/X11R6/lib/X11/fonts/Type1# puede cambiarle el nombre al directorio [.filename]#MathType1# del ejemplo anterior por [.filename]#Type1#.

[[linuxemu-maple]]
== Instalación de Maple(TM)

Maple(TM) es un programa comercial de matemáticas similar a Mathematica(R). Puede adquirir este software en http://www.maplesoft.com/[http://www.maplesoft.com/]; tras registrarlo recibirá un fichero de licencia. Si quiere instalar este software en FreeBSD siga los siguienes pasos:

[.procedure]
. Ejecute el "script" de shell [.filename]#INSTALL# desde el lugar de instalación del producto. Elija la opción "RedHat" cuando le pregunte el programa de instalación. [.filename]#/usr/local/maple# es un buen sitio para instalar el software.
. Si no lo ha hecho ya, solicite una licencia para Maple(TM) a Maple Waterloo Software (http://register.maplesoft.com/[http://register.maplesoft.com/]) y cópiela a [.filename]#/usr/local/maple/license/license.dat#.
. Instale el gestor de licencias FLEXlm ejecutando el "script" de shell de instalación [.filename]#INSTALL_LIC# que viene con Maple(TM). Introduzca el nombre de su máquina (el servidor de licencias lo necesita).
. Parchée el fichero [.filename]#/usr/local/maple/bin/maple.system.type# con lo siguiente:
+
[.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 -----
....

+ 
Tenga muy presente que después de `"FreeBSD"|\` no debe haber ningún espacio en blanco.
+ 
Este parche le dice a Maple(TM) que interprete "FreeBSD" como un tipo de sistema Linux. El "script" de shell [.filename]#bin/maple# llama al "script" de shell [.filename]#bin/maple.system.type#, que a su vez recurre a `uname -a` para dictaminar el nombre del sistema operativo. Dependiendo de cuál sea sabrá qué binarios utilizar.
. Inicio del servidor de licencias.
+ 
El siguiente "script", sito en [.filename]#/usr/local/etc/rc.d/lmgrd.sh#, le permitirá arrancar `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)
	lmgrd -c ${LICENSE_FILE} -x lmdown 2<< ${LOG} 1<&2
	;;
*)
	echo "Usage: `basename $0` {start|stop}" 1<&2
	exit 64
	;;
esac

exit 0
   ----- snip ------------
....

. Prueba de arranque de Maple(TM):
+

[source,shell]
....
% cd /usr/local/maple/bin
% ./xmaple
....

+ 
Todo debería funcionar perfectamente. Si es así aún le queda un último paso: escribir a Maplesoft y decirles que sería genial una versión nativa para FreeBSD.

=== Problemas frecuentes

* El gestor de licencias FLEXlm puede ser un tanto difícil de usar. En caso de necesitarla tiene más información en http://www.globetrotter.com/[http://www.globetrotter.com/].
* `lmgrd` tiene una reconocida fama de ser muy meticuloso en todo lo relacionado con el fichero de licencia; suele generar volcados de memoria si se encuentra con algún problema. Un fichero de licencia correcto tiene que parecerse mucho a este:
+
[.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]
====
El número de serie y la clave han sido sobreescritos con X. `chillig` es el nombre de un equipo.
====

+ 
Puede editar el fichero de licencia siempre que no toque la línea "FEATURE" (que está protegida por la clave de la licencia).

[[linuxemu-matlab]]
== Instalación de MATLAB(R)

Este documento describe el proceso de instalación de la versión para Linux de MATLAB(R) version 6.5 en FreeBSD. En general funciona bastante bien, excepción hecha de Java Virtual Machine(TM) (consulte la <<matlab-jre>>).

La versión Linux de MATLAB(R) puede pedirse directamente en el sitio de The MathWorks, http://www.mathworks.com[http://www.mathworks.com]. Tiene que recibir también el fichero de licencia o instrucciones de cómo crearlo. Al hacer su pedido aproveche para decirles que sería muy buena idea que ofrecieran una versión nativa de su software para FreeBSD.

=== Instalación de MATLAB(R)

Para instalar MATLAB(R) haga lo siguiente:

[.procedure]
. Inserte el CD de instalación y móntelo. Conviértase en `root` e inicie la instalación:
+

[source,shell]
....
# /compat/linux/bin/sh /cdrom/install
....

+
[TIP]
====

El instalador es gráfico. Si obtiene errores acerca de no ser capaz de abrir un display teclée `setenv HOME ~USUARIO`, donde _USUARIO_ es el nombre del usuario con el que hizo man:su[1].
====

. Teclée `/compat/linux/usr/local/matlab` donde el instalador le pida el directorio raíz de MATLAB(R).
+
[TIP]
====

Esto último le facilitará la entrada de datos durante el resto de la instalación. Introduzca lo siguiente en el "prompt" de su shell: `set MATLAB=/compat/linux/usr/local/matlab`
====

. Edite el fichero de licencia tal y como consta en las instrucciones de la licencia de MATLAB(R).
+
[TIP]
====

Puede tenerlo ya editado y copiado a [.filename]#$MATLAB/license.dat# desde antes de que el instalador se lo pida.
====

. Complete el proceso de instalación.

La instalación MATLAB(R) ha finalizado. Los siguientes pasos aplicarán el "pegamento" necesario para conectarlo a su sistema FreeBSD.

=== Inicio del administrador de licencias

[.procedure]
. Crée los enlaces simbólicos que necesitan los "scripts" del administrador de licencias:
+

[source,shell]
....
# ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW
# ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW
....

. Crée un fichero de inicio en [.filename]#/usr/local/etc/rc.d/flexlm.sh#. El siguiente ejemplo es una versión modificada de [.filename]#$MATLAB/etc/rc.lm.glnx86# que viene con la distribución de MATLAB(R). Los cambios que se han hecho en él obedecen a la ubicación de los ficheros y el arranque del administrador de licencias bajo emulación de 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 nombre-de-usuario && 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]
====
El fichero debe ser ejecutable:

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

Tendrá que reemplazar la entrada _nombre-de-usuario_ de nuestro ejemplo por un nombre de usuario válido en su sistema (que no sea `root`).
====

. Arranque el administrador de licencias:
+

[source,shell]
....
# /usr/local/etc/rc.d/flexlm.sh start
....

[[matlab-jre]]
=== Enlace del entorno de ejecución Java(TM)

Cambie el enlace del entorno de ejecución Java(TM) (JRE) a uno que funcione en FreeBSD:

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

=== Creación de un "script" de arranque para MATLAB(R)

[.procedure]
. Coloque el siguiente "script" de arranque en [.filename]#/usr/local/bin/matlab#: 
+
[.programlisting]
....
#!/bin/sh
/compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"
....

. Escriba `chmod +x /usr/local/bin/matlab`.

[TIP]
====

Dependiendo de su versión de package:emulators/linux_base[] tal vez obtenga errores al ejecutar este "script". Para evitarlo edite [.filename]#/compat/linux/usr/local/matlab/bin/matlab# y cambie la línea en la que aparece:

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

(en la versión 13.0.1 es en la línea 410) por esta otra línea:

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

====

=== Creación de un "script" para detener MATLAB(R)

Este "script" solucionará las dificultades que pueda tener para detener MATLAB(R) correctamente.

[.procedure]
. Crée un fichero llamado [.filename]#$MATLAB/toolbox/local/finish.m# y ponga en él una sola línea con este texto:
+
[.programlisting]
....
! $MATLAB/bin/finish.sh
....

+
[NOTE]
====
`$MATLAB` debe escribirse tal cual.
====

+
[TIP]
====

En el mismo directorio encontrará los ficheros [.filename]#finishsav.m# y [.filename]#finishdlg.m#, que le permiten guardar su trabajo antes de salir de la aplicación. Si quiere usar alguno de ellos, inserte la línea de arriba inmediatamente después de `save`.
====

. Crée un fichero [.filename]#$MATLAB/bin/finish.sh# con el siguiente contenido:
+
[.programlisting]
....
#!/usr/compat/linux/bin/sh
(sleep 5; killall -1 matlab_helper) &
exit 0
....

. El fichero tiene que ser ejecutable:
+

[source,shell]
....
# chmod +x $MATLAB/bin/finish.sh
....

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

Desde este momento ya puede usted teclear `matlab` y empezar a usarlo.

[[linuxemu-oracle]]
== Instalación de Oracle(R)

=== Prefacio

Este texto describe el proceso de instalación de Oracle(R) 8.0.5 y Oracle(R) 8.0.5.1 Enterprise Edition para Linux en una máquina FreeBSD.

=== Instalación del entorno Linux

Debe tener instalados los ports package:emulators/linux_base[] y package:devel/linux_devtools[]. Si tiene dificultades con estos ports es posible que tenga que usar los paquetes o quizás versiones más antiguas de dichas aplicaciones que encontrará en la Colección de Ports.

Si quiere usar el agente inteligente también tendrá que instalar el paquete Tcl de Red Hat, [.filename]#tcl-8.0.3-20.i386.rpm#. La orden genérica para instalar paquetes con el port oficial de RPM (package:archivers/rpm[]) es:

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

La instalación de dicho _paquete_ no debe generar ningún error.

=== Creación del entorno Oracle(R)

Antes de instalar Oracle(R) tendrá que configurar un entorno apropiado. Este documento solamente explica lo que hay que hacer _especialmente_ para utilizar la versión de Linux para Oracle(R) FreeBSD, no lo que figura en la guía de instalación de Oracle(R).

[[linuxemu-kernel-tuning]]
==== Personalización del kernel

Tal y como consta en la guía de instalación de Oracle(R), debe configurar la cantidad máxima de memoria compartida. No utilice `SHMMAX` en FreeBSD. `SHMMAX` se calcula a partir de `SHMMAXPGS` y `PGSIZE`, así que defina `SHMMAXPGS`. Todas las demás opciones pueden usarse tal y como se describen en la guía. Por ejemplo:

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

Configure estas opciones para que se ajusten al uso que pretenda darle a Oracle(R).

Asegúrese también de que las siguientes opciones están en el fichero de configuración de su kernel:

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

[[linuxemu-oracle-account]]
==== Cuenta Oracle(R)

Crée una cuenta `oracle` según el procedimiento habitual de creación de usuarios. La cuenta `oracle`, empero, tiene algo especial puesto que debe teer una shell _de_ Linux. Añada `/compat/linux/bin/bash` a [.filename]#/etc/shells# y asigne a la cuenta `oracle`[.filename]#/compat/linux/bin/bash# como shell por omisión.

[[linuxemu-environment]]
==== Entorno

Además de las variables normales para Oracle(R), como `ORACLE_HOME` y `ORACLE_SID`, debe configurar las siguientes variables de entorno:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Variable
| Valor

|`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`
|===

Le aconsejamos configurar todas las variables de entorno en [.filename]#.profile#. Veamos un ejemplo 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
....

=== Instalación de Oracle(R)

Debido a una pequeña inconsistencia en el emulador Linux tendrá que crear un directorio llamado [.filename]#.oracle# en [.filename]#/var/tmp# antes de iniciar el instalador. Haga que sea propiedad del usuario `oracle`. Hecho esto deberí poder instalar Oracle(R) sin ningún problema. Si no es así _revise su distribución_ Oracle(R) y su configuración. Una vez finalizada la instalación de Oracle(R) aplique los parches que se detallan en las dos siguientes subsecciones.

Un problema que se da con una cierta frecuencia es que el adaptador del protocolo TCP no está correctamente instalado. Como consecuencia no puede iniciarse ninguna escucha TCP, a las que también se les llama directamente «listeners». Esto le ayudará a resolver el problema.:

[source,shell]
....
# 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
....

_No se olvide de ejecutar [.filename]#root.sh# de nuevo_.

[[linuxemu-patch-root]]
==== Cómo parchear root.sh

Durante la instalación de Oracle(R) algunas acciones que requieren ser ejecutadas como `root` deben almacenarse en un "script" de shell llamado [.filename]#root.sh#. Dicho "script" está en el directorio [.filename]#orainst#. Aplique el siguiente parche a [.filename]#root.sh# para que utilice la ruta correcta de `chown` o ejecute el "script" bajo una shell nativa de 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
....

Si no está instalando Oracle(R) desde un CD puede parchear las fuentes de [.filename]#root.sh#. Se llama [.filename]#rthd.sh# y está en el directorio [.filename]#orainst# del árbol de fuentes. 

[[linuxemu-patch-tcl]]
==== Cómo parchear genclntsh

El "script" `genclntsh` se usa para crear una biblioteca de cliente compartida y para construir los demos. Al aplicar el siguiente parche comentará la definición de `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
....

=== Ejecución de Oracle(R)

Una vez seguidas estas instrucciones podrá ejecutar Oracle(R) como si la hubiera instalado en Linux.

[[sapr3]]
== Instalación de SAP(R) R/3(R)

Las instalaciones de sistemas SAP(R) en FreeBSD no reciben soporte técnico de SAP(R). SAP(R) solamente lo ofrece si se usan plataformas certificadas.

[[preface]]
=== Introducción

Este texto expone una forma de instalar un SAP(R) R/3(R) System con una Oracle(R) Database para Linux en una máquina FreeBSD, incluyendo la instalación de FreeBSD y Oracle(R). Se muestran dos configuraciones diferentes:

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

Aunque este documento trate de describir todos los pasos importantes con detalle no ha sido escrito como sustituto de las guías de instalación de Oracle(R) y SAP(R) R/3(R).

Por favor, consulte la documentación de SAP(R) R/3(R) que se incluye en la edición para Linux de SAP(R) y las preguntas específicas sobre Oracle(R), así como los recursos que estén a su disposición sobre Oracle(R) y SAP(R) OSS.

[[software]]
=== Software

Durante la instalación de SAP(R) se han utilizado los siguientes CD-ROM:

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

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| Nombre
| Número
| Descripción

|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 de 6

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

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

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

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

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

También utilizamos el CD de Oracle(R) 8 Server (versión pre-producción 8.0.5 para Linux, versión de kernel 2.0.33), que no es realmente necesario y FreeBSD 4.3-STABLE (a unos cuantos días de la liberación de 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"]
|===
| Nombre
| Número
| Descripción

|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 de 4

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

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

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

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

Según los idiomas que quiera usar es posible que necesite otros CD de idiomas. Sólo hemos utilizado DE y EN, así que nos bastó con el primer CD. Para su información, los números de los cuatro CD EXPORT son idénticos. Los tres CD de idiomas también tienen el mismo número, aunque esto es distinto en los CD de la versión 4.6B IDES. Al escribir este texto (20.03.2002) ejecutamos la instalación en FreeBSD 4.5-STABLE (20.03.2002).

[[sap-notes]]
=== Notas SAP(R)

Las siguientes notas han resultado ser muy útiles durante la instalación, así que le recomendamos encarecidamente que las lea antes de instalar SAP(R) R/3(R):

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

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Número
| Título

|0171356
|SAP Software on Linux: Essential Comments

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

|0373203
|Update / Migration Oracle 8.0.5 --> 8.0.6/8.1.6 LINUX

|0072984
|Release of Digital UNIX 4.0B for Oracle

|0130581
|R3SETUP step DIPGNTAB terminates

|0144978
|Your system has not been installed correctly

|0162266
|Questions and tips for R3SETUP on 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"]
|===
| Número
| Título

|0015023
|Initializing table TCPDB (RSXP0004) (EBCDIC)

|0045619
|R/3 with several languages or typefaces

|0171356
|SAP Software on Linux: Essential Comments

|0195603
|RedHat 6.1 Enterprise version: Known problems

|0212876
|The new archiving tool SAPCAR

|0300900
|Linux: Released DELL Hardware

|0377187
|RedHat 6.2: important remarks

|0387074
|INST: R/3 4.6C SR2 Installation on UNIX

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

|0387078
|SAP Software on UNIX: OS Dependencies 4.6C SR2
|===

[[hardware-requirements]]
=== Requisitos de hardware

El siguiente equipo es suficiente para la instalación de un sistema SAP(R) R/3(R). Si pretende darle uso productivo necesitará hacer un estudio detallado de sus necesidades:

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

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

|Memoria
|1GB ECC
|2GB ECC

|Espacio en disco
|50-60GB (IDES)
|50-60GB (IDES)
|===

Para su uso en producción le recomendamos procesadores Xeon(TM) con una caché grande, discos de alta velocidad (SCSI, controlador de RAID por hardware), USV y ECC-RAM. Un espacio en disco tan grande se debe al sistema IDES preconfigurado, que crea ficheros de bases de datos de 27 GB durante la instalación. Este espacio también es suficiente para sistemas de producción iniciales y datos de aplicación.

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

Este es el hardware que utilizamos al escribir este texto: placa base dual con 2 procesadores Pentium(R) III a 800 MHz, adaptador SCSI Adaptec(R) 29160 Ultra160 (para acceder a una unidad de cinta 40/80 GB DLT y CDROM), Mylex(R) AcceleRAID(TM) (2 canales, firmware 6.00-1-00 con 32 MB RAM). La controladora Mylex(R) RAID tiene conectados dos discos duros de 17 GB (replicados) y cuatro discos duros de 36 GB (RAID nivel 5).

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

Para esta instalación se usó un Dell(TM) PowerEdge(TM) 2500: placa base dual con 2 procesadores Pentium(R) III a 1000 MHz (256 kB de Caché), 2 GB PC133 ECC SDRAM, controladora RAID PERC/3 DC PCI con 128 MB y una unidad EIDE DVD-ROM. La controladora RAID tiene conectados dos discos duros 18 GB (replicados) y cuatro discos duros de 36 GB (RAID nivel 5).

[[installation]]
=== Instalación de FreeBSD

Lo primero que tiene que hacer es instalar FreeBSD. Hay muchas formas de hacerlo. Nosotros instalamos FreeBSD 4.3 desde un FTP y FreeBSD 4.5 desde el CD de la distribución. Si necesita más información sobre los medios de instalación de FreeBSD consulte la crossref:install[install-diff-media,Cómo preparar su propio medio de instalación].

[[disk-layout]]
==== Esquema de disco

Quisimos hacer el proceso lo más simple posible, así que usamos el esquema de disco de SAP(R) R/3(R) 46B y SAP(R) R/3(R) 46C SR2. Solo cambiamos los nombres de dispositivo debido a que las instalaciones tuvieron lugar en hardware diferente ([.filename]#/dev/da# y [.filename]#/dev/amr# respectivamente. Si utiliza una AMI MegaRAID(R) verá en pantalla [.filename]#/dev/amr0s1a# en lugar de [.filename]#/dev/da0s1a#):

[.informaltable]
[cols="1,1,1,1", frame="none", options="header"]
|===
| Sistema de ficheros
| Tamaño (bloques de 1k)
| Tamaño (GB)
| Montado en

|[.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#
|===

Configure e inicialice antes que nada las dos unidades lógicas con el software Mylex(R) o PERC/3 RAID. El software puede iniciarse durante la fase de arranque de BIOS.

Por favor, tenga en cuenta que el esquema de disco que utilizamos difiere ligeramente de las recomendaciones de SAP(R), ya que SAP(R) sugiere montar los subdirectorios Oracle(R) (y algunos otros) por separado. Decidimos crearlos como subdirectorios reales para simplificar. 

[[makeworldandnewkernel]]
==== `make world` y un nuevo kernel

Descargue las fuentes -STABLE más recientes. Ejecute `make world` y compile su kernel personalizado. Recuerde incluir en él tanto los <<kerneltuning,parámetros del kernel>> requeridos por SAP(R) R/3(R) como los que necesita Oracle(R).

[[installingthelinuxenviornment]]
=== Instalación del entorno Linux

[[installinglinuxbase-system]]
==== Instalación del sistema base Linux

Primero instale el port <<linuxemu-libs-port,linux_base>> (como `root`):

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

[[installinglinuxdevelopment]]
==== Instalación del entorno de desarrollo Linux

El entorno de desarrollo Linux es imprescindible si quiere instalar Oracle(R) en FreeBSD según se explica en la <<linuxemu-oracle>>:

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

El entorno de desarrollo Linux solo ha de instalarse si sigue el proceso para instalar SAP(R) R/3(R) 46B IDES. No es necesario si Oracle(R) DB no está reenlazado («relinked») con el sistema FreeBSD. Este sería su caso si está usa el fichero comprimido tar de Oracle(R) de un sistema Linux.

[[installingnecessaryrpms]]
==== Instalación de los RPM necesarios

Necesitará soporte PAM para iniciar el programa `R3SETUP`. Durante la primera instalación de SAP(R) en FreeBSD 4.3-STABLE intentamos instalar PAM con todas las dependencias y finalmente forzamos la instalación del paquete PAM, y funcionó. En SAP(R) R/3(R) 4.6C SR2 forzamos la instalación del RPM PAM, que también funcionó, así que parece que las dependencias no lo son tanto:

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

Para que Oracle(R) 8.0.5 pueda lanzar el agente inteligente también tendremos que instalar el paquete Tcl de RedHat [.filename]#tcl-8.0.5-30.i386.rpm# (si no, cuando lo reenlace durante la instalación de Oracle(R) no funcionará). Existen otros aspectos relacionados con el reenlazado de Oracle(R) a tener en cuenta durante la instalación, pero atañen a la versión para Linux de Oracle(R) y no son específicos de FreeBSD.

[[linuxprocandfallbackelfbrand]]
==== Sugerencias

Le recomendamos añadir `linprocfs` a [.filename]#/etc/fstab#. Consulte man:linprocfs[5] para más información. Otro parámetro que debería configurar es `kern.fallback_elf_brand=3` en [.filename]#/etc/sysctl.conf#.

[[creatingsapr3env]]
=== Creación del entorno SAP(R) R/3(R)

[[filesystemsandmountpoints]]
==== Creación de los sistemas de ficheros y puntos de montaje necesarios

Para una instalación sencilla es suficiente con crear los siguientes sistemas de ficheros:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| punto de montaje
| tamaño en GB

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

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

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

También es necesario crear algunos enlaces. Si no, el instalador SAP(R) tendrá problemas ya que buscará los siguientes enlaces:

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

Veamos unos cuantos errores que se le pueden presentar durante la instalación (en este caso con el sistema _PRD_ y la instalación de SAP(R) R/3(R) 4.6C SR2):

[source,shell]
....
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]]
==== Creación de usuarios y directorios

SAP(R) R/3(R) necesita dos usuarios y tres grupos. Los nombres de usuario dependen del "SAP(R) system ID" (SID), y consisten en tres letras. Algunos de estos SID están reservados por SAP(R) (por ejemplo `SAP` y `NIX`. Tiene una lista completa de ellos en la documentación de SAP(R)). Para la instalación de IDES usamos `IDS` y para la instalación de 4.6C SR2 `PRD`, dado que ese sistema está pensado para un uso de producción. Tenemos por lo tanto los siguientes grupos (Los ID de grupo pueden ser diferentes, estos son solamente los valores que utilizamos en nuestra instalación):

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| ID de grupo
| nombre de grupo
| descripción

|100
|dba
|Administrador de base de datos

|101
|sapsys
|Sistema SAP(R)

|102
|oper
|Operador de base de datos
|===

En una instalación por omisión de Oracle(R) solo se usa el grupo `dba`. Puede usar el grupo `oper` como grupo `dba` (consulte la documentación de Oracle(R) y SAP(R) para más información).

También necesitaremos los siguientes usuarios:

[.informaltable]
[cols="1,1,1,1,1,1", frame="none", options="header"]
|===
| ID de usuario
| nombre de usuario
| nombre genérico
| grupo
| grupos adicionales
| descripción

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

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

Al añadir dichos usuarios mediante man:adduser[8] tenga en cuenta que debe incluir las siguientes entradas (observe la shell y el directorio home) al crear el "administrador SAP(R)":

[.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)
....

y para el "Administrador 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)
....

Esto también incluye al grupo `oper` en caso de que esté usando el grupo `dba` y el grupo `oper`.

[[creatingdirectories]]
==== Creación de directorios

Estos directorios se crean como sistemas de ficheros independientes. Esto depende totalmente de sus necesidades. Nosotros decidimos crearlos como directorios ya que todos están en el mismo RAID 5:

Primero vamos a configurar los propietarios y los derechos de algunos directorios (como `root`):

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

Luego vamos a crear directorios como el usuario `ora__sid__`. Estos serán todos subdirectorios de [.filename]#/oracle/SID#:

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

Para la instalación de Oracle(R) 8.1.7 tendrá que crear unos cuantos directorios más:

[source,shell]
....
# 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]
====
El directorio [.filename]#client/80x_32# tiene que tener exactamente este nombre. No sustituya la _x_ por un número ni por ninguna otra cosa.
====

En el tercer paso creamos directorios como usuario `__sid__adm`:

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

[[entriesinslashetcslashservices]]
==== Entradas en [.filename]#/etc/services#

SAP(R) R/3(R) requiere algunas entradas en [.filename]#/etc/services# que es posible que no estén correctamente activadas durante la instalalación. Añada las siguientes entradas (necesita al menos las entradas correspondientes al número de instancia, en este caso, `00`. No hará ningún daño añadir todas las entradas de `00` hasta `99` para `dp`, `gw`, `sp` y `ms`). Si va a utilizar un SAProuter o necesita acceder a SAP(R) OSS, también necesitará `99`, ya que el puerto 3299 se usa generalmente para el proceso SAProuter en el sistema destino:

[.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]]
==== Locales necesarios

SAP(R) requiere al menos dos locales que no forman parte de la instalación por defecto de RedHat. SAP(R) dispone de los paquetes RPMs que pueda necesitar; puede descargalos desde su FTP, aunque tenga en cuenta que solo pueden acceder al mismo los clientes con acceso OSS). Consulte la nota 0171356, que contiene una lista de los RPM que necesitará. 

También puede crear enlaces (por ejemplo desde _de_DE_ y _en_US_ ), pero no se lo recomendamos si pretende configurar un sistema de producción (no obstante, hemos de reconocer que a nosotros nos ha funcionado con el sistema IDES sin ningún problema). Necesitará al menos los siguientes locales:

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

Haga los enlaces de esta manera:

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

Si no están habrá algunos problemas durante la instalación. Si se ignoran (es decir, si configura el `STATUS` de los pasos relacionados con esos locales a `OK` en el fichero [.filename]#CENTRDB.R3S#) será imposible entrar al sistema SAP(R) sin tener que recurrir a ciertas triquiñuelas.

[[kerneltuning]]
==== Personalización del kernel

Los sistemas SAP(R) R/3(R) necesitan muchos recursos, por eso hemos añadido los siguientes parámetros al fichero de configuración de su 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
....

Puede consultar los valores mínimos en la documentación de SAP(R). Como no hay detalles sobre Linux, consulte para mayor información la sección de HP-UX (32-bit). El sistema de instalación 4.6C SR2 tiene más memoria principal, asín que los segmentos compartidos pueden ser más extensos tanto para SAP(R) como para Oracle(R); elija, por tanto, un número mayor de páginas de memoria compartida.

[NOTE]
====
En la instalación por omisión de FreeBSD 4.5 en i386(TM), configure `MAXDSIZ` y `DFLDSIZ` como máximo a 1 GB. Si no lo hace podrían aparecer errores extraños como `ORA-27102: out of memory` y `Linux Error: 12: Cannot allocate memory`.
====

[[installingsapr3]]
=== Instalación de SAP(R) R/3(R)

[[preparingsapcdroms]]
==== Preparación de los CDROM

Hay que montar y desmontar muchos CD-ROM durante la instalación. Si tiene suficientes unidades de CDROM, podría montarlos todos. Nosotros decidimos copiar el contenido de los CD-ROM a los directorios correspondientes:

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

Donde _nombre-cd_ era [.filename]#KERNEL#, [.filename]#RDBMS#, [.filename]#EXPORT1#, [.filename]#EXPORT2#, [.filename]#EXPORT3#, [.filename]#EXPORT4#, [.filename]#EXPORT5# y [.filename]#EXPORT6# para la instalación 4.6B/IDES, y [.filename]#KERNEL#, [.filename]#RDBMS#, [.filename]#DISK1#, [.filename]#DISK2#, [.filename]#DISK3#, [.filename]#DISK4# y [.filename]#LANG# para la instalación 4.6C SR2. Todos los nombres de fichero en los CDs montados deben estar en mayúsculas; si no es así use la opción `-g` al montar. Utilice lo siguiente: 

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

[[runningtheinstall-script]]
==== Ejecución del "script" de instalación

Primero tendrá que preparar un directorio [.filename]#install#:

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

Una vez arrancado el "script" de instalación copiará casi todos los ficheros relevantes en el directorio [.filename]#install#:

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

La instalación IDES (4.6B) incluye un sistema de demostración SAP(R) R/3(R) totalmente personalizado, así que hay seis CD EXPORT en lugar de solo tres. La plantilla de instalación [.filename]#CENTRDB.R3S# está pensada para una instancia central estándar (R/3(R) y base de datos), no la instancia central IDES, así que hay que copiar el [.filename]#CENTRDB.R3S# correspondiente del directorio [.filename]#EXPORT1#. Si no lo hace `R3SETUP` solo pedirá tres CD EXPORT.

La nueva versión de SAP(R) 4.6C SR2 incluye cuatro CDs EXPORT. El fichero de parámetros que controla los pasos de la instalación es [.filename]#CENTRAL.R3S#. A diferencia de versiones versiones anteriores, no existen patrones de instalación por separado para una instancia central con o sin base de datos. SAP(R) utiliza un patrón separado para la instalación de la base de datos. Para reiniciar la instalación después es suficiente reiniciarla con el fichero original.

Durante y después de la instalación, SAP(R) necesita que `hostname` devuelva _sólamente_ el nombre del sistema, no el nombre cualificado de dominio. Configure el nombre del equipo de ese modo, o active un alias mediante `alias hostname='hostname -s'` para `ora__sid__` y para `__sid__adm` (y para `root` al menos durante los pasos de la instalación realizados como `root`). También puede configurar los ficheros [.filename]#.profile# y [.filename]#.login# de los usuarios que se crean durante la instalación SAP(R).

[[startr3setup-46B]]
==== Inicio de `R3SETUP` 4.6B

Asegúrese de que `LD_LIBRARY_PATH` esté configurada correctamente:

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

Inicie `R3SETUP` como `root` desde el directorio de instalación:

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

El "script" le preguntará algunas cosas; le mostramos aquí entre corchetes la respuesta por defecto, y después la respuesta que nosotros introdujimos:

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| Pregunta
| Por omisión
| Entrada

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

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

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

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

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

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

|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:[Intro]

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

|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:[Intro]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Si no ha copiado los CD a su disco duro el instalador SAP(R) no podrá encontrar el CD que necesite (identifica los contenidos mediante fichero [.filename]#LABEL.ASC# de cada CD) y por lo tanto le pedirá que introduzca y monte el CD, o que confirme o introduzca la ruta de montaje.

[.filename]#CENTRDB.R3S# puede contener algún error. En nuestro caso, solicitó el CD EXPORT4 más de una vez, pero se le indicó la clave correcta (6_LOCATION, luego 7_LOCATION, etc), así que pudimos continuar introduciendo los valores correctos.

Aparte de algunos problemas que se detallan más adelante deberíamos ir llegando a la instalación del software de base de datos Oracle(R).

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

Asegúrese de que `LD_LIBRARY_PATH` esté correctamente configurada. Tenga en cuenta de que es un valor diferente de la instalación 4.6B con Oracle(R) 8.0.5:

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

Arranque `R3SETUP` como el usuario `root` desde el directorio de instalación:

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

El "script" le preguntará algunas cosas. Le presentamos la respuesta por omisión entre corchetes y después la respuesta que dimos nosotros):

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| Pregunta
| Por omisión
| Entrada

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

La creación de usuarios da un error durante la instalación en las fases OSUSERDBSID_IND_ORA (al crear al usuario `ora__sid__`) y OSUSERSIDADM_IND_ORA (al crear el usuario `__sid__adm`).

Más adelante hablaremos de cierto problemas que aún tenemos pendientes, pero ha llegado el momento de instalar el software de base de datos Oracle(R).

[[installingoracle805]]
=== Instalación de Oracle(R) 8.0.5

Consulte los [.filename]#Readme# de Oracle(R) y las notas de de SAP(R) sobre Linux y Oracle(R) DB por si hubiera algo que le pueda afectar. La mayoría de los problemas, por no decir todos, tienen su origen en bibliotecas incompatibles.

Para mayor información sobre la instalación de Oracle(R) diríjase al <<linuxemu-oracle,capítulo de instalación de Oracle(R).>>

[[installingtheoracle805withorainst]]
==== Instalación de Oracle(R) 8.0.5 con `orainst`

Si quiere instalar Oracle(R) 8.0.5 necesitará unas cuantas bibliotecas para el enlazado, ya que Oracle(R) 8.0.5 fué enlazado con una glibc antigua (la de RedHat 6.0), pero RedHat 6.1 usa una nueva glibc. Tendrá que instalar los siguientes paquetes para asegurarse que el reenlazado funcione:

[.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#

Para más información consulte las notas correspondientes de SAP(R) o los [.filename]#Readme# de Oracle(R). Si no es posible (durante la instalación no tuvimos tiempo suficiente para ello), se podrían utilizar los binarios originales, o los binarios reenlazados de un sistema original RedHat.

Instale el paquete Tcl de RedHat para compilar el agente inteligente. Si no puede conseguir [.filename]#tcl-8.0.3-20.i386.rpm# debería funcionar una versión más reciente, por ejemplo [.filename]#tcl-8.0.5-30.i386.rpm# para RedHat.

Aparte del reenlazado, la instalación es muy sencilla:

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

Confirme todas las pantallas con kbd:[Intro] hasta que el software esté instalado; todas excepto en la que debe quitar la marca de instalación al _visualizador de textos Oracle(R) en línea_, ya que no existe para Linux. Oracle(R) intentará, gracias a esto, reenlazar con `i386-glibc20-linux-gcc` en lugar de `gcc`, `egcs` o `i386-redhat-linux-gcc`.

Debido a la falta de tiempo decidimos usar los binarios de una versión Oracle(R) 8.0.5 PreProduction, después de que nuestro primer intento de que funcionara la versión del CD RDBMS fallara y viendo que encontrar y utilizar los RPM correctos hubiera sido una pesadilla.

[[installingtheoracle805preproduction]]
==== Instalación de Oracle(R) 8.0.5 "Pre-production Release" para Linux (Kernel 2.0.33)

La instalación es bastante fácil. Monte el CD e inicie el instalador. Le preguntará por la ubicación del directorio home de Oracle(R), y copiará en él todos los binarios. (Nosotros no eliminamos los restos de una instalación RDBMS anterior que no terminó de llegó a terminar).

Tras esto la base de datos Oracle(R) puede arrancar.

[[installingoracle817]]
=== Instalación desde el fichero comprimido de Linux Oracle(R) 8.1.7

Descomprima el fichero [.filename]#oracle81732.tgz# (creado en el directorio de instalación en un sistema Linux) y descomprímalo en [.filename]#/oracle/SID/817_32/#.

[[continuewithsapr4installation]]
=== Continúe con la instalación SAP(R) R/3(R)

Revise las configuraciones del entorno de los usuarios `idsamd` (__sid__adm) y `oraids` (ora__sid__). Ambos deben tener los ficheros [.filename]#.profile#, [.filename]#.login# y [.filename]#.cshrc# con `hostname` correctamente configurado. En caso que el nombre del sistema sea el nombre cualificado completo tendrá que cambiar `hostname` a `hostname -s` en los tres ficheros anteriormente citados.

[[databaseload]]
==== Carga de la base de datos

Hecho esto puede rearrancar `R3SETUP` o volver a arrancar la instalación (dependiendo si eligió salir o no). `R3SETUP` crea las tablas y carga los datos (en 46B IDES, desde EXPORT1 a EXPORT6, en 46C desde DISK1 a DISK4) mediante `R3load`.

Cuando se termina la carga de la base de datos (que puede llevar un par de horas) se le pedirán algunas contraseñas. En una instalación de prueba puede usar unas contraseñas de compromiso. (_use una contraseña de verdad si le preocupa siquiera ligeramente la seguridad_):

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Pregunta
| Entrada

|Enter Password for sapr3
|sapkbd:[Intro]

|Confirum Password for sapr3
|sapkbd:[Intro]

|Enter Password for sys
|change_on_installkbd:[Enter]

|Confirm Password for sys
|change_on_installkbd:[Enter]

|Enter Password for system
|managerkbd:[Intro]

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

Aquí tuvimos problemas con `dipgntab` en la instalación de 4.6B.

[[listener]]
==== Las escuchas

Arranque las escuchas de Oracle(R) con el usuario `ora__sid__` de la siguiente manera:

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

Si no lo hace así verá un error ORA-12546, ya que los sockets no tendrán los permisos correctos. Consulte la nota 072984 de SAP(R).

[[mnlstables]]
==== Actualización de tablas MNLS

Si tiene previsto importar idiomas que no sean Latin-1 en SAP(R) tiene que actualizar las tablas "Multi National Language Support". Tiene más información sobre esto en las notas de SAP(R) OSS 15023 y 45619. Si no es su caso puede saltarse esta parte de la instalación de SAP(R).

[NOTE]
====
Aunque no necesite soporte MNLS sigue siendo necesario que revise la tabla TCPDB y que la inicialice si no lo ha hecho ya. Consulte las notas 0015023 y 0045619 de SAP(R) para más información.
====

[[postinstallationsteps]]
=== Pasos para después de la instalación

[[requestsapr3licensekey]]
==== Solicitar una licencia SAP(R) R/3(R)

Tiene que solicitar una licencia de SAP(R) R/3(R). No tendrá más remedio, puesto que la licencia temporal que se usa durante la instalación tiene un límite de validez de cuatro semanas. Necesitará la llave hardware. Entre al sistema como usuario `idsadm` y ejecute `saplicense`:

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

Si ejecuta `saplicense` sin parámetros verá una lista de opciones. Una vez que tenga la licencia en su poder la podrá instalar del siguiente modo: 

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

Se le solicitará que introduzca los siguientes valores:

[.programlisting]
....
SAP SYSTEM ID   = SID, 3 caracteres
CUSTOMER KEY    = llave hardware, 11 caracteres
INSTALLATION NO = instalación, 10 caracteres
EXPIRATION DATE = yyyymmdd, normalmente "99991231"
LICENSE KEY     = licencia, 24 caracteres
....

[[creatingusers]]
==== Crear usuarios

Cree un usuario dentro del cliente 000 (es necesario para algunas tareas que requieren hacerse dentro del cliente 000, pero con un usuario que no sea ni `sap*` ni `ddic`). Nosotros solemos elegir para este usuario el nombre de `wartung` (o `service`, ambos "servicio" en castellano). Los perfiles son `sap_new` y `sap_all`. Para mayor seguridad las contraseñas para usuarios por defecto dentro de todos los clientes deben cambiarse (incluidos los usuarios `sap*` y `ddic`).

[[configtranssysprofileopermodesetc]]
==== Configurar sistema de transporte, perfil, modos de operación, etc.

Dentro del cliente 000 y con un usuario que no sea `ddic` ni `sap*`, haga al menos lo siguiente:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Tarea
| Transacción

|Configurar sistema de transporte, por ejemplo como _Stand-Alone Transport Domain Entity_
|STMS

|Crear / editar perfil para el sistema
|RZ10

|Mantener modos de operación e instancias
|RZ04
|===

Todos estos (y muchos más) pasos para ejecutar después de la instalación se explican de forma detallada en las guías de instalación de SAP(R).

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

El fichero [.filename]#/oracle/IDS/dbs/initIDS.sap# contiene la copia de seguridad del perfil de de SAP(R). Aquí es donde debe definir el tamaño de la cinta a utilizar, tipo de conpresión, etc. Las siguientes modificaciones nos permitirían ejecutar `sapdba` / `brbackup`:

[.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
....

Explicación:

`compress`: La cinta que usamos es una HP DLT1 que tiene compresión por hardware.

`archive_function`: Define el comportamiento por omisión del almacenaje de los logs de Oracle(R): los nuevos ficheros de log se guardan en cinta, los ficheros de log que ya han sido guardados se guardan de nuevo y luego se borran. Así se evitan muchos problemas si necesita recuperar la base de datos y una de las cintas está dañada.

`cpio_flags`: por omisión se usa `-B`, que asigna un tamaño de bloque de 5120 Bytes. HP recomienda un tamaño de bloque de 32 K como mínimo; usamos `--block-size=128` para que sea de 64 K. Necesitaremos usar `--format=newc` porque tenemos números de inodo mayores a 65535. La última opción (`--quiet`) se necesita ya que `brbackup` se queja en cuanto `cpio` imprime los números de bloque guardados.

`cpio_in_flags`: Parámetros necesarios para cargar datos desde la cinta. El formato es reconocido automáticamente.

`tape_size`: La capacidad de almacenaje de la cinta. Por razones de seguridad (nosotros usamos compresión por hardware) el valor es ligeramente menor que el valor real.

`tape_address`: El dispositivo (que no permite el rebobinado) que se usará con `cpio`.

`tape_address_rew`: El dispositivo (que permite el rebobinado) que se usará con `cpio`.

==== Aspectos de la configuración una vez concluida la instalación

Los siguientes parámetros SAP(R) deben personalizarse una vez concluída la instalación (los ejemplos son para IDES 46B, 1 GB de memoria):

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Nombre
| Valor

|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
|===

SAP(R) Note 0013026:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Nombre
| Valor

|ztta/dynpro_area
|2500000
|===

SAP(R) Note 0157246:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Nombre
| Valor

|rdisp/ROLL_MAXFS
|16000

|rdisp/PG_MAXFS
|30000
|===

[NOTE]
====
En un sistema con 1 GB de memoria y los parámetros arriba expuestos puede esperarse encontrar un consumo de memoria similar al siguiente:

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

====

[[problemsduringinstallation]]
=== Problemas durante la instalación

[[restartr3setup]]
==== Reiniciar `R3SETUP` una vez arreglado el problema

`R3SETUP` se detiene si encuentra un error. Si ha revisado los logs y ha corregido el error reinicie `R3SETUP`; hágalo seleccionando la opción REPEAT en el paso donde `R3SETUP` se detuvo.

Cuando quiera reiniciar `R3SETUP` inícielo con el fichero [.filename]#R3S# correspondiente:

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

en el caso de 4.6B, o con

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

en 4.6C; no importa si el error ocurrió con [.filename]#CENTRAL.R3S# o con [.filename]#DATABASE.R3S#.

[NOTE]
====
En algunas etapas, `R3SETUP` asume que la base de datos y los procesos SAP(R) están en marcha (como aquellos en los cuales se completaron los pasos). Si hay errores y por ejemplo la base de datos no se puede iniciar tendrá que arrancar la base de datos y SAP(R) manualmente una vez haya corregido los errores y antes de iniciar `R3SETUP` nuevamente.

No olvide iniciar también la escucha de Oracle(R) (como `ora__sid__` con `umask 0; lsnrctl start`) si también tuvo que detenerlo (si por ejemplo hubo que reiniciar el sistema).
====

[[indoraduringduringr3setup]]
==== OSUSERSIDADM_IND_ORA durante `R3SETUP`

Si `R3SETUP` se queja en este etapa edite la plantilla `R3SETUP` que esté usando en ese momento ([.filename]#CENTRDB.R3S# (en 4.6B) o [.filename]#CENTRAL.R3S# o [.filename]#DATABASE.R3S# (en 4.6C)). Ubique `[OSUSERSIDADM_IND_ORA]` o busque la única entrada `STATUS=ERROR` y edite los siguientes valores:

[.programlisting]
....
HOME=/home/sidadm (was empty)
STATUS=OK (had status ERROR)
....

Hecho esto, reinicie `R3SETUP`.

[[indoraduringr3setup]]
==== OSUSERDBSID_IND_ORA durante `R3SETUP`

Es posible que `R3SETUP` se queje también en esta etapa. El error aquí es similar al de la fase OSUSERSIDADM_IND_ORA. Edite la plantilla `R3SETUP` que esté usando ([.filename]#CENTRDB.R3S# (en 4.6B) o [.filename]#CENTRAL.R3S# o [.filename]#DATABASE.R3S# (en 4.6C)). Ubique `[OSUSERDBSID_IND_ORA]` o busque la única entrada `STATUS=ERROR` y edite los siguientes valores en esa sección:

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

Hecho esto reinicie `R3SETUP`.

[[oraviewvrffilenotfound]]
==== `oraview.vrf FILE NOT FOUND` durante la instalación de Oracle(R)

No ha dejado sin seleccionar la opción de instalar el _visualizador de texto en línea de Oracle(R)_ antes de iniciar la instalación. Está seleccionado para ser instalado, aunque la aplicación no existe para Linux. Deje sin seleccionar el producto en el menú de instalación de Oracle(R) y reinicie la instalación.

[[textenvincalid]]
==== `TEXTENV_INVALID` durante `R3SETUP`, o inicio de RFC o SAPgui

Si se encuentra con este error significa que falta el locale correcto. La nota 0171356 de SAP(R) contiene una lista de RPM que deben instalarse (p.ej. [.filename]#saplocales-1.0-3#, [.filename]#saposcheck-1.0-1# para RedHat 6.1). En caso de que ignore todos los errores relacionados y configure los `STATUS` correspondientes de `ERROR` a `OK` (en [.filename]#CENTRDB.R3S#) cada vez que `R3SETUP` se queje y simplemente reinicie `R3SETUP`; el sistema SAP(R) no estará configurado correctamente y no podrá conectarse al sistema con SAPgui, aunque el sistema pueda arrancar. Si intenta conectar con el antiguo SAPgui de Linux recibirá los siguientes mensajes:

[.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
....

Este comportamiento se debe a que SAP(R) R/3(R) es incapaz de asignar correctamente un locale y tampoco puede configurarse a sí mismo correctamente (faltan entradas en algunas tablas de la base de datos). Añada las siguientes entradas al fichero [.filename]#DEFAULT.PFL# y podrá conectarse a SAP(R) (vea la nota 0043288):

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

Reinicie el sistema SAP(R). Puede conectar al sistema, aunque la configuración de idioma o de país puede que no funcione como se espera de ella. Una vez corregidas las configuraciones de país (y proporcionados los locales adecuados) puede eliminar estas entradas de [.filename]#DEFAULT.PFL# y el sistema SAP(R) puede reiniciarse.

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

Este error solo aparece con Oracle(R) 8.1.7 en FreeBSD 4.5. Se debe a que la base de datos Oracle(R) no puede inicializarse correctamente y se viene abajo, dejando semáforos y memoria compartida en el sistema. El siguiente intento de iniciar la base de datos produce el error ORA-00001.

Encuéntrelos con `ipcs -a` y elimínelos con `ipcrm`.

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

Este error tuvo lugar con Oracle(R) 8.1.7. Aparece si se arranca la base de datos con el "script" `startsap` (por ejemplo `startsap_majestix_00`) con el usuario `prdadm`.

Una solución (entre otras) es iniciar la base de datos con el usuario `oraprd` en lugar de hacerlo con `svrmgrl`:

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

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

Inicie la escucha de Oracle(R) como usuario `oraids` con la siguiente orden:

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

De no ser así puede encontrarse con el error ORA-12546, ya que los sockets no tendrán los permisos adecuados. Consulte la nota de SAP(R) 0072984.

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

Este error ocurre al tratar de usar valores mayores a 1 GB (1024x1024x1024) en `MAXDSIZ` y `DFLDSIZ`. Recibiremos, además, este otro error: `Linux Error 12: Cannot allocate memory`.

[[dipgntabindind]]
==== [DIPGNTAB_IND_IND] during `R3SETUP`

Consulte la nota de SAP(R) 0130581 de (`R3SETUP` step (`DIPGNTAB` terminates). Por alguna razón durante la instalación específica IDES el proceso de instalación no usaba el nombre de sistema correcto SAP(R)"IDS" sino la cadena vacía `""`. Esto provocaba algunos errores menores en el acceso a directorios, ya que las rutas se generan dinámicamente en base a dicho _SID_ (en este caso IDS). En lugar de ejecutar los accesos del siguiente modo :

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

se usaron las siguientes rutas:

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

Para continuar con la instalación creamos un enlace y un directorio adicional:

[source,shell]
....
# 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
....

Encontramos una descripción de este comportamiento en las notas de SAP(R). (0029227 y 0008401). En la instalación de SAP(R) 4.6C no tuvimos estos problemas.

[[rfcrswboiniindind]]
==== [RFCRSWBOINI_IND_IND] during `R3SETUP`

Durante la instalación de SAP(R) 4.6C nos encontramos con este error, cuyo origen está en un error que tuvo lugar anteriormente durante la propia instalación. Busque en sus ficheros de log y corrija el problema.

Si despues de buscar en los logs el error resulta ser el correcto (revise las notas de SAP(R)), puede poner el `STATUS` del paso donde se produce el error de `ERROR` a `OK` (en el fichero [.filename]#CENTRDB.R3S#) y reiniciar `R3SETUP`. Una vez finalizada la instalación, tiene que ejecutar el informe `RSWBOINS` de la transacción SE38. Consulte la nota SAP(R) 0162266 para más información sobre las fases `RFCRSWBOINI` y `RFCRADDBDIF`.

[[rfcraddbdifindind]]
==== [RFCRADDBDIF_IND_IND] during `R3SETUP`

Aquí sucede lo mismo de antes, asegúrese, revisando los logs, de que la causa de este error no esté en algún problema previo.

Si en la nota de SAP(R) 0162266 está la solución ponga el `STATUS` del paso donde se produce el error de `ERROR` a `OK` (en el fichero [.filename]#CENTRDB.R3S#) y reinicie `R3SETUP`. Una vez finalizada la instalación ejecute el informe `RADDBDIF` desde la transacción SE38.

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

Este error ocurrió durante el inicio del proceso SAP(R)_disp+work_. Si inicia SAP(R) con el "script" `startsap` se inician los subprocesos que se separan y hacen el "trabajo sucio" de iniciar el resto de procesos de SAP(R), pero es importante saber que el propio "script" no notará si algo ha ido mal.

Puede revisar si los procesos SAP(R) se iniciaron correctamente con `ps ax | grep SID`, que le proporcionará una lista de todos los procesos de Oracle(R) y de SAP(R). Si parece que algunos procesos no están, o si no puede conectarse al sistema SAP(R) revise los logs que encontrará en [.filename]#/usr/sap/SID/DVEBMGSnr/work/#. Los ficheros que debe revisar son [.filename]#dev_ms# y [.filename]#dev_disp#.

La señal 31 aparece si la cantidad de memoria compartida asignada a Oracle(R) y SAP(R) supera la definida dentro del fichero de configuración del kernel y puede resolverse usando un valor mayor:

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

[[saposcolfails]]
==== Start of `saposcol` Failed

Hay algunos problemas con el programa `saposcol` (version 4.6D). El sistema SAP(R) utiliza `saposcol` para recoger datos del rendimiento del sistema. Este programa no es necesario para usar el sistema SAP(R), así que el problema puede considerarse como poco importante. La versión más antigua (4.6B) funciona, pero no recoge todos los datos (muchas llamadas devolverán un 0, por ejemplo el uso de CPU).

[[linuxemu-advanced]]
== Temas avanzados

Si siente curiosidad por saber cómo funciona la compatibilidad con Linux esta es la sección que debe leer. La mayor parte de lo que sigue está basado casi en su totalidad en un mensaje enviado por Terry Lambert mailto:tlambert@primenet.com[tlambert@primenet.com] a la lista {freebsd-chat} (Message ID: `<199906020108.SAA07001@usr09.primenet.com>`).

=== ?Cómo funciona?

FreeBSD dispone de una abstracció denominada "cargador de clase en ejecución". Esto no es más que un bloque de código incrustado en la llamada man:execve[2] del sistema.

Históricamente las plataformas UNIX(R) disponían de un único cargador de binarios, que en última instancia (_fallback_) recurría al cargador `#!` para ejecutar cualesquiera intérpretes o scripts de la shell. Ese cargador único examinaba el número mágico (generalmente los 4 u 8 primeros bytes del fichero) para ver si era un binario reconocible por el sistema y, en tal caso, invocaba al cargador binario.

Si no era de tipo binario, la llamada man:execve[2] devolvía un error y la shell intentaba empezar a ejecutarlo como órdenes shell, tomando por defecto como punto de partida "la shell actual, sea cual sea".

Posteriormente se pensó en hacer una modificación de manera que man:sh[1] examinara los dos primeros caracteres, de modo que si eran `:\n` se llamaba a la shell man:csh[1] en su lugar (parece ser que en SCO fueron los primeros en utilizar ese truco).

Lo que ocurre ahora es que FreeBSD dispone de una lista de cargadores, en lugar de uno solo. FreeBSD recorre esa lista de cargadores, con un cargador genérico `#!` que sabe reconocer los intérpretes en base a los caracteres que siguen al siguiente espacio en blanco, con [.filename]##/bin/sh## como último recurso.

Para dar soporte a la ABI ("Application Binary Interface") de Linux, FreeBSD interpreta el número mágico como un binario ELF ("Executable and Linking Format"): En este punto no hace distinción entre FreeBSD, Solaris(TM), Linux(R) o cualquier otro SO que tenga un tipo de imagen ELF.

El cargador ELF busca entonces una marca (_brand_) especial, una sección de comentarios en la imagen ELF que no está presente en los binarios ELF de SVR4/Solaris(TM).

Para que los binarios de Linux funcionen deben estar marcados con man:brandelf[1] como tipo `Linux`:

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

Hecho esto el cargador ELF verá la marca `Linux` en el fichero.

Cuando el cargador ELF ve la marca `Linux` sustituye un puntero en la estructura `proc`. Todas las llamadas del sistema se indexan a través de este puntero (en un sistema UNIX(R) tradicional sería el «array» de estructura `sysent[]` que contiene las llamadas del sistema). Además, el proceso se marca con unos indicadores ("flags") para que el vector trampa del código de envío señales lo maneje de una forma determinada, así como otros arreglos (menores) que serán utilizados por el módulo Linux del kernel.

El vector de llamada del sistema Linux contiene, entre otras cosas, una lista de entradas `sysent[]` cuyas direcciones residen en el módulo del kernel.

Cuando el binario Linux realiza una llamada al sistema, el código trampa extrae el puntero a la función de la llamada del sistema de la estructura `proc`, y así obtiene los puntos de entrada a las llamadas del sistema Linux, no las de FreeBSD.

Además, el modo Linux cambia la raíz de las búsquedas de una forma dinámica. En efecto, esto es lo que hace la opción `union` cuando se monta un sistema de ficheros (¡y que _no_ es lo mismo que el sistema de ficheros `unionfs`!). Primero se hace un intento de buscar el fichero en el directorio [.filename]#/compat/linux/ruta-original# y _solo después_, si lo anterior falla, se repite la búsqueda en el directorio [.filename]#/ruta-original#. Esto permite que se puedan ejecutar binarios que necesitan de otros binarios (por ejemplo las herramientas de programación ("toolchain") de Linux pueden ejecutarse en su totalidad bajo la ABI de Linux). Esto significa también que los binarios Linux pueden cargar y ejecutar binarios FreeBSD si los binarios Linux equivalentes no se hallan presentes y que se puede poner una orden man:uname[1] en el árbol de directorios [.filename]#/compat/linux# para poder estar seguros de que los binarios Linux no puedan decir que no estaban ejecutándose en Linux.

En efecto, hay un kernel Linux en el kernel FreeBSD; las distintas funciones subyacentes que implementan todos los servicios proporcionados por el kernel son idénticas en ambas, las tablas de entradas de llamadas del sistema en FreeBSD y en Linux: operaciones del sistema de ficheros, operaciones de memoria virtual, envío de señales IPC System V, etc. La única diferencia es que los binarios FreeBSD reciben sus funciones de conexión ("_glue_") y los binarios Linux las suyas (la mayoría de los sistemas operativos más antiguos solo tienen sus propias funciones de conexión: direcciones de funciones en un "array" de estructura `sysent[]` estática y global, en lugar de direcciones de funciones que se extraen a partir de un puntero inicializado dinámicamente en la estructura `proc` del proceso que hace la llamada).

?Cuál es entonces la ABI nativa de FreeBSD? No importa. Básicamente, la única diferencia es (ahora mismo; esto podría cambiar y probablemente lo hará en una release futura) que las funciones de conexión de FreeBSD están enlazadas estáticamente en el kernel mientras que las de Linux pueden estarlo también estáticamente o se puede acceder a ellas por medio de un módulo del kernel.

Bien, pero ?de verdad es esto una emulación? No. Es una implementación ABI, no una emulación. No hay un emulador involucrado (ni un simulador, para adelantarnos a la siguiente pregunta).

Entonces ?por qué a veces se le llama "emulación Linux"? ¡Para hacer más difícil el vender FreeBSD! En serio, se debe a que la primera implementación se hizo en un momento en que realmente no había ninguna palabra distinta a esa para describir lo que se estaba haciendo; decir que FreeBSD ejecutaba binarios Linux no era cierto si no se compilaba el código o se cargaba un módulo; hacía falta una forma de describir todo esto y acabamos usando "emulador Linux".
