Mostrando las entradas con la etiqueta solaris. Mostrar todas las entradas
Mostrando las entradas con la etiqueta solaris. Mostrar todas las entradas

martes, 6 de diciembre de 2011

Cambiar el nombre de un equipo Solaris

Cambiar el nombre a un equipo Solaris en realidad es algo muy sencillo, simplemente se debe modificar el archivo /etc/nodename con el nuevo nombre.

También debemos hacer algunas modificaciones en los archivos de configuración de red para que funcione correctamente, se debe modificar el archivo de la interfaz de red principal /etc/hostname.interfaz y en el caso de usar una IP fija, también se deberá modificar el archivo /etc/hosts

Una vez realizados estos cambios se debe reiniciar el equipo para que utilice la nueva configuración.

También es cierto que este cambio se puede realizar en línea por medio del comando hostname, en cualquier caso, los archivos deben modificarse para que el cambio sea “permanente”. El cambio en línea no es recomendable en servidores en producción debido a que hay aplicaciones que al iniciar indagan el nombre del equipo y lo utilizan durante la “corrida” del programa como parte de su funcionalidad, por lo que siempre se recomienda hacer el cambio con aplicaciones abajo.

jueves, 27 de octubre de 2011

Configurar una interfaz de red en Solaris (parte 3)

Continuando con el tema de configurar una interfaz de red, en esta ocasión veremos cómo configurar una IP virtual.

Una IP virtual es aquella que se agrega a una interfaz ya configurada con otra IP llamada real, la razón por la que se le denomina IP virtual es porque es necesario crear una nueva instancia del dispositivo, es decir, creamos un dispositivo virtual con la dirección adicional. Normalmente una IP virtual se encuentra en la misma LAN de la IP real, sin embargo, no es una regla, depende del uso que se le va a dar.

Los usos de una IP virtual pueden ser muy variados: es posible que la aplicación requiera una IP para cada componente; puede ser una aplicación que originalmente corría en otro servidor tuvo que ser "migrada" al actual; también es posible que sea una IP asociada a una máquina virtual (un contenedor), o tal vez, se trate de un esquema de alta disponibilidad en el que la ejecución de la aplicación se puede "pasar" de un servidor a otro con todo y su IP (un cluster activo-pasivo). En cualquier caso, aunque la forma de crear las IP's virtuales puede variar, en esencia, es el mismo principio para todas.

Para mostrar cómo se configura la IP virtual, voy a utilizar un servidor llamado solaris10 con la IP fija 192.168.100.51/255.255.255.0 y vamos a crear la IP virtual 192.168.100.50

# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.100.51 netmask ffffff00 broadcast 192.168.100.255
        ether 0:c:29:5b:b3:1d
# netstat -rn
Routing Table: IPv4
  Destination           Gateway           Flags  Ref     Use     Interface
-------------------- -------------------- ----- ----- ---------- ---------
default              192.168.100.2        UG        1          0
192.168.100.0        192.168.100.51       U         1          3 e1000g0
224.0.0.0            192.168.100.51       U         1          0 e1000g0
127.0.0.1            127.0.0.1            UH        3         68 lo0

Ahora vamos a crear la IP virtual con la instrucción addif del comando ifconfig.

# ifconfig e1000g0 addif 192.168.100.50 netmask + broadcast + up
Created new logical interface e1000g0:1

Con los parámetros netmask + y broadcast + le indico que configure la máscara y el broadcast más convenientes; con up  que deje "encendida" a la interfaz, es decir, que permita el envío y recepción a través de la interfaz. Ahora veamos cómo queda, noten que el dispositivo virtual no posee una MAC, debido a que utiliza la misma que el dispositivo real.

# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.100.51 netmask ffffff00 broadcast 192.168.100.255
        ether 0:c:29:5b:b3:1d
e1000g0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.100.50 netmask ffffff00 broadcast 192.168.100.255
# netstat -rn
Routing Table: IPv4
  Destination           Gateway           Flags  Ref     Use     Interface
-------------------- -------------------- ----- ----- ---------- ---------
default              192.168.100.2        UG        1          0
192.168.100.0        192.168.100.51       U         1          5 e1000g0
192.168.100.0        192.168.100.50       U         1          0 e1000g0:1
224.0.0.0            192.168.100.51       U         1          0 e1000g0
127.0.0.1            127.0.0.1            UH        3         68 lo0

Como les mencione anteriormente, existen varias formas de crear las IP's virtuales, una muy usual es crear el dispositivo virtual con plumb de la forma: ifconfig interfaz:instancia plumb; posteriormente se configura la IP igual que un dispositivo real. Mi recomendación es utilizar addif por dos razones: la primera, ahorran el paso de crear el dispositivo; la segunda, no necesitan llevar la cuenta de qué instancia sigue.

Para dejar esta configuración en forma permanente vamos a modificar al archivo /etc/hostname.interfaz que en este caso se llama /etc/hostname.e1000g0:

# cat /etc/hostname.e1000g0
192.168.100.51 netmask + broadcast + up \
addif 192.168.100.50 netmask + broadcast + up

Como podrán observar son los parámetros del comando ifconfig, la función del backslash (\) es simplemente separar lo que corresponde a la IP real de la virtual.

De esta forma, la IP virtual queda operando y podrá el servidor recibir conexiones tanto por la IP real como la virtual, por lo cual, si la IP virtual va a ser utilizada por alguna aplicación que reciba conexiones desde otro equipo (un servidor web, por ejemplo) no tendrá ningún problema (estas conexiones son las conocidas como conexiones entrantes). Sin embargo, quiero resaltar el hecho de que en el caso de las conexiones salientes, por la forma en la que la tabla de ruteo señala la ruta hacia la red local, utilizará ambas IP's para salir, es decir, en algunas ocasiones se conectará por medio de la 192.168.100.51 y en otras por la 192.168.100.50. Menciono ésto porque en algunos sistemas es relevante desde que IP se inicia la conexión y esto puede ser por razones administrativas, funcionales o de seguridad.

La forma de controlar desde qué IP se va conectar el equipo es "depreciando" la IP con la que no queremos se conecte por medio de la instrucción deprecated del comando ifconfig, de la forma: ifconfig interfaz deprecated. En nuestro ejemplo, vamos depreciar la IP real: ifconfig e1000g0 deprecated

# ifconfig e1000g0 deprecated
# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1040843<UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4> mtu 1500 index 2
        inet 192.168.100.51 netmask ffffff00 broadcast 192.168.100.255
        ether 0:c:29:5b:b3:1d
e1000g0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.100.50 netmask ffffff00 broadcast 192.168.100.255
# netstat -rn
Routing Table: IPv4
  Destination           Gateway           Flags  Ref     Use     Interface
-------------------- -------------------- ----- ----- ---------- ---------
default              192.168.100.2        UG        1          0
192.168.100.0        192.168.100.50       U         1          2 e1000g0:1
192.168.100.0        192.168.100.50       U         1          0 e1000g0
224.0.0.0            192.168.100.51       U         1          0 e1000g0
127.0.0.1            127.0.0.1            UH        4        147 lo0

Observen el cambio en la tabla de ruteo para la red local, le indica que tanto en la interfaz real como en la virtual utilice la IP 192.168.100.50 (Nota: en el caso del multicast 224.0.0.0 no afecta porque no es a la red local). Para que la configuración quede en forma permanente solo basta agregar la instrucción deprecated en el archivo /etc/hostname.interfaz en la línea que corresponda a la IP a depreciar:

# cat /etc/hostname.e1000g0
192.168.100.51 netmask + broadcast + deprecated up \
addif 192.168.100.50 netmask + broadcast + up

miércoles, 26 de octubre de 2011

Configurar una interfaz de red en Solaris (parte 2)

En la entrada anterior vimos cómo configurar a una interfaz de red con una IP fija, en esta ocasión, veremos como configurarla con una IP dinámica por medio del DHCP.

Pero, ¿qué es el DHCP?

Es un servicio TCP/IP que utiliza el protocolo UDP con el puerto 67 y que, básicamente, consiste en asignarle una IP a quién lo “solicite” de un pool de IP’s que posee para este fin.

Lo más lógico sería suponer que este protocolo debería operar en capa 3 pero no es así, opera en capa 5.

¿Cómo es posible tener una comunicación en ese nivel sin tener una dirección IP?. El cliente DHCP, provisionalmente, asigna la IP 0.0.0.0 a la interfaz y envía una petición a la IP 255.255.255.255, esta IP esta reservada como un broadcast en cualquier red local no importando su direccionamiento. El servidor atiende la petición, asigna una IP y la “ofrece” al cliente; el cliente acepta la IP ofrecida y la solicita; el servidor asocia la IP a la MAC del cliente y envía una respuesta de confirmación junto con otros parámetros tales como: máscara, dirección del broadcast y ruteador. Adicional a esto, el servidor puede enviar otros datos y que, por lo regular, incluyen las direcciones de los servidores DNS, el nombre del dominio, las direcciones de los servidores WINS, etc.

En Solaris el cliente DHCP se llama dhcpagent y es controlado por el comando ifconfig utilizando la instrucción dhcp, de la forma: ifconfig interfaz dhcp start

# ifconfig e1000g0 dhcp start

En esta forma, el agente asignará una IP en forma dinámica para la interfaz, además del broadcast y la máscara. Adicionalmente, dará de alta una ruta en la tabla de ruteo.

Lo normal es que este tipo de configuración se utilice sólo para estaciones de trabajo (más adelante comento la razón) y solamente en la interfaz principal. Generalmente se configura en forma permanente de la siguiente manera:

  • Se crea el archivo /etc/dhcp.interfaz en donde interfaz representa el nombre de la interfaz principal, este archivo normalmente esta vacío y puede contener parámetros específicos (consultar archivo /etc/default/dhcpagent)
  • Crear o modificar el archivo /etc/hostname.interfaz para que contenga la línea: inet hostname, donde hostname es un nombre de host que, por lo regular, es el nombre del servidor.

En este ejemplo, creamos el archivo vacío: /etc/dhcp.e1000g0 y en el archivo hostname.e1000g0 dejamos la línea: inet solaris10 (solaris10 es el nombre del equipo).

Después de esto podemos reiniciar el equipo, sin embargo, antes de eso, les recomiendo editar el archivo /etc/hosts, si existe una línea para el hostname del equipo, borrarla, y en la línea de la dirección 127.0.0.1 localhost adicionarle como un nombre adicional loghost de esta forma:

# cat /etc/hosts
#
# Internet host table
#
::1     localhost
127.0.0.1       localhost       loghost

Reiniciamos y observen cómo configura a la interfaz:

# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4> mtu 1500 index 2
        inet 192.168.100.101 netmask ffffff00 broadcast 192.168.100.255
        ether 0:c:29:5b:b3:1d
# netstat -rn

Routing Table: IPv4
  Destination           Gateway           Flags  Ref     Use     Interface
-------------------- -------------------- ----- ----- ---------- ---------
default              192.168.100.2        UG        1          0 e1000g0
192.168.100.0        192.168.100.101      U         1         17 e1000g0
224.0.0.0            192.168.100.101      U         1          0 e1000g0
127.0.0.1            127.0.0.1            UH        4        401 lo0
# cat /etc/hosts
#
# Internet host table
#
::1     localhost
127.0.0.1       localhost       loghost
192.168.100.101 solaris10       # Added by DHCP

Adicional a esto, también configura la parte del cliente DNS:

# cat /etc/resolv.conf
domain unixymas.com.mx
nameserver 192.168.100.2

# cat /etc/nsswitch.conf
#
# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# ident "@(#)nsswitch.files     1.14    06/05/03 SMI"

#
# /etc/nsswitch.files:
#
# An example file that could be copied over to /etc/nsswitch.conf; it
# does not use any naming service.
#
# "hosts:" and "services:" in this file are used only if the
# /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports.

passwd:     files
group:      files
#hosts:      files # Commented out by DHCP
hosts: files dns # Added by DHCP
#ipnodes:    files # Commented out by DHCP
ipnodes: files dns # Added by DHCP
networks:   files
protocols:  files
rpc:        files
ethers:     files
netmasks:   files
bootparams: files
publickey:  files
# At present there isn't a 'files' backend for netgroup;  the system will
#   figure it out pretty quickly, and won't use netgroups at all.
netgroup:   files
automount:  files
aliases:    files
services:   files
printers:       user files

auth_attr:  files
prof_attr:  files
project:    files

tnrhtp:     files
tnrhdb:     files

En esta forma nuestro equipo queda configurado con una IP dinámica, lo cual es muy conveniente para una estación de trabajo y no importa si es necesario modificar a la red o si es necesario moverla a otra parte, siempre y cuando, en nuestra red exista un servidor DHCP.

Como les comentaba anteriormente, no es recomendable esta configuración para un servidor, menos si se trata de un servidor en producción ya que la IP puede ser modificada por el servidor DHCP. Aunque se realice la modificación en un servidor DNS con la nueva dirección, lo cierto es que existiría un tiempo de desfasamiento entre la IP anterior y la nueva que, simplemente, se puede resolver evitando esta modificación en forma dinámica (Nota: de hecho, este desfasamiento es la razón por la que en los ambientes de alta disponibilidad los servicios siempre van asociados cada uno a una IP, ya que es más rápido migrar una IP de una interfaz a otra que hacer el cambio en un servidor de dominio). Aunque existe la posibilidad de asignar en forma permanente la IP en el servidor DHCP, la mejor práctica es reservar siempre una parte del segmento de red para su uso con IP’s fijas (e incluso reservar segmentos completos para esto) por lo que en el servidor DHCP se configuran fragmentos de segmentos de red como pool de IP’s.

Y ya que mencionamos ambientes de alta disponibilidad, algo muy básico en éstos es el uso de IP’s virtuales por lo que en la siguiente entrega veremos cómo configurarlas en su forma básica.

jueves, 20 de octubre de 2011

Configurar una interfaz de red en Solaris (parte 1)

Para que nuestro equipo Solaris (estación de trabajo o servidor) se pueda conectar a una red es necesario configurar, al menos, una interfaz de red con una IP estática o dinámica (la diferencia entre una IP estática y dinámica es que la primera debe ser proporcionada en forma manual y la segunda será proporcionada por otro servidor dedicado a esto a través del protocolo DHCP).

Si bien, es cierto, podemos configurar a una interfaz de red desde la instalación de sistema operativo, muchas veces requeriremos de configurar interfaces después de la instalación.

El primer paso es identificar la NIC que debemos activar, aunque es, en apariencia, muy obvio en realidad es sorprendente el número de ocasiones que tendremos que “sufrir” un poco para encontrar el dispositivo que corresponde. Aunque existen otros métodos, creo que el más genérico es por medio del comando prtdiag.

# prtdiag –v | less

Yo en lo personal, prefiero utilizar less en lugar de more debido a que es más fácil navegar a través de la salida del comando prtdiag.

Buscamos la cadena “net” y revisamos el dispositivo, en mi ejemplo, éste fue el dispositivo que encontré:

         name='model' type=string items=1
             value='Ethernet controller'
         name='power-consumption' type=int items=2
             value=00000001.00000001
         name='66mhz-capable' type=boolean
         name='devsel-speed' type=int items=1
             value=00000001
         name='interrupts' type=int items=1
             value=00000001
         name='max-latency' type=int items=1
             value=00000000
         name='min-grant' type=int items=1
             value=000000ff
         name='subsystem-vendor-id' type=int items=1
             value=000015ad
         name='subsystem-id' type=int items=1
             value=00000750
         name='unit-address' type=string items=1
             value='0'
         name='class-code' type=int items=1
             value=00020000
         name='revision-id' type=int items=1
             value=00000001
         name='vendor-id' type=int items=1
             value=00008086
         name='device-id' type=int items=1
             value=0000100f
     Interrupt Specifications:
         Interrupt Priority=0x6 (ipl 6), vector=0xa (10)
     Device Minor Nodes:
         dev=(71,1)
             dev_path=/pci@0,0/pci15ad,790@11/pci15ad,750@0:e1000g0
                 spectype=chr type=minor
                 dev_link=/dev/e1000g0
         dev=(71,1002)
             dev_path=<clone>
             Device Minor Layered Under:
                 mod=udp accesstype=chr
                     dev_path=/pseudo/udp@0
         dev=(71,1003)
             dev_path=<clone>
             Device Minor Layered Under:
                 mod=udp accesstype=chr
                     dev_path=/pseudo/udp@0

Observen que indica que se trata de un dispositivo Ethernet y que la ruta del dispositivo es la que está indicada como dev_link y que corresponde a /dev/e1000g0

En este caso, es la única interfaz que posee el equipo, por lo que este debe ser el dispositivo que busco sin duda alguna, sin embargo, ya es muy común encontrar servidores con más de una interfaz, por lo que debemos constatar que si corresponde a la interfaz con la que debemos trabajar, habrá ocasiones en la que debamos utilizar el método de prueba y error.

Ya seleccionado el dispositivo de la interfaz vamos proceder a activarla con el comando ifconfig.

# ifconfig e1000g0 plumb

Con el primer parámetro le indicamos el dispositivo con el que vamos a trabajar, no es necesario indicar toda la ruta /dev/e1000g0. El siguiente es la instrucción plumb, la cual, activa al dispositivo.

A continuación, procedemos a configurar la interfaz, también con el comando ifconfig.

# ifconfig e1000g0 inet 192.168.188.22 netmask 255.255.255.0 broadcast + up

Los parámetros son:

  • e1000g0: El dispositivo
  • inet 192.168.188.22: La IP fija que vamos a asignarle a la interfaz
  • netmask 255.255.255.0: La máscara de red
  • broadcast +: Que utilice como dirección reservada para el broadcast la última dirección del segmento
  • up: Que deje a la interfaz arriba (es decir, encendida)

Es una buena práctica el indicarle todos estos parámetros ya que de lo contrario corremos el riesgo de que quede mal establecido el segmento de red y el equipo no pueda localizar algunas direcciones (Nota: en la práctica real, observarán que en algunas ocasiones el servidor no puede conectarse con algunas direcciones, pero con otras si, en esos casos lo primero que debemos revisar es si los parámetros de subnet mask y brodcast están bien designados).

Una vez realizado lo anterior, podemos decir que ya tenemos el equipo en red, sin embargo, hasta este punto solo va a ser posible su comunicación con otros equipos de la red local, es necesario configurar un ruteador para que puede comunicarse con equipos remotos.

En este ejemplo, vamos a configurar el ruteador por default utilizando el comando route.

# route add default 192.168.188.2

Los parámetros que utilizamos indican lo siguiente:

  • add: Le indica que vamos a agregar una ruta, la instrucción contraria es delete
  • default: Esta palabra indica que ésta es la ruta por default, en su lugar, puede ser la dirección de una red o la de un host (por ejemplo: host 192.168.190.2 ó net 192.168.190.0)
  • 192.168.188.2: La IP del ruteador, esta IP debe ser local

La forma de revisar la configuración con los comandos ifconfig (para la interfaz) y netstat (para el ruteador) es la siguiente:

# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.188.22 netmask ffffff00 broadcast 192.168.188.255
        ether 0:c:29:4b:86:96
# route add default 192.168.188.2
add net default: gateway 192.168.188.2
# netstat -rn

Routing Table: IPv4
  Destination           Gateway           Flags  Ref     Use     Interface
-------------------- -------------------- ----- ----- ---------- ---------
default              192.168.188.2        UG        1          0
192.168.188.0        192.168.188.22       U         1          1 e1000g0
224.0.0.0            127.0.0.1            U         1          0 lo0
127.0.0.1            127.0.0.1            UH        9        463 lo0

Por último, vamos a configurar al equipo para que esta configuración quede en forma permanente, para la configuración de la interfaz, vamos a crear en el directorio /etc un archivo llamado hostname.nic donde nic es el nombre de la interfaz, en este ejemplo: hostname.e1000g0. En este archivo podemos, simplemente, agregar la dirección IP. Sin embargo, en muchos manuales encontrarán que en este archivo por lo regular se escribe un nombre de host (hostname) en la forma canónica, dicho hostname debe existir en el archivo /etc/hosts. Adicional a esto, lo normal es que una de las interfaces utilice como hostname el mismo nombre definido para el equipo (a esta interfaz se le conoce como la interfaz principal). Para este ejemplo, en el que solo va a quedar configurada una sola interfaz, vamos a utilizar el modo canónico escribiendo en el archivo hostname.e1000g0 el nombre del equipo (solaris10) y el archivo /etc/hosts lo dejaremos de la siguiente forma:

# cat /etc/hosts
#
# Internet host table
#
::1     localhost
127.0.0.1       localhost
192.168.188.22  solaris10       loghost

También es importante indicar la máscara de red, para lo cual, utilizamos el archivo /etc/inet/netmasks para indicar la máscara que corresponde a la red, recuerden que la máscara para este ejemplo es la 255.255.255.0, por lo que la red es la 192.168.188.0/24 (en un artículo anterior se muestra cómo se definen los segmentos). El archivo quedará en la siguiente forma:

# cat /etc/inet/netmasks
#
# The netmasks file associates Internet Protocol (IP) address
# masks with IP network numbers.
#
#       network-number  netmask
#
# The term network-number refers to a number obtained from the Internet Network
# Information Center.
#
# Both the network-number and the netmasks are specified in
# "decimal dot" notation, e.g:
#
#               128.32.0.0 255.255.255.0
#
192.168.188.0   255.255.255.0

Y por último, el ruteador por default se define mediante el archivo /etc/defaultrouter, al cual, contendrá la dirección del ruteador, en este ejemplo, la 192.168.188.2.

De esta forma, nuestra interfaz quedará configurada con una IP fija, en el siguiente artículo veremos como utilizar una IP dinámica.

martes, 5 de octubre de 2010

Activar el uso de sesiones gráficas remotas en Solaris 10 (XDMCP)

Esta es la forma de permitir el uso de sesiones gráficas remotas a un servidor Solaris 10 que fue instalado dándole “si” a la opción de cerrar servicios remotos.

En un servidor así, solo se permite el inicio de sesiones gráficas desde la consola, pero si es necesario el poder iniciar sesión desde otras estaciones de trabajo, lo que debemos hacer es activar al administrador de sesiones para que permita la conexión remota.

Esta sesión remota se logra mediante el protocolo XDMCP, el cual, utiliza el puerto 177 UDP, este servicio lo proporciona el cde-login, por lo que vamos a realizar una modificación en este servicio utilizando el comando svccfg:

svccfg -s cde-login

Al ejecutar este comando vamos a entrar a “una consola” que nos permitirá modificar los atributos del servicio, ejecutamos lo siguiente:

svc:/application/graphical-login/cde-login> setprop dtlogin/args = astring: ""
svc:/application/graphical-login/cde-login> end

Después, le indicamos al servicio que vuelva a “leer” sus atributos y que reinicie:

svcadm refresh cde-login
svcadm restart cde-login

Por último, vamos a activar el servidor de fuentes, el cual, es necesario para algunos servidores X.

svcadm enable xfs

image

domingo, 3 de octubre de 2010

Migración de sistema basado en UFS a ZFS en Solaris 10

En la entrada anterior vimos a grandes rasgos, cómo crear un ZFS y mencioné algunas de sus ventajas con respecto al tradicional UFS. En esta ocasión vamos a ver cómo migrar nuestro sistema montado sobre UFS a ZFS.

Para esto requiero un disco libre, en el cual, voy a crear el pool que va a contener el sistema, en mi caso, estoy utilizando Solaris 10 en x86, por lo que debo inicializar el disco con fdisk:

fdisk c1t1d0p0
No fdisk table exists. The default partition for the disk is:

  a 100% "SOLARIS System" partition

Type "y" to accept the default partition,  otherwise type "n" to edit the
partition table.
y

Creo una partición:

format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c1t1d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@1,0
Specify disk (enter its number): 1
selecting c1t1d0
[disk formatted]

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> p

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit
partition> p
Current partition table (original):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0

partition> 0
Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0

Enter partition id tag[unassigned]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]: 1
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 2606e
partition> p
Current partition table (unnamed):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       1 - 2606       19.96GB    (2606/0/0) 41865390
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0

partition> label
Ready to label disk, continue? y

partition> q

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> q

Como va a contener el sistema operativo debo hacerlo booteable:

fdisk -b /usr/lib/fs/ufs/mboot /dev/rdsk/c1t1d0p0
             Total disk size is 2610 cylinders
             Cylinder size is 16065 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1       Active    Solaris2          1  2609    2609    100

SELECT ONE OF THE FOLLOWING:
   1. Create a partition
   2. Specify the active partition
   3. Delete a partition
   4. Change between Solaris and Solaris2 Partition IDs
   5. Exit (update disk configuration and exit)
   6. Cancel (exit without updating disk configuration)
Enter Selection: 5

installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t1d0s0
stage1 written to partition 0 sector 0 (abs 16065)
stage2 written to partition 0, 272 sectors starting at 50 (abs 16115)

Creamos el pool:

zpool create rpool c1t1d0s0

Ahora vamos a utilizar el Live Upgrade para iniciar esta migración, lo primero es crear un ambiente de booteo (Boot Environment) utilizando el comando lucreate:

lucreate -c BE_ufs_1009 -n BE_zfs_1009 -p rpool

Estos parámetros indican lo siguiente:

  • -c BE_ufs_1009: Es una identificación con la que vamos a nombrar el ambiente actual, es completamente a discreción. Para esta denominación en particular, estoy utilizando una muy común, BE es por boot environment, ufs por el sistema de archivo actual y 1009 por el release de Solaris.
  • -n BE_zfs_1009: Es la identificación del nuevo ambiente.
  • -p rpool: El pool que va a contener el nuevo ambiente.

Lo ejecutamos, van a aparecer algunos errores y advertencias que tienen que ver con el hecho de que es la primera vez que estamos definiendo ambiente de booteo.

Una vez concluido este proceso, revisamos los ambientes de booteo con lustatus:

lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
BE_ufs_1009                yes      yes    yes       no     -
BE_zfs_1009                yes      no     no        yes    -

Observen que el ambiente zfs aparece como completo, es muy importante que tenga este estatus. Ahora vamos a activar el nuevo ambiente con luactivate:

luactivate BE_zfs_1009
Generating boot-sign, partition and slice information for PBE <BE_ufs_1009>
A Live Upgrade Sync operation will be performed on startup of boot environment <BE_zfs_1009>.

Generating boot-sign for ABE <BE_zfs_1009>
NOTE: File </etc/bootsign> not found in top level dataset for BE <BE_zfs_1009>
Generating partition and slice information for ABE <BE_zfs_1009>
Boot menu exists.
Generating multiboot menu entries for PBE.
Generating multiboot menu entries for ABE.
Disabling splashimage
Re-enabling splashimage
No more bootadm entries. Deletion of bootadm entries is complete.
GRUB menu default setting is unaffected
Done eliding bootadm entries.

**********************************************************************

The target boot environment has been activated. It will be used when you
reboot. NOTE: You MUST NOT USE the reboot, halt, or uadmin commands. You
MUST USE either the init or the shutdown command when you reboot. If you
do not use either init or shutdown, the system will not boot using the
target BE.

**********************************************************************

In case of a failure while booting to the target BE, the following process
needs to be followed to fallback to the currently working boot environment:

1. Boot from the Solaris failsafe or boot in Single User mode from Solaris
Install CD or Network.

2. Mount the Parent boot environment root slice to some directory (like
/mnt). You can use the following command to mount:

     mount -Fufs /dev/dsk/c1t0d0s0 /mnt

3. Run <luactivate> utility with out any arguments from the Parent boot
environment root slice, as shown below:

     /mnt/sbin/luactivate

4. luactivate, activates the previous working boot environment and
indicates the result.

5. Exit Single User mode and reboot the machine.

**********************************************************************

Modifying boot archive service
Propagating findroot GRUB for menu conversion.
File </etc/lu/installgrub.findroot> propagation successful
File </etc/lu/stage1.findroot> propagation successful
File </etc/lu/stage2.findroot> propagation successful
File </etc/lu/GRUB_capability> propagation successful
Deleting stale GRUB loader from all BEs.
File </etc/lu/installgrub.latest> deletion successful
File </etc/lu/stage1.latest> deletion successful
File </etc/lu/stage2.latest> deletion successful
Activation of boot environment <BE_zfs_1009> successful.

Aparecen otros errores y advertencias e incluside nos da indicaciones de qué hacer en caso de falla, reiniciamos el sistema operativo:

shutdown -i6 -g0 –y

En el menú del GRUB elegimos la opción que corresponde a nuestro ambiente de booteo y de no ocurrir ningún error deberá iniciar el sistema operativo en forma correcta. Si observamos a los filesystem montados observamos lo siguiente:

df -h
Filesystem             size   used  avail capacity  Mounted on
rpool/ROOT/BE_zfs_1009
                        20G   4.1G    13G    24%    /
/devices                 0K     0K     0K     0%    /devices
ctfs                     0K     0K     0K     0%    /system/contract
proc                     0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
swap                   2.3G   348K   2.3G     1%    /etc/svc/volatile
objfs                    0K     0K     0K     0%    /system/object
sharefs                  0K     0K     0K     0%    /etc/dfs/sharetab
/usr/lib/libc/libc_hwcap1.so.1
                        17G   4.1G    13G    24%    /lib/libc.so.1
fd                       0K     0K     0K     0%    /dev/fd
swap                   2.3G    40K   2.3G     1%    /tmp
swap                   2.3G    24K   2.3G     1%    /var/run
/dev/dsk/c1t0d0s5      2.9G   3.0M   2.9G     1%    /export/home
rpool                   20G    35K    13G     1%    /rpool
rpool/ROOT              20G    21K    13G     1%    /rpool/ROOT

Sólo aparece /export/home en UFS, lo migramos en forma manual:

umount /export/home
rmdir /export/home
zfs create -o mountpoint=/export/home rpool/home
cd /export/home
ufsdump 0cf - /dev/dsk/c1t0d0s5 | ufsrestore rf -

Eliminamos del vfstab la línea que corresponde al /export/home y listo, ya podemos eliminar el ambiente de booteo anterior:

ludelete -f BE_ufs_1009

Nuevamente reiniciamos sistema operativo y comprobamos que inicie sin problemas.

Con esto queda como concluida la migración a ZFS, aprovechando que me queda un disco duro libre, voy a “espejear” mi sistema, es muy sencillo, por medio del comando format, borro todas las particiones del disco que quedo libre (disco 0) y creo una con todo el espacio disponible, después, la agrego al pool de datos:

zpool attach -f rpool c1t1d0s0 c1t0d0s0

Y como punto final, reinstalamos el grub en c1t0d0s0:

installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t0d0s0

Podemos monitorear el progreso de sincronización con zpool status:

zpool status
  pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h4m, 48.94% done, 0h4m to go
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c1t1d0s0  ONLINE       0     0     0
            c1t0d0s0  ONLINE       0     0     0  2.23G resilvered

errors: No known data errors

miércoles, 8 de septiembre de 2010

Creando un nuevo filesystem en Solaris

Para este ejemplo voy a utilizar la partición creada en la entrada anterior.

La partición la tenemos identificada como c1t1d0s0, es muy importante tener bien claro cuál es la partición que debemos utilizar, una confusión puede ocasionar la destrucción de un filesystem con datos y, si les ocurre lo que a mí alguna vez, para acabarla de amolar no había respaldo.

Una vez identificada la partición, debemos tener claro cuál es el “raw device” que le corresponde, normalmente a cada partición se le asocia con 2 dispositivos, el “raw” o carácter (/dev/rdsk/c?t?d?s?), y el de bloque (/dev/dsk/c?t?d?s?), podríamos decir de una manera sencilla que el raw es el que vamos a utilizar para operaciones de mantenimiento (crear, borrar, modificar, etc.) y el de bloques para las operaciones de acceso a la información (montar, desmontar, respaldar, etc.) el dispositivo que utilizaremos en el ejemplo es: /dev/rdsk/c1t1d0s0

El comando que nos permite crear nuevos filesystems es mkfs, sin embargo, para el caso de filesystems UFS lo recomendable es utilizar newfs, el cual, es uno de los llamados comandos “frontend” el cual va a invocar a mkfs con los parámetros correctos para UFS. En su forma más simple, solamente necesitamos darle como parámetro el raw device en que se va a crear el filesystem: newfs /dev/rdsk/c1t1d0s0

[root@solaris10:~] newfs /dev/rdsk/c1t1d0s0
newfs: construct a new file system /dev/rdsk/c1t1d0s0: (y/n)? y
Warning: 870 sector(s) in last cylinder unallocated
/dev/rdsk/c1t1d0s0:     20980890 sectors in 3415 cylinders of 48 tracks, 128 sectors
        10244.6MB in 214 cyl groups (16 c/g, 48.00MB/g, 5824 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
 32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
 20055584, 20154016, 20252448, 20350880, 20449312, 20547744, 20646176,
 20744608, 20843040, 20941472

Lo siguiente es montar el filesystem para poder tener acceso a él, suponiendo que requerimos que el punto de montaje sea /apache, primero creamos el directorio con mkdir y montamos el filesystem con el comando mount

[root@solaris10:~] mkdir /apache
[root@solaris10:~] mount /dev/dsk/c1t1d0s0 /apache

Aquí podemos observar en el comando mount que el dispositivo que utilizamos en este caso es el de bloque, no es necesario el indicarle que tipo de filesystem es ya que, por default, Solaris asume que un filesystem de disco es UFS.

Finalmente, para que la siguiente vez que reiniciemos el sistema operativo monte automáticamente este filesystem, debemos agregarlo al archivo /etc/vfstab de esta forma:

/dev/dsk/c1t1d0s0   /dev/rdsk/c1t1d0s0   /apache  ufs  2  yes     -

Lo primero es el dispositivo de bloque, después el raw, continua el punto de montaje, sigue el tipo de filesystem, un número que indica en qué momento se le ejecuta un fsck, si se va a montar en forma automático o no y por al final las opciones de montaje. Si alguno de los parámetros no aplica o se desean las opciones por default se sustituye por “-“.

martes, 7 de septiembre de 2010

Definir particiones con format en Solaris

El comando format nos permite definir particiones en los discos duros, las cuales pueden contener un filesystem o pueden ser utilizados como swap e inclusive pueden formar parte de un administrador de volúmenes.

Al ejecutar format lo primero que aparece es una lista de discos que son reconocidos por el sistema.

[root@solaris10:~] format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c1t1d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@1,0
Specify disk (enter its number): 1


Elegimos el disco, en este caso el 1 y procedemos con el siguiente paso:

selecting c1t1d0
[disk formatted]


FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> p


En esta parte indicamos que comando es el que vamos a emplear con el disco seleccionado, en este caso, le damos una "p" para seleccionar el comando partition

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit
partition> p


En partition lo primero que nos presenta es un menú con las diferentes operaciones que podemos realizar con la tabla de particiones, prácticamente las únicas que nos son útiles para este caso son del 0 al 7, print y label. Por supuesto que antes de realizar cualquier modificación a la tabla de particiones, debemos revisar cómo se encuentra utilizando la letra "p" de print.

Current partition table (original):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0


Ya que para este ejemplo estoy utilizando un Solaris x86 aparecen 2 particiones, la 8 y la 9, las cuales estan reservadas, cuando esto lo realizamos en una SPARC esto no aparece.



La partición 2 es una representación del total del disco, esta no debe ser modificada.


El resto: 0, 1, 3, 4, 5, 6 y 7 son las que tenemos disponibles, para este ejemplo, vamos a definir la partición 0 con 10 Gb, por lo que damos un "0" y enter.


Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0

Enter partition id tag[unassigned]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]: 1
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 10gb


Lo primero que nos pregunta es el tag, si le damos ? nos da una lista de las opciones disponibles, generalmente utilizo unassigned, puede ser cualquiera. Para flags hay dos letras, la primera puede ser "w" que indica que es de lectura escritura y la "r" solo lectura, la segunda puede ser "m" que indica que puede ser montado y la "u" que indica que no. En la siguiente indicamos el cilindro con el que vamos a iniciar, aquí si debemos ser muy cuidadosos y revisar muy bien la geometría de las particiones para evitar que unas se "empalmen" con otras. La última opción es el tamaño de la partición, en este caso los 10 Gb que requerimos.

Una vez realizado todo esto, procedemos a revisar con el comando print.

Current partition table (unnamed):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       1 - 1306       10.00GB    (1306/0/0) 20980890
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0
Si no encontramos ningún problema procedemos a guardar los cambios "etiquetando" con el comando label.



Ready to label disk, continue? y

El término etiquetar se refiere a que la tabla de particiones forma parte de la VTOC, también llamada etiqueta del disco, por lo que los cambios en la tabla implican un cambio en dicha etiqueta.

Por último salimos del comando partition con "q" y nuevamente otra "q" para salir de format.

El disco que modificamos es el c1t1d0 y la partición que creamos es "0" por lo que el nombre completo con el que lo va a reconocer el sistema es c1t1d0s0, posteriormente vamos a crear un nuevo filesystem con esta partición y la vamos a montar.

lunes, 6 de septiembre de 2010

Entendiendo al sistema de archivos en Solaris

Un sistema de archivos (filesystem) es una unidad de almacenamiento de información organizada en archivos.

En Unix estos archivos a su vez son organizados en directorios, cada uno de estos directorios puede contener archivos y a otros directorios, cada uno de estos directorios puede contener otros archivos y otros directorios. Prácticamente se pueden tener tantos directorios como se desee, sin embargo, todos tienen un directorio origen común.

Para poder accesar a los archivos de un sistema de archivos, éste debe ser “montado” sobre un directorio al que se le denomina punto de montaje.

Uno de los sistemas de archivos se le denomina sistema de archivos raíz (Root Filesystem), esto es porque todos los directorios del sistema semejan las ramas de un árbol cuyo directorio principal (/) funge como la raíz de este árbol.

En los sistemas Unix existen diferentes tipos de  filesystem, en Solaris el más común es el UFS.

En su forma más sencilla, los discos duros se dividen hasta en 7 particiones llamadas slices (rebanadas) y son 0, 1, 3, 4, 5, 6 y 7; la 2 es una representación del 100% del espacio del disco duro. Cada uno de estos slice puede contener un filesystem.

En las siguientes entradas voy a explicar cómo definir estos slices, cómo crear un filesystem y cómo montarlo.