27 sept 2010

Inicio/parada del sistema. Montar y desmontar.

Inicio del sistema

Para ser un administrador del sistema hay que saber algo sobre el inicio de los sistemas que ejecutan UNIX. Cuando un ordenador que ejecuta UNIX se enciende, ejecuta un código de arranque almacenado en ROM (en SPARC se llamaba eeprom) que se encarga de que comience la siguiente secuencia.

- carga e inicialización del kernel
- detección y configuración de dispositivos
- creación de threads del kernel
- intervención del operador en modo monousuario
- ejecución de scripts de arranque
- operación multiusuario


Lo primero que ocurre, por tanto, en cualquier sistema UNIX, es que el kernel se carga, realiza un reconocimiento de dispositivos, y ejecuta el proceso init, que es el número 1 (o madre de todos los procesos, aunque en algunos sistemas es visible un proceso 0 que es el sched).

El proceso init a continuación lleva al sistema al nivel que se le indique.
Los niveles por defecto en UNIX (se definen en /etc/inittab) son:

0 parado, 1/s single user, 2 multiuser no network, 3 multiuser con red, 5 multiuser con red y X-Windows, 6 reiniciar.

El modo 1/s o "modo monousuario" es como el "modo a prueba de fallos" de Windows. nos abre una shell en la que no tenemos servicios de red ni los filesystems montados (sólo el root filesystem) para que podamos hacer cosas como reparar el sistema operativo restaurando un backup, o arreglar algún problema de red. El init arranca un número mínimo de procesos adicionales (en Linux por ejemplo son unos kernel daemons cuyo nombre empieza por k y termina por d). El login sólo lo podremos hacer en un puertos serie (e.g. en la consola del sistema) gracias a alguna variante del proceso getty.

Lo que define cada uno de estos niveles, son los llamados scripts de inicio del sistema, que se van ejecutando uno tras otro, hasta llegar al punto en el que los usuarios pueden conectarse.

Scripts de inicio

Los scripts de inicio en cada sistema operativo UNIX tienen una pinta diferente.

El procedimiento tradicional en Solaris era tener un script en /etc/init.d y enlaces a los niveles en que se ejecuta. Ahora en Solaris 10 se supone que han creado lo que se conoce como SMF (proceso svc.statd que tiene su configuración propia)

La forma tradicional de poner en funcionamiento en Solaris un proceso al inicio y a la parada era la siguiente. Sea un ejecutable nuestro interesantísimo que queremos que se esté ejecutando siempre, al que le podemos pasar los argumentos start y stop. Queremos que se inicie a la vez que la máquina y que se pare cuando se detiene el sistema. Para eso creamos el script /etc/init.d/programita

#!/bin/ksh
#
# @(#)FileDescription: Startup Script of Programita 
# @(#)FileName:        /etc/init.d/programita
# @(#)Language:        Korn Shell
# @(#)Version:         1.0

if [ ! -d /usr/bin ] then                    # /usr not mounted exit fi # # Startup Script # case "$1" in 'start')   echo "--- Starting ---"    su – luciag -c "cd /opt/programita/bin;./programita.ksh start" ;; 'stop')   echo "--- Stopping ---"    su – luciag -c "cd /opt/programita/bin;./programita.ksh stop" ;; *) echo "Usage: $0 { start | stop }" ;; esac


Para que se ejecute programita start cuando arrancamos la máquina y se ejecute programita stop cuando la apagamos tenemos que hacer links duros desde el nivel por defecto.

Si en la máquina Solaris el nivel por defecto es 3, tendrias que ln /etc/init.d/programita /etc/rc3.d/S85programita para que arrancase, y si tuvieras parada, entonces ln /etc/init.d/arpas /etc/rc0.d/K85programita.

El 85 es un numero que tiene que ser:

a) para el arranque, mayor que el que tenga el script que se use para hacer esto con cualquier comando relacionado (por ejemplo si arrancamos la base de datos con un script en el número 84)
b) para la parada menor que el que tenga el script que se use para hacer esto con cualquier comando relacionado.


Parada del sistema

Hay muchas formas de parar el sistema.
  • La peor y más desaconsejada es pegarle un botonazo o desenchufar la máquina. Los búferes de los sistemas de ficheros cambian en memoria y escriben a disco esporádicamente. Este esquema hace que la escritura a disco sea más rápida pero también que el sistema se pueda quedar inconsistente si lo apagamos de repente.
  • La más habitual es utilizar un comando. El comando shutdown envía mensajes a los usuarios para que se vayan desconectando. Puede usarse para especificar una hora a la que se hará la parada o el reinicio.
Parar el sistema

# shutdown -h now

Parar el sistema a las 21:30

# shutdown -h 21:30 "Este sistema se va a apagar por cambio de moqueta en sala de servidores"

Parar el sistema en 15 minutos:

# shutdown -h +15 "Este sistema se va a apagar porque le vamos a cambiar un disco"
  • Hay otras formas de parar, el comando halt, que sin avisar a nadie, lo mata todo, ejecuta el comando sync y adios muy buenas. Recuerdo un técnico de sistemas en la época en que halt no hacía sync que paraba las máquinas con el mantra "sync; sync; halt" en plan militar.
  • Para reiniciar tenemos reboot, que es lo mismo que shutdown -r now. Este comando fuerza a hacer un chequeo de filesystems (también conocido como fsck) en el siguiente reinicio.
  • Hay una manera de indicar que no se haga el filesystem check, y es shutdown -rf now. Que reinicie pero no haga chequeos.
Montar y desmontar

Hemos mencionado el tema de montar y desmontar los sistemas de ficheros de los discos de los sistemas UNIX, vamos a explicarlo con más detenimiento.

Para que un filesystem o partición esté disponible, debe de ser montado utilizando el comando mount. La acción de montar un sistema de ficheros simplemente "conecta" esa partición al árbol de directorios disponible.

Los sistemas de ficheros disponibles cuando el sistema arranca están indicados en la tabla /etc/fstab o /etc/vfstab en Solaris. En AIX que son muy particulares /etc/filesystems.

Cuando hacemos df podemos ver el disco disponible en el sistema, y este uso nos viene desglosado por filesystems. Normalmente hacemos df -k para ver el resultado en KBs.

sun (ksh) % df -k

Filesystem            kbytes    used   avail capacity  Mounted on /dev/dsk/c0t3d0s0      47975   17711   25467    42%    / /dev/dsk/c0t3d0s3     721230  590285   73247    89%    /usr /dev/dsk/c0t3d0s4      96455   29279   57531    34%    /var swap                  128408     312  128096     1%    /tmp /dev/dsk/c0t1d0s5    2100583 1200588  836978    59%    /export/home /dev/dsk/c0t1d0s6     668423  334350  273915    55%    /opt
La primera columna muestra el dispositivo de bloque asociado al filesystem, la última el "punto de montaje". Un punto de montaje empieza siendo un directorio normal creado con mkdir, y cuando se ha ejecutado el mount muestra los contenidos de la partición. 
Por ejemplo, si queremos montar el /opt de este ejemplo: 
mount /dev/dsk/c0t1d0s6 /opt

Y si queremos desmontarlo
umount /opt

En Solaris hay un curioso directorio llamado lost+found en cada mount point, no borrarlo que es para los inodos dereferenciados.
Si no sabes en qué filesystem está el espacio que necesitas para determinar si tienes sitio, siempre está el df -k . (directorio actual). Otro comando para sacar cuánto disco estamos usando es du -ks . (para saber el tamaño del directorio actual). 
No sólo se montan y desmontan los filesystem, también los directorios de red (usando lo que se conoce como NFS) y los CDs (aunque en los sistemas modernos no es necesario porque hay un servicio que los detecta y monta solos en un mount point cuyo nombre suele ser /cdrom). 
Para distinguir filesystem locales de NFS se suele utilizar df -kl (la opción l es solo locales). 

Bibliografía
http://my.safaribooksonline.com/9780132117371/app02#X2ludGVybmFsX0ZsYXNoUmVhZGVyP3htbGlkPTk3ODAxMzIxMTczNzEvODc=

No hay comentarios:

Publicar un comentario