Conceptos Básicos de Archivos en Linux
Conceptos Básicos de Archivos en Linux
2. Administración de Procesos.
Pero eso es todo? Que hay detrás de ese concepto?, podría ser un problema?, cómo lo
El sistema de archivos.
En esta parte veremos a los sistemas de archivos desde una perspectiva de usuario, más
adelante lo veremos desde el punto de vista de arquitectura.
Archivo.- Un archivo es la unidad fundamental del sistema de archivos del Linux. Existen
tres diferentes clases de archivos: Ordinarios, Especiales y Directorios.
• Archivos Ordinarios.- Se conoce así a casi todos los archivos que depositamos en el
disco, documentos, programas hechos para el computador y los ejecutables. Estos
archivos pueden crearse, cambiarse, o borrarse cuando lo desee.
$ ls -l
total 196
-rw------- 1 root sys 23552 May 13 10:53 Ex01108
drwxr-xr-x 2 jmatias informix 2048 May 8 13:56 gif
drwxr-xr-x 2 jmatias informix 3072 May 8 13:58 gif2
-rw-r-Sr-- 1 jmatias informix 34418 Aug 23 1996 graphics
drwxr-xr-x 3 jmatias informix 512 Jul 9 1996 INTRO
-rw-r--r-- 1 root sys 4 May 17 21:02 rem-root
-rw------- 1 root sys 3072 May 13 10:52 Rx01108
drwxr-xr-x 2 jmatias informix 512 May 8 13:57 SAI
drwxr-xr-x 2 jmatias informix 512 May 8 13:57 SAII
drwxr-xr-x 2 root sys 1024 May 17 21:12 xxx
sr--r--r-- 1 root sys 0 May 8 13:53 00304dos
Salida del comando “ls -l”, mostrando archivos en un directorio
:
brw-rw-rw- 2 bin bin 2, 64 Jan 12 1997 fd0
:
brw------- 1 sysinfo sysinfo 1, 0 May 7 1996 hd00
:
crw-rw---- 1 informix informix 1, 44 May 13 10:51 dbspace1
:
crw------- 2 bin bin 6, 0 May 17 21:02 lp
:
br--r----- 1 root backup 1, 42 Apr 10 1997 root
:
crw--w--w- 1 root sys 58, 0 May 17 21:05 ttyp0
:
Listado parcial del directorio /dev de un SCO Unix
En resumen, en los sistemas Unix y Linux tenemos los siguientes tipos de archivos :
1. Archivos Regulares. Detallado.
2. Archivos tipo Directorio. Detallado.
3. Archivos especiales. Detallado.
4. Archivos de tipo Fifo son pipes con nombre. Son propios de System V, no existen en
los sistemas BSD.
5. Archivos de Enlaces simbólicos. Es un archivo que contiene un puntero a otro archivo.
Existen en BSD Unix 4.3 y también en los Unix de la familia SCO (a pesar de ser de tipo
System V)
6. El Soket es un archivo especial de BSD Unix 4.3.
/
La estructura del conjunto de todos los archivos del sistema, es una estructura de árbol
invertido, como se puede apreciar en la figura.
Trasladarse a un directorio equivale a abrir una rama dentro del árbol.
En el sistema Linux, todos los archivos forman parte de la jerarquía. Cualquier archivo de
esta estructura es parte de una red de directorios conectados.
Partiendo del directorio raíz / se recorren los directorios intermedios home, silvia y finalmente
finanzas que asocia el nombre control.c a un archivo que contiene los fuentes de un
programa en C.
Este método de caminos de acceso permite tener archivos y directorios con los mismos
nombres en varios lugares del árbol, con la única condición que no puede haber dos
caminos de acceso iguales.
La ubicación de archivos mediante sus caminos de acceso absolutos puede resultar algo
lenta para el usuario cuando el número de directorios es grande.
Además durante el trabajo normal de un usuario o de una aplicación, generalmente se
utilizan archivos que se encuentran solo en el directorio actual o en los directorios
inmediatamente superior o inferior, por este motivo, el sistema asocia, de forma permanente,
a todo proceso un directorio actual que agiliza la designación de un archivo mediante un
camino de acceso relativo a ese directorio actual.
Ejemplo :
Estas dos entradas pueden reemplazar, en los caminos de accesos relativos, a los nombres
actuales de los directorios como veremos en el siguiente ejemplo:
Permisos.
La privacía y seguridad de los archivos y directorios del sistema de archivos del Linux esta
basada en la confiabilidad de los permisos que estos tienen.
Un filesystem seguro tiene los permisos correctamente establecidos; estos permisos limitan
que cualquier usuario pueda escribir en cualquier parte del filesystem, con eso podremos
crear copias de seguridad y mantener el espacio libre con suma facilidad, si estos permisos
no son los correctos, los usuarios podrán escribir en cualquier parte del filesystem, o,
cambiar o remover archivos de configuración.
Adicionalmente el Administrador del Sistema (root) puede incrementar la seguridad del Linux
implementando algunos scripts (programas) simples, los cuales pueden hacer las veces de
vigilantes del sistema, y crear el efecto de puertas cerradas para cualquier usuario o proceso
no autorizado.
Archivos y usuarios.- Existen tres clases diferentes de usuarios de un archivo y tres modos
diferentes de acceso al archivo. Estas tres clases de usuarios figuran en la siguiente tabla:
Para cada una de las tres clases de usuarios existen 3 modos de acceso diferentes. Estos
tres modos figuran en la tabla siguiente:
Especificación de los permisos.- Para especificar qué usuario puede tener acceso a los
archivos y qué permisos tiene sobre ellos, es necesario designar los atributos de lectura,
escritura y ejecución para cada uno de los tres grupos de usuarios existentes: propietario
grupo y otros. Estos permisos tienen que ponerse en el mismo orden que aparecen cuando
se utiliza el comando ls -l ; es decir:
rwx rwx rwx
| | |
| | Permisos para otros usuarios
| |
| Permisos para el grupo de usuarios
|
Permisos para el usuario propietario
Siempre que esté presente una letra (r, w, x), el usuario tiene activo el permiso, cuando en
su lugar aparece un guión (-), el usuario no tiene el permiso correspondiente.
Esta es la salida del comando date, muestra la fecha actual del sistema.
• cal.- Muestra el calendario.
Este comando fue ejecutado sin argumentos ni opciones. Veamos como reacciona el mismo
comando con dos opciones :
En este caso vemos el calendario del mes de Diciembre del 2002.
• who: Muestra quienes están usando el sistema. Veamos el comando sin opciones ni
argumentos:
• w.- Es una variante muy utilizada de who, su característica principal es que muestra qué
hace cada usuario (What), y me muestra el promedio de carga de mi sistema Linux (load
average).
Observe que en la primera fila se muestra la horra actual, el tiempo que lleva encendido
el sistema, el numero de usuarios y el promedio de carga.
Mientras que en la primera columna se muestra los nombres de los usuarios conectados,
en la segunda columna, el terminal al cual se conectaron, la tercera el equipo desde el
cual se conectaron, luego se muestra la fecha de conexión, el tiempo ocioso (IDLE), dos
parámetros que no discutiremos (JCPU y PCPU) y finalmente que es lo que esta
haciendo cada usuario en este momento.
El ejemplo más notorio a este nivel es el comando ls el cual será detallado con más
precisión algunas páginas adelante.
• ls muestra los archivos que existen en un directorio, note que se ordenan alfabéticamente
por columnas.
NOTA: Normalmente ls, muestra los archivos según un código de colores, Ud. podrá
observarlo en su pantalla, obviamente en este manual no se aprecian los mismos, han sido
anulados por motivos técnicos.
El comando ls con una opción (-s), sin mas argumentos, muestra la información anterior, y
adicionalmente, el número de bloques asignados a cada archivo.
Observe, por ejemplo que el archivo [Link] tiene asignados 8 bloques de 1Kb
cada uno, eso quiere decir que podrá crecer hasta 8kb antes de que el sistema le asigne
otro bloque mas.
El comando ls con una opción (-s) y un argumento (/). Muestra del directorio raíz.
NOTA: Linux crea los directorios con 4 bloques de 1Kb cada uno.
Observe que el usuario jmatias (UID=500), tiene como login group informix (GID=500), y
adicionalmente pertenece a los grupos curso (GID=501) y postgress (GID=26).
Todos los dispositivos son controlados por archivos especiales que se encuentran en el
directorio /dev, en este casp /dev/pts/2 representa un psudo-terminal , generalmente es tipo
de terminales se asignan a usuarios de consola grafica y a los usuarios que ingresan al
sistema via telnet o ssh.
Con un parámetro:
Nos muestra (en ese orden), el nombre del sistema operativo (Linux), el nombre del
computador (server), la version del kernel (2.6.9-1.667), la fecha de creacion del Kernel (Thu
Nov 2 [Link] EST 2004) y el tipo de equipo (i686 i686 i386 GNU/Linux).
El Manual interactivo.
Linux (al igual que TODOS los sistemas de tipo Unix) provee un Manual Interactivo en Línea,
el cual se puede invocar en cualquier momento desde la línea de comando.
Para solicitar ayuda al sistema, se debe digitar man, seguido por el nombre del acápite o
tema que deseamos ver.
Por ejemplo :
Como podemos ver, nos da una descripción detallada del comando en mención (ftp).
$ date_
sh
200
fork() wait() exit()
crea el proceso ret orna el co nt rol
espera ret orno
sh date
450 exec() 450
reemplaz a
Algunos programas no son ejecutados como comandos del shell, pero corren en segundo
plano realizando tareas del sistema. A este tipo de programas se les llama demonios, todos
ellos son hijos de "init", en un "ps -ef" es fácil reconocerlos porque en la columna "TTY"
llevan un signo de interrogación ("?", System V), o un guión ("-", BSD Unix).
Cuando un proceso muere envía señales al proceso padre y otras señales distintas a sus
procesos hijos. Cuando los procesos reciben una señal pueden ejecutar una rutina o si no
existe dicha rutina se ejecutara la acción por defecto que generalmente es terminar.
La shell cuando termina envía una señal a los procesos arrancados por ella. Esto hace que
terminen, para evitar esto se utiliza el comando nohup.
Los procesos tienen un EUID (Efective User ID), y un UID normalmente ambos coinciden.
Sin embargo existe un bit de permisos que cuando esta presente en un archivo ejecutable
hace que cambie el EUID del proceso convirtiéndose en el UID del owner del archivo
ejecutable. Gracias a esto un usuario puede tomar temporalmente privilegios de
superusuario para acceder por ejemplo a archivos del sistema propiedad de root.
La forma en que un proceso arranca a otro es mediante una llamada al sistema con la
función fork() y el proceso hijo ejecuta luego una llamada exec() que no retorna nunca.
Los demonios son procesos que permanecen arrancados todo el tiempo. Generalmente son
iniciados por el proceso init cuando arranca el sistema. Algunos de ellos resucitaran
inmediatamente en caso de morir.
Un proceso puede pasar al proceso hijo una serie de variables pero un hijo no puede pasar
nada a su padre a través de variables.
Las formas de comunicación entre procesos son:
• A través de variables: Solo de padres a hijos.
• Mediante una señal: Solo indica que algo ha ocurrido no lleva información sino solo un
numero de señal.
• Mediante entrada salida: Es la forma mas corriente a nivel de shell.
• Mediante sofisticadas técnicas : Semáforos, Memoria compartida, Colas de mensajes.
El comando ps
Si Ud. está corriendo un programa, éste se ve como un proceso para el sistema. En
cualquier momento diferentes procesos son cargados y activados, uno por uno. El concepto
de programa y un proceso van de la mano, pero son diferentes.
Un proceso es lo que corre en el computador y al que se le asignan varias áreas de la
memoria, una de estas áreas contiene el programa, que es el código y que le dice al proceso
que hacer.
Cuando Ud. entra a una sesión en Unix (o Linux) empieza un proceso para Ud.
Normalmente corre un programa llamado shell, que espera a que se escriba un comando
como ls, y entonces trata de encontrar el programa correspondiente.
Cada vez que se corre un programa del prompt del shell, hay dos procesos activos, el
programa nuevo y el shell. Obviamente el shell no hace nada, mientras se corre un
programa, el shell espera a que termine para volver a poner el prompt.
Para ver qué proceso está activo en un momento determinado existe el comando ps.
$ ps
PID TTY TIME CMD
16564 pts/1 0:00 ps
21012 pts/1 4:04 IslandWrite
34084 pts/1 0:00 -ksh
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Feb 21 - 3:34 /etc/init
root 4716 3124 0 Feb 21 - 0:00 /usr/bin/X11/xdm -nodaemon
root 5052 6330 0 Feb 21 - 0:21 /usr/sbin/biod 6
al334896 10004 16402 0 [Link] pts/0 0:00 -ksh
root 10296 1 0 Feb 21 - 0:00 /usr/lpp/xlC/browser/pdnsd
root 10554 1 0 Feb 21 - 0:00 /usr/sbin/getty /dev/ttypa
wmaster 21012 34084 0 [Link] pts/1 6:24 IslandWrite
al334896 21632 10004 0 [Link] pts/0 0:00 TEC
crcastro 23582 1 0Feb 21 pts/3 2:19 search g
root 24154 4716 0 [Link] - 0:00 -[Link] mx:0
al334896 25986 21 0 [Link] pts/0 0:00 [pine]
root 26358 4716 0 13:32 - 0:03 -[Link] mx:0
al370705 29166 1624 0 [Link] pts/4 0:01 mail
wmaster 32530 3408 0 [Link] pts/1 0:00 ps -ef
:
$ ps
PID TTY STAT TIME COMMAND
2158 p4 IW 0:00 rlogin cca
29891 p4 IW 0:00 bin/csh (csh)
2116 p5 S 0:03 rlogin cca
2117 p5 S 0:03 rlogin cca
29898 p5 IW 0:00 bin/csh (csh)
29906 p6 IW 0:00 bin/csh (csh)
2263 p7 R 0:00 ps
$
Cabecera Significado
• PID Número del proceso, es un entero positivo
• TTY Es el dispositivo en donde se despliegan los resultados de los comandos.
• STAT Indica el estado del proceso, los estados más usuales son:
• IW Idle and Swapped out.
• S Sleeping.
• R Running.
• D Non interruptible I/O wait.
• T Stopped.
• Z Zombie (espera a padre).
• TIME Tiempo usado de usuario y sistema.
• COMMAND Nombre del proceso.
La información más usada por la mayoría de los usuarios es la que se refiere al PID, ya que
se usa ese número para eliminarlo del sistema o enviarle señales específicas.
Una opción más completa del comando "ps" es con los parámetros "-aux", con lo cual se
lista la tabla de procesos de todos los usuarios y además se añade una columna más que
indica el dueño de cada proceso, bajo el encabezado USER.
Veamos algunas líneas de "ps -ef", ejecutado en un SCO OpenServer 5:
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 Sep-24 ? [Link] sched
root 1 0 0 Sep-24 ? [Link] /etc/init -a
root 2 0 0 Sep-24 ? [Link] vhand
root 3 0 0 Sep-24 ? [Link] bdflush
root 4 0 0 Sep-24 ? [Link] kmdaemon
root 5 1 0 Sep-24 ? [Link] htepi_daemon /
root 6 0 0 Sep-24 ? [Link] strd
root 432 1 0 [Link] tty01 [Link] /etc/getty tty01 sc_m
root 43 1 0 [Link] ? [Link] /etc/syslogd
root 47 1 0 [Link] ? [Link] /etc/ifor_pmd
root 48 47 0 [Link] ? [Link] /etc/ifor_pmd
:
Comando kill
Para eliminar un proceso se usa el comando kill y especificando como parámetros el
número de proceso (PID) a ser eliminados. Por ejemplo, para eliminar un proceso:
$ kill 2116
$ kill -9 2117
Esta señal (-9) es "irrevocable", la forma más efectiva de "matar" un proceso, de esta forma
la salida de ps, queda de la siguiente manera:
$ ps
PID TTY STAT TIME COMMAND
2158 p4 IW 0:00 rlogin cca
29891 p4 IW 0:00 bin/csh (csh)
29898 p5 IW 0:00 bin/csh (csh)
29906 p6 IW 0:00 bin/csh (csh)
2263 p7 R 0:00 ps
$
También es importante saber que los procesos están protegidos para que solamente su
dueño los pueda eliminar, si Ud. trata de eliminar un proceso de otro usuario, obtendrá un
error.
Comando time
time es una buena herramienta de programación. Da los tiempos de ejecución. Este
comando nos da tres valores cuya interpretación es:
real : Tiempo real gastado
user : Tiempo de usuario.
sys : Tiempo consumido como proceso de kernel. (Dentro de las llamadas al kernel)
Ejemplo :
renice
Sirve para cambiar la prioridad de un proceso.
Sigue la misma filosofía que el comando nice pero hay que identificar el o los procesos que
deseamos cambiar su prioridad.
Se puede cambiar la prioridad de un proceso concreto dado su PID o los procesos de un
usuario dando su UID o todos los procesos pertenecientes a un determinado grupo. dando
su GID. Uso:
Ejemplos:
• Ejecutar el comando ps con la mínima prioridad.
$ nice -39 ps -l
• Ejecutar el comando ps aumentando la prioridad (bajando su valor nice) en 10. Esto solo
lo puede hacer 'root'.
# nice --10 ps -l
$ renice -p 33432
Explicación:
En los sistemas Unix (y Linux) el multiproceso esta implementado concediendo cíclicamente
la CPU en rodajas de tiempo a cada proceso que esta en ejecución.
Para ello para cada proceso en ejecución existe un contador que se va decrementando en
cada intento de acceder a la CPU y solo accederá cuando el contador alcance el valor 0. En
ese momento se ejecuta el proceso y el contador se inicializa de nuevo con el valor NICE.
Por eso si un proceso tiene un valor NICE bajo, se ejecutara mas veces que uno que tenga
un valor NICE alto pero en cualquier caso esta garantizado que todos se ejecutan. Si un
proceso tiene valor NICE 0. Se ejecutara todas las veces en cada ciclo.