Inicio y cierre del sistema

De doc.ubuntu-es
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(Removing all content from page)
Línea 1: Línea 1:
 +
El arranque de un sistema Linux consta de las siguientes fases:
 +
* Ejecución del gestor de arranque (p.ej. lilo o grub)
 +
* Carga y ejecución del kernel
 +
* Ejecución de init (proceso número 1)* Ejecución de scripts de iniciación genéricos en /etc/rcS.d
 +
* Entrada en el runlevel por defecto: ejecución de scripts del runlevel en /etc/rcX.d, donde X el el número del runlevel.
  
 +
 +
== Cierre del sistema ==
 +
Para detener correctamente un sistema Unix hemos de situar el proceso INIT en un determinado runlevel, generalmente 0 o 6 (podemos comprobarlo simplemente echando un vistazo a /etc/inittab). Para ello, el sistema ofrece al superusuario varios mandatos que pueden ser invocados desde el shell, y que se suelen encontrar en el directorio /sbin/, como shutdown, halt o reboot. Tanto halt como reboot detienen el sistema; la diferencia entre ellos es que la segunda orden lo reinicializa. En principio sólo vamos a poder invocar estas órdenes cuando nos encontremos en los runlevels 0 o 6; si nos encontramos en otro nivel de operación habremos de utilizar shutdown para poder asegurar la estabilidad del sistema. Sin embargo, en la mayorá de Unices no existen problemas por esta causa, ya que INIT detecta el estado actual del sistema, y si no es alguno de los anteriores, invoca de forma automática a shutdown con los parámetros adecuados
 +
Shutdown va a detener la máquina de una forma ordenada, siguiendo unos pasos definidos. En primer lugar, notifica el hecho a todos los usuarios conectados (mediante wall) y bloquea el proceso de login. Posteriormente invoca a INIT en un runlevel 0 (para simplemente detener el sistema), 6 (para reinicializarlo) o incluso 1 (monousuario, para realizar tareas administrativas). Entonces NIT ejecuta el script correspondiente (leído de /etc/inittab), que suele encargarse de eliminar todos los procesos de la máquina, notificar el evento en el fichero de log correspondiente, desmontar los sistemas de ficheros que existan, desactivar el área de swap y, según se haya invocado la orden, detener el sistema o reinicializarlo. La forma habitual (que se da en el 90% de los casos, y por supuesto es la que estudiaremos nosotros) de invocar a shutdown es:                                             shutdown -r/-h now
 +
Con el parámetro -r hacemos un reboot, y con -h un halt (simplemente detenemos el sistema, sin reinicializar).
 +
 +
== El intérprete de órdenes ==
 +
El proceso login nos asigna un intérprete de mandatos, leído de nuestra entrada en /etc/passwd. Ya sabemos que un shell no es más que un programa del sistema que nos va a permitir relacionarnos con la máquina, introduciéndole órdenes desde el teclado; es la interfaz de usuario que nos ofrece cualquier sistema operativo. En nuestro sistema Unix podemos tener instalados diversos intérpretes de órdenes; en el archivo /etc/shells tenemos los disponibles para cada usuario, incluido el root. Por defecto se asigna el Bourne Again Shell (bash), el más cómodo, que incluye lo mejor de todos los anteriores intérpretes, como el C-Shell (csh) o el Korn Shell (ksh). El bash incluye rodillo de mandatos, histórico de órdenes (en el archivo .bash history del directorio $HOME de cada usuario), uso de tabuladores para completar órdenes, etc. Cualquier intérprete de Unix nos ofrece un entorno de programación completo con herramientas similares a las de la mayoría de lenguajes de programación secuencial (if, for, while. . . ). También nos va a ofrecer una serie de órdenes, denominadas órdenes internas, que no encontramos como archivos ejecutables en el sistema, y que por supuesto no va a ser necesario cargar en memoria para oder ejecutarlas; un ejemplo típico de este tipo de instrucciones es exit: no encontraremos ningún ejecutable en todos los sistemas de ficheros de Unix que se denomine así.
 +
En Unix existe el mandato chsh, que permite a cualquier usuario modificar el shell que el sistema le asigna por defecto (recordemos que este dato está grabado en /etc/passwd). En determinados clones, chsh no va a comprobar que el shell sea válido (esto es, que sea una entrada de /etc/shells). Esto puede suponer un problema: imaginemos que un usuario inexperto cambia su shell de entrada a /bin/login; será imposible para él volver a entrar al sistema mediante conexión remota hasta que el administrador modifique la información de /etc/passwd. Por tanto, desde hace algún tiempo la mayoría de Unices del mercado (y por supuesto también Linux) hacen la comprobación oportuna.
 +
Analizando el funcionamiento de chsh, vemos que una de las cosas que realiza es modificar el fichero de contraseñas para cambiar el shell de entrada de un usuario; por tanto, el archivo está "setuidado". Puede ser interesante para nosotros resetear el bit setuid del archivo (chmod -s) para así conseguir un mayor nivel de seguridad del sistema, ya que, como veremos más adelante, es conveniente mantener al míınimo el número de archivos "setuidados" en la máquina. Si lo hacemos así y algún usuario quiere cambiar su intérprete de órdenes cada vez que entre al sistema puede incluir en su .profile una orden como:
 +
exec <nuevoshell> 
 +
De esta forma, sustituye el proceso que ejecuta .profile (el shell) por la orden <nuevoshell>, el nuevo intérprete que desea.

Revisión de 17:18 30 may 2007

El arranque de un sistema Linux consta de las siguientes fases:

  • Ejecución del gestor de arranque (p.ej. lilo o grub)
  • Carga y ejecución del kernel
  • Ejecución de init (proceso número 1)* Ejecución de scripts de iniciación genéricos en /etc/rcS.d
  • Entrada en el runlevel por defecto: ejecución de scripts del runlevel en /etc/rcX.d, donde X el el número del runlevel.


Cierre del sistema

Para detener correctamente un sistema Unix hemos de situar el proceso INIT en un determinado runlevel, generalmente 0 o 6 (podemos comprobarlo simplemente echando un vistazo a /etc/inittab). Para ello, el sistema ofrece al superusuario varios mandatos que pueden ser invocados desde el shell, y que se suelen encontrar en el directorio /sbin/, como shutdown, halt o reboot. Tanto halt como reboot detienen el sistema; la diferencia entre ellos es que la segunda orden lo reinicializa. En principio sólo vamos a poder invocar estas órdenes cuando nos encontremos en los runlevels 0 o 6; si nos encontramos en otro nivel de operación habremos de utilizar shutdown para poder asegurar la estabilidad del sistema. Sin embargo, en la mayorá de Unices no existen problemas por esta causa, ya que INIT detecta el estado actual del sistema, y si no es alguno de los anteriores, invoca de forma automática a shutdown con los parámetros adecuados Shutdown va a detener la máquina de una forma ordenada, siguiendo unos pasos definidos. En primer lugar, notifica el hecho a todos los usuarios conectados (mediante wall) y bloquea el proceso de login. Posteriormente invoca a INIT en un runlevel 0 (para simplemente detener el sistema), 6 (para reinicializarlo) o incluso 1 (monousuario, para realizar tareas administrativas). Entonces NIT ejecuta el script correspondiente (leído de /etc/inittab), que suele encargarse de eliminar todos los procesos de la máquina, notificar el evento en el fichero de log correspondiente, desmontar los sistemas de ficheros que existan, desactivar el área de swap y, según se haya invocado la orden, detener el sistema o reinicializarlo. La forma habitual (que se da en el 90% de los casos, y por supuesto es la que estudiaremos nosotros) de invocar a shutdown es: shutdown -r/-h now Con el parámetro -r hacemos un reboot, y con -h un halt (simplemente detenemos el sistema, sin reinicializar).

El intérprete de órdenes

El proceso login nos asigna un intérprete de mandatos, leído de nuestra entrada en /etc/passwd. Ya sabemos que un shell no es más que un programa del sistema que nos va a permitir relacionarnos con la máquina, introduciéndole órdenes desde el teclado; es la interfaz de usuario que nos ofrece cualquier sistema operativo. En nuestro sistema Unix podemos tener instalados diversos intérpretes de órdenes; en el archivo /etc/shells tenemos los disponibles para cada usuario, incluido el root. Por defecto se asigna el Bourne Again Shell (bash), el más cómodo, que incluye lo mejor de todos los anteriores intérpretes, como el C-Shell (csh) o el Korn Shell (ksh). El bash incluye rodillo de mandatos, histórico de órdenes (en el archivo .bash history del directorio $HOME de cada usuario), uso de tabuladores para completar órdenes, etc. Cualquier intérprete de Unix nos ofrece un entorno de programación completo con herramientas similares a las de la mayoría de lenguajes de programación secuencial (if, for, while. . . ). También nos va a ofrecer una serie de órdenes, denominadas órdenes internas, que no encontramos como archivos ejecutables en el sistema, y que por supuesto no va a ser necesario cargar en memoria para oder ejecutarlas; un ejemplo típico de este tipo de instrucciones es exit: no encontraremos ningún ejecutable en todos los sistemas de ficheros de Unix que se denomine así. En Unix existe el mandato chsh, que permite a cualquier usuario modificar el shell que el sistema le asigna por defecto (recordemos que este dato está grabado en /etc/passwd). En determinados clones, chsh no va a comprobar que el shell sea válido (esto es, que sea una entrada de /etc/shells). Esto puede suponer un problema: imaginemos que un usuario inexperto cambia su shell de entrada a /bin/login; será imposible para él volver a entrar al sistema mediante conexión remota hasta que el administrador modifique la información de /etc/passwd. Por tanto, desde hace algún tiempo la mayoría de Unices del mercado (y por supuesto también Linux) hacen la comprobación oportuna. Analizando el funcionamiento de chsh, vemos que una de las cosas que realiza es modificar el fichero de contraseñas para cambiar el shell de entrada de un usuario; por tanto, el archivo está "setuidado". Puede ser interesante para nosotros resetear el bit setuid del archivo (chmod -s) para así conseguir un mayor nivel de seguridad del sistema, ya que, como veremos más adelante, es conveniente mantener al míınimo el número de archivos "setuidados" en la máquina. Si lo hacemos así y algún usuario quiere cambiar su intérprete de órdenes cada vez que entre al sistema puede incluir en su .profile una orden como:

exec <nuevoshell>  

De esta forma, sustituye el proceso que ejecuta .profile (el shell) por la orden <nuevoshell>, el nuevo intérprete que desea.

Herramientas personales