UNIX/LINUX: Bases 1.

Introducción: Arquitectura del sistema operativo UNIX.

Como todos los sistemas operativos UNIX gestiona los recursos físicos del ordenador (CPU, memoria, disco, terminales, etc) con las siguientes características:

Tal y como se muestra en la figura 1.1, cuando un usuario entra a trabajar en un ordenador bajo UNIX le atiende un programa llamado intérprete de comandos (shell) que le permite ejecutar al menos 200 programas que forman parte de la distribución típica de UNIX. Sin embargo, desde un punto de vista técnico, el sistema operativo UNIX es tan solo el programa que gestiona los recursos del ordenador que se llama núcleo (kernel). Es por abuso del lenguaje por lo que habitualmente se habla de sistema operativo UNIX cuando nos referimos a cualquiera de los 200 comandos.

Figura 1. Arquitectura del Sistema Operativo UNIX
Figura 1.1: Arquitectura del Sistema Operativo UNIX.

Quizás una de las principales características del sistema operativo UNIX es su asombrosa portabilidad a todo tipo de sistemas y la inalterable interfaz que muestra al usuario. Por esto, UNIX corre en la mayoría de las computadoras existentes (desde un IBM PC o CBM Amiga hasta un vectorial de Cray o Convex). En concreto lo que hace cada fabricante es adaptar UNIX y concretamente el núcleo a su máquina y de esta forma se comportará de forma similar a cualquier otra máquina que ejecuta UNIX. El secreto de esta facilidad de implantación se muestra en la figura 1.1 en la que se muestran los niveles que forman el sistema operativo UNIX. La característica más relevante de cualquier sistema UNIX es que existe un adecuado aislamiento entre cualquier usuario (incluido el superusuario) y el hardware del sistema, siempre usándose como intermediario el núcleo del sistema operativo que es la principal parte dependiente de la máquina. Por esta razón, Linux que no es más que una versión no comercial de UNIX (de ahí su bajo coste) corre actualmente en los siguientes sistemas (visitar www.cs.us.es/archive/linux/devel.html para más información):

Conexión en red.

Conexión remota

Para poder empezar a trabajar en un sistema UNIX es necesario disponer de una cuenta en el sistema y de una contraseña válida. Después de conectarnos al servidor remoto haciendo uso del programa "putty.exe" (desde un puesto con Windows) o bien el comando ssh (desde un puesto con Linux/UNIX/GNU-Linux) el sistema estará esperando a que el usuario se identifique.

A continuación mostramos un ejemplo de ese proceso:

login: jmartine el usuario se identifica ante el sistema
Password: el usuario introduce la contraseña que no se visualiza
Apis$ aparece el prompt del intérprete de órdenes

Como se puede observar, cuando el usuario introduce un nombre de usuario y una contraseña válidas, se pone en marcha un programa destinado a servir como interfaz entre él y el sistema operativo. Este tipo de programas reciben el nombre genérico de intérpretes de órdenes, intérpretes del lenguaje de control de tareas o shell en terminología UNIX/GNU-Linux. Hay tres shell estándar:

Nosotros vamos a trabajar con una shell denominada  bash  que es una extensión de la Bourne shell y que dispone de características muy cómodas para la edición de comandos, y que es parcialmente compatible con el k-shell.

El proceso de conexión también suele denominarse procedimiento de establecimiento de sesión.

Una vez conectados al sistema, estaremos ante una consola, una ventana en la que se está ejecutando un intérprete de comandos que contínuamente espera a que le demos órdenes para llevarlas a cabo. Por realizar un símil, podríamos equiparar esa consola con una ventana del DOS. 

Procedimiento de desconexión.

En UNIX/GNU-Linux, al igual que es necesario seguir una secuencia determinada para poder acceder a los recursos del sistema (procedimiento de conexión), también es necesario indicar cuando se da por finalizada una sesión de trabajo. De esta forma se libera el terminal para que pueda ser empleado por otro usuario y se evita que otros usuarios puedan acceder a nuestra información e incluso dañarla o destruirla.

La desconexión se consigue sin más que teclear la orden exit.

Apis:~$ exit

o bien pulsando simultáneamente las Ctrl+d a lo que el sistema responde con el mensaje:

logout

indicando que da por finalizada la conexión.

Estructura de las órdenes en UNIX/GNU-Linux.

La estructura general de cualquier orden es:

nombre[-modificadores][parámetros]

siendo nombre el nombre del programa u orden a ejecutar. Lo más común es que todas las órdenes admitan modificadores que suelen comenzar con el signo - (menos) y por una única letra y permiten caracterizar, alterar o configurar el funcionamiento de una orden. Estos modificadores pueden ir seguidos sin necesidad de colocar espacios en blanco entre ellos. Ejemplo:

Apis:~$ ls -l -a

es lo mismo que teclear:

Apis:~$ ls -la

Los parámetros deben estar separados por espacios en blanco y suministran información adicional a la orden. Ejemplo:

Apis:~$ ls -l .profile
Apis:~$ banner xxx

Además, es importante señalar que UNIX/GNU-Linux distingue las mayúsculas de las minúsculas al contrario que otros sistemas operativos.

Primeras órdenes en UNIX/GNU-Linux.

En esta sección se muestran algunas órdenes sencillas que permitirán ir familiarizando al usuario con el sistema.

man

Sintaxis: man término

En UNIX/GNU-Linux es posible obtener información detallada en línea sobre cualquier aspecto del sistema sin más que teclear man y la palabra sobre la que queremos obtener información. Esto muestra en pantalla las páginas del Manual de Referencia de UNIX asociadas al término (orden, archivo, llamada al sistema, etc.). Este manual está dividido en un conjunto de secciones de las cuales las tres primeras son estándar:

Sección 1 Ordenes de usuario
Sección 2 Describe las llamadas al sistema
Sección 3 Describe la biblioteca de funciones estándar de C

Aunque existen otras secciones para describir archivos de configuración del sistema, órdenes utilizadas por el administrador, su numeración no es común a todos los sistemas UNIX/GNU-Linux y por lo tanto deberá ser consultada. Ejemplo:

Apis:~$ man man

MAN(1) Manual pager utils MAN(1)

NAME
man - an interface to the on-line reference manuals

SYNOPSIS
man [-c|-w|-tZ] [-H[browser]] [-T[device]] [-adhu7V] [-i|-I] [-m sys-
tem[,...]] [-L locale] [-p string] [-C file] [-M path] [-P pager] [-r
prompt] [-S list] [-e extension] [[section] page ...] ...
man -l [-7] [-tZ] [-H[browser]] [-T[device]] [-p string] [-P pager] [-r
prompt] file ...
man -k [apropos options] regexp ...
man -f [whatis options] page ...

DESCRIPTION
man is the system's manual pager. Each page argument given to man is
normally the name of a program, utility or function. The manual page
associated with each of these arguments is then found and displayed. A
section, if provided, will direct man to look only in that section of
the manual. The default action is to search in all of the available
sections, following a pre-defined order and to ....

En el ejemplo (1) indica el número de sección. Cuando un término tiene varias entradas en diferentes secciones man término muestra siempre la información contenida en la primera de ellas. Si se quiere consultar otras secciones es necesario indicarlo por ejemplo:

Apis~$ man nº sección término

A continuación mostramos las operaciones básicas con man:

Operación Secuencia de Teclas Descripción
Avance de página ctrl+f o barra espaciadora muestra la siguiente pantalla
Retroceso de página ctrl+b muestra la pantalla anterior
Salir de la ayuda q finaliza el man
Localización adelante /palabra localiza la siguiente ocurrencia de la palabra dada como parámetro
Localización atrás ?palabra localiza la ocurrencia anterior de la palabra dada como parámetro

clear

Sintaxis: clear

Limpia la pantalla y sitúa el prompt del sistema en la parte superior de la pantalla.

date

Sintaxis: date [-u]

Apis~$ date [-u] +format

Esta orden muestra la hora y la fecha actuales del reloj del sistema. La opción -u provoca que la hora se exprese en formato UTC (Coordinated Universal Time). En el parámetro format se pueden especificar diferentes directivas que permiten caracterizar la salida.

La cadena format estará constituida por cualquier combinación de caracteres ordinarios y directivas. Una directiva está formada por el carácter % junto con un campo opcional que permite especificar la precisión y la anchura y un carácter de terminación que determina el comportamiento del la directiva. Se puede obtener una lista de los caracteres de terminación y su significado mediante man. Ejemplo:

Apis:~$ date
Thu Feb 23 13:12:37 CET 2006
Apis:~$ date '+DATE: %m/%d/%y%nTIME: %H:%M:%S'
DATE: 02/23/06
TIME: 13:13:33

echo

Sintaxis: echo [opt] [arg] ...

escribe las cadenas que recibe como argumentos, añadiendo al final un salto de línea. Ejemplo:

	Apis:~$ echo Repite esto si te atreves
Repite esto si te atreves

echo también permite escribir secuencias de escape empleando para ello una sintaxis similar a la de C; así:

\b escribe un carácter de borrado (backspace).
\c escribe una línea sin añadir un salto de línea al final.
\f carácter de salto de página(form-feed).
\n carácter de salto de linea (new-line).
\r carácter de retorno de carro (carriage return).
\t carácter de tabulación.
\v carácter de tabulación vertical.
\\ escribe el carácter \

\n escribe el carácter cuya representación en octal es n. N debe ser una secuencia de 1, 2, 3, ó 4 dígitos cuyo primer carácter debe ser 0.

Como el carácter \ tiene significado especial para el interprete de ordenes, es necesario evitar que éste lo procese. Para ello se encierra la expresión que lo contiene entre comilla simples o dobles. Ej:

Apis:~$ echo -e "esto\taparecera\nseparado"
esto aparecera
separado
Apis:~$

echo es utilizado con frecuencia dentro de programas de shell y para visualizar el contenido de las variables del intérprete de órdenes como se estudiará en prácticas posteriores.

line

Sintaxis: line

lee una línea de caracteres y la reproduce. Ejemplo:

Apis:~$ line
Tecleo esta linea
Tecleo esta linea
Apis:~$
line se usa con frecuencia dentro de shell scripts para leer información del terminal del usuario.

who

Sintaxis: who | who am I | who am i | whoami

Esta orden permite conocer que usuarios están conectados actualmente en el sistema, mostrando además el terminal asociado a cada sesión de cada usuario (un usuario puede tener activas varias sesiones simultáneamente) y la hora de establecimiento de la sesión. Cuando se emplea el parámetro am i el sistema muestra únicamente la información referida al propio usuario. Ejemplo:

Apis:~$ who am i
chan ttyp1 Sep 27 07:50
Apis:~$ who
tdcli00 ttyp2 Sep 27 23:14
chan ttyp1 Sep 27 07:50
root console Sep 27 20:32

Comunicación con otros usuarios

UNIX/GNU-Linux al ser un sistema multiusuario ofrece a los usuarios un conjunto de ordenes para que se puedan comunicar entre ellos. Se distinguen dos tipos de comunicación:

Comunicación interactiva (on line) en este tipo de comunicación los dos usuarios deben estar conectados al sistema (talk, write)
Comunicación no interactiva (off line) en este caso no es necesario que ambos usuarios estén conectados al sistema (mail)

write

Sintaxis: write user [line]

La orden write permite comunicarse con otro usuario conectado en el sistema de forma interactiva. La comunicación consiste en el intercambio de mensajes entre los usuarios. Si el usuario de destino tiene varias sesiones abiertas, el parámetro opcional line permite especificar con qué sesión se va a realizar la comunicación. No existen limitaciones para la longitud del mensaje. El carácter delimitador de fin de mensaje es Ctrl+d. Ejemplo:

Apis:~$ write alf
Hola alf,
Por fin, termine el módulo de control que me pediste
(Ctrl + d)
Apis:~$

el usuario destinatario (alf) escuchara un pitido y recibirá una cabecera como la siguiente junto con el mensaje:

Message from tracy (console) [Wed Sept 23 20:01:01] ...
Hola alf,
Por fin, termine el modulo de control que me pediste

mesg

Sintaxis: mesg [y | n]

Esta orden permite al usuario que la ejecuta habilitar (y) o inhibir (n) el permiso de escritura sobre su terminal. De esta forma se puede impedir que otros usuarios envíen mensajes. mesg sin argumentos muestra el estado actual del terminal. Ejemplo:

Apis:~$ mesg
is y
Apis:~$ mesg n
Apis:~$ mesg
is n
Apis:~$

mail

Sintaxis: mail [usuario destino]

por medio de esta orden es posible intercambiar correo electrónico con otros usuarios. A diferencia de write, no es necesario que el usuario destino este conectado en el sistema, puesto que el mensaje se guarda en su buzón, que podrá consultar posteriormente (mail sin argumentos). Para terminar la edición de un mensaje pulsaremos Ctrl+d. Generalmente esta consulta se realiza al iniciar la sesión que es cuando el sistema notifica al usuario la existencia de correo (mensaje -You have mail).

La orden mail en modo de consulta dispone de un conjunto de comandos para gestión de los mensajes, se puede obtener un listado de estos comandos desde dentro del propio mail tecleando ?. Ejemplo:

Apis:~$ mail pepeillo
Hola pepeillo.
Te estoy escribiendo un mensaje porque estoy
en practicas de SOA y ...
(Ctrl+d)
Apis:~$

cuando el usuario pepeillo consulte el correo electrónico obtendrá:

Apis:~$ mail
From tracy@lightwind 8 11:09 EDT 1995
Received: by lightwind
(16.6/15.6) id AA00430; Thu, 28 Sep 95 11:09:13 -0400
Date: Thu, 28 Sep 95 11:09:13 -0400
From: Dick Tracy <tracy@lightwind>
Return-Path: <tracy@lightwind>
Apparently-To: pepeillo@lightwind
Hola pepeillo.
Te estoy escribiendo un mensaje porque estoy
en practicas de SOA y ...
? ?
q quit
x exit without changing mail
p print
s [file] save (default mbox)
w [file] same without header
- print previous
d delete
+ next (no delete)
m user mail to user
! cmd execute cmd

uname

Sintaxis: uname [ -snrvmia ]

suministra diversa información sobre el sistema UNIX/GNU-Linux en el que se está conectado, sin opciones muestra la versión particular del sistema que nos atiende.

Apis:~$ uname
Linux

las opciones más comunes son:

-a muestra toda la información sobre el tipo de sistema que se está utilizando. Equivale a todas las siguientes opciones.
-m tipo de hardware que se está utilizando.
-s nombre del sistema.
-n nombre por el que se identifica el sistema en una red de comunicaciones.
-r revisión del sistema operativo.
-v versión del sistema operativo.

Ejemplo:

Apis:~$ uname -a
Linux arq0.ual.es 2.2.5-15 #10 Mon Jan 10
18:54:15 CET 2000 i586 unknown

less

Sintaxis: less nombre_de_archivo

Visualiza por pantalla el contenio de un archivo de texto dando control sobre el scroll ascendente y descendente. Mantiene una interface con el usuario donde usar una amplia colección de comandos con los que operar sobre el contenido del archivo sin modificarlo: Desplazamientos, búsqueda de cadenas, visualización de colores, apertura de archivos no regulares, apertura simultanea de n archivos, etc...

Apis:~$ less /etc/profile
# /etc/profile for SuSE Linux # # PLEASE DO NOT CHANGE /etc/profile. There are chances that your changes # will be lost during system upgrades. Instead use /etc/profile.local for # your local settings, favourite global aliases, VISUAL and EDITOR # variables, etc ... # # Check which shell is reading this file # if test -f /proc/mounts ; then case "`/bin/ls -l /proc/$$/exe`" in */bash) is=bash ;; */rbash) is=bash ;; */ash) is=ash ;; */ksh) is=ksh ;; */zsh) is=zsh ;; */*) is=sh ;; esac else is=sh fi /etc/profile lines 1-23/310 7%

Edición de Texto en UNIX/GNU-Linux

La edición de texto es una de las operaciones más frecuentes que se realizan en un ordenador. Un editor de textos es una herramienta que facilita la creación de nuevos archivos y la modificación de los ya existentes. Un editor es un tipo de procesador de texto muy sencillo, que no soporta las características tipográficas (negrita, subrayado, centrado, etc.) que tienen los procesadores de textos convencionales.

El sistema operativo UNIX/GNU-Linux dispone de varios editores de texto. Algunos de ellos están orientados a línea, como por ejemplo emacs y ex, y otros orientados  a pantalla, como el famoso editor vi. Sin embargo, ninguno de ellos podría recibir el calificativo de amigable. Resulta bastante desesperante, sobretodo al principio, acostumbrarse a su forma de trabajo, pero no podemos olvidar que una vez dominados (particylarmente vi) son muy poderosos y lo mejor es que están presentes en todas las plataformas Unix/Linux

Afortunadamente, de entre los editores de texto orientados a la pantalla hay uno, cuyo manejo, no se diferencia en casi nada al famoso "bloc de notas" de los entornos Microsoft Windows. Su nombre es nano  y será el que utilicemos durante el curso.

Apis:~$ nano