0607 Practica 1

23
DEPARTAMENTO DE INFORMÁTICA DE SISTEMAS Y COMPUTADORES ARQUITECTURA DE COMPUTADORES Y SISTEMAS OPERATIVOS I Práctica 1: Introducción al Sistema Operativo Unix

description

SISTEMAS OPERATIVOS

Transcript of 0607 Practica 1

DEPARTAMENTO DE INFORMÁTICA DE SISTEMAS Y COMPUTADORES

ARQUITECTURA DE COMPUTADORES Y SISTEMAS OPERATIVOS I

Práctica 1: Introducción al Sistema Operativo Unix

Arquitectura de Computadores y Sistemas Operativos Pág. 2

1. INTRODUCCIÓN Esta práctica sirve de introducción al sistema operativo UNIX. Se deberán seguir los siguientes pasos en el orden indicado. En la práctica nos ocuparemos de temas básicos para cualquier usuario de un sistema operativo tipo UNIX.

UNIX es un sistema operativo multiproceso y multiusuario. En el sistema existen varios procesos ejecutándose simultáneamente, cada uno de estos procesos pertenece a un usuario, normalmente aquel que ha arrancado ese proceso. Como se verá más adelante, este dato se utiliza en los mecanismos de seguridad del sistema operativo.

En realidad no se puede hablar de un solo UNIX. Existen diferentes implementaciones de este sistema operativo, cada una de ellas sobre una máquina o conjunto de máquinas y proporcionada por un fabricante diferente. Ejemplos de sistemas pueden ser AIX de IBM, NextStep sobre diferentes plataformas, Xenix para PC's, Solaris de Sun o Irix de Silicon Graphics.

También existen versiones libres de Unix (no hay que pagar por ellas) que, en algunos casos, ofrecen similares características que los productos comerciales. Algunas de estas versiones tienen objetivos didácticos (MINIX, XINU...) y otras son el resultado del trabajo de programadores que simplemente no entendían porque pagar por algo que se puede construir entre varias personas (LINUX, FreeBSD). La versión que se utilizará en prácticas será una versión de LINUX, aunque los ejercicios propuestos se pueden realizar en prácticamente cualquier versión de UNIX.

1.1. DISTRIBUCIONES LINUX La práctica pretende ser una introducción a aspectos básicos de UNIX, y para ello utilizamos ordenadores con LINUX. Este hecho hace que algunas órdenes puedan funcionar de forma ligeramente diferente a las descritas en la memoria.

Además, no se puede hablar de un único LINUX. La especificación de LINUX se realiza sólo a nivel de Kernel, todos los demás componentes (Sistema de Ventanas, administración del sistema, intérpretes de órdenes (shells), sistemas de ficheros…) dependen de la “distribución” utilizada.

Una distribución de LINUX es un conjunto de aplicaciones y un sistema de instalación y organización de dichas aplicaciones. Los ejercicios planteados deberían poderse realizar con cualquier distribución, aunque siempre pueden aparecer algunas diferencias.

La distribución utilizada para el desarrollo de la memoria fue originalmente SuSE 6.0. Desde entonces se han hecho varias actualizaciones que, sin embargo, no impiden que los ejercicios estén adaptados a la distribución instalada en los ordenadores de prácticas. Esta situación se debe al deseo de que la práctica sea lo más independiente posible de la distribución final utilizada.

2. ENTRADA AL SISTEMA El sistema operativo permite que haya varios usuarios trabajando a la vez en una misma máquina. Cada uno de estos usuarios ejecuta un programa especial que le sirve de interfaz con el sistema operativo. Este programa es el intérprete de órdenes. Para arrancar este programa se necesita una forma de acceder a la máquina. Existen dos formas de hacerlo:

1. A través de un terminal conectado a la máquina. Un terminal está formado por un teclado y un monitor y algún circuito adicional para conectarse al ordenador. Todos los ordenadores con los que vamos a trabajar disponen de, al menos, un teclado y un

Arquitectura de Computadores y Sistemas Operativos Pág. 3

monitor. El monitor y el teclado directamente conectados al ordenador y controlados por HW del mismo se denominan CONSOLA.

2. A través de una red. En este caso, el ordenador en el que queremos iniciar el intérprete de órdenes debe estar ejecutando un SW especial. El usuario ejecuta un programa en un ordenador (programa cliente) con el que se conectará al ordenador servidor. En este último se creará lo que se conoce como terminal remota.

El sistema UNIX con el que vais a trabajar está instalado en una máquina llamada osito.disca.upv.es, conectada a la red de la UPV. Para trabajar en ella desde el PC donde os encontráis es preciso conectarse mediante una aplicación llamada Secure Shell (ssh), aunque no es necesario hacerlo más que en un apartado de esta práctica. Esta aplicación es especialmente útil si se desea trabajar de forma remota con los ordenadores del laboratorio.

UNIX es un sistema multiusuario. Cada usuario tiene creada una cuenta propia. Las cuentas de los usuarios son creadas por el superusuario (root), un usuario con privilegios especiales que se encarga de la administración del sistema.

Una vez iniciado el ssh, todo usuario debe identificarse en el momento de la conexión al sistema. Para ello debe introducir, en primer lugar, el llamado Host Name, que será el mismo para todos: osito.disca.upv.es; a continuación su identificador de usuario (User Id) que será único para cada alumno, y, a continuación, su contraseña (password).

Hay que introducir el password respetando las mayúsculas y minúsculas. Por motivos de seguridad, la contraseña no se visualiza en pantalla al escribirla. Así que hay que poner bastante atención en teclearla correctamente.

Si el servidor UNIX autoriza la conexión, presenta en pantalla mensajes de bienvenida y, a continuación, el indicador (o prompt) del intérprete de órdenes (SHELL). Si UNIX no autoriza la conexión lo indica al usuario.

Para cerrar la conexión bastará con escribir las instrucciones exit o logout, o pulsar las teclas <CTRL> D.

3. NOTAS GENERALES • <CTRL> C: Termina o aborta la ejecución de una orden.

• <CTRL> S: Detiene la visualización en pantalla.

• <CTRL> Q: Reanuda la visualización en pantalla.

• <CTRL> D: Indica final de fichero, así como finaliza la ejecución de algunas órdenes.

• Tened en cuenta al teclear las órdenes, que UNIX distingue entre mayúsculas y minúsculas.

• Si se ha tecleado mal, la orden puede corregirse con la tecla de retroceso <←>

• Aunque el interprete de órdenes que se utiliza (bash) permite recuperar órdenes introducidas con anterioridad con las teclas de desplazamiento. Esto sólo funciona en la consola y con algunos programas emuladores de terminal.

Arquitectura de Computadores y Sistemas Operativos Pág. 4

4. FORMATO DE LAS ÓRDENES Muchas de las órdenes de UNIX aceptan argumentos, siendo el separador de argumentos el espacio en blanco, como en la ventana de órdenes de Windows.

Ejemplo: $ finger $ finger root

(no escribáis el $, pues es sólo indicativo del final del prompt)

Un tipo especial de argumento son las opciones. Las opciones modifican la operación por defecto de la orden. Estas opciones se pasan como argumentos que empiezan con uno o dos guiones (-). Ejemplos:

$ ls -l $ ls --help $ ls -l /etc/passwd

Las opciones pueden expresarse por separado o combinadas: $ ls -l -a $ ls -la

El objetivo de la práctica es que empecéis a manejar UNIX como usuarios. Para ello debéis probar todas las órdenes de UNIX que se comentan en este boletín y comprender qué es lo que hacen. Muchas órdenes soportan la opción –help o –-help, que muestra una descripción de la orden y sus parámetros y opciones.

5. ALGUNAS ÓRDENES BASICAS DE UNIX

5.1. ORDEN type La orden type nos permite saber si una orden es interna o externa. Decimos que una orden es interna cuando el shell en ejecución la ejecuta directamente sin necesitar ningún programa adicional.

En el caso que una orden no sea interna, habrá un programa que se ejecuta cada vez que utilicemos dicha orden, de hecho el programa es la orden y tiene el mismo nombre. La orden type nos informa sobre el directorio en el que se encuentra este programa.

La orden type acepta como argumento el nombre de la orden de la queremos conocer su naturaleza. Así, por ejemplo, la siguiente orden nos permite conocer la naturaleza de la orden cd:

$ type cd

Sería interesante que para cada una de las órdenes que se verán en el resto de la práctica, probéis type para averiguar su naturaleza.

Arquitectura de Computadores y Sistemas Operativos Pág. 5

5.2. ORDEN man Permite consultar la sintaxis, la descripción y las opciones de cualquier orden sobre el terminal. Ejemplo:

$man date

nos dará información sobre la orden date. La información saldrá paginada por pantallas. Podemos ir avanzando pulsando <ENTER> , con la barra espaciadora o abandonar la ayuda con q (quit). (Si pulsáis la tecla h obtendréis ayuda sobre el significado de las teclas cuando estáis haciendo un man).

Es interesante que probéis la siguiente orden:

$man man

os dará información sobre cómo funciona la orden man, así como sobre distintas opciones de esta orden.

Ejemplo:

$ man date

CONSULTAR QUÉ DICE man DE CADA ORDEN CONFORME VAYAMOS VIÉNDOLAS A LO LARGO DE LA PRÁCTICA.

5.3. ORDEN date Permite consultar la fecha y hora del sistema.

Formato de representación por defecto: día de la semana, mes, día del mes, hora, año.

$ date

Este formato de representación se puede cambiar. ¿Cómo?

PISTA: usar la orden man para averiguarlo.

Con esta orden también se puede modificar la fecha y hora del sistema, pero sólo el superusuario (usuario ‘root’) puede hacerlo, ya que éstos son valores críticos de los que dependen muchos de los servicios del sistema.

5.4. ORDEN who Permite visualizar los usuarios conectados al sistema. El formato de salida contiene la siguiente información por defecto:

- nombre de usuario

- terminal de conexión

- momento de la conexión

Observar como, si tenéis más de una conexión abierta, el usuario es el mismo, pero tiene un terminal distinto. También fijaos en que un terminal sólo puede pertenecer a un usuario cada vez.

Arquitectura de Computadores y Sistemas Operativos Pág. 6

También puede utilizarse para conocer la propia identidad:

$ who am i

Otras variedades de esta orden son w y whoami. Probadlas.

5.5. OBTENCIÓN DEL DIRECTORIO ACTUAL: pwd. Cuando entramos en el sistema a través de nuestro login, éste nos sitúa sobre nuestro directorio de trabajo. A partir de ahí podemos ir cambiando de directorio.

Para saber en qué directorio estamos en cada momento utilizaremos la orden:

$ pwd

Que nos muestra el camino completo de la situación de nuestro directorio dentro del sistema, empezando por el directorio / (raíz)

Esta orden también tiene opciones, relacionadas con la utilización de enlaces. Comprobad la página de manual.

5.6. LISTADO DEL CONTENIDO DE UN DIRECTORIO ACTUAL: ls. La orden ls nos permite ver el contenido de un directorio. Variantes:

• ls -a: Aparecen además los ficheros ocultos.

• ls -l: Listado con todos los detalles de los archivos/directorios.

• ls -F: Indica además qué ficheros en un directorio son ordinarios y cuáles son directorios, de la siguiente forma:

- los ficheros que acaben en / son directorios

- los que acaben en * son ejecutables

• ls -t: Ordena los ficheros por fechas (primero los más nuevos)

• ls -r: Ordena los ficheros por fechas (primero los más antiguos)

Podemos combinar varias opciones. Ejemplo:

$ ls -la

Siempre nos aparecerán dos ficheros especiales: el '.' y '..' . El primero hace referencia al directorio actual y el segundo al directorio padre. Se pueden utiliza estos dos nombres como cualquier otro nombre de directorio, así la orden "cd .." nos cambia al directorio padre.

La distinción entre ficheros ordinarios y directorios también se puede apreciar si observamos cada fila (fichero) cuando se ha especificado la opción '-l'. Las entradas cuyo primer carácter es una 'd' representan directorios y las que tienen un '-' son ficheros ordinarios. Si una entrada empieza por 'l' que hace referencia a un 'link' o enlace, concepto que se presentará en clase.

Cuando hacemos un ls -l , nos va a aparecer la siguiente información:

- Modos de fichero (bits de protección): El primer elemento especifica el tipo de fichero. El resto de elementos son los llamados bits de protección. Están compuestos por tres secuencias de valores 'r', 'w', 'x', que indican los permisos de lectura, escritura y ejecución.

- Número de enlaces contenidos en el fichero.

Arquitectura de Computadores y Sistemas Operativos Pág. 7

- Nombre del propietario del fichero.

- Nombre del grupo al que pertenece el fichero.

- Tamaño del fichero en bytes.

- Fecha y hora de la última modificación.

La orden ls tiene muchas más opciones de las aquí comentadas. Averiguad algunas de ellas leyendo su página del manual y probadlas por separado y combinándolas.

5.7. CAMBIO DE DIRECTORIO: cd. Por defecto, al entrar en el equipo Unix nos colocamos en nuestro directorio de trabajo. Pero podemos cambiar de directorio mediante la orden:

$ cd nombre_directorio

El nombre del directorio podremos darlo mediante su forma absoluta (todo el camino desde el directorio raíz) o mediante su forma relativa (indicando la ruta desde el directorio actual). Probar ambas formas.

Con la orden cd sin argumentos volveremos siempre al directorio de trabajo propio y, si queremos ir al directorio de nivel superior, basta con utilizar 'cd ..' .

Cambiar al directorio raíz (/) y desde ahí ir visualizando el contenido de los siguientes directorios típicos de UNIX:

• /bin: Directorio de algunas órdenes ejecutables.

• /usr/bin: Resto de órdenes ejecutables.

• /usr/include: Librerías del lenguaje C.

• /dev: Ficheros especiales asociados a los diferentes dispositivos del sistema tales como terminales, impresoras,...

• /etc: Directorio de contenidos variados. Ejemplo: passwd: fichero de contraseñas.

• /tmp: Se utiliza para crear ficheros temporales

• /users o /home: Directorio donde se encuentran los directorios de los usuarios del sistema.

5.8. CARACTERES COMODINES. A veces nos puede interesar referenciar ficheros que tengan en su nombre características comunes, como por ejemplo todos los ficheros que empiezan por la letra "c". Esto se conseguirá utilizando los caracteres comodines o metacaracteres:

*: Representa a cualquier cadena de caracteres arbitraria incluyendo la cadena vacía.

?: Representa a cualquier carácter simple.

[ ]: Pueden contener un grupo o rango de caracteres y corresponden a un carácter simple.

Ejemplos:

$ ls a* $ ls fichero? $ ls c[1-3] $ ls c[1,3]

Arquitectura de Computadores y Sistemas Operativos Pág. 8

$ ls c[123]

Probar distintas combinaciones de estas órdenes. Para ello sería interesante que crearais distintos ficheros vacíos, en vuestro directorio inicial, con la orden touch: $ touch nombre_de_fichero

Hay que tener en cuenta que el comodín * sustituye a cualquier cadena de caracteres excepto aquellas cadenas que comiencen por el carácter '.'. Prueba a crear un fichero que empiece por este carácter e intenta listarlo con la orden ls utilizando el comodín *.

Una forma interesante de ver cómo interpreta el shell los caracteres comodines es utilizando la orden echo, la cuál nos mostrará por la salida estándar (pantalla) la cadena de caracteres que le indiquemos. Por ejemplo: $ echo ls a*

Sacará por pantalla el texto que hay a continuación pero el shell sustituirá previamente el carácter comodín por lo que corresponda. Para poder utilizar nombres de ficheros que incluyan estos caracteres comodines se puede utilizar el carácter \, denominado “Escape”. Así la combinación \\ será sustituida por \ y la combinación \* por * en el nombre del fichero. Probad las siguientes órdenes: $ echo ls a* $ echo ls a\*

5.9. VISUALIZACIÓN DE FICHEROS: CAT, FILE, MORE, LESS, HEAD, TAIL.

La orden cat se utiliza para visualizar sobre la salida estándar el contenido de un fichero (se supone de tipo texto). Para saber de qué tipo es un fichero (texto, ejecutable,...) utilizaremos la orden file seguida del nombre del fichero del cuál queremos averiguar su tipo.

Probar:

$ cat /home/acso1/login/.profile Si el fichero no cabe en pantalla podemos utilizar las combinaciones de teclas <CTRL> S (para detener la salida) y <CTRL> Q (para reanudarla).

Más elegante es utilizar " | more " a continuación de la orden para visualizar pantalla tras pantalla. Consultar las páginas del manual (man more) para ver alguna de sus opciones y practicar algunas de ellas, pues también puede ser utilizada en solitario. A los programas que realizan una función similar a more se les denomina paginadores.

Otro paginador es less. Utilizándolo igual que more nos permitirá movernos en el texto hacia delante y hacia atrás con las flechas de desplazamiento, mientras que en more las órdenes son letras.

De hecho, man utiliza un paginador para mostrar la información del manual. El que utiliza por defecto en los computadores del laboratorio es less.

La orden cat permite listar varios ficheros secuencialmente. Por ejemplo para listar el fichero1 y luego el fichero2:

$ cat fichero1 fichero2

Sustituir login por vuestro identificador

Arquitectura de Computadores y Sistemas Operativos Pág. 9

Una aplicación muy útil de cat es concatenar ficheros. Si queremos concatenar los dos ficheros anteriores en un nuevo fichero llamado fichero3:

$ cat fichero1 fichero2 > fichero3

La orden tail permite visualizar el final de un fichero. Por defecto visualiza las 10 últimas líneas. Ejemplo:

$ tail .profile

Lista las 10 últimas líneas del fichero ".profile". Para listar las últimas 5 líneas: $ tail -5 .profile

y si para visualizar a partir de la línea 5: $ tail +5 .profile

Existen unos parámetros que permiten indicar el número de líneas que queremos visualizar.

La orden head es complementaria de la anterior, pues permite visualizar el comienzo de un fichero. Por defecto visualiza las 10 primeras líneas. Se utilizan argumentos muy parecidos a los de la orden tail.

Consultar las páginas del manual y probar distintas opciones.

6. CREACION Y BORRADO DE DIRECTORIOS

6.1. CREACIÓN DE DIRECTORIOS Para crear un directorio es necesario utilizar la orden mkdir nombre(s) de directorio(s):

$ mkdir practicas

Utilizando la orden cd ir al directorio creado.

Cread un directorio dentro de practicas que se llame prueba1.

Si queremos crear varios directorios a la vez: $mkdir prueba2 prueba3

(Comprobar la creación haciendo un listado con ls -l)

Esto nos creará directorios en el directorio en el que estemos.

También podemos crear subdirectorios utilizando los caminos (paths). Estando en el directorio practicas que habéis creado escribid lo siguiente:

$ mkdir prueba1/prueba11 prueba2/prueba21 prueba3/prueba31

Para comprobar todos los niveles de subdirectorios que hemos creado, podemos utilizar la opción ls -R que lista recursivamente ficheros y directorios.

6.2. BORRADO DE DIRECTORIOS La orden rmdir elimina un directorio. Pero será necesario que dicho directorio esté vacío (que no contenga ningún archivo). Haced:

$ rmdir prueba1/prueba11

Comprobad con ls lo que ha pasado.

Arquitectura de Computadores y Sistemas Operativos Pág. 10

7. COPIA, MOVIMIENTO Y RENOMBRADO DE FICHEROS

7.1. COPIA DE FICHEROS (ORDEN cp) Si queremos copiar un fichero utilizaremos la orden cp. El primer argumento de la orden es el fichero origen y el segundo el destino. El fichero destino es físicamente diferente del origen.

Ejemplo: $ cp /usr/bin/cal ejemplo

Esto copia el fichero /usr/bin/cal a nuestro directorio y con el nombre ejemplo. Esto es equivalente a utilizar la orden:

$ cp /usr/bin/cal ./ejemplo

(Recordemos que "." es el directorio actual).

También podemos efectuar la copia a un directorio concreto: $ cp /usr/bin/cal prueba3

Introduce el fichero en el directorio prueba3, si estamos en el directorio superior.

La orden cp también copia directorios. Lógicamente, querremos copiar tanto un directorio como su contenido. Para esto utilizamos el modificador recursivo -r.

$ cp -r prueba3 prueba4

7.2. MOVIMIENTO DE FICHEROS (ORDEN mv) El cometido de la orden mv es mover ficheros entre diferentes directorios. Si se usa sobre el mismo directorio, el efecto obtenido es equivalente a cambiar el nombre al fichero.

Ejemplo 1 : Cambia el nombre del fichero ejemplo a ejemplo2

$ mv ejemplo ejemplo2

Ejemplo 2: Coloca el fichero ejemplo2 en el directorio prueba4 (si existe en el directorio actual). $ mv ejemplo2 prueba4

Si el fichero destino al que copiamos o movemos ya existe y no tiene permisos de escritura, entonces el sistema nos pide confirmación. Los permisos del fichero copiado o movido son los mismos que los del fichero original. Estudiaremos los permisos más adelante en esta práctica.

7.3. BORRADO DE FICHEROS (ORDEN rm) La orden rm suprime una lista de ficheros de un directorio:

$ rm ejemplo2

Notar el efecto que tendría olvidarse algún carácter en una orden de este tipo. Si queremos borrar todos los ficheros cuya extensión sea .bak del directorio actual lo haríamos de la siguiente forma:

$ rm *.bak

Arquitectura de Computadores y Sistemas Operativos Pág. 11

Esta orden permite concatenar varias órdenes de borrado: $ rm *bak *c *d d*

Esta orden borra todos los ficheros acabados en bak (incluyendo los .bak), también todos los que acaban en c y en d y finalmente todos los que empiecen por d.

OPCIONES

Vale la pena resaltar algunas de las opciones que admiten la orden rm:

• -i: Opción interactiva. Solicita la confirmación del usuario antes de proceder al borrado.

• -r: Opción recursiva. Borra recursivamente los ficheros que le digamos de todos los directorios y subdirectorios del nivel que estamos y de los niveles inferiores.

¡OJO! Esta orden es muy peligrosa. UNIX no tiene la orden UNDELETE.

8. PROPIEDAD Y PROTECCIÓN Puesto que el sistema operativo UNIX es de tipo multiusuario, hemos de manejar los conceptos de propiedad y protección, es decir, a quién pertenece un determinado fichero respectivamente.

Ejemplo: Creemos un fichero de la siguiente forma: $ ls -l > hola

Esta orden utiliza el concepto de la redirección (que trataremos más adelante). Si mostramos el contenido de este fichero podremos observar que contiene un listado del directorio en el que nos encontramos:

$ more hola

Podemos observar que el propietario de este fichero eres tú, y que pertenece al grupo acso, y que sus bits de acceso están de la siguiente forma: rw-r--r--. ¿Qué indica esto?

Para cada fichero del sistema hay tres clases de permisos que definen quien puede tener acceso:

• Propietario: Todos los ficheros creados en Unix tienen su propietario, habitualmente la persona que lo creó. El propietario de un fichero puede asignarle diversos privilegios de acceso. Para cambiar a un fichero de propietario se utiliza la orden chown (que habitualmente sólo usa el administrador del sistema).

• Grupo: Varios usuarios que pueden tener alguna característica común (p. Ej. Trabajar en un mismo proyecto). Para cambiar las propiedades de grupo de un fichero se utilizaría la orden chgrp.

• Público: El resto de usuarios del sistema (exceptuando al propietario y al grupo)

Para cada uno de estos grupos se definen los permisos sobre las operaciones que pueden efectuar con ese fichero: lectura (r), escritura (w) y ejecución(x).

Por tanto, para cada uno de los posibles modos de usuario comentados anteriormente (propietario, grupo y público) hay tres tipos de privilegio posibles (lectura, escritura y ejecución). Esto nos da un total de nueve modos posibles que normalmente se escriben como:

Arquitectura de Computadores y Sistemas Operativos Pág. 12

rwxrwxrwx. Si, por ejemplo, un fichero tiene los privilegios rw-r-----, querrá decir que el propietario tiene permiso para leer y escribir, el grupo tiene permiso para leer y el resto no tiene permiso para nada.

Para poder cambiar estos permisos hemos de ser los propietarios del fichero (o administradores del sistema) y utilizar la orden chmod. La sintaxis es:

$chmod modo_protección nombres_ficheros.

Para especificar el modo existen diversas formas. Vamos a utilizar la más conocida y que se basa en la representación binaria y expresar el número resultante en octal. Se trata de representar cada uno de los 9 permisos mediante unos o ceros en función de si un permiso está activado o no.

Ejemplos:

rw-r----- se puede representar en binario como 110 100 000, que en modo octal sería 640. Supongamos que nosotros somos los únicos que deseamos leer y escribir sobre nuestro fichero y que el resto de usuarios sólo puedan leerlo. Los permisos quedarían como:

rw-r--r--. Es decir, 110 100 100, que en modo octal sería 644.

Para cambiar los permisos del fichero habría que escribir lo siguiente:

$ chmod 644 hola

Comprobar que se han cambiado los permisos.

Si lo que deseamos proteger es un directorio determinado, nos colocaremos en el nivel superior del directorio que queremos proteger y ejecutaremos la orden chmod con los privilegios que deseamos. Haced una prueba y confirmad los cambios.

Los permisos asignados a los directorios tienen un significado ligeramente distinto de los que toman en los ficheros. Así, si un directorio tiene permiso de lectura te permite visualizar su contenido, es decir, la función de una orden ls. El permiso de escritura te permite crear nuevos archivos y eliminar archivos del mismo. Y, por último, el permiso de ejecución te permitirá cambiar a ese directorio, es decir, la función de cd.

8.1. PERMISOS INICIALES Cuando se crea un fichero o un directorio se le asignan unos permisos por defecto. Estos permisos pueden ser cambiados por la orden umask. Esta orden sirve para especificar aquellos permisos que van a denegarse en los ficheros de nueva creación.

La forma de especificar estos permisos será especificando una máscara. Cada bit activo de esta máscara indicará que ese permiso estará negado para los ficheros de nueva creación.

Por ejemplo, si ejecutamos la orden:

$ umask 022

conseguiremos tener todos los permisos sobre todos los ficheros que creemos pero el resto de usuarios sólo podrán leer y ejecutar esos archivos.

Esta orden sólo tendrá valor durante la sesión actual.

Si introducimos umask sin argumentos, nos devuelve el valor actual de la máscara.

Cread un fichero con la orden touch que se cree con permisos de lectura y escritura sólo para el propietario y sin permiso de ejecución para nadie. Para ello tendréis que ejecutar antes la orden

Arquitectura de Computadores y Sistemas Operativos Pág. 13

umask correspondiente. Comprobad con la orden ls -l que los permisos con los que se ha creado son los indicados.

9. REDIRECCIÓN DE E/S Cuando se ejecuta un programa en UNIX, éste usualmente espera una entrada de datos y normalmente produce alguna salida de resultados. En un modo de trabajo interactivo, el usuario espera interaccionar con el sistema usando los dispositivos que se inventaron para tal efecto, los terminales.

En el modo de operación de trabajo por lotes, el usuario no interactúa con el programa, luego tanto las entradas como las salidas se espera que se realicen sobre ficheros.

La solución que UNIX adopta es simple, los dispositivos se tratan como ficheros. Por cada dispositivo conectado al sistema existe un fichero al cual el usuario se refiere cuando desea acceder al dispositivo.

En UNIX existen tres ficheros estándar que se refieren a la E/S por defecto que usan los programas:

• Entrada estándar: (stdin) Representa al dispositivo del cuál un programa espera leer su entrada.

• Salida estándar: (stdout) Representa al dispositivo sobre el cuál un programa espera escribir su salida.

• Salida de error: (stderr) Representa al dispositivo sobre el cuál un programa escribirá los mensajes de error.

En general, si un programa espera una entrada y no se especifica ningún nombre de fichero, la entrada estándar para este programa se toma como el teclado de la terminal del usuario.

Normalmente, el resultado de la ejecución de un programa se lanza sobre la salida estándar, que coincide con la pantalla del terminal del usuario. La salida de diagnóstico coincide con la salida estándar.

UNIX ofrece un sistema sencillo para cambiar las asignaciones por defecto de los ficheros stdin, stdout, stderr. Se puede especificar que la salida estándar de un programa sea escrita en un fichero, que los datos de entrada se tomen de un fichero, o que los mensajes de error se almacenen en un fichero. A esto se le llama redirección de la E/S.

UNIX también permite usar la salida estándar de un proceso como la entrada estándar de otro, tal y como si colocáramos una tubería que los uniera. A una secuencia de órdenes enlazadas de este modo, se le llama tubería o tubo (pipeline o pipe).

9.1. REDIRECCIÓN DE LA SALIDA ESTÁNDAR. Si un nombre de fichero está precedido por el símbolo >, la salida estándar de un programa se redirige hacia el fichero. Haced:

$ ls -l > dir.dat

Comprobad qué ha pasado, con la orden:

$ cat dir.dat

Arquitectura de Computadores y Sistemas Operativos Pág. 14

Si el fichero dir.dat no existía antes de la orden ls, se crea, y si ya existía, se reemplazará su contenido.

Comprobad:

$ ls -l > salida.dat $ cat salida.dat $ date > salida.dat $ cat salida.dat

Según esto, podemos usar este método para crear un fichero vacío. Dos formas diferentes:

$ > vacio1 $ echo –n > vacio2

Si queremos que la salida de un programa se añada al contenido actual de un fichero, usaremos el símbolo >>. Así no borraremos el contenido del fichero. Por ejemplo:

$ ls -l > salida.dat $ date >> salida.dat

Visualizad el contenido de salida.dat.

Si queremos que la salida de un programa se "pierda", es decir, no aparezca ni en la pantalla ni se almacene en ningún fichero, podemos usar el dispositivo /dev/null así:

$ ls -l > /dev/null

9.2. REDIRECCIÓN DE LA ENTRADA ESTÁNDAR. Al igual que se puede redireccionar la salida estándar, se puede hacer lo propio con la entrada estándar. Para ello usaremos el símbolo <.

$ wc < salida.dat

La orden wc el número de líneas, palabras y caracteres que tú escribes por teclado. Como la entrada estándar está redireccionada al fichero salida.dat , y la salida estándar por defecto está asociada a la pantalla, el resultado de la orden es la escritura en pantalla de los números resultantes del fichero salida.dat.

9.3. TUBERÍAS (PIPES). La potencia de UNIX no se llega a aprovechar al máximo ejecutando las órdenes del shell y programas del sistema individualmente, sino cuando se combinan. Para ello se pueden utilizar las tuberías y los "shell scripts". Estos últimos vienen a ser como los ficheros ".BAT" y los veremos en prácticas futuras.

Para conectar dos procesos formando una tubería, usaremos el símbolo "|". Ejemplo:

$ ls -l | wc –l

Ahora la salida estándar de ls se usa como entrada estándar de wc (wc es un programa que nos permite contar el número de caracteres, palabras y líneas de un fichero de texto). Es intuitivo pensar en que las tuberías nos permiten construir procesos que operen en un "flujo" de datos. Se pueden conectar varios procesos en una misma orden:

$ ls /home | grep dis | sort -r

Arquitectura de Computadores y Sistemas Operativos Pág. 15

¿Qué hace esta serie de órdenes?

Podéis seguir el proceso ejecutándolas por separado de manera secuencial, para ello será necesario redireccionar la salida de una orden a un fichero y la entrada de la siguiente cogerla de ese fichero.

9.4. REDIRECCIÓN DE LA SALIDA DE ERROR De la misma manera que podemos redirigir la salida estándar, es posible almacenar la salida de error en un fichero, usando 2>. Recordad que 0, 1 y 2 son los dispositivos de E/S estándar en UNIX. Probad lo siguiente:

$ cat noexisto.dat >sal.dat

El shell da un mensaje de error. El fichero sal.dat se ha creado, pero ¿qué contiene? Visualiza su contenido.

Si no se quiere que aparezcan los mensajes de error en la pantalla, pero sí se quiere tener constancia de ellos, se pueden redireccionar a un archivo para luego examinarlo. Probad:

$ cat noexisto.dat > sal.dat 2> err.dat $ cat err.dat

Como se puede suponer, UNIX se refiere a los dispositivos de salida usando los números correspondientes delante de cada símbolo >. Si no se especifica ningún símbolo delante de >, UNIX toma 1 por omisión. Comprobad que la ejecución de la siguiente orden es equivalente a la anterior:

$ cat noexisto.dat 1> sal.dat 2>err.dat

Si se quiere lanzar la salida de error hacia el mismo fichero que se lanza la salida estándar, se usa la nomenclatura 2>&1. También se puede usar 1>&2 para añadir la salida estándar a la salida de error.

9.5. COPIA DE SEGURIDAD: tar La orden tar nos va a servir para crear archivos en cinta u otros soportes. Estos archivos serán copias de seguridad de todo un sistema de archivos. La orden nos servirá también para guardar y restaurar archivos a/desde un soporte de archivo. Tiene la ventaja que permite almacenar y recuperar la estructura de directorios y los permisos de los archivos.

Una forma de generar uno de estos archivos a partir de todo el sistema de archivos que cuelga de nuestro directorio de trabajo sería con la siguiente orden:

$ tar cvf copia *

Así hemos generado un fichero llamado copia y que contiene la copia de seguridad de todo nuestro directorio. En vez de seleccionar todo nuestro directorio podríamos haber seleccionado unos cuantos ficheros o directorios. Si como nombre de fichero se coloca un guión (-) la orden supondrá que debe cambiar ese guión por la entrada o salida estándar, según proceda.

Los parámetros más comúnmente utilizados en esta orden son los siguientes:

• c : Crea un nuevo archivo o sobrescribe uno ya existente.

• v : Coloca a tar en modo detallado, de forma que los nombres de los archivos se mostrarán en el terminal según tar los va procesando.

Arquitectura de Computadores y Sistemas Operativos Pág. 16

• f : Especifica el nombre del fichero que será utilizado como contenedor. En nuestro ejemplo hemos puesto el fichero copia pero podríamos poner algún dispositivo de carácter especial, como el correspondiente a una disquetera.

• t : Proporciona una tabla de contenido del archivo.

• x : Extrae los archivos o directorios especificados en la lista de archivos

• z : Permite además hacer copias comprimidas o descomprimir copias.

Por tanto, si queremos hacer una copia comprimida de nuestro directorio haríamos :

$ tar cvzf copia2 *

Si queremos ver lo que contienen ambos ficheros generados lo haremos así:

$ tar tvf copia $ tar tvzf copia2

Y si lo que queremos es extraer los ficheros que contienen copia y copia2 lo haremos con:

$ tar xvf copia $ tar xvfz copia2

Notar que el tar cvZf que hemos hecho anteriormente sería equivalente a lo siguiente: $ tar cv * | gzip > copia2.comp

Esto nos generará un fichero copia2.comp que contiene la copia comprimida de todo nuestro sistema de directorios.

Pensar en la orden equivalente al tar xvzf copia2 utilizando la orden gunzip para descomprimir ficheros.

Normalmente se etiquetan con las terminaciones .tgz o .tar.gz los ficheros que creados con tar y comprimidos con gzip.

10. MANEJO DE PROCESOS Las órdenes del usuario y las tareas del sistema, se manifiestan como la ejecución de procesos, concretamente, el sistema ofrece al usuario un intérprete de órdenes, el programa sh (shell). El sh es una orden del sistema UNIX que consiste en un intérprete de un lenguaje de programación que lee su entrada desde una terminal o desde un fichero. Generalmente se habla de sh, pero los sistemas UNIX ofrecen distintos intérpretes de órdenes con características similares, así podemos encontrar: sh, csh, ksh y bash.

Cuando un usuario comienza una sesión de trabajo, el UNIX arranca un programa sh que funciona de forma interactiva con su terminal. Para arrancar un proceso, basta que el usuario teclee el nombre del fichero asociado en su terminal.

$ date

Si se desea ordenar a UNIX que ejecute varios procesos de forma secuencial, podemos invocarlos separados por punto y coma ";".

$ date;ps;who

El proceso ps comenzará a ejecutarse cuando termine la ejecución de date, y who cuando lo haga ps. A esto se le llama proceso secuencial.

Arquitectura de Computadores y Sistemas Operativos Pág. 17

10.1. ORDEN ps Esta orden muestra en la pantalla información sobre los procesos que se están ejecutando en el instante actual.

$ ps PID TTY TIME COMMAND 29437 Ttyqa 0:00 Bash 6816 Ttyqa 0:00 Ps

Algunas opciones proporcionan información más detallada (ojear las páginas de man)

$ ps xf

Una orden similar a ps y que ofrece más información es top. Ejecutadla y mirar la información que muestra. Una vez arrancada, apretad la tecla q para salir y la tecla h para ayuda (distingue mayúsculas y minúsculas)

10.2. ORDEN kill Esta orden se usa para enviar una señal a un proceso en ejecución. Para usarla, debemos conocer el PID del proceso al que se desea enviar la señal. La señal por defecto es la 15, que es la de terminación. Añadiendo el parámetro 9 a esta orden, lo que le llega al proceso será la señal 9 (SIGKILL) que es una señal con la que finalizamos el proceso instantáneamente.

Observe la ejecución de la siguiente secuencia de órdenes.

$ (sleep 30;echo Han pasado 30 segundos)& 6815 $ ps PID TTY TIME COMMAND 29437 ttyqa 0:00 Bash 6815 ttyqa 0:00 Sleep 30 6816 ttyqa 0:00 Ps $ kill 6815

Resulta curioso el resultado de la ejecución de la siguiente secuencia: $ ps PID TTY TIME COMMAND 29437 ttyqa 0:00 Bash 6816 ttyqa 0:00 Ps $ kill -9 29437

Se han colocado en negrita las salidas de las órdenes por claridad.

Arquitectura de Computadores y Sistemas Operativos Pág. 18

11. VARIABLES Y COMILLAS El shell, como cualquier otro intérprete, permite la utilización de variables que, en este caso, son siempre alfanuméricas.

Creación y modificación de variables: Una variable se crea asignándole una cadena de caracteres mediante el operador =. Este operador también permite modificar su valor:

$ RUTA1=/bin $ RUTA2=/usr/bin $ yo=pepe

Referencias a variables: Las variables se pueden referenciar utilizando el operador $: $ echo $RUTA1 $ echo $RUTA1 $yo $ RUTAS=$RUTA1:$RUTA2/$yo $ echo $RUTAS

11.1. LAS COMILLAS. Dentro del conjunto de metacaracteres del shell existen tres tipos de comillas que tienen distintos significados.

Las comillas simples ' ' (tecla de ? ) evitan que el shell interprete las cadenas que delimitan, es decir, las trate como un literal:

$ echo /bin/c* $ echo '/bin/c*'

Para evitar la interpretación de un carácter también puede utilizarse la barra invertida \: $ echo * $ echo '*' $ echo \*

Las comillas dobles " " son muy semejantes a las comillas simples y también evitan la interpretación excepto sí se da el caso del metacarácter $, que sirve para referenciar variables. Su uso se ilustrará cuando se introduzcan las variables. (Ver siguiente apartado)

Las comillas inversas ` ` (tecla [ seguida de espacio) son muy diferentes a las comillas simples y dobles y permiten que la salida de la orden que delimitan pueda utilizarse como argumento de otra orden:

$ echo date $ echo 'date' $ echo `date`

Arquitectura de Computadores y Sistemas Operativos Pág. 19

11.2. VARIABLES Y COMILLAS. Las comillas simples se utilizan para que los blancos y otros meta caracteres puedan formar parte de una cadena:

$ saludo='Hola; que tal' $ echo $saludo

Las comillas dobles permiten que el operador $ sea interpretado al asignar una variable:

$ echo ' rutas: - $RUTAS -' $ echo " rutas: - $RUTAS -" $ echo "echo $RUTAS" > rutas2 $ diff rutas rutas2

Las comillas inversas permiten asignar una variable con la salida de una orden: $ hoy=`date` $ echo $hoy

12. Procesos en segundo plano Hasta ahora los procesos que hemos ejecutado realizaban su ejecución en primer plano, es decir, con un control más o menos directo sobre el teclado. En MSDOS todos los procesos que se ejecutan son en primer plano.

En UNIX existe una segunda manera de ejecutar procesos: el segundo plano o background. Esta forma de ejecución se utiliza para ejecutar aquellos programas que no requieren interacción con el usuario, por ejemplo servidores, o aquellos procesos que tienen tanto su entrada como su salida redireccionada a ficheros.

Como ejemplo de la utilización de órdenes en background, imaginad el siguiente supuesto: se quiere encontrar un conjunto de ficheros en el árbol de directorios (por ejemplo todos los archivos cuyo nombre empiece por pas). Comprobar la siguiente orden:

$ find / -name pas\* -print

Cuando lleve un minuto (o menos) la paráis con ^C.

Una forma más elegante de hacer la orden seria: $ find / -name pas\* -print > encontrados &

Fijaos que hemos redireccionado la salida y añadido el símbolo &. Este símbolo le dice al shell que no debe esperar a la finalización de la orden, que la ponga en ejecución y vuelva a pedir otra orden, es decir, que ponga la orden en segundo plano. Como find no necesita más entradas de teclado seguirá con su ejecución dejando los resultados en el fichero encontrados.

Cuando la orden finalice aparecerá un mensaje en pantalla informando de ello, aunque también podemos averiguar si sigue en funcionamiento con la orden ps.

Este y otros conceptos se dejan para la siguiente práctica.

Arquitectura de Computadores y Sistemas Operativos Pág. 20

13. Entorno de ventanas En Linux no existe un entorno de ventanas único que se encuentre implementado en el sistema operativo, tal y como ocurre en otros SO como MacOS de Aple, OS/2 de IBM o Windows-NT de Microsoft.

En cambio existe el sistema de ventanas X. En este sistema se pueden encontrar los siguientes elementos:

• Dispositivos de entrada. En el sistema X se utiliza el teclado y un dispositivo apuntador (un ratón). En X se supone que el ratón tiene al menos 3 botones.

• Dispositivo de salida gráfica. Un dispositivo que permite la visualización de datos gráficos.

• Servidor X. Programa que conoce los dispositivos gráficos de entrada/salida gestionando los eventos producidos por los primeros y actualizando la información en la salida. Como en una misma máquina puede haber varios servidores en marcha (varios monitores, diferentes configuraciones…) cada uno de los servidores arrancados recibe un nombre diferente.

• Gestor de Ventanas. Aplicación que controla las ventanas. Las aplicaciones gráficas se comunican con el gestor de ventanas para crear y actualizar la información de sus ventanas. El gestor es el encargado de distribuir los eventos detectados en el servidor a las aplicaciones. Algunos ejemplos de gestores: twm, fvwm, olwm, KDE, Gnome… (En la figura se muestra el aspecto de KDE)

• Aplicaciones. Las aplicaciones se comunican con un gestor de ventanas para enviar

Nombredel

programaBarra de

tareas

Ventana

Sistemas deayuda

Aplicaciones,menús y

escritoriosTerminal

(shell)

Menú deaplicaciones

Explorador

Accesosdirectos

Arquitectura de Computadores y Sistemas Operativos Pág. 21

y recibir información. Aunque las aplicaciones pueden funcionar con cualquier gestor de ventanas, existen aplicaciones que requieren que un determinado gestor de ventanas esté instalado (no en ejecución) en la máquina en que se ejecutan. Muchas de las aplicaciones diseñadas para su ejecución en un sistema de ventanas compatible con X tienen un nombre que empieza por esta letra: xterm, xman, xload…

Como característica adicional: el servidor X, el gestor de ventana y las aplicaciones pueden estar ejecutándose en máquinas diferentes.

Para arrancar el entorno de ventanas en el laboratorio (si no estuviese en marcha), habría que ejecutar la orden: startx.

Esta orden arranca un servidor X y arranca un gestor de ventana, por defecto KDE. En la figura se puede ver el aspecto general que presenta este entorno una vez arrancado.

El nombre de un servidor X se construye de la siguiente manera:

nombre_maquina:N.M

Donde nombre de máquina es la dirección o nombre de red del computador y N y M son el identificador del servidor X. El primer servidor que se ha arrancado se denomina ":0.0" . La configuración del servidor la realiza el superusuario, aunque los usuarios pueden modificar algunas opciones con el archivo ".xserverrc".

La configuración del entorno (gestor de ventanas inicial, aplicaciones a arrancar, fondo de pantalla, etc...) se pueden configurar con el fichero".xinitrc". Si no se encuentran estos ficheros se toman una serie de acciones por defecto que son configuradas por el superusuario.

13.1. Ejecución remota Una de las características más importantes de X es la posibilidad de la ejecución remota de aplicaciones gráficas mostrando el resultado en la máquina local. Para conseguirlo es necesario tener en ejecución un servidor X y un gestor de ventanas en la máquina local.

Supongamos que nos encontramos en acompXX.disca.upv.es y arrancamos el servidor X. Este servidor sería acompXX.disca.upv.es:0.0 si es el primero en arrancarse en el computador. Podéis comprobar el nombre del servidor mirando el valor de la variable DISPLAY.

Ejecutar en el entorno: xosview &

Ejecutar en el entorno: /usr/X11/lib/xcreensaver/bubble3d &

Mientras se ejecuta este programa veréis como la barra de xosview que mide lo ocupada que esta la CPU aumenta (estamos usando la CPU local).

Cerrar la ventana del programa buble3d Desde programa de terminal (xterm, kvt, etc) abrimos una sesión remota con osito.disca.upv.es, usando la orden “ssh osito”. Las aplicaciones que ejecutamos en esta sesión se ejecutan en osito.

En osito ejecutamos: export DISPLAY=acompXX.disca.upv.es:0.0

Esta variable de entorno se define cuando arrancamos el sistema X y es utilizada por las aplicaciones para saber a que servidor conectarse. (Comprobar el valor de dicha variable en acompXX).

Ejecutar en el entorno: xosview &

Ejecutar en el entorno: /usr/X11/lib/xcreensaver/bubble3d &

Arquitectura de Computadores y Sistemas Operativos Pág. 22

¿Qué está ocurriendo? La siguiente figura lo indica:

acompXX.disca.upv.esosito.disca.upv.es

RED

Gestor deVentanas

Servidor X

Salida GraficaRaton yteclado

Aplicación X

Aplicación X

Las aplicaciones X se comunican con el servidor X directamente mediante un protocolo estándar. Este protocolo se puede utilizar para comunicar un servidor X y una aplicación aunque se ejecuten en máquinas diferentes, aunque la respuesta en este segundo caso será más lenta.

NOTA 1: Si la sesión remota se ha abierto mediante ssh es este programa el que gestiona automáticamente la variable DISPLAY, que no hace falta modificar.

NOTA 2: Es posible restringir desde que máquinas se pueden abrir ventanas en un servidor X, para ello se utiliza la orden xhost. Consultar la ayuda. Si tenéis cualquier problema aseguraos de ejecutar la siguiente línea: “xhost +localhost +osito.disca.upv.es “

13.2. Otros gestores de ventanas Un aspecto importante es que las aplicaciones no dependen del gestor de ventanas en ejecución, por lo que este se puede cambiar de forma dinámica. (El entorno KDE no lo permite pero esto es una excepción)

Para que al ejecutar startx se inicie otro gestor de ventanas diferentes se puede optar por tres soluciones:

• (NO RECOMENDABLE) Arrancar el servidor X, el gestor y las aplicaciones desde la línea de órdenes del shell.

• Modificar el fichero ".xinitrc" para que de forma permanente arranque otro gestor.

• Configurar ".xinitrc" para que arranque un gestor de ventanas en función del valor de una variable de entorno.

La tercera de estas soluciones es la más cómoda y la que se encuentra implementada en vuestro ".xinitrc". Para arrancar un gestor de ventanas se chequea la variable WINDOWMANAGER. Si no está definida se arranca por defecto el entorno KDE, si lo está se arranca el gestor especificado.

Si antes de ejecutar "startx" se define WINDOWMANAGER con la siguiente línea: acomp10:~$export WINDOWMANAGER=/usr/X11/bin/fvwm2

Arquitectura de Computadores y Sistemas Operativos Pág. 23

Se arrancará el gestor de ventanas especificado. Existen un gran número de gestores de ventanas para Linux.

En la actualidad los dos gestores más utilizados son KDE y GNOME. En el laboratorio el gestor utilizado por defecto es KDE pero también está instalado GNOME, para utilizar este último definir la variable WINDOWMANAGER como windowMaker.

13.3. XDM Otra forma de arrancar las X es que el superusuario se encargue de ello. Existe la posibilidad que root arranque un gestor de ‘login’ gráfico. En este caso encontramos una pantalla que nos pide directamente el login y el password, dejándonos decidir en algunos casos que manejador de ventanas queremos utilizar

La aplicación utilizada para este fin se denomina gestor de sesiones X. La aplicación base se denomina XDM (X Desktop Manager).

Este es el caso de los ordenadores de prácticas y de Knoppix.

En prácticas el programa de login “recuerda” el gestor de ventanas que se utilizó la última vez, y lo utiliza por defecto si no se cambia. Estar atentos cuando os identifiquéis, cada gestor tiene un funcionamiento diferente.