QEMU/SunOS 4.1.4

De Wikilibros, la colección de libros de texto de contenido libre.

Motivación[editar]

Este capítulo describe la instalación de SunOS 4.1.4 (= Solaris 1.1.2) en un una maquina SPARC 1.4.0 emulada por QEMU. SunOS 4.1.4 es el último sistema operativo Unix basado puramente en BSD hecho por Sun Microsystems. Fue sustituido por Solaris 2.x (= SunOS 5.x), basado en System V Release 4. Los programas compilados para SunOS 4.x no se ejecutarán sin emulación binaria en Solaris versión 2.x. La utilidad de Unix file de Solaris 2.4 mostrará informes como

Sun demand paged SPARC executable

para binarios de SunOS 4.1.4 y

ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped

para binarios de Solaris 2.4. Si se quiere ejecutar programas muy antiguos del primer tipo, se podría intentar hacerlo de forma nativa en un SunOS 4.1.4.

Prerequisitos[editar]

  • Imagen del CD-ROM de instalación de SunOS 4.1.4
  • Imagen de la ROM de SPARCstation 5 Rev. 2.15

A continuación, el fichero de imagen de CD se llama solaris1.1.2.iso y el fichero de imagen de la ROM se llama ss5.bin. Para nuestra instalación crearemos una imagen de disco de 2GB de tamaño:

$ qemu-img create -f qcow2 -o compat=1.1 sunos414.img 2G
Formatting 'sunos414.img', fmt=qcow2 size=2147483648 compat='1.1' encryption=off cluster_size=65536 lazy_refcounts=off 

Por compatibilidad con versiones de QEMU anteriores a la 1.1 omitiremos compat=1.1. Si se necesita más espacio, cambiaremos 2G por un valor mayor, pero hay que tener en cuenta que el programa de instalación no proporciona una geometría de disco predefinida. Habrá que introducir los valores de CHS (Cylinder-Head-Sector, cilindro-cabezal-sector) por nosotros mismos durante la instalación.

Copiar la Imagen Miniroot[editar]

Iniciamos la maquina emulada con el siguiente commando. De aquí en adelante todos los comandos del sistema host (el sistema en que se ejecuta QEMU) tendrán el prompt del Shell "$", el prompt de la rom será "ok", el prompt del guest (del sistema que se está ejecutando en la máquina emulada) será "#" y el prompt del monitor de QEMU será "(qemu)".

$ qemu-system-sparc -monitor tcp::4444,server,nowait -bios ss5.bin -m 32 -nographic -hda sunos414.img -hdb solaris1.1.2.iso

Se omite la opción -machine, que quiere decir que QEMU emulará una SPARCstation 5(basada en la arquitectura sun4m) por defecto. La máquina emulada proporciona gráficos que no podemos usar, así que deshabilitamos la salida de los gráficos con la opción -nographic, redirigiendo todas las salidas al terminal desde el que iniciamos QEMU. Más adelante se explicará cómo ejecutar programas de X Windows en el guest exportando la pantalla a un servidor X que se esté ejecutando en el host. Ya que tampoco habrá emulación de teclado, se tomará como entrada la del terminal igualmente. Se verá el siguiente mensaje de la ROM:

Keyboard not present. Using tty for input and output.

La opción -monitor nos permite controlar QEMU sobre una conexión de telnet, en nuestro ejemplo por el puerto 4444. Para lograrlo, ejecutar

$ telnet localhost 4444

en otra consola. Alternativamente podemos omitir la opción -monitor y usar el comando "Ctrl-a c" para cambiar entre la consola (en la que se ejecuta QEMU) y el prompt del monitor de QEMU. En este caso, escribir "Ctrl-a h" para obtener ayuda. Algunos comandos muy útiles son

(qemu) stop

para pausar la maquina emulada y

(qemu) cont

para reanudarla. Siempre tendremos la carga de la CPU a tope mientras que la maquina emulada no esté pausada. Este comando finaliza QEMU inmediatamente:

(qemu) q

Nuestra maquina emulada tiene 32 MB de RAM, indicados por la opción -m Esa parece la cantidad mínima que no provocará que QEMU salga dando el error:

qemu: fatal: Trap 0x29 while interrupts disabled, Error state

La cantidad maxima para una SPARCstation 5 es 256MB. Escoger 32MB si no se quiere esperar al test de la ROM, que lleva algún tiempo. No hacemos uso de la emulación del CD-ROM con la opción -cdrom porque no funciona. En su lugar, declaramos que el CD de instalación es el segundo disco duro. La secuencia de inicio de la ROM finaliza con un fallo de arranque desde la red:

Boot device: /iommu/sbus/ledma@5,8400010/le@5,8c00000  File and args: 
Internal loopback test -- Wrong packet length; expected 36, observed 64 

Parece ser que QEMU version 1.4.0 no es capaz de permitirnos arrancar desde la red. Arrancaremos con.

ok boot disk1:d

desde la cuarta partición del segundo disco duro (nuestra imagen de CD), que lleva el bloque de arranque para nuestra arquitectura. Realizar las siguientes elecciones:

What would you like to do?
  1 - install SunOS mini-root
  2 - exit to single user shell
Enter a 1 or 2: 1
Beginning system installation - probing for disks.
Which disk do you want to be your miniroot system disk?
  1 - sd1:  <CD-ROM Disc for SunOS Installation> at esp0 slave 8
  2 - sd3:  <drive type unknown>> at esp0 slave 0
  3 - exit to single user shell
Enter a 1, 2 or 3: 2
selected disk unit "sd3".
Do you want to format and/or label disk "sd3"?
  1 - yes, run format
  2 - no, continue with loading miniroot
  3 - no, exit to single user shell
Enter a 1, 2, or 3: 1

Nótese que el sistema que ha arrancado tiene su propia idea de cómo ordenar las unidades conectadas. El dispositivo desde el que hemos arrancado (el segundo disco duro) recibe el nombre sd1 y nuestro disco destino es nombrado sd3. Escogemos formatear este último. Escogemos el tipo "SUN2.1G":

format> type


AVAILABLE DRIVE TYPES:
        0. Quantum ProDrive 80S
        1. Quantum ProDrive 105S
        2. CDC Wren IV 94171-344
        3. SUN0104
        4. SUN0207
        5. SUN0320
        6. SUN0327
        7. SUN0424
        8. SUN0535
        9. SUN0669
        10. SUN1.0G
        11. SUN1.05
        12. SUN1.3G
        13. SUN2.1G
        14. CD-ROM Disc for SunOS Installation
        15. other
Specify disk type (enter its number): 13
selecting sd3: <SUN2.1G>
[disk formatted, no defect list found]

Los formatos de disco predefinidos están almacenados en /etc/format.dat en el sistema de ficheros miniroot. La ruta a nuestra imagen miniroot en el CD-ROM es:

EXPORT/EXEC/KVM/SUN4M_SUNOS_4_1_4/MINIROOT_SUN4M

En format.dat encontramos la geometría de disco de nuestro tipo de disco:

disk_type = "SUN2.1G" \
	: ctlr = SCSI : fmt_time = 4 \
	: ncyl = 2733 : acyl = 2 : pcyl = 3500 : nhead = 19 : nsect = 80 \
	: rpm = 5400 : bpt = 44823

y para las particiones predefinidas:

partition = "SUN2.1G_PREINSTALL" \
        : disk = "SUN2.1G" : ctlr = SCSI \
        : a = 0, 62320 : b = 41, 197600 : c = 0, 4154160 : g = 171, 1947120 \
        : h = 1452, 1947120

partition = "SUN2.1G_STANDARD" \
        : disk = "SUN2.1G" : ctlr = SCSI \
        : a = 0, 62320 : b = 41, 197600 : c = 0, 4154160 : g = 171, 3894240

Nótese que ncyl*nhead*nsect=4154160 es el número de bloque de 512 bytes en la tercera partición, que comprende todo el espacio disponible, mientras que el tamaño del disco es (ncyl+acyl)*nhead*nsect=4157200 bloques, que es aproximadamente 1.98 GB o 2.13e9 Bytes. Si se quiere instalar en una imagen de disco sin la geometría predefinida habrá que introducir las cifras por nuestra cuenta. . Para escribir la partición al disco e imprimir la tabla de partición hay que hacer:

format> label
Ready to label disk, continue? y

format> partition
partition> print
Current partition table (SUN2.1G_PREINSTALL):
        partition a - starting cyl      0, # blocks    62320 (41/0/0)
        partition b - starting cyl     41, # blocks   197600 (130/0/0)
        partition c - starting cyl      0, # blocks  4154160 (2733/0/0)
        partition d - starting cyl      0, # blocks        0 (0/0/0)
        partition e - starting cyl      0, # blocks        0 (0/0/0)
        partition f - starting cyl      0, # blocks        0 (0/0/0)
        partition g - starting cyl    171, # blocks  1947120 (1281/0/0)
        partition h - starting cyl   1452, # blocks  1947120 (1281/0/0)

partition> quit

El tamaño de la partición de intercambio b es 100 MB. En SunOS 4.x el tamaño de la partición para intercambio debe ser al menos el mismo que de la memoria RAM poque cada programa tiene reservado espació de intercambio equivalente a su ocupación en memoria. Cambiar el espacio de intercambio según nuestras necesidades y salir de la utilidad format con:

format> quit
checking writeability of /dev/rsd3b
0+1 records in
1+0 records out
Extracting miniroot ...
using cdrom partition number 3
fastread: failed to open /dev/rsr0No such device or address
ERROR while loading miniroot disk: /dev/rsd3b

La extraction del miniroot mediante el script extract script falla porque el dispositivo origen CD-ROM /dev/rsr0 no existe. En el fichero /extract encontramos las cifras (en bytes) para ubicr la imagen de miniroot:

miniskip=4194304
minicount=7168000

y el copiando para copiarla:

        fastread $cddev $cdpartno $miniskip $minicount > /dev/r${disk}b

Con esta información podemos extraer el miniroot a la partición de intercambio de nuestro disco destino:

# dd if=/dev/rsd1d bs=4096 skip=1024 count=1750 of=/dev/sd3b
1750+0 records in
1750+0 records out

Reiniciamos la máquina con:

# reboot

Instalación[editar]

De vuelta en el prompt de la ROM arrancamos el miniroot:

ok boot disk0:b -w

El indicador -w es necesario para hacer que el sistema de ficheros montado tenga permiso de escritura como requiere el programa SunInstall. El programa SunInstall no nos dejará escoger un disco duro como origen de la instalación. Así que enlazamos el dispositivo CD-ROM /dev/sr0 al disco duro asociado con nuestra imagen de CD-ROM:

# cd /dev
# mv sr0 sr0.bak
# ln -s sd1a sr0

SunInstall recreará nombres de dispositivo usando el script /dev/MAKEDEV. Para excluir /dev/sr0 de la recreación borramos su entrada en MAKEDEV:

# mv MAKEDEV MAKEDEV.bak
# sed 's/sr0 //' MAKEDEV.bak > MAKEDEV
# cd /

Ahora estamos listos para iniciar SunInstall:

# suninstall

                               Welcome to SunInstall

     Remember:  Always back up your disks before beginning an installation.

  SunInstall provides two installation methods:
     1. Quick installation

        This option provides an automatic installation with a choice of 
        standard installations, and a minimum number of questions asked. 

     2. Custom installation

        Choose this method if you want more freedom to configure your
        system.  You must use this option if you are installing your
        system as a server.

        Your choice (or Q to quit) >> 2


Select your terminal type:
        1) Televideo 925
        2) Wyse Model 50
        3) Sun Workstation
        4) Other

>> 4

Enter the terminal type ( the type must be in /etc/termcap ):
>> ansi

Enter the local time zone name (enter ? for help):

>> ?

El tipo de terminal ansi parece funcionar suficientemente bien. Si se encuentran problemas con la visualización de los menús de SunInstall, se pueden redibujar la pantalla con "Ctrl-l". Si se conoce el nombre de la zona horaria, se puede introducir directamente. Con "?"seremos guiados a través de un menú para seleccionar nuestra zona horaria. Después de confirmar la correcta configuración de la zona horaria seremos guiados al formulario que nos asignará la información del host:

 HOST FORM                [?=help] [DEL=erase one char] [RET=end of input data]
-----------------------------------------------------------------------------
 Workstation Information :
      Name : sunguest
      Type : x[standalone]  [server]  [dataless]





 Network Information :
      Ethernet Interface :  [none] x[le0]

      Internet Address   : 10.0.2.15  
      NIS Type           : x[none]  [master]  [slave]  [client]


 Misc Information :
      Reboot after completed        :  [y] x[n]



 Are you finished with this form [y/n] ? y
    [x/X=select choice] [space=next choice] [^B/^P=backward] [^F/^N=forward]

En este ejemplo establecemos el nombre del host como "sunguest" y 10.0.2.15 es la dirección estándar asignada al sistema guest por QEMU. El siguiente formulario nos permite asignar la información de disco:

 DISK FORM                [?=help] [DEL=erase one char] [RET=end of input data]
 -----------------------------------------------------------------------------
 Attached Disk Devices :
    [sd1]    x[sd3]

 Disk Label :  [default] x[use existing]  [modify existing]
 Free Hog Disk Partition :  [d]  [e]  [f]  [g] x[h]
 Display Unit            : x[Mbytes]  [Kbytes]  [blocks]  [cylinders]

 PARTITION START_CYL BLOCKS    SIZE     MOUNT PT             PRESERVE(Y/N)
 ==============================================================================
     a     0         62320     31       /                          n
     b     41        197600    100
     c     0         4154160   2126
     d     0         0         0
     e     0         0         0
     f     0         0         0
     g     171       1947120   996      /usr                       n
     h     1452      1947120   996      /home                      n



 Ok to use this partition table [y/n] ? y
    [x/X=select choice] [space=next choice] [^B/^P=backward] [^F/^N=forward]

Finalmente establecemos el dispositivo origen y escogemos la selección de software:

 SOFTWARE FORM            [?=help] [DEL=erase one char] [RET=end of input data]
 -----------------------------------------------------------------------------
 Software Architecture Operations :
      x[add new release]  [edit existing release]




 Media Information :
      Media Device   :  [st0]  [st1]  [st2]  [st_]  [xt0]  [mt0]  [fd0] x[sr0]
      Media Location : x[local]  [remote]


 Choice : x[all]  [default]  [required]  [own choice]
      Executables path :  /usr
      Kernel executables path :  /usr/kvm






 Ok to use these values to select Software Categories [y/n] ? y
    [x/X=select choice] [space=next choice] [^B/^P=backward] [^F/^N=forward]

Se nos informa de los paquetes de software que se instalarán y llegamos a la última pantalla, desde la que podemos comenzar la instalación:

 MAIN MENU                                                            [?=help]
 -----------------------------------------------------------------------------
                   Sun Microsystems System Installation Tool

                     ( + means the data file(s) exist(s) )


                    +     assign host information

                    +     assign disk information

                    +     assign software information





                          start the installation

                          exit suninstall



  [RET/SPACE=next choice] [x/X=select choice] [^B/^P=backward] [^F/^N=forward]

La existencia de ficheros de datos marcados con "+" indica que esos datos no se perderán, incluso si reiniciamos la máquina. Después de que finalice su tarea SunInstall, podemos reiniciar con

# reboot

y deberemos ser capaces de arrancar nuestro nuevo sistema con:

ok boot disk0

En el prompt para hacer login podemos escribir root y obtendremos un shell sin contraseña. El sistema se puede parar con

# halt

y la máquina puede apagarse con:

ok power-off

Red[editar]

Configuración Guest[editar]

Si se quiere direccionar el sistema host por nombre de host hay que asignarlo a la dirección IP 10.0.2.2 en /etc/hosts (en el guest):

# cat >> /etc/hosts
10.0.2.2 qemuhost
^D

donde ^D significa Ctrl-d. Un nombre de host es necesario para hacer rlogin, rsh y rcp en el guest. Para una conexión al exterior establecemos la ruta por defecto con

# route add default 10.0.2.2 1
add net default: gateway 10.0.2.2

y la hacemos permanente con:

# cat > /etc/defaultrouter
10.0.2.2
^D

Compruebe las rutas con:

# netstat -r
Routing tables
Destination          Gateway              Flags    Refcnt Use        Interface
localhost            localhost            UH       1      288        lo0
default              qemuhost             UG       0      0          le0
arpanet              sunguest             U        2      96         le0

Red de usuario[editar]

Con el valor por defecto de red de back end de QEMU podemos utilizar la opción -redir para habilitar conexiones entre el host y el guest por telnet (puerto 23), rlogin al guest (puerto 513), o la copia de ficheros entre el host y el guest con rcp (puerto 514). También se puede usar telnet para conectar desde el guest hacia el mundo exterior si el sistema host está conectado a Internet. Para rlogin y rcp necesitaremos acceso de root en un sistema host Linux para definir las reglas de filtrado de paquetes. Iniciaremos la máquina emulada con:

$ qemu-system-sparc -monitor tcp::4444,server,nowait -bios ss5.bin -m 32 -nographic -hda sunos414.img \
-redir tcp:4423:10.0.2.15:23 -redir tcp:4513:10.0.2.15:513 -redir tcp:4514:10.0.2.15:514

Usar el comando info del monitor de QEMU para obtener una tabla de todos los puertos redireccionados:

(qemu) info usernet
info usernet
VLAN 0 (user.0):
  Protocol[State]    FD  Source Address  Port   Dest. Address  Port RecvQ SendQ
  TCP[HOST_FORWARD]  10               *  4423       10.0.2.15    23     0     0
  TCP[HOST_FORWARD]   9               *  4513       10.0.2.15   513     0     0
  TCP[HOST_FORWARD]   8               *  4514       10.0.2.15   514     0     0

Los puertos del host que son redireccionados deben ser mayors que 102 (mientras que no se ejecuta qemu como root). Para comprobar en que puertos está escuchando QEMU, hacer:

$ netstat -tulpn | grep qemu
tcp        0      0 0.0.0.0:4514            0.0.0.0:*               LISTEN      27021/qemu-system-s 
tcp        0      0 0.0.0.0:4423            0.0.0.0:*               LISTEN      27021/qemu-system-s 
tcp        0      0 0.0.0.0:4444            0.0.0.0:*               LISTEN      27021/qemu-system-s 
tcp        0      0 0.0.0.0:4513            0.0.0.0:*               LISTEN      27021/qemu-system-s 

Despues de que ha arrancado el sistema guest podemos conectar desde el host al guest:

$ telnet localhost 4423

y desde el guest al host:

# telnet 10.0.2.2

o desde el guest al exterior (india.colorado.edu proporciona el tiempo universal coordinado):

# telnet 128.138.140.44 13
Trying 128.138.140.44 ...
Connected to 128.138.140.44.
Escape character is '^]'.

56365 13-03-14 00:33:39 50 0 0 147.2 UTC(NIST) * 
Connection closed by foreign host.

Podemos incluso comprobar desde el guest, con el commando ping, que el host está disponible:

# ping 10.0.2.2
10.0.2.2 is alive

Rlogin y rcp usan puertos fijos. Definimos reglas de dirección de puertos en el host para conseguir una conexión hacia el guest. Para que esto funcione, puede ser necesario desactivar nuestro cortafuegos (o ver más abajo para una configuración más precisa) antes de ejecutar como root:

$ iptables -t nat -I OUTPUT -o lo -p tcp --dport 513 -j REDIRECT --to-ports 4513
$ iptables -t nat -I OUTPUT -o lo -p tcp --dport 514 -j REDIRECT --to-ports 4514

Muestre las reglas con:

$ iptables -t nat -n -L OUTPUT
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:514 redir ports 4514 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:513 redir ports 4513 

Estas reglas se pueden eliminar con:

$ iptables -t nat -D OUTPUT 1
$ iptables -t nat -D OUTPUT 1

Bajo openSUSE 11.4, deshabilitar el cortafuegos eliminará estas reglas. Por lo tanto detendremos el cortafuegos primero y después definiremos las reglas. Alternativamente podremos mantener el cortafuegos levantado y eliminar únicamente la siguiente regla:

$ iptables -t raw -n -L OUTPUT
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
NOTRACK    all  --  0.0.0.0/0            0.0.0.0/0           

con el comando:

$ iptables -t raw -D OUTPUT 1

Esta regla puede ser restaurada con:

$ iptables -t raw -A OUTPUT -j NOTRACK

o deteniendo el cortafuegos e iniciándolo de nuevo. Ahora deberíamos ser capaces de conectar desde el host al guest con:

$ rlogin -l root localhost

y de copiar ficheros como root en el host en ambos sentidos:

$ rcp file_on_host localhost:
$ rcp localhost:file_on_guest .

Para usar rcp como un usuario normal en el host, deberíamos crear un usuario con el mismo nombre en el guest. Por razones desconocidas para el autor, un comando de shell remoto como

$ rsh localhost uname

falla dando:

socket: protocol failure in circuit setup

Rlogin, rsh y rcp desde el guest al host no funciona con esta configuración. Redirigir el puerto con

$ ssh -L 23:localhost:4423 localhost

(como root) funciona para Telnet, pero cuando se redirigen los puertos 513 y 514 cobre SSH, las conexiones no se pueden establecer desde el host. Los mensajes de error son:

rlogind: Permission denied.

cuando se intenta hacer rlogin al guest y

rcmd: localhost: short read

cuando se intenta hacer rcp al guest.

Usar un dispositivo TAP[editar]

En la anterior sección hemos visto las deficiencias de las red de usuario de QEMU. Usar el back end de red de ap permite una conexión sin restricciones entre el host y el guest. Para crear y configurar interfaces TUN/TAP en un host Linux necesitamos acceso como root:

$ tunctl -t tap0 -u user_name_on_host
$ ifconfig tap0 10.0.2.2 netmask 255.255.255.0

Iniciamos qemu con el comando:

$ qemu-system-sparc -monitor tcp::4444,server,nowait -nographic -bios ss5.bin -m 32 -hda sunos414.img \
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=no,downscript=no

Desde el host usamos la dirección 10.0.2.15 para acceder al host y desde el guest usamos la dirección 10.0.2.2 para acceder al host. Para rlogin y compañía en el guest necesitamos hacer referencia al sistema host con el nombre del host definido en /etc/hosts. Debemos ser capaces de hacer ping y de conectar con Telnet, rlogin, rsh y rcp sin problema si está permitido por la configuración del host. El rlogin como root puede estar deshabilitado completamente en el host y para los usuarios normalmente necesitamos añadir la dirección 10.0.2.2 a ~/.rhosts. Debe haber configurado (o deshabilitado) un cortafuegos en el host para permitir ese tipo de conexiones. También podemos ejecutar programas X Windows en el guest mostrándolos en el X server del host:

$ xhost +10.0.2.15

(en el host) permitirá acceso desde el guest y

# usr/openwin/bin/xterm -display 10.0.2.2:0

inicia el emulador de terminals para el sistema X Window en el gues, mostrado en una ventana del host. Podemos dar acceso al guest a Internet habilitando el reenvío IP en el host:

$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

donde wlan0 es el dispositivo de red que conecta el host a Internet (normalmente eth0 para una conexión LAN). Podría ser necesario deshabilitar el cortafuegos en el host para que esto funcionara.

Ejecutar OpenWindows[editar]

Con la configuración de red TAP/TUN, establecer las siguentes variables de entorno en el guest:

# setenv DISPLAY 10.0.2.2:1.0
# setenv OPENWINHOME /usr/openwin
# setenv PATH $OPENWINHOME/bin:$PATH
# setenv LD_LIBRARY_PATH $OPENWINHOME/lib
# setenv MANPATH $OPENWINHOME/share/man:/usr/man
# setenv HELPPATH $OPENWINHOME/lib/help

Exportamr el display a un segundo X server que se está ejecutando en una ventana de nuestro X server host:

$ Xephyr :1 -ac -screen 1152x900 &

Iniciar el gestor de ventanas en el guest:

# olwm &

Se debería ver el escritorio OpenWindows en la ventana Xephyr. Hacer clic con el botón derecho del ratón para el menú de aplicación. Desafortunadamente, el visor de ayuda se niega a iniciar dando:

XView error: NULL pointer passed to xv_set