Esta página puede ser redistribuida libremente bajo los términos de la licencia GPL. Vease ( GPL texto original ) o si lo prefiere (Traducción española no oficial de la GPL) Al margen de las obligaciones legales que se derivan del uso de esta licencia rogamos sea respetada la referencia a su lugar de publicación original www.ciberdroide.com. y a su autor original Antonio Castro Snurmacher (Madrid 01/01/2000). |
![]() |
Esta ausencia de garantía se hace extensa a cualquier tipo de uso de este material y muy especialmente a las prácticas, ejercicios, y de ejemplos que encuentre en estas páginas. Deberá trabajar siempre salvo indicación contraria con un SO Linux y con un usario distinto de 'root' sin privilegios especiales. Como directorio de trabajo se procurará usar el directorio '/tmp' o algún otro que no contenga información valiosa. Tampoco se considera buena idea practicar en una máquina que contenga información valiosa. Todo esto son recomendaciones de prudencia. En cualquier caso si algo sale mal toda la responsabilidad será únicamente suya. En ningún caso podrá reclamar a nadie por daños y perjuicios derivados del uso de este material. Para más información lea el contenido de la licencia GPL y abstengase de hacer prácticas si no está dispuesto a asumir toda la responsabilidad.
|
Visión panorámica:
Por otra parte estos conceptos están interrelacionados de tal forma que
tampoco se puede abordar ninguno de ellos en detalle en este momento.
Por ello nuestro primer objetivo es ofrecer una visión panorámica del
SO. Por borrosa que resulte siempre será mejor esto que empezar
directamente abordando en detalle los temas.
Usaremos muchas veces de forma indistinta Unix y Linux. No son cosas
equivalentes pero en este curso consideraremos ambas cosas como
equivalentes salvo que concretemos detalles específicos de Linux.
Para nosotros Linux es un SO tipo Unix y precisamente nos centraremos
en los aspectos más generales de estos sistemas operativos. Entre sus
características más destacables está la de ser un SO multitarea y
multiusuario. Un sistema multitarea es aquel que puede ejecutar
varios procesos simultaneamente. Para ello se puede
usar uno o mas procesadores físicos. En el caso de un solo procesador
lo que ocurre es que el tiempo del procesador se va repartiendo para
atender los distintos procesos creando la ilusión de que todo ocurre
simultaneamente. Un sistema multiusuario
es aquel que está pensado para ser utilizado por varios usuarios
simultaneamente. En la práctica un sistema multiusuario requiere capacidad
multitarea. En el caso concreto de Linux es además un SO multiplataforma
ya que puede funcionar en diferentes arquitecturas.
Los conceptos que mencionemos en este curso procuraremos ilustrarlos
con ejemplos.
El comando 'echo' es un comando que vamos a usar mucho para practicar.
Este comando se limita a visualizar en pantalla todo aquello que se
le pasa como argumentos. Por eso nos resultará muy util.
Lo primero que vamos a practicar y que no debe olvidar es el hecho de
que en Unix los ficheros, comandos etc.. deben indicarse exactamente
respetando la diferencia entre mayúsculas y minúsculas.
La segunda linea habrá producido un mensaje de error porque no existe
nigún comando llamado ECHO con mayúsculas.
Variables de entorno:
En Unix las variables del sistema se llaman variables de entorno.
Para consultar el valor de una variable se utiliza el nombre de la
variable precedido por '$'.
Para ver todas las variables y sus valores se utiliza el comando
set.
Para hacer la variable exportable se usa el comando 'export'.
Se puede hacer que una variable sea de solo lectura con el comando
'readonly'. Este comando sin parámetros mostrará todas las variables
que son de solo lectura. Pruebe estos comandos:
Existen algunas variables predefinidas y
hay tres variables importantes que mencionaremos en seguida y que
son $PATH, $PS1 y $PS2.
Directorios:
En Unix la estructura de directorios es en forma de arbol similar a la
de Msdos.
Dado que la estructura de directorios se organiza como las ramas de un
arbol para localizar un punto cualquiera hay que utilizar cada uno de
los directorios que conducen a ese punto desde el directorio raiz.
Nosotros lo llamaremos camino y en Unix se le suele llamar path.
Se empieza en el directorio raiz representado por '/' y se
avanza por las ramas de ese arbol separando cada identificador por un
nuevo caracter '/'. De esta forma '/usr/local/bin' indica un lugar concreto
en el arbol de directorios. Quizás se pregunte porqué Unix usa '/' en
lugar de '\' como en Msdos. Recuerde que Msdos fué posterior a Unix y
que a Bill Gates le gusta inventar cosas totalmente nuevas y revolucionarias.
Aunque el astuto lector ya se habrá dado cuenta, advierto a los despistados
que estoy ironizando.
Aprovechando que estamos hablando de directorios mencionaremos que hay
directorios con significado especial. Está el directorio raiz '/' que
ya hemos mencionado. Está el directorio 'home' que es el punto donde
el sistema nos situa para trabajar cuando entramos en él. Recordemos que
en Unix normalemente no disponemos de todo el sistema para nosotrso solos.
Luego podemos cambiar de directorio de trabajo. El directorio de trabajo
actual se representa como directorio '.', El directorio anterior o directorio
padre de este directorio se representa por '..'. Los comandos 'cd',
'mkdir' y 'pwd' sirven para cambiar de directorio actual, crear un
directorio y averiguar en que directorio nos encontramos actualmente.
Estamos dando ideas en forma intuitiva. En realidad cuando digo " ... en que
directorio nos encontramos actualmente ..." es una forma de expresarse.
Normalmente el usuario no estará en un directorio sino sentado en una
silla sentado delante de una pantalla, pero la shell mantiene en todo
momento algún directorio abierto como directorio de trabajo actual.
Comandos
Si un comando no está localizado en ninguno
de esos caminos deberá ser referenciado indicando el camino completo ya
que de otra forma no podrá ser referenciado.
Si quiere saber donde se encuentra un ejecutable use el comando which.
Este comando buscará en los caminos contenidos en la variable $PATH
hasta que encuentre el comando y entonces mostrará el camino completo
que conduce al comando. Puede ocurrir que un comando se encuentre
duplicado y que los dos sitios donde se encuentre figuren en el $PATH.
En ese caso se ejecutará el comando que se encuentre en el primer camino
referenciado en el $PATH. Igualmente el comando which solo mostrará el
primer camino referenciado en el $PATH.
Estamos usando un comando llamado echo para mostrar valores. Vamos a
localizarlo.
Echo esta situado en uno de los caminos contenidos en $PATH.
En resumidas cuentas $PATH es una variable que usa el interprete de
comandos para localizar los comando. En la lección siguiente hablaremos de
'man'. Es un comando que sirve para consultar el manual en linea de Linux.
Pues bien existe una variable llamada $MANPATH que contiene la lista de
los caminos donde el comando 'man' debe
buscar las páginas del manual. La variable $MANPATH será usada por el
comando 'man' y quizas algún otro. La variable $PATH será usada por la
shell y quizas por algún otro comando como por ejemplo 'which' del cual
acabamos de hablar.
Somos conscientes de que no estamos explicando gran cosa ahora, pero
son conceptos muy elementales que vamos a utilizar antes de explicar
en profundidad todo el sistema de ficheros de Unix.
Más adelante también hablaremos más detenidamente sobre las variables
de entorno.
Estamos dando unos pequeños esbozos sobre algunas cuestiones porque hay
mucha interrelación de unos conceptos con otros y resulta imposible abordar
nada en profundidad al principio.
Usuarios
Los usarios pueden estar organizados en diferentes grupos a fin de
poder manejar permisos a nivel de grupo. Esto se hace para simplificar
la administración del sistema.
Los usuarios y los grupos dentro del sistema se manejan como un número
llamado UID y GID respectivamente. Los números en un ordenador se manejan
con mucha más
facilidad que un literal. Por eso el nombre de usuario y el nombre de
grupo se guardarán solo en un fichero junto al número UID y GID asociado,
pero para el sistema un usuario, un grupo, un proceso, un fichero, y
muchas otras cosas se identifican por una clave numérica. Para un ordenador
resulta más sencillo consultar si el proceso 456 perteneciente al usuario
105 tiene permiso de escritura en el fichero 48964 que consultar si el
usuario 'pepito' perteneciente al grupo 'alumnos' tiene permiso de escritura
en el fichero '/home/pepito/leccion005.txt'. Cuando el ordenador tiene que
mostrar información en formato inteligible buscará la descripción
correspondiente a cada clave numérica.
Cada clave
recibe un nombre como por ejemplo los UID, GID que ya hemos comentado otra
sería por ejemplo el PID, para procesos y existen otras muchas más que
iremos aprendiendo y que forman parte de la jerga de este SO.
Para ver los datos de identificación relativos a su usuario pruebe lo siguiente:
El comando 'id -un' o el comando 'whoami' muestran su nombre de usuario.
Existe un usuario especial que goza absolutamente de todos los privilegios
y que se llama root. Su número de usuario es decir su UID es 0.
El Núcleo del sistema (kernel)
Procesos
Si se siente un poco mareado y confuso relajese y acostumbrese a esta
sensación. Los primeros pasos suelen ser los más complicados.
Especialmente en Unix porque no fué diseñado como un sistema intuitivo.
Test
En su momento trataremos los temas abordados en este capítulo de forma
completa. En este momento dado que partimos de cero se hace necesario al
menos esbozar una serie de conceptos que son tan elementales que
dificilmente se puede explicar algo sin hacer referencia a ellos.
$ echo hola
$ ECHO hola
Empezaremos hablando de las variables sin profundizar ahora en ello.
Una variable solo es un elemento que tiene un nombre y que es capaz de
guardar un valor. Para definir una variable basta poner su nombre un
igual y su valor. (Ojo no dejar espacios).
$ VAR33=valor_de_la_variable_VAR33
$ echo $VAR33
$ set
$ readonly
$ export
Aquí también tenemos que hacer un pequeño avance sobre la estructura
de directorios de Unix porque si no puede que no se entienda lo que
vamos a hablar sobre la variable $PATH.
Un comando es generalmente un fichero ejecutable localizado en alguna
parte de nuestro sistema.
Existe una variable llamada $PATH que contiene una lista de caminos de
busqueda para los
comandos todos ellos separados por ':'. Compruebe el valor de su
variable $PATH.
$ echo $PATH
$ which echo
Linux es un sistema operativo multiusuario y eso implica una filosofía
de uso muy distinta a la del tradicional ordenador personal. Cuando
un usuario va a usar un SO Tipo Unix lo primero que necesita hacer es
identificarse para ser autorizado a abrir una sesión de trabajo. También
es multitaréa y por ello en el mismo instante varios procesos pueden estar
funcionando y cada uno puede pertenercer a usuarios distintos. La
información que se guarda en el disco duro también puede pertenecer a
distintos usuarios y para evitar que todo ello provoque conflictos existen
unos atributos de usuario que se asocian a los ficheros a los directorios,
a los procesos, etc. En función de esto hay cosas que estarán permitidas
a ciertos usuarios y a otros no.
$ id
$ whoami
El núcleo del sistema llamado también kernel es el encargado de realizar la
mayoría de funciones básicas del sistema y gestiona entre otras cosas la
memoria, los ficheros, los usuarios, las comunicaciones, los procesos, etc.
La gestíon de estas cosas se hacen por medio de un limitado número de
funciones que se denominan llamadas al sistema y que pueden ser usadas
por los programas. Los procesos que usan una llamada al sistema cambian
su modo de ejecución. Mientras están ejecutando la llamada del núcleo
se dice que estan en modo núcleo y cuando están ejecutando código que
no pertenece al núcleo se dice que están en modo usuario. Son dos niveles
de ejecución distintos ya que el modo núcleo es un modo privilegiado.
Esto garantiza a nivel de hardware que ningún programa de usuario pueda
acceder a recursos generales del sistema ni interactuar con otros
procesos a no ser que use las llamadas del núcleo las cuales establecerán
si tiene o no permiso para hacer ciertas cosas. Esto proporciona gran
robustez de funcionamiento. Un programa mal diseñado no perjudicará
jamás al sistema ni a otros procesos. Cada proceso tiene su propia zona
de memoria y no puede acceder fuera de ella ni intencionadamente ni
accidentalmente. Para que un programa pudiera tener un efecto destructivo
en el sistema tendría que pertenecer a 'root' o pertenecer al propio
nucleo del sistema y solo el admiministrador 'root' puede alterar el
dicho nucleo. Si el ordenador aparece un buen día destrozado a
martillazos también buscaran la forma de culpar a 'root' para no perder
la costumbre.
Un proceso a diferencia de un programa es algo vivo es decir algo que está
funcionando. En un sitema multitarea como este, un programa puede dar
lugar a varios procesos. A cada proceso le corresponderá con un número
de identificación llamado PID que le identifica totalmente.
Además de esto se guarda la información de identificación del usuario
propietario. Cuando un usuario ejecuta un comando se arranca
el proceso correspondiende del cual generalmente permanecerá como
propietario. Es decir el sistema no acepta órdenes anónimas. Siempre
figurará un usuario para hacer cada cosa.
Esto se indica con un número UID para identificar el
usuario correspondiente. No siempre este UID se corresponde con el
usuario que arrancaro el proceso. Por ello existe además de un UID
un identificador de usuario efectivo (EUID) que es el que realmente
es tenido encuenta por el sistema a la hora de conceder permiso para
hacer ciertas cosas. El EUID de 'root' es 0.
Ahora no importa como pero algunos comandos de forma bien controlada
podrían convertirnos virtualmente en superusuarios haciendo que su EUID
valga 0. Esto serviría por ejemplo para permitir hacer cosas especiales y muy
concretas nada más que en condiciones normales solo 'root' podría hacer.
No hemos mencionado intencionadamente algunas cosas (como por ejemplo el
grupo de usuario), porque estamos simplificando mucho intencionadamente
para intentar que en este momento solo capte una primera idea general.
Puede comprobar sus conocimientos respondiendo el siguiente test.
Para ello seleccione las opciones que se ajusten a la verdad y luego
pulse el boton para ver el resultado de su test.
Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos