CONOCIENDO LINUX
Linux es un sistema operativo libre, basado en Unix.4 Es uno de los principales ejemplos de software libre y de código abierto.5 Linux está licenciado bajo la GPL v2 y está desarrollado por colaboradores de todo el mundo.
El núcleo Linux fue concebido por el entonces estudiante de ciencias de la computación finlandés Linus Torvalds en 1991.6 Linux consiguió rápidamente desarrolladores y usuarios que adoptaron códigos de otros proyectos de software libre para usarlo con el nuevo sistema operativo.7 El núcleo Linux ha recibido contribuciones de miles de programadores de todo el mundo.8 Normalmente Linux se utiliza junto a un empaquetado de software, llamado distribución GNU/Linux y servidores.
ESTRUCTURA DEL KERNEL DE LINUX
Originalmente Linux era
monolítico, es decir que todas las funcionalidades estaban incluidas en el código
del núcleo y era necesario recompilarlo para soportar un nuevo dispositivo,
etc.
Sin embargo, esta idea no
encaja bien con la enorme diversidad de componentes hardware que existen hoy en
día. Que todas las personas tengan los mismos componentes es raro, por esta
razón Linux, como buen sistema operativo Unix pretende obtener todo el partido
de la máquina en la que se está ejecutando.
Debido a todo esto, el diseño
fue migrando paulatinamente a un modelo basado en módulos. Se procura así que
el núcleo sea lo más ligero posible y cuando sea necesario añadir una nueva
funcionalidad como soportar una nueva tarjeta de sonido, sólo haya que compilar
el módulo y añadirlo al núcleo.
El Kernel está compuesto por
cinco subsistemas.
1) Process Scheduler o Programador
de Procesos
2) Memory Manager o
Administrador de Memoria
3) Virtual File System o
Sistema de Archivos Virtual
4) Network Interface o
Interfaz de Red
5) Inter-Process Comunication
o Comunicación Entre Procesos
Estos componentes son
independientes entre sí.
1) Process Scheduler o
Programador de Procesos
a) Permitirle a los procesos
crear nuevas copias de sí mismos (forking)
b) Determinar qué proceso
tendrá acceso a la CPU
c) Recibir interrupciones y
desviarlas hacia el subsistema respectivo
d) Enviar mensajes a los
procesos de usuario
e) Manejar el reloj de
Hardware (Hardware Timer)
f) Liberar recursos cuando un
programa los haya desocupado.
El Process Scheduler también
soporta módulos cargados dinámicamente. Una de las funcionabilidades más
importantes de esto último son el Virtual File System y Network Interface.
También provee dos interfaces. Uno, provee una interface de
llamada a sistema limitada que
los procesos pueden llamar. Dos, provee una interface para el resto del espacio
del Kernel.
En tiempo de booteo, Linux
posee sólo un proceso, init(), que a su vez realiza copias de sí mismo a través
de llamadas fork(). Cuando un proceso termina, ejecuta la llamada a _exit().
Ademas posee llamados a
señales a través de signal(). Esta llamada permite a un proceso asociar un
manejador de funcion (function handler) con una señal en particular. Las
señales pueden considerarse como una forma de IPC o intercomunicación de
procesos.
Acerca del timer, Linux maneja
un timer interno que se inicia cada 10 milisegundos. Esto permite que los
procesos se reasignen (Scheduling) cada 10 ms. Esta unidad se llama “clock
tick” que sirve para medir la cantidad de ticks que un proceso en particular
puede continuar ejecutándose sin forzar su reasignación. Cada proceso se asigna
con un identificador único, llamado Process ID o pid, que es asignado a la
lista de procesos o tabla de procesos.
Finalmente, una estructura de
modulos es usada para representar los modulos cargados en tiempo de ejecución.
Esta estructura posee campos que son usados para implementar una lista de
estructura de modulos.
2) Memory Manager o
Administrador de Memoria
El Memory Manager o
administrador de memoria permite lo siguiente:
a) Gran espacio de
direcciones: Los programas pueden requerir más memoria que la que físicamente
existe
b) Protección: La memoria
asignada un proceso es privada para tal.
c) Mapas de Memoria: Se puede
mapear un archivo dentro de un area de memoria virtual y acceder al archivo
como si fuera memoria
d) Acceso Limpio a la Memoria
Física: el MM asegura que los procesos puedan usar transparentemente todos los
recursos de la máquina, asegurando además un rendimiento aceptable
e) Memoria Compartida: Permite
que los procesos puedan compartir trozos de la memoria asignada. El
Administrador de memoria posee dos interfaces : una
interfaz con llamada a sistema
que es usada por los procesos de usuario (User Space) y una interface que es
usada por los otros subsistemas (Kernel Space).Algunas de las llamadas de usuario
incluyen malloc() y free(). Las llamadas de kernel incluyen kmalloc() y
kfree(). Ya que Linux soporta múltiples arquitecturas, es necesario entonces
que existan rutinas específicas para abstraer los detalles del uso del hardware
en una sola interface.
El Memory Manager usa el
administrador de memoria de hardware para mapear direcciones virtuales a
direcciones físicas. Gracias a esto, los procesos no están conscientes de
cuanta memoria física está asociada a una dirección virtual. Esto permite al MM
poder mover trozos de memoria virtual dentro de la memoria física. Además,
permite que dos procesos puedan compartir dos trozos de memoria física si las
regiones de memoria virtual asignadas a ellas son mapeadas en la misma
dirección física. Otro concepto importante es el Swapping o intercambio, que es
intercambiar (swap) memoria ocupada por procesos en un archivo. Esto le permite
al Kernel poder ejecutar mayor cantidad de procesos que usen mayor cantidad de
memoria física existente. El MM posee un demonio, kswapd, para ejecutar la
tarea de intercambiar zonas de memoria en archivos y viceversa. Este demonio
chequea periódicamente si no existen direcciones físicas mapeadas
recientemente. Estas direcciones son vaciadas de la memoria física, y además de
esto, el MM minimiza la cantidad de actividad de disco necesaria para hacer
este intercambio.
El administrador de memoria
del hardware detecta cuando un proceso de usuario tiene acceso a una porción de
memoria no mapeada en una dirección virtual y avisa al Kernel de esta falla.
Existen dos alternativas para solucionar esto: a) o la página de memoria es
volcada a un archivo y viceversa b) o el proceso está haciendo referencia a una
zona de memoria no permitida Si el administrador de memoria detecta un acceso
no permitido (a la memoria) notifica al proceso con una señal. Si el proceso no
sabe cómo manejar esta señal, el proceso es finalizado.
3) Virtual File System o
Sistema de Archivos Virtual
Un importante desarrollo tuvo
lugar cuando se añadió el sistema de ficheros EXT, en aquel momento el sistema
de ficheros real se separó del sistema operativo y servicios del sistema a
favor de un interfaz conocido como el sistema de Ficheros Virtual, o VFS.
VFS permite a Linux soportar
muchos, incluso muy diferentes, sistemas de ficheros y cada uno presentando un
interfaz software común al VFS. Todos los
detalles del sistema de
ficheros de Linux son traducidos mediante software de forma que todo el sistema
de ficheros parece idéntico al resto del kernel de Linux y a los programas que
se ejecutan en el sistema. La capa del sistema de Ficheros Virtual de Linux
permite al usuario montar de forma transparente diferentes sistemas de ficheros
al mismo tiempo.
El VFS de Linux mantiene una
antememoria (cache) con información de cada sistema de ficheros montado y en
uso, siempre se debe tener mucho cuidado al actualizar correctamente el sistema
de ficheros ya que los datos contenidos en las antememorias se modifican cuando
se crean, escriben y borran ficheros y directorios.
La antememoria o caché más
importantes es el Buffer Cache, que está integrado entre cada
sistema de ficheros y su dispositivo de bloque. Tal y como se accede a los
bloques se ponen en el Buffer Cache y se almacenan en varias colas dependiendo
de sus estados. El Buffer Cache no sólo mantiene buffers de datos, también
ayuda a administrar el interfaz asíncrono con los controladores de dispositivos
de bloque.
Como ventajas podemos citar la
estructura de datos en memoria con los bloques más frecuentemente utilizados y
las lecturas adelantadas.
Linux implementa el denominado
Virtual File System Cache, (VFS Caché) para acelerar substancialmente el
sistema de ficheros. El argumento "filename" es utilizado por el VFS
para buscar en una estructura denominada Directory Entry Caché (dentry caché o
dcache), donde se almacenan referencias a los directorios utilizados Una
entrada del dcaché contiene un puntero a un inodo y solo residen en memoria,
mientras que los inodos tienen existencia en el disco físico. El VFS implementa
un buffer caché que controla los accesos a disco, realizando operaciones de
lectura en avance (look-ahead) Existe caché de directorios, de inodos y de
bloques de disco.
4) Network Interface o
Interfaz de Red
El sistema de red de Linux
permite la conectividad entre distintas máquinas de una red y un modelo de
conexión via sockets.
Existen dos tipos de sockets,
los BSD y los INET.
Linux posee dos protocolos de
transporte con distintos tipos de modelo de comunicación y calidad de servicio.
Están los mensajes no confiables, basados en el protocolo UDP y los mensajes
confiables basados en TCP. Estos dos están
implementados sobre el
protocolo de transporte y el protocolo IP. El protocolo IP está por encima de
los drivers. A los drivers se les provee distintas formas de comunicación: SLIP
(Serial Link IP), PLIP (Parallel Line IP) y Ethernet. Un protocolo de
resolución de direcciones media entre el protocolo IP y los drivers de
Ethernet. Su tarea es resolver direcciones IP lógicas y convertirlas en
direcciones físicas ethernet (de capa 3 a capa 2).
Los servicios de red son
usados por los otros subsistemas y por el usuario a traves de la interfaz de
sockets, que son creados y manipulados a traves de socketcall(). Los datos son
leidos y escritos a través de read() y write() como si fuera un descriptor de
archivo.
El modelo BSD de sockets es
presentado a los procesos de usuario. El modelo es orientado a la conexión, se
permite hacer streaming (flujo) y se permiten buffers. La implementacion BSD
está por sobre la INET. BSD maneja las tareas de forma similar al VFS (Virtual
File System) y administra una estructura de datos general para las conexiones.
Su propósito es la portabilidad a través de la abstracción de los detalles, a
través de una simple interfaz. La interfaz BSD es usada por Unix y Windows.
El modelo INET administra los
puntos finales de la comunicación para los protocolos TCP y UDP. La
lectura/escritura de red comienza por leer o escribir en un socket. Esto invoca
a una llamada de sistema que es manejada por el VFS (o sea, las llamadas a
archivo o sockets es simétrica). Desde ahí, se determina que la llamada BSD
sock_write() es la que implementa la llamada al filesystem. Esta rutina maneja
detalles administrativos (permisos) y pasa el control a inet_write(), para
después llamar a una funcion de transporte, como tcp_write().
Las rutinas de escritura de la
capa de transporte son las responsables de fragmentar los datos entrantes en
paquetes de transporte. Estas rutinas pasan el control a ip_build_header() que
construye una cabecera IP para ser insertada en el paquete a enviar. Luego,
tcp_build_header() es llamada para crear una cabecera TCP. Una vez hecho esto,
se envian los datos directamente al driver de red.
5) Inter-Process Comunication
o Comunicación Entre Procesos
El IPC es un mecanismo en el
cual los procesos que se están ejecutando posean medios para compartir
recursos, sincronizarse y compartir datos entre ellos. Linux implementa todas
las formas de IPC a través de recursos compartidos, estructuras de datos de
Kernel y colas de espera.
Estas formas de IPC son a
través de
a) Señales b) Colas de Espera
c) Bloqueos de Archivos d) Pipes y Named Pipes, que permiten una transferencia
de datos bidireccional y orientada a la conexión entre dos procesos,
explícitamente seteando los pipes o comunicándolos a través de named pipes en
el sistema de archivos (N. del E.:piensen en ls -als | more como una forma de piping)
e) Unix Domain Sockets, otro medio de transferencia, más usado en el modelo
INET f) IPC de System V compuesta por: g) Semáforos h) Colas de Mensaje i)
Memoria Compartida
Una señal es una notificación
enviada a un proceso por el kernel o por otro proceso. Las señales se envían a
través de send_sig(). El numero de señal se da como parámetro, como también el
proceso destino. Los procesos pueden registrar sus propias señales, a través de
la función signal(). Los bloqueos de archivo están soportados directamente por
el kernel. Para bloquear un archivo, puede usarse open() simplemente.
Pipes (tuberías) pueden ser
usadas con pipe(), para filesystems read() o write() y para named pipes open().
Para Unix Domain Sockets, toda la funcionabilidad está encapsulada en
socketcall().
En IPC de System V, existe una
interfaz común para los tres métodos, ipc().
Las colas de espera son solo
listas con los procesos que esperan por un evento del kernel, como la
finalización de una lectura de DMA. Un proceso puede entrar voluntariamente a
una cola de espera con sleep_on() o interruptable_sleep_on() y despertar con
wake_up() o wake_up_interruptable() (que remueve los procesos de esta cola).
Los bloqueos de archivos
ocurren para prevenir que dos procesos puedan acceder al mismo archivo. Esta
exclusión puede ser hecha al archivo completa o a una porción del archivo.
INTÉRPRETES DE COMANDOS PARA
UNIX O LINUX
Los intérpretes de comandos es
un archivo ejecutable (shell) que debe interpretar los comandos, transmitirlos
al sistema y devolver el resultado.
Linux ofrece la posibilidad de
usar varias shells:
sh (llamado
"Bourne shell")
ksh ("Korn
shell")
csh ("C
Shell")
bash ("Bourne
again shell")
Tcsh ("Tenex
C shell") versión de C Shell para Linux con funcionalidades similares
a bash.
zsh ("Zero
shell"). pequeño intérprete similar al Bourne Shell.
Las dos shell más populares en
Unix son el Bourne Shell (System V) y el Cshell (BSD Unix). En Linux es el
Bourne Shell (bash) una variante del Bourne clásico
COMANDOS BÁSICOS DE LINUX
Referencia De Comandos
Unix-Linux
La siguiente lista de comandos
pretende ser de utilidad como referencia rapida
para utilizar comandos de
sistema. Se ha agrupado en dos: los comandos
de sistema corrientes y los
relacionados con la administracion.
Comandos de sistema
ls
Descripción: =list. listar
contenido de directorios.
Ejemplos: ls, ls -l, ls -fl,
ls --color
cp
Descripción: =copy. copiar
ficheros/directorios.
Ejemplos:cp -rfp directorio
/tmp, cp archivo archivo_nuevo
rm
Descripción: =remove. borrar
ficheros/directorios.
Ejemplos: rm -f fichero, rm
-rf directorio, rm -i fichero
mkdir
Descripción: =make dir. crear
directorios.
Ejemplos: mkdir directorio
rmdir
Descripción: =remove dir.
borrar directorios, deben estar vacios.
Ejemplos: rmdir directorio
mv
Descripción: =move. renombrar
o mover ficheros/directorios.
Ejemplos: mv directorio
directorio, mv fichero nuevo_nombre, mv fichero a_directorio
date
Descripción: gestion de fecha
de sistema, se puede ver y establecer.
Ejemplos: date, date 10091923
history
Descripción: muestra el
historial de comandos introducidos por el usuario.
Ejemplos: history | more
more
Descripción: muestra el
contenido de un fichero con pausas cada 25 lineas.
Ejemplos: more fichero
grep
Descripción: filtra los
contenidos de un fichero.
Ejemplos:cat fichero | grep
cadena
cat
Descripción: muestra todo el
contenido de un fichero sin pausa alguna.
Ejemplos: cat fichero
chmod
Descripción: cambia los
permisos de lectura/escritura/ejecucion de ficheros/directorios.
Ejemplos: chmod +r fichero,
chmod +w directorio, chmod +rw directorio -R, chmod -r fichero
chown
Descripción: =change owner.
cambia los permisos de usuario:grupo de ficheros/directorios.
Ejemplos: chown root:root
fichero, chown pello:usuarios directorio -R
tar
Descripción: =Tape ARchiver.
archivador de ficheros.
Ejemplos: tar cvf fichero.tar
directorio , tar xvf fichero.tar, tar zcvf fichero.tgz directorio, tar zxvf
fichero.tgz
gunzip
Descripción: descompresor
compatible con ZIP.
Ejemplos: gunzip fichero
rpm
Descripción: gestor de
paquetes de redhat. Para instalar o actualizar software de sistema.
Ejemplos: rpm -i paquete.rpm,
rpm -qa programa, rpm --force paquete.rpm, rpm -q --info programa
mount
Descripción: montar unidades
de disco duro, diskette, cdrom.
Ejemplos:
mount /dev/hda2 /mnt/lnx, mount /dev/hdb1 /mnt -t vfat
umount
Descripción: desmontar
unidades.
Ejemplos: umount /dev/hda2,
umount /mnt/lnx
wget
Descripción: programa para
descargar ficheros por http o ftp.
Ejemplos: wget
http://www.rediris.es/documento.pdf
lynx
Descripción: navegador web con
opciones de ftp, https.
Ejemplos:
lynx www.ibercom.com, lynx --source http://www.ibercom.com/script.sh | sh
ftp
Descripción: cliente FTP.
Ejemplos: ftp ftp.ibercom.com
whois
Descripción: whois de
dominios.
Ejemplos: whois ibercom.com
who
Descripción: muestra los
usuarios de sistema que han iniciado una sesion.
Ejemplos:
who, w, who am i
mail
Descripción: envio y lectura
de correo electronico.
Ejemplos: mail
pepe@ibercom.com < fichero, mail -v pepe@ibercom.com < fichero
sort
Descripción: ordena el
contenido de un fichero.
Ejemplos: cat /etc/numeros |
sort, ls | sort
ln
Descripción: =link. para crear
enlaces, accesos directos.
Ejemplos: ln -s /directorio
enlace
tail
Descripción: muestra el final
(10 lineas) de un fichero.
Ejemplos:tail
-f /var/log/maillog, tail -100 /var/log/maillog | more
head
Descripción: muestra la
cabecera (10 lineas) de un fichero.
Ejemplos:
head fichero, head -100 /var/log/maillog | more
file
Descripción: nos dice de que
tipo es un fichero.
Ejemplos: file fichero, file *
Comandos de administración
sysctl
Descripción: Configurar los
paràmetros del kernel en tiempo de ejuecución.
Ejemplos: sysctl -a
adduser
Descripción: añadir usuario de
sistema.
Ejemplos: adduser pepe,
adduser -s /bin/false pepe
userdel
Descripción: = eliminar
usuario de sistema
Ejemplos: userdel pepe
usermod
Descripción: = modificar
usuario de sistema
Ejemplos: usermod -s /bin/bash
pepe
df
Descripción: = disk free.
espacio en disco disponible. Muy útil.
Ejemplos: df, df -h
uname
Descripción: =Unix name.
Informacion sobre el tipo de Unix en el que estamos, kernel, etc.
Ejemplos: uname, uname -a
netstat
Descripción: la informacion
sobre las conexiones de red activas.
Ejemplos:
netstat, netstat -ln, netstat -l, netstat -a
ps
Descripción: =proccess toda la
informacion sobre procesos en ejecucion.
Ejemplos:
ps, ps -axf, ps -A, ps -auxf
free
Descripción: muestra el estado
de la memoria RAM y el SWAP.
Ejemplos: free
ping
Descripción: heramienta de red
para comprobar entre otras cosas si llegamos a un host remoto.
Ejemplos: ping www.rediris.es
traceroute
Descripción: herramienta de
red que nos muestra el camino que se necesita para llegar a otra maquina.
Ejemplos: traceroute
www.rediris.es
du
Descripción: =disk use. uso de
disco. Muestra el espacio que esta ocupado en disco.
Ejemplos: du *, du -sH /*, du
-sH /etc
ifconfig
Descripción: =interface
config. configuracion de interfaces de red, modems, etc.
Ejemplos:
ifconfig, ifconfig eth0 ip netmask 255.255.255.0
route
Descripción: gestiona las
rutas a otras redes.
Ejemplos: route, route -n
iptraf
Descripción: muestra en una
aplicacion de consola TODO el trafico de red IP, UDP, ICMP.
Permite utilizar filtros, y es
SUMAMENTE UTIL para diagnostico y depuracion de firewalls
Ejemplos: iptraf
tcpdump
Descripción: vuelca el contenido
del trafico de red.
Ejemplos: tcpdump, tcpdump -u
lsof
Descripción: muestra los
ficheros(librerias, conexiones) que utiliza cada proceso
Ejemplos:
lsof, lsof -i, lsof | grep fichero
lsmod
Descripción: Muestra los
modulos de kernel que estan cargados.
Ejemplos: lsmod
modprobe
Descripción: Trata de instalar
un modulo, si lo encuentra lo instala pero de forma temporal.
Ejemplos: modprobe ip_tables,
modprobe eepro100
rmmod
Descripción: Elimina modulos
del kernel que estan cargados
Ejemplos: rmmod <nombre de
modulo>
sniffit
Descripción: Sniffer o
husmeador de todo el trafico de red. No suele venir instalado por defecto.
Ejemplos: sniffit -i
DETALLE DEL COMANDO LS
ls
ls es una
instrucción UNIX que muestra el listado de un directorio o archivo. Los
resultados se muestran
ordenados alfabéticamente.
El nombre ls proviene de la
palabra list, listado en inglés.
Los archivos y directorios
cuyo nombre comienza con . (punto) no se muestran con la instrucción ls, por lo
que
se suelen denominar
"archivos ocultos". El parámetro -a de ls inhibe este comportamiento,
mostrando todos
los archivos y subdirectorios,
incluso los que comienzan con punto.
Sintaxis:
$ ls [opciones]
[archivo|directorio]
sin argumentos muestra el
listado del directorio actual.
$ ls archivo1 archivo2
archivo3 subdir1 subdir2
Muestra un listado de los
archivos y subdirectorios especificados en la línea de instrucción. Para los
archivos
muestra el nombre solamente (o
más información si se emplea algún argumento como -l ) y para los
subdirectorios muestra todos
los archivos incluidos en el subdirectorio.
Modificadores más comunes:
-l muestra un listado en el
formato largo, con información de permisos, número de enlaces asociados al
archivo, usuario, grupo,
tamaño y fecha de última modificación además del nombre.
$
ls -l
total
1424
-rw-r--r--
1 mail bin 40661 May 13 22:27 Manual.txt.gz
-rw-r--r--
1 nobody nogroup 0 May 13 22:26 fichero1.txt
-rw-r--r--
1 root root 825 May 13 22:26 hosts
lrwxrwxrwx
1 user1 grp1 5 May 13 22:31 servidores -> hosts
-rw-r-----
1 sys sys 1405600 May 13 22:27 syslog.0
-d muestra solamente el nombre
del subdirectorio, sin entrar en él ni dar un listado del contenido.
-a muestra los archivos
ocultos aparte de los comunes.
-t muestra ordenado por la
fecha de última modificación.
-c muestra ordenado por la
fecha de última modificación del estado del archivo. -L en los enlaces
simbólicos, muestra los datos del archivo referenciado en vez de los del link.
-1 muestra el listado en una
sola columna. Sin la opción -1 el listado se muestra en varias columnas, tantas
como permita el ancho de la
terminal.
-i muestra el número del
i-nodo antes del nombre de archivo.
-m muestra los archivos en una
línea y separados por comas.
-R hace un listado recursivo.
Lista primero los archivos del directorio en curso, luego los de los
subdirectorios
de éste, luego los de los
subdirectorios contenidos en ellos (nietos) y así sucesivamente.
-S ordena la salida por tamaño
de archivo, poniendo los más pesados en la parte superior del listado.
--color muestra cada tipo de
archivo de un color distinto: un color para los directorios, otro para los
archivos regulares, otro para
los enlaces simbólicos, otro para los sockets, otro para las tuberías FIFO,
etc.
Este parámetro no se acepta en
todas las versiones de ls y, por supuesto, requiere que la terminal sea capaz
de mostrar distintos colores o
intensidades.
Al igual que en la mayoría de
instrucciones Unix, los parámetros se pueden agrupar, de manera que es lo mismo
poner
$ ls -li
que
$ ls -l -i
cat
Fuente:
http://www.pello.info/referencia_linux.html
http://lafec.df.uba.ar/tutorial_18pag.pdf
http://www.taringa.net/posts/linux/13639365/echo-terminal-en-linux-entra.html
http://deckerix.com/modulos/manuales/linux/capitulo36.php
http://es.kioskea.net/contents/692-sistema-unix-el-shell
http://electrouni.files.wordpress.com/2010/12/kernel-linux.pdf
No hay comentarios.:
Publicar un comentario