Você está na página 1de 34

UNIVERSIDAD DE LOS ANDES

DEPTO. ING. ELECTRICA Y ELECTRONICA


Curso: Arquitectura Diseno Sistemas Digitales - IELE3222
Semestre: 2015-20
Profesor: Fredy E. Segura-Quijano fsegura@uniandes.edu.co
Asistentes:

TALLER 3 (Individual) (0 %) Taller Linux

OBJETIVOS

E0. Conocer el estado actual y tendencias de tecnologas basadas en procesadores y microcontroladores.

Reconocer los comandos basicos de linux.


Identificar las potencialidades del manejo por consola.

Taller de Linux

TOMADO COMPLETAMENTE DE: http://tallergnulinux.sourceforge.net/

1. COMANDOS BASICOS
OBJETIVO: Utilizar comandos basicos para manejo de archivos y directorios

A continuacion se presentan algunos comandos basicos clasificados as:

Archivos y directorios: cd pwd ls cp mv rm mkdir rmdir


Ayuda man whatis apropos
Sesion exit logout

La lista de comandos basicos es:

cd Cambia el directorio
pwd print working directory (muestra el directorio actual)
ls Lista el contenido de directorios
cp Copiar archivos
mv Mover archivos o directorios
rm Borrar archivos o directorios
mkdir Crear directorios
rmdir Borrar directorios vacos
whatis Imprime la descripcion breve de la pagina de manual
apropos Busca entre las paginas de manual y las descripciones
exit Produce la terminacion normal de un programa
logout Salir de de un logueo de sesion
man Interfaz para los manuales electronicos de referencia

1.1. Notas sobre el bash:


La tecla [TAB] se utiliza para completar comando, rutas o nombres de archivo. Con las teclas [CTRL-ALT-F1]
hasta [CTRL-ALT-F6] se tiene acceso a diferentes consolas virtuales. Con [CTRL-ALT-F7] se accede al primer display
grafico (utilizado por el X-Server).

1
1.2. Formato de los comandos UNIX
Los comandos UNIX son almacenados en un computador como archivos con permisos de ejecucion. La mayora
de los comandos se almacenan en directorios de archivos binarios estandar como /bin,/usr/bin o /usr/local/bin.
Los comandos UNIX usan el siguiente formato:

nombre-comando -opciones lista de parametros

nombre-comando: el nombre del comando actual generalmente es el nombre del programa ejecutable que imple-
menta el comando.

-opciones: el smbolo - se usa para indicar una opcion. La opcion modifica el modo de operar del comando.

lista de parametros: La lista de parametros (o argumentos) con los que operara el comando podra ser 0 1
o mas parametros. Los parametros son separados por espacios en blanco.

1.3. Opciones mas comunes del comando ls


-F, --classify
Anade un caracter a cada nombre de fichero indicando el tipo del fichero. Para ficheros regulares que sean ejecu-
tables, anade un *. Los indicadores de tipos de ficheros son / para directorios, @ para enlaces simbolicos,
para FIFOs, = para conectores, y nada para ficheros regulares.

-l, --format=long, --format=verbose


Escribe (en formato de una sola columna) los permisos del fichero, el numero de enlaces que tiene, el nombre del
propietario, el del grupo al que pertenece, el tamano (en bytes), una marca de tiempo, y el nombre del fichero. De
forma predeterminada, la marca de tiempo que se muestra es la de la ultima modificacion; las opciones -c y -u selec-
cionan las otras dos que hay. Para ficheros especiales de dispositivo el campo de tamano se reemplaza comunmente
por los numeros de dispositivo mayor y menor. Para cada directorio que se liste, escribe antes de los ficheros una
lnea total bloques, donde bloques es el espacio de disco total usado por todos los ficheros en ese directorio. Por
omision, se emplean bloques de 1024 bytes.

-h, --human-readable
Anade una letra indicativa de tamano, tal como M para megabytes binarios , a cada tamano. (Nueva en fileutils-4.0.)

-a
Incluye en el listado ficheros cuyos nombres empiecen con ..

Nota: Por regla general para todas las aplicaciones, las opciones de la lnea de comando se pueden agrupar.

Ejemplo: Si queremos realizar un listado en formato largo, que nos muestre tambien los archivos ocultos con
el tamano en unidades faciles de leer, debemos pasar las siguientes opciones al comando ls:

[usuario ]@host:$ ls -l -a -h

Si agrupamos, para mayor facilidad, nos queda:

[usuario ]@host:$ ls -lah

1.4. Archivos Ocultos


En Linux los archivos o directorios que comiencen con el caracter punto . seran tratados como ocultos. Para
poder listar estos archivos con el comando ls, se debe utilizar la opcion -a. Es de uso comun que en el directorio de
usuario, las aplicaciones creen directorios o archivos de configuracion ocultos.

2
1.5. Visualizacion de archivos de texto (less)
Ademas del comando cat y more, uno de los mas utilizados es el less. El comando less permite desplazar el
texto hacia arriba y hacia abajo, realizar busquedas dentro del archivo, y muchas otras funciones utiles. La forma
mas facil de utilizar el comando less es:

[usuario ]@host:$ less nombrearchivo

1.6. Ejercicios
1. Visualice el tamano del archivo .bash history utilizando el comando ls. Nota: el mismo se encuentra oculto
por estar precedido por un punto.

2. Ejecutar las siguientes lneas:


[usuario ]@host:$ ls
[usuario ]@host:$ ls /
Cual fue la diferencia?
3. Ejecutar lo siguiente e indicar cual fue el resultado en cada caso.
[usuario ]@host:$ cd
[usuario ]@host:$ cd..
[usuario ]@host:$ cd ..
[usuario ]@host:$ cd /etc
[usuario ]@host:$ cd

4. Crear el directorio prueba1 en el home de su usuario.


5. Copiar algun archivo de configuracion del sistema (/etc) en el directorio de usuario. Renombrarlo a datos.

6. Copiar el archivo en el mismo directorio con el nombre datos2 y verificar que el contenido sea el mismo.
7. Para que sirve el parametro -i del comando cp?
8. Crear el directorio prueba2 y copiar dentro el archivo datos.

9. Mover el archivo datos2 al directorio prueba2.


10. Mover el archivo datos al directorio prueba2 con el nombre datos3.
11. Cambiarle el nombre al archivo datos3 por datos.
12. Mover todos los archivos (de una sola vez) que empiecen con el nombre datos del directorio prueba2 al
directorio prueba3.
13. Borrar el archivo datos3.

2. PERMISOS DE ARCHIVOS
OBJETIVO: Comprender el sistema de permisos para el acceso a archivos y directorios

A continuacion se presentan algunos comandos basicos:

chmod: cambia los permisos de acceso de los archivos.


chown cambia el usuario y grupo propiestarios de archivos
chgrp: cambia el grupo al que pertenecen los archivos

3
2.1. Comando chmod
chmod - cambia los permisos de acceso de ficheros

SINOPSIS:
chmod [opciones] modo fichero...
Opciones de POSIX: [-R]
Opciones de GNU (en la forma mas corta): [-cfvR] [reference=rfile] [help]
[version] []
DESCRIPCION:
chmod cambia los permisos de cada fichero dado segun modo, que puede ser o bien una representacion simbolica
de los cambios a realizar, o bien un numero octal que representa el patron de bits de los nuevos permisos.

Modo Simbolico:
El formato de un argumento de cambio de modo simbolico es [ugoa...][[+-=][rwxXstugo...]...][,...]. Tal
argumento es una lista de ordenes de cambio de modo simbolico, separadas por comas. Cada orden de cambio de
modo simbolico empieza con cero o mas letras del conjunto ugoa: estas controlan a que usuarios se referiran los
nuevos permisos del fichero cuyos permisos se van a cambiar:

(u) el usuario propietario.


(g) otros usuarios distintos del propietario pero del mismo grupo que el del fichero.
(o) otros usuarios que ni son el propietario ni pertenecen al grupo del fichero.
(a) todos los usuarios. De forma que a equivale aqu a ugo.
Operador de asignacion:
[+] El operador + hace que los permisos seleccionados se anadan a los ya existentes en cada fichero;
[] hace que se quiten de los que ya haba,
[=] hace que sea los unicos que el fichero va a tener.

Las letras rwxXstugo seleccionan los nuevos permisos para los usuarios afectados:
(r) lectura.
(w) escritura o modificacion.
(x) ejecucion (para un fichero ejecutable) o permiso de paso (para directorios).
(X) ejecucion solamente si el fichero es un directorio o ya tiene permiso de ejecucion para algun usuario.
(s) activar el bit SUID o SGID para ejecucion.
(t) activar el bit pegajoso.o STI.
(u) los permisos que el usuario propietario del fichero ya tiene.
(g) los que otros usuarios del grupo del fichero, pero no el propietario, ya tienen.
(o) los que otros usuarios distintos de los anteriores ya tienen.
As, chmod g-s fichero quita el bit SGID (establecer el identificador de grupo), chmod ug+s fichero activa los
bits SUID y SGID, pero en cambio chmod o+s fichero no hace nada.

Modo Numerico:
Un modo numerico esta compuesto de 1 a 4 dgitos octales (0-7), formados mediante adicion de los bits de valores
4, 2 y 1. Los dgitos que falten se toman como ceros iniciales. El primer dgito selecciona los atributos SUID (4),
SGID (2) y STI [sticky] (1). El segundo selecciona los permisos para el usuario propietario del fichero: lectura
(4), escritura (2) y ejecucion (1); el tercero, los permisos para otros usuarios del mismo grupo que el fichero, pero
no el propietario, con los mismos valores que antes; y por ultimo, el cuarto dgito selecciona los permisos para los
otros usuarios que no son ni el propietario ni estan en el mismo grupo que el fichero, con los mismos valores de
nuevo. chmod nunca cambia los permisos de enlaces simbolicos; la llamada al sistema chmod(2) no puede cambiar
sus permisos. Esto no es un problema puesto que los permisos de los enlaces simbolicos nunca se usan. Sin embargo,
para cada enlace simbolico puesto en la lnea de ordenes, chmod cambia los permisos del fichero al cual apunta. En
cambio, chmod hace caso omiso de los enlaces simbolicos que encuentre durante el recorrido recursivo de directorios.

OPCIONES DE POSIX
-R Cambia recursivamente los permisos de directorios y sus contenidos.

OPCIONES DE GNU

4
-c, changes Muestra un mensaje mencionando solamente aquellos ficheros cuyos permisos cambian realmente.
-f, silent, quiet No muestrax mensajes de error sobre ficheros cuyos permisos no se pueden cambiar.
-v, verbose Describe prolijamente la accion efectuada o no para cada fichero.
-R, recursive Cambia recursivamente los permisos de directorios y sus contenidos.
OPCIONES ESTANDARES DE GNU
help Muestra un mensaje en la salida estandar sobre el modo de empleo y acaba con codigo de exito.
version Muestra en la salida estandar informacion sobre la version y luego acaba con codigo de exito.
Termina la lista de opciones.
reference=rfile (Nueva en fileutils 4.0.) Cambia el modo de file al del fichero rfile.

2.2. Ejercicios
1. En un directorio vaco (nuevo), crear 9 archivos (archiv1,archiv2,etc.) utilizando el comando touch.
Quitarle todos los permisos con el comando chmod a-rwx archiv*
2. Modificar los permisos usando el operador = del chmod, para que queden de la siguiente manera:
[usuario ]@host:$ archiv1 -rwx------ $ chmod u=rwx,go= archiv1
[usuario ]@host:$ archiv2 -rw------- $
[usuario ]@host:$ archiv3 -rwxrwxrwx $ chmod a=rwx archiv3
[usuario ]@host:$ archiv4 -rwxrw-r-- $
[usuario ]@host:$ archiv5 -rwxr----- $
[usuario ]@host:$ archiv6 -r-xrw-r-- $
[usuario ]@host:$ archiv7 -r-------x $
[usuario ]@host:$ archiv8 -rw-r--r-- $
[usuario ]@host:$ archiv9 -rw-rw-r-- $

3. Modificar los permisos de los archivos anteriores utilizando los operadores + y - del chmod para que queden
de la siguiente manera (Los cambios son relativos a los archivos del ejercicio anterior):
archiv1 -rwxr (agrega lectura para otros) $ chmod o+r archiv1
archiv2 -r (quita escritura para propietario) $
archiv3 -rw-rw-rw- (quita ejecucion para todos) $chmod a-x archiv3
archiv4 -rwx-w- (quita lectura para grupo y otros) $
archiv5 -rwx-wx (quita lectura al grupo, agrega esc. y ejec para otros) $
archiv6 -rwxrw- (agrega escritura al propietario, quita lectura a otros) $
archiv7 -rwx-w- $
archiv8 -r $
archiv9 -rwx $

4. Crear 9 archivos (num1,num2,etc.) utilizando el comando touch. (touch num1..9)


5. Sobreescribir los permisos utilizando el comando chmod con argumento numerico (octal) para que queden de
la siguiente manera:
num1 -rwx $ chmod 0421 num1
num2 - $
num3 -rwxrwxrwx $ chmod 0777 num3
num4 -r-xrw-r $
num5 -rwxr $
num6 -rw-rr $
num7 -rw-rr-x $
num8 -rwxrw-r $
num9 -rwx $

6. Con una sola instruccion, quitar permisos de lectura, escritura y ejecucion para todos los archivos utilizados
en el ultimo ejercicio.
$

5
7. Crear un directorio y quitarle todos los permisos de ejecucion. Explicar que pasa al intentar entrar al directorio
con el comando cd. Explicar el significado de los permisos r,w y x para directorios.
8. Informarse sobre los grupos a los que pertenece su usuario.
9. Utilizando los comandos chown y chgrp, intentar cambiar el propietario y el grupo del archivo num3. Cual
es el problema?

3. REDIRECCION DE ENTRADA Y SALIDA


OBJETIVO: Conceptos de entrada y salida estandar

3.1. Entrada y salida estandar


Muchos comandos UNIX toman su entrada de algo conocido como entrada estandar y envan su salida a la salida
estandar (a menudo abreviado como stdin y stdout). Ademas existe una salida especial para los mensajes de
error de cada programa stderr. El interprete de comandos configura el sistema de forma que la entrada estandar
es el teclado y la salida la pantalla. Normalmente cat lee datos de los archivos cuyos nombres se pasan como
argumentos en la lnea de comandos y enva estos datos directamente a la salida estandar. Usando el comando

[usuario ]@host:$ cat history-final masters-thesis

mostrara por pantalla el contenido del archivo history-final seguido por masters-thesis. Si no se le pasan nombres
de archivos a cat como parametros, leera datos de stdin y los enviara a stdout. Por ejemplo.

[usuario ]@host:$ cat


Hello there
Hello there
Bye
Bye
[ctrl-D]
[usuario ]@host:$

Como se puede ver, cada lnea que el usuario teclea es inmediatamente reenviada al monitor por [usuario ]@host:$
cat. Cuando se esta leyendo de la entrada estandar, los comandos reconocen el fin de la entrada de datos cuando
reciben el caracter EOT (end-of-text, fin de texto). Normalmente es generado con la combinacion [ctrl-D].

El comando sort toma como entrada lneas de texto (de nuevo leera desde stdin si no se le proporcionan
nombres de archivos en la lnea de comandos), y devuelve la salida ordenada a stdout. Pruebe lo siguiente:

[usuario ]@host:$ sort


peras
manzanas
bananas
[ctrl-D]
bananas
manzanas
peras
[usuario ]@host:$

3.2. Redireccionando la salida


Supongamos que queremos que la salida de sort vaya a un archivo para poder salvar la lista ordenada de salida.
El interprete de comandos nos permite redireccionar la salida estandar a un archivo usando el smbolo >. As:

6
[usuario ]@host:$ sort > shopping-list
peras
manzanas
bananas
[ctrl-D]
[usuario ]@host:$

Como puede ver, el resultado de sort no se muestra por pantalla, en su lugar es salvado en el archivo shopping-
list, el cual se puede ver as:
[usuario ]@host:$ cat shopping-list
bananas
manzanas
peras
[usuario ]@host:$

Ya podemos ordenar la lista de la compra y ademas guardarla. Creemos ahora otro listado desordenado de
nuestras futuras compras en el shopping:

[usuario ]@host:$ cat > items


corbata
anteojos
bufanda
[ctrl-D]
[usuario ]@host:$

Al no especificar al cat un nombre de archivo, tomara la entrada de la entrada estandar (teclado) y la salida se
redirecciona a un archivo llamado items.

3.3. Redireccionando la entrada


Ya tenemos guardada nuestra lista de compra desordenada original en el archivo items. Una forma de ordenar
la informacion y salvarla en un archivo podra ser darle a sort el nombre del archivo a leer en lugar de la entrada
estandar y redireccionar la salida estandar como hicimos arriba.

[usuario ]@host:$ sort items > shopping-list


[usuario ]@host:$ cat shopping-list
anteojos
bufanda
corbata
[usuario ]@host:$

Hay otra forma de hacer esto. No solo puede ser redireccionada la salida estandar, tambien puede ser redirec-
cionada la entrada estandar usando el smbolo <.

[usuario ]@host:$ sort < items


anteojos
bufanda
corbata
[usuario ]@host:$

Tecnicamente, sort < items es equivalente a sort items, pero nos permite demostrar que sort < items se
comporta como si los datos del archivo fueran tecleados por la entrada estandar. El interprete de comandos es quien
maneja las redirecciones. sort no recibe el nombre del fichero (items) a leer. Desde el punto de vista de sort, esta
leyendo datos de la entrada estandar como si fueran enviados desde el teclado.

7
3.4. Filtros
Un filtro es un programa que lee datos de la entrada estandar, los procesa de alguna forma, y devuelve los datos
procesados por la salida estandar. Usando la redireccion la entrada estandar y/o salida estandar pueden ser archivos.

sort es un filtro simple: ordena los datos de entrada y enva el resultado a la salida estandar.
cat es incluso mas simple, no hace nada con los datos de entrada, simplemente enva a la salida cualquier cosa que
le llega

3.5. Redireccion no destructiva


El uso de > para redireccionar la salida a un archivo es destructivo: en otras palabras, el comando:

[usuario ]@host:$ ls > file-list

sobrescribe el contenido del fichero file-list.

Si en su lugar, usamos el smbolo >>, la salida sera anadida al final del archivo nombrado, en lugar de ser
sobrescrito.

[usuario ]@host:$ ls >> file-list

Anadira la salida de ls al final de file-list. Es conveniente tener en cuenta que las redirecciones son caractersticas
proporcionadas por el interprete de comandos. Este, proporciona estos servicios mediante el uso de la sintaxis >,
>> y <.

3.6. Algunos Filtros


A continuacion estan algunos comandos que funcionan como filtros:

cat - concatenate files and print on the standard output


sort - sort lines of text files
head - output the first part of files
tail - output the last part of files
wc - print the number of bytes, words, and lines in files
more - file perusal filter for crt viewing
strings - print the strings of printable characters in files.
sed - a Stream EDitors
grep - print lines matching a pattern

3.7. Ejercicios
1. Crear un archivo llamado listado bin que contenga el listado del directorio /bin. Uso obligatorio de: ls; >
$
2. Crear un archivo llamado listado sbin que contenga el listado del directorio /sbin. Uso obligatorio de: ls; >
$
3. Crear un archivo llamado binarios que contenga ambos listados. Uso obligatorio de: cat; >
$
4. Ordenar alfabeticamente el listado binarios y guardar el resultado en un archivo binarios2. Uso obligatorio
de: sort; <; >
$

8
5. Verificar que los datos en binarios2 sean correctos.

6. Crear un archivo llamado datosv con los siguientes datos personales dentro: Nombre, apellido y CC. Uso
obligatorio de: cat; >
$
7. Agregar a datosv una lnea que indique el directorio actual. Uso obligatorio de: pwd; >>
$
8. Agregar a datosv un listado en formato largo del directorio /etc. Uso obligatorio de: ls; >>
$
9. Observar (por pantalla) el archivo datosv resultante a traves del filtro more y verificar que los datos esten
correctos. Uso obligatorio de: more; <
$

4. PIPES: COMUNICACION ENTRE PROCESOS


OBJETIVO: Conceptos de pipes: comunicacion entre procesos

4.1. Uso de pipes


Ya se ha usado sort como un filtro. Pero estos ejemplos suponen que tenemos los datos en un fichero en alguna
parte o vamos a introducir los datos manualmente por la entrada estandar. Que pasa si los datos que queremos
ordenar provienen de la salida de otro comando, como ls?. Por ejemplo, usando la opcion -r con sort ordenaremos
los datos en orden inverso. Si queremos listar los ficheros en el directorio actual en orden inverso, una forma podra
ser:

[usuario ]@host:$ ls
english-list
history-final
masters-thesis
notes
[usuario ]@host:$ ls > file-list
[usuario ]@host:$ sort -r file-list
notes
masters-thesis
history-final
english-list
[usuario ]@host:$

Aqu, salvamos la salida de ls en un archivo, y entonces ejecutamos sort -r sobre ese archivo. Pero esta forma
necesita crear un archivo temporal en el que salvar los datos generados por ls.

La solucion es usar las pipes. El uso de pipes es otra caracterstica del interprete de comandos, que nos permite
conectar una cadena de comandos en un pipe, donde la stdout del primero es enviada directamente a la stdin
del segundo y as sucesivamente. Queremos conectar la salida de ls con la entrada de sort. Para crear un pipe se
usa el smbolo | :

[usuario ]@host:$ ls | sort -r


notes
masters-thesis
history-final
english-list
[usuario ]@host:$

9
Esta forma es mas corta y obviamente mas facil de escribir. Otro ejemplo util, usando el comando:

[usuario ]@host:$ ls /usr/bin

mostrara una lista larga de los archivos, la mayora de los cuales pasara rapidamente ante nuestros ojos sin que
podamos leerla. En lugar de esto, usemos more para mostrar la lista de archivos en /usr/bin.

[usuario ]@host:$ ls /usr/bin | more

Ahora podemos ir avanzando pagina a pagina comodamente. Pero el potencial de los pipes no termina aqu.
Podemos .entubarmas de dos comandos a la vez. El comando head es un filtro que muestra la primeras lneas del
canal de entrada (aqu la entrada desde una pipe). Si queremos ver el ultimo fichero del directorio actual en orden
alfabetico, usaremos:

[usuario ]@host:$ ls | sort -r | head -1


notes
[usuario ]@host:$

Donde head -1 simplemente muestra la primera lnea de la entrada que recibe en este caso, el flujo de datos
ordenados inversamente provenientes de ls.

4.2. Ejercicios
1. Obtener un listado en orden alfabetico inverso de los primeros 3 comandos del directorio /bin. Ayuda: (posible
resultado: cat,bash,arch). Utilizar: ls, sort y head.
$
2. Obtener el mismo resultado que en el ejercicio anterior, pero utilizando el comando tail en vez de head.
$
3. Contar la cantidad de archivos en el directorio /bin. Ayuda: Para contar palabras se utilizara el comando wc
-w.
$
4. Buscar dentro de /usr/doc o /usr/share/doc algun archivo de texto comprimido (extension .gz). Una vez
elegido el archivo, observar el contenido con el comando zcat. Ordenar las lneas alfabeticamente y mostrar
el resultado a traves del less. Todo usando pipes.
$
5. Obtener (utilizando una sola lnea de comandos y pipes) un archivo donde figuren todos los usuarios y los
grupos definidos en el sistema, ordenados alfabeticamente. Visualizar a traves del less. Ayuda: (El archivo
/etc/passwd contiene una lnea por cada usuario definido en el sistema. En el comienzo de la lnea figura el
nombre del usuario. Algo similar ocurre con los grupos, en el archivo /etc/group). Utilizar cat para juntar
ambos archivos, ordenar las lneas alfabeticamente y mostrar el resultado.
$
6. Obtener la cantidad de usuarios y grupos definidos en el sistema (suma de ambos). Ayuda: Similar al ejercicio
anterior, pero contando la cantidad de lneas del archivo concatenado.
$

5. EXPRESIONES REGULARES
OBJETIVO: Utilizar expresiones regulares de linux

10
5.1. Construccion de expresiones regulares
Las expresiones regulares se utilizan para hacer busquedas contextuales y modificaciones sobre textos. Se pueden
encontrar en muchos editores de textos avanzados, en programas de analisis gramatical y en muchos lenguajes. Para
practicar las expresiones regulares utilizaremos el comando grep.

. caracter de correspondencia simple (Cualquier caracter)


Ejemplo:
l . nu . podra resultar en lynux, linux o linus

caracter de correspondencia multiple. Cero o mas apariciones del caracter previo. Se utiliza
en combinacion con . y con los rangos.
Ejemplo:
f.*o (texto que empiezan con f y termina con o)

[rango] Especifica un posible rango o conjunto de caracteres


Ejemplo:
[a d]. (texto que empieza con a,b,c o d)
[axf ]. (texto que empieza con a,x,o f)

[rango] Rango negado


Ejemplo:
[0 9]. (texto que no empieza con un numero)

^
Ancla de comienzo de lnea
Ejemplo:
j
(lnea que comienza con j)

$ Ancla de fin de lnea


Ejemplo:
j$ (lnea que finaliza con j)

? El signo de interrogacion especifica cero o una ocurrencia del caracter precedente. Ejemplo:
pesos? coincide con la cadena peso o con pesos.

+ El smbolo mas indica especifica una o mas ocurrencias del caracter precedente. Por lo que
la expresion [0 9]+ es equivalente a la expresion [0 9][0 9]

5.2. Comando grep


Muestra todas las lneas de un archivo dado que coinciden con cierto patron.

Usage: grep [OPCIONES] PATRON [FILE1] [FILE2] [FILEn]...


Donde PATRON es una expresion regular y [FILE1] [FILE2] [FILEn]... son los archivos donde buscar.

Ejemplo:
Para buscar el texto hello world dentro del archivo main.c
[usuario ]@host:$ grep hello world main.c
[usuario ]@host:$ grep hello world <main.c
[usuario ]@host:$ cat main.c | grep hello world
(las tres lneas hacen lo mismo)

5.3. Ejercicios
1. Para trabajar utilizaremos un archivo creado de la siguiente forma:
ls /bin/ > b.txt (si el ls utiliza colores usar \ls /bin/ > b.txt )

11
2. Buscar dentro de b.txt si esta listado el comando mount (utilizar grep)
$
3. buscar dentro de b.txt comandos que empiecen con fs
$

4. buscar dentro de b.txt comandos que terminen con fs


$
5. buscar dentro de b.txt comandos que tengan un caracter numerico mayor a 2
$
6. buscar dentro de b.txt comandos que tengan un caracter numerico menor o igual a 2
$
7. buscar dentro de b.txt comandos que empiecen con s y terminen con n
$
8. buscar dentro de b.txt comandos que empiecen con f o p , terminen con k, g o f y tengan alguna i en
el medio
$
9. Utilizar ps wax para listar los procesos en ejecucion y filtrar con grep las lneas que posean el texto get
$

6. COMANDOS MOUNT Y UMOUNT


OBJETIVO: Conocer como referenciar discos rgidos, particiones, unidades de CD. Montar y
desmontar unidades de CD, recursos en servidores remotos etc.

A diferencia de Windows y MS-DOS, en Linux, ademas de no haber una asignacion de letras a: b: c: d: e: para
las unidades de disco y las particiones, es necesario indicarle al sistema cuando se utilizara una unidad de disco
extraible para poder acceder a esta y cuando se dejara de utilizar para poder retirarla y cambiarla por otra en el
caso de unidades removibles.

La mayora de las tarjetas principales de los computadores tienen capacidad para soportar hasta cuatro discos
duros o unidades IDE. Bajo Linux, los dispositivos fsicos del sistema se acceden a traves de archivos especiales
ubicados en el directorio /dev (devices o dispositivos).

A continuacion se listan algunos de los dispositivos de interes:

Unidades IDE Nombre del dispositivo bajo Linux


Primera controladora IDE Disco Maestro /dev/hda
Disco Esclavo /dev/hdb
Segunda controladora IDE Disco Maestro /dev/hdc
Disco Esclavo /dev/hdd
Las unidades de disco rgido contienen particiones, a las que en la tabla de particiones se les asigna un numero
de acuerdo a su posicion en el disco. Cada disco rgido puede contener hasta 4 (cuatro) particiones primarias (nu-
meradas siempre de 1 a 4) y dentro de estas se pueden crear particiones logicas (siempre a partir del numero 5).
Como ejemplo mostraremos particiones en /dev/hda, pero sera lo mismo para cualquier otro disco, solo cambia la
letra (b,c o d)

12
Particiones ejemplo
Particiones primarias primera /dev/hda1
Segunda /dev/hda2
Tercera /dev/hda3
Cuarta /dev/hda4

Particiones logicas primera /dev/hda5


segunda /dev/hda6
tercera /dev/hda7
En dispositivos SCSI el mecanismo es similar:
/dev/sda : Primer dispositivo SCSI
/dev/sda1 : Primera particion del primer dispositivo SCSI
/dev/sdai : Particion i del primer dispositivo SCSI

Para el caso del cdrom, existe normalmente un dispositivo /dev/cdrom que es un link (puntero) a la ubicacion
real del dispositivo (por ejemplo a /dev/hdc si esta conectado como maestro en la IDE2)

6.1. Tipos de filesystem soportados por GNU/Linux


Los sistemas Unix actuales incluyen drivers para soportar diferentes sistemas de archivos. Los mas comunes son:

sysv Compatibilidad con antiguo sistema de archivos System V

minix Antiguo sistema de archivos Unix de Linux


ext2 Actual sistema de archivos Unix de Linux (Estandar en Linux)
ext3 Nuevo y eficiente sistema de archivos

msdos MSDOS estandar


vfat VFAT Para discos grandes (w95 y w98)
ntfs Windows NT File System
nfs Para montaje de discos remotos con protocolo NFS

iso9660 Estandar para unidades CD-ROM


smbfs Para montaje de recursos remotos de disco con protocolo smb
ncpfs Para montaje de discos remotos con protocolo novell
qnx4 Sistema de archivos del sistema operativo de tiempo real QNX

6.2. Montar y desmontar utilizando comandos


Se llama montar a la accion de hacer accesible un sistema de archivos (local o remoto) para lectura o para
lectura/escritura. El comando utilizado para montar unidades es el mount. Mediante la accion de desmontar
le informamos al sistema que ya no utilizaremos mas la unidad montada anteriormente. Es importante siempre
desmontar una unidad de lectura/escritura para que el sistema vace los buffers de escritura del dispositivo montado
y se evite la corrupcion de datos. El comando utilizado para desmontar unidades es el umount.

Aprender la utilizacion de los comandos mount y umount es necesario si se quiere entender que es lo que real-
mente ocurre en un sistema Linux cuando utilizamos una aplicacion grafica o los iconos del escritorio para acceder
a las unidades de disco (cdrom, floppys, etc.). Sabiendo que particion o dispositivo deseamos montar y su tipo, la
sintaxis a utilizar como root para el comando mount sera del siguiente modo:

mount -t [tipo] /dev/[dispositivo] /punto/de/montaje/

13
Como ejemplo supondremos que deseamos montar el dispositivo /dev/hda1, que corresponde a la particion don-
de se encontrara la instalacion Windows, en un punto de montaje que previamente hemos creado, /mnt/windows/.
La lnea de comando correspondera a la siguiente:

root@host:$ mount -t vfat /dev/hda1 /mnt/windows

Hecho lo anterior, podremos acceder a los directorios contenidos en dicha particion donde estara instalado Win-
dows, con solo cambiar a /mnt/windows/:

root@host:$ cd /mnt/windows/

Utilice el comando ls a fin de ver el contenido del directorio en el cual ahora se encuentra:

root@host:$ ls -l

Si en este momento decidiesemos desmontar la unidad con el comando umount, el sistema nos enviara un men-
saje de error indicandonos que no es posible desmontar la unidad pues esta se encuentra ocupada. A fin de poder
desmontar dicha unidad, es necesario salir de esta y que ningun otro proceso o programa se encuentre utilizando
algun contenido de dicha unidad. Es decir, ejecutemos lo siguiente:

root@host:$ cd ~

Una vez cumplido esto, solo necesitara ejecutar el siguiente comando para desmontar /dev/hda1 de /mnt/win-
dows/:

root@host:$ umount /mnt/windows/

6.3. Archivo de configuracion /etc/fstab


El archivo fstab contiene informacion que describe los diversos sistemas de archivos presentes en nuestro sistema.
El administrador del sistema (root) es responsable de la creacion y el mantenimiento de este archivo. Cada lnea
describe un sistema de archivos; los campos en cada lnea estan separados por tabs o espacios. El archivo /etc/fstab
posee 6 columnas o campos. Veremos aqu el significado de los primeros cuatro campos:

El primer campo describe el dispositivo especial de bloque o sistema de archivos remoto a ser montado.
El segundo campo describe el punto de montaje para el sistema de archivos. Para particiones de intercambio
(swap), este campo debe decir none.
El tercer campo describe el tipo del sistema de archivos (ext2, vfat, msdos, etc).

El cuarto campo describe las opciones de montaje asociadas con el sistema de archivos. Es una lista de
opciones separadas por comas. Contiene como mnimo el tipo de montaje y otras opciones apropiadas para
el tipo del sistema de archivos. Las distintas opciones para sistemas de archivos locales estan documentadas
en mount(8). Las siguientes opciones son comunes para cualquier tipo de sistema de archivos: noauto (no
monta el sistema cuando se ejecuta mount -a, p.ej., cuando arranca el sistema), y user (permite que un
usuario monte el sistema de archivos). Para mayor informacion, vease mount(8).

Normalmente solo el root puede modificar este archivo. Si esta definido en el archivo /etc/fstab los usuarios
podran montar un dispositivo especificando solo el punto de montaje, o solo el dispositivo. Por ejemplo:

root@host:$ mount /floppy o

root@host:$ mount /dev/fd0


Mayor informacion man fstab o man mount

14
Por ejemplo si tenemos una particion windows en /dev/hda1 y queremos que tambien los usuarios, y no solo
root, puedan montarla , es necesario que la particion o unidad de disco este especificada en el fichero /etc/fstab del
siguiente modo:

/dev/hda1 /mnt/windows vfat user,rw,exec,nosuid,noauto,gid=100 0 0

La lnea especfica que del dispositivo /dev/hda1 que tendra como punto de montaje /mnt/windows/ y que
posee formato FAT o FAT32 -vfat-, podra ser montada y desmontada por los usuarios -user- en modo de lectura
y escritura -rw-, con permisos de ejecucion de programas -exec-, sin permitir la ejecucion de programas con SUID
-nosiud-, y que el contenido de la particion le pertenecera por defecto al grupo users -gid=100-, al cual pertenecen
todos los usuarios del sistema, y dicha particion, al igual que las unidades de disco extrable, no sera montada
durante el arranque del sistema -noauto-. Los usuarios sin privilegios solo tendran que ejecutar la siguiente lnea
de comando para poder montar y acceder a la particion que corresponde a la instalacion de Windows

root@host:$ mount /mnt/windows/

Un ejemplo de /etc/fstab para configurar una particion de Windows, unidad de floppy, unidad de CDROM y
Zip Drive IDE/ATAPI:

# <file system> <mount point> <type> <options> <dump> <pass>


/dev/hda1 /mnt/windows vfat user,rw,exec,noauto,gid=100 0 0
/dev/hda2 none swap sw 0 0
/dev/hda3 / ext2 defaults,errors=remount-ro 0 1
/dev/hdc /mnt/cdrom iso9660 user,ro,exec,noauto 0 0
/dev/hdd4 /mnt/zipdrive vfat user,rw,exec,noauto,gid=100 0 0
proc /proc proc defaults 0 0
/dev/fd0 /mnt/floppy vfat user,rw,exec,noauto,gid=100 0 0

La lnea /dev/hda3 corresponde al sistema de archivos principal / o root donde reside nuestro sistema de archi-
vos mas importante.

6.4. Ejercicios
1. Investigar el archivo /etc/fstab del sistema. Cual es la lnea correspondiente a la unidad de CDROM?
2. Utilizar el comando mount para listar los dispositivos montados actualmente.
3. Hay algo montado en forma remota a traves de NFS? Si lo hay, aclarar fuente y punto de montaje.

4. Colocar una memoria usb y montarla.


5. Verificar que este montado (con mount) y realizar un listado en formato largo del contenido de la memoria
USB.
6. Copiar el archivo de texto /etc/hosts a la memoria.

7. Verificar la copia haciendo un cat y luego desmontar la memoria. Es importante desmontar siempre la unidad
antes de quitar el medio fsico.
8. Si colocamos una lectora de cdrom como esclava en la segunda controladora IDE, como montamos un cd
formato iso, siendo root?

9. Si queremos facilitar y permitir el uso de esta lectora a los usuarios, que lnea debemos agregar al /etc/fstab?
10. Cuando se utiliza la opcion defaults en /etc/fstab, que opciones se estan usando realmente?
11. Para que sirve la opcion -a en los comandos mount y umount

15
7. CONTROL DE PROCESOS
OBJETIVO: Comprender el manejo de procesos en linux

7.1. Tareas y procesos


Control de Tareas es una utilidad incluida en muchos shells (incluidos Bash y Tcsh), que permite el control de
multitud de comandos o tareas al momento. Antes de seguir, deberemos hablar un poco sobre los procesos. Cada
vez que se ejecuta un programa, usted lanza lo que se conoce como proceso, que es simplemente el nombre que se le
da a un programa cuando se esta ejecutando. El comando ps visualiza la lista de procesos que se estan ejecutando
actualmente, por ejemplo:

[usuario ]@host:$ ps
PID TTY STAT TIME COMMAND
24 3 S 0:03 (bash)
161 3 R 0:00 ps
[usuario ]@host:$

La columna PID representa el identificador de proceso. La ultima columna COMMAND, es el nombre del proceso que
se esta ejecutando. Ahora solo estamos viendo los procesos que esta ejecutando [usuario]. Vemos que hay dos pro-
cesos, bash (Que es el shell o interprete de comandos que usa [usuario]), y el propio comando ps. El bash ejecuto ps
cuando [usuario] tecleo el comando. Cuando ps termina de ejecutarse (despues de mostrar la tabla de procesos),
el control retorna al proceso bash, que muestra el prompt, indicando que esta listo para recibir otro comando. Un
proceso que esta corriendo se denomina tarea para el shell. Los terminos proceso y tarea, son intercambiables. Sin
embargo, se suele denominar tarea a un proceso, cuando se usa en conjuncion con control de tareas, que es un
rasgo del shell que permite cambiar entre distintas tareas.

Hay muchos mas procesos aparte de estos corriendo en el sistema, para verlos todos, teclearemos el comando ps
-aux. En muchos casos, los usuarios solo ejecutan un trabajo cada vez, que es el ultimo comando que teclearon desde
el shell. Sin embargo, usando el control de tareas, se podra ejecutar diferentes tareas al mismo tiempo, cambiando
entre cada uno de ellos conforme se necesite. Cuan beneficioso puede llegar a ser esto?. Supongamos que estamos
con un procesador de textos, y de repente necesitamos parar y realizar otra tarea. Con el control de tareas se
podra suspender temporalmente el editor, y volver al shell para realizar cualquier otra tarea, y luego regresar al
editor como si no lo hubiese dejado nunca. Lo siguiente solo es un ejemplo, hay montones de usos practicos del
control de tareas.

7.2. Primer plano y Segundo plano


Un proceso puede estar en Primer plano o en Segundo plano: Solo puede haber un proceso en primer
plano al mismo tiempo. El proceso que esta en primer plano, es el que interactua con el usuario, recibe entradas de
teclado, y enva las salidas al monitor. (Salvo, por supuesto, que haya redirigido la entrada o la salida. El proceso
en segundo plano, no recibe ninguna senal desde el teclado y por lo general se ejecutan en silencio sin necesidad de
interaccion.

Algunos programas necesitan mucho tiempo para terminar, y no hacen nada interesante mientras tanto. Com-
pilar programas es una de estas tareas, as como comprimir un fichero grande. No tiene sentido que se siente y se
aburra mientras estos procesos terminan. En estos casos es mejor lanzarlos en segundo plano, para dejar la compu-
tadora en condiciones de ejecutar otro programa.

Los procesos se pueden suspender: Un proceso suspendido es aquel que no se esta ejecutando actualmente,
sino que esta temporalmente parado. Despues de suspender una tarea, puede indicar a la misma que continue, en
primer plano o en segundo, segun necesite. Retomar una tarea suspendida no cambia en nada el estado de la misma,
la tarea continuara ejecutandose justo donde se dejo.

Suspender un trabajo no es lo mismo que interrumpirlo: Cuando usted interrumpe un proceso (general-
mente con la pulsacion de CTRL-C), el proceso muere, y deja de estar en memoria y utilizar recursos del ordenador.
Una vez eliminado, el proceso no puede continuar ejecutandose, y debera ser lanzado otra vez para volver a realizar

16
sus tareas. Tambien se puede dar el caso de que algunos programas capturan la interrupcion, de modo que pulsando
CTRL-C no se para inmediatamente. Esto se hace para permitir al programa realizar operaciones necesarias de
limpieza antes de terminar. De hecho, algunos programas simplemente no se dejan matar por ninguna interrupcion.

7.3. Envo a segundo plano y eliminacion de procesos:


Empecemos con un ejemplo sencillo. El comando yes es un comando aparentemente inutil que enva una serie
interminable de y-es a la salida estandar. (Realmente es muy util. Si se utiliza un pipe para unir la salida de yes
con otro comando que haga preguntas del tipo si/no, la serie de y-es confirmara todas las preguntas.) Pruebe con esto:

[usuario ]@host:$ yes


y
y
y
y

La serie de y-es continuara hasta el infinito, a no ser que usted la elimine, pulsando la tecla de interrupcion,
generalmente CTRL-C. Tambien puede deshacerse de esta serie de y-es redirigiendo la salida estandar de yes hacia
/dev/null, que como recordara es una especie de agujero negro o papelera para los datos. Todo lo que usted enve
all, desaparecera.

[usuario ]@host:$ yes > /dev/null


Ahora va mucho mejor, el terminal no se ensucia, pero el prompt de la shell no retorna. Esto es porque yes sigue
ejecutandose y enviando esos inutiles y-es a /dev/null. Para recuperarlo, pulse la tecla de interrupcion.

Supongamos ahora que queremos dejar que el comando yes siga ejecutandose, y volver al mismo tiempo a la
shell para trabajar en otras cosas. Para ello enviaremos a yes a segundo plano, lo que nos permitira ejecutarlo, pero
sin necesidad de interaccion. Una forma de mandar procesos a segundo plano es anadiendo un caracter & al final
de cada comando.

[usuario ]@host:$ yes > /dev/null &


[1] 164
[usuario ]@host:$

Como podra ver, ha regresado al shell. Pero que es eso de [1] 164?, Se esta ejecutando realmente el comando
yes? [1] representa el numero de tarea del proceso yes. El shell asigna un numero a cada tarea que se este ejecutando.
Como yes es el unico comando que se esta ejecutando, se le asigna el numero de tarea 1. El numero 164 es el
numero de identificacion del proceso, o PID, que es el numero que el sistema le asigna al proceso. Ambos numeros
pueden usarse para referirse a la tarea como veremos despues.

Ahora usted tiene el proceso yes corriendo en segundo plano, y enviando constantemente la senal y hacia el
dispositivo /dev/null. Para chequear el estado del proceso, utilice el comando interno de la shell jobs:

[usuario ]@host:$ jobs


[1]+ Running yes > /dev/null &
[usuario ]@host:$

Ah esta!. Tambien puede usar el comando ps, como mostramos antes, para comprobar el estado de la tarea.

Para eliminar una tarea, utilice el comando kill Este comando toma como argumento un numero de
tarea o un numero de ID de un proceso. Esta era la tarea 1, as que usando el comando:
[usuario ]@host:$ kill %1 Matara la tarea.

Cuando se identifica la tarea con el numero de tarea, se debe preceder el numero con el caracter de porcentaje
( % ). Ahora que ya hemos matado la tarea, podemos usar el comando jobs de nuevo para comprobarlo:

17
[usuario ]@host:$ jobs
[1]+ Terminated yes > /dev/null
[usuario ]@host:$

La tarea esta, en efecto, muerta, y si usa el comando jobs de nuevo, no mostrara nada. Tambien podra matar
la tarea usando el numero de ID de proceso (PID), el cual se muestra conjuntamente con el ID de tarea cuando
arranca la misma. En nuestro ejemplo el ID de proceso es 164, as que el comando:

[usuario ]@host:$ kill 164 es equivalente a [usuario ]@host:$ kill %1

7.4. Parada y relanzamiento de tareas


Hay otra manera de poner una tarea en segundo plano. Usted puede lanzarlo como un proceso normal (en primer
plano), pararlo, y despues relanzarlo en segundo plano. Primero, lance el proceso yes en primer plano como lo hara
normalmente:

[usuario ]@host:$ yes > /dev/null

De nuevo, dado que yes corre en primer plano, no debe retornar el prompt de la shell. Ahora, en vez de inte-
rrumpir la tarea con CTRL-C, suspenderemos la tarea. El suspender una tarea no la mata: solamente la detiene
temporalmente hasta que se desee retomarla. Para hacerlo debemos pulsar la tecla de suspender, que suele ser
CTRL-Z.

[usuario ]@host:$ yes > /dev/null


CTRL-Z
[1]+ Stopped yes >/dev/null
[usuario ]@host:$

Mientras el proceso esta suspendido, simplemente no se esta ejecutando.


No gasta tiempo de CPU en la tarea. Sin embargo, se puede retomar el proceso de nuevo como si nada hubiera
pasado. Continuara ejecutandose donde se dejo. Para relanzar la tarea en primer plano, usamos el comando fg (del
ingles foreground).
[usuario ]@host:$ fg
yes >/dev/null

El shell muestra el nombre del comando de nuevo, de forma que tenga conocimiento de que tarea es la que ha
puesto en primer plano. Pare la tarea de nuevo, con CTRL-Z. Esta vez utilice el comando bg para poner la tarea
en segundo plano. Esto hara que el comando siga ejecutandose igual que si lo hubiese hecho desde el principio con
& como en la seccion anterior.
[usuario ]@host:$ bg
[1]+ yes >/dev/null &
[usuario ]@host:$

Y tenemos de nuevo el prompt. El comando jobs debera decirnos que yes se esta ejecutando, y podemos matar
la tarea con kill tal y como lo hicimos antes.

Como podemos parar la tarea de nuevo? Si pulsa CTRL-Z no funcionara, ya que el proceso esta en segundo
plano. La respuesta es poner el proceso en primer plano de nuevo, con el comando fg, y entonces pararlo. Como
puede observar, podra usar fg tanto con tareas detenidas, como con las que esten corriendo en segundo plano.

Hay una gran diferencia entre una tarea que se encuentra en segundo plano, y una que se encuentra detenida.
Una tarea detenida es una tarea que no se esta ejecutando, es decir, que no usa tiempo de CPU, y que no esta
haciendo ningun trabajo (la tarea aun ocupa un lugar en memoria, aunque puede ser volcada a disco). Una tarea
en segundo plano, se esta ejecutando, y usando memoria, a la vez que completando alguna accion mientras usted

18
hace otro trabajo. Sin embargo, una tarea en segundo plano puede intentar mostrar texto en su terminal, lo que
puede resultar molesto si esta intentando hacer otra cosa. Por ejemplo, si uso el comando:
[usuario ]@host:$ yes &

sin redirigir stdout a /dev/null, una cadena de y-es se mostraran en su monitor, sin modo alguno de interrumpirlo
(no puede hacer uso de CTRL-C para interrumpir tareas en segundo plano). Para poder parar esas interminables
y-es, tendra que usar el comando fg para pasar la tarea a primer plano, y entonces usar CTRL-C para matarla.

Otra observacion: Normalmente, los comandos fg y bg actuan sobre el ultimo proceso parado (indicado por
un + junto al numero de tarea cuando usa el comando jobs). Si usted tiene varios procesos corriendo a la vez,
podra mandar a primer o segundo plano una tarea especfica indicando el ID de tarea como argumento de fg o bg,
como en:

[usuario ]@host:$ fg % 2 (para la tarea de primer plano numero 2), o


[usuario ]@host:$ bg % 3 (para la tarea de segundo plano numero 3).

No se pueden usar los ID de proceso con fg o bg. Ademas de esto, si usa el numero de tarea por s solo, como:
[usuario ]@host:$ %2 es equivalente a [usuario ]@host:$ fg %2

Recordemos que el uso de control de tareas es una utilidad del shell. Los comandos fg, bg y jobs son internos del
shell. Si por algun motivo utilizamos una shell que no soporta control de tareas, no dispondremos de estos comandos.

Combinaciones de teclas utilizadas


Ctrl-C : Enva una senal de interrupcion al programa actual en ejecucion, el cual generalmente responde con la
accion de terminar la propia ejecucion.

Ctrl-Z : Suspende al programa actual en ejecucion.

7.5. Otros comandos relacionados


top: muestra los procesos que mas recursos del sistema utilizan. Se actualiza periodicamente.
pstree: muestra los procesos mediante un arbol, mostrando las relaciones padre-hijo.
skill / killall / pkill: Igual que kill pero para un grupo de procesos.
fuser: Identifica que procesos (PID) utilizan un archivo determinado.
pgrep: listado selectivo de procesos, basado en los nombres de los mismos y en otros tipos de atributos.
nice / renice/ snice: Manejo de prioridades de ejecucion.

7.6. Ejercicios
1. Ejecutar en la siguiente secuencia:
[usuario ]@host:$ bash
[usuario ]@host:$ yes > /dev/null &
[usuario ]@host:$ yes > /dev/null &
[usuario ]@host:$ bash
[usuario ]@host:$ ping host valido > /dev/null &
[usuario ]@host:$ ping otro host valido > /dev/null &

Utilizar el comando pstree para ver el arbol de procesos generado.


2. Cambiar de consola y matar todas las tareas relacionadas con la consola anterior (utilizar algun comando para
eliminar grupos de procesos).
3. Ejecutar varios procesos [usuario ]@host:$ yes > /dev/null & y varios [usuario ]@host:$ ping host > /dev/null
& Eliminar todos los procesos yes. Verificar lo realizado y luego eliminar todos los procesos ping.

19
4. Leer la pagina de manual del ls. Suspender el proceso. Leer la pagina de manual del cat. Suspender el proceso.
Hacer un ping a otra maquina. Suspender el proceso. Que otros procesos se han disparado? De que proceso
son hijos?
5. Retomar el proceso man ls en primer plano y terminarlo normalmente
6. Pasar el proceso pin de suspendido a ejecucion en segundo plano. Eliminar luego el proceso ping.
7. Ejecutar un procesos [usuario ]@host:$ yes > /dev/null & y un [usuario ]@host:$ ping host > /dev/null
&. Cuanto porcentaje de cpu consume cada uno? es constante?

8. Matar todos los procesos que han quedado perdidos.antes de cerrar las sesiones.

8. COMPRESION DE ARCHIVOS
OBJETIVO: Conocer herramientas mas utilizadas para el empaquetado y compresion de archivos

8.1. Comando tar


El comando tar es utilizado normalmente para empaquetar archivos. El comando tar no comprime automatica-
mente los archivos mientras los empaqueta. El formato del comando tar es:

tar <opciones> <archivo1> <archivo2> ...<archivoN>

donde opcioneses la lista de comandos y opciones para tar, y archivo1hasta archivoNes la lista de archivos
a anadir o extraer del archivo empaquetado. Por ejemplo, el comando
# tar cvf backup.tar /etc

empaquetara todos los archivos de /etc en el archivo backup.tar.

En el primer argumento de tar (cvf), la opcion c le dice a tar que cree un nuevo archivo (create). La opcion
v fuerza a tar en el modo verbose, imprimiendo los nombres de los archivos segun se empaquetan. La opcion f
le dice a tar que el siguiente argumento (backup.tar) es el nombre del archivo a crear. El resto de los argumentos
de tar son los nombres de archivos y directorios a anadir al archivo empaquetado.

8.2. Descomprimir archivos con tar


# tar xvf backup.tar
Esto extraera el archivo backup.tar en el directorio actual. Esto puede ser peligroso, porque si el archivo ya exista
se sobrescribira. Por otra parte, antes de extraer archivos tar es importante conocer donde se deben desempaquetar.
Por ejemplo, digamos que se empaquetaron los siguientes archivos: /etc/hosts, /etc/group, y /etc/passwd. Si se
uso:
# tar cvf backup.tar /etc/hosts /etc/group /etc/passwd

el nombre de directorio /etc se anadio al principio de cada nombre de archivo. Para poder extraer los archivos
en el directorio correcto, se necesitara utilizar los siguientes comandos:
# cd /
# tar xvf backup.tar

Ya que los archivos se extraen con el nombre de camino almacenado. Sin embargo, si se empaquetaron los
archivos con los comandos:
# cd /etc
# tar cvf hosts group passwd

Los nombres de directorio no se salvaron en el archivo empaquetado. Por esto se necesitara hacer cd /etc.antes
de extraer los archivos. Como se puede ver, el como haya sido creado un archivo tar marca una gran diferencia en
como se extrae. Se puede usar el comando:
# tar tvf backup.tar

20
para mostrar unndic del archivo tar antes de desempaquetarlo. De esta forma se puede ver que directorio
se utilizo como origen de los nombres de los archivos, y se puede extraer el archivo desde la localizacion correcta.
Ademas agregando el switch z utiliza el gzip y el gunzip para comprimir / descomprimir.

8.3. Comando gzip


El comando gzip se utiliza para comprimir un archivo. El formato del comando gzip es:
gzip archivo (archivo se convierte en archivo.gz comprimido)
gzip -c archivo > archivo.gz (Se crea archivo.gz, archivo no se modifica)

Por ejemplo:
# gzip -9 backup.tar

Comprimira backup.tar y lo dejara como backup.tar.gz, que es la version comprimida del archivo tar. La opcion
-9 le dice a gzip que utilice el mayor factor de compresion.

8.4. Descomprimir archivos con gunzip o con gzip


El comando gunzip se utiliza para descomprimir un archivo comprimido con gzip. Equivalentemente, se puede
utilizar gzip -d. El formato del comando gunzip es:

gunzip archivo.gz (descomprime archivo.gz)


gunzip -c archivo.gz > nuevo (descomprime archivo.gz y se redirecciona la salida al archivo nuevo).

8.5. Comprimir y empaquetar


Por lo tanto, para empaquetar un grupo de archivos y comprimir el resultado, se pueden utilizar los comandos:

# tar cvf backup.tar /etc


# gzip -9 backup.tar

El resultado sera backup.tar.gz. Para desempaquetar este archivo, se usan los comandos contrarios:

# gunzip backup.tar.gz
# tar xvf backup.tar

8.6. Comando zcat


Es similar al cat, pero pasando el archivo a traves del gunzip. Con zcat podemos, ver el contenido de una archivo
comprimido sin descomprimirlo, similar al cat. El formato del comando zcat es:
# zcat <archivo-de-texto-comprimido>

8.7. Comandos zip y unzip


Este comando es una utilidad para empaquetar y comprimir archivos. Para una descripcion de los parametros
de zip o unzip se puede ejecutarlos sin parametros en el shell. El formato del comando zip es:

# zip <nombre_archivo_comprimido> <archivos_a_comprimir>

Si se quieren comprimir todos los archivos de un directorio se debe usar * en <archivos a comprimir>.
Para descomprimirlos se debe usar el comando unzip. El formato del comando unzip es:
# unzip <nombre_archivo_comprimido>

Algunas opciones utiles de estos comandos:

21
-r: comprime todos los subdirectorios y archivos bajo el directorio donde estamos, o donde le indicamos.

-i: Incluye solo los archivos que especificamos, por ejemplo: # zip todo * -i (backslash) .txt (solo comprimira
los archivos que finalicen con .txt).

-f: Si ya hemos creado un .zip de nuestros archivos, pero periodicamente modificamos estos, con este argumento
no hace falta crear el .zip de nuevo, este agrega los cambios de nuestros archivos en el zip, basandose en la fecha de
creacion de estos. Esta opcion no funciona como -u, no agrega archivos nuevos a nuestro zip, solo actualiza los que
ya estan.

-q: Trabaja en modo silencioso, es decir, elimina todos los mensajes informativos.

-u: Actualiza los archivos que hemos modificado, y tambien agrega archivos a nuestro .zip. # zip -u nombre
archivo comprimidoarchivo a agregar

-x: Esta opcion sirve para excluir uno o varios archivos en nuestro .zip. # zip nombre archivo* -x (backs-
lash)*.Z (se excluyen los archivos Z de nuestro .zip)

-y : Esta opcion sirve para guardar los links en el zip como links en vez de guardar el archivo al que apunta el
link.

8.8. Comandos bzip2 bunzip2 bzcap bzip2recover


El comando bzip2 comprime archivos usando el algoritmo Burrows-Wheeler block-sorting text compression
y Huffman coding. La lnea de comandos es similar al GNU gzip pero no es identica. Tiene un poco mas de
capacidad de compresion que otros compresores mas convencionales basados en LZ77/LZ78. Este genera archivos
de la forma archivo original.bz2. El comando bunzip2 se utiliza para descomprimir los archivos generados con
bzip2. Con bzcat se puede consultar el contenido de un archivo de texto comprimido con bzip2. El comando bzip2
comprime los archivos en bloques de 900kbytes aproximadamente y cada bloque se maneja de manera independiente
lo que posibilita que si un bloque esta corrupto se puedan recuperar los datos de los bloques que estan correctos.
El programa bzip2recover se utiliza para buscar bloques correctos dentro de un archivo bzip2 danado, el unico
argumento que necesita este es el nombre del archivo danado, generando un salida similar a rec0001fichero.bz2,
rec0002fichero.bz2, etc. bzip2recover es de mas provecho cuanto mas bloques tiene el archivo bz2. Es inutil
utilizarlo con archivos de un solo bloque pues este no repara bloques sino que extrae los bloques correctos. Si se
desea minimizar la perdida de informacion por un error del medio fsico o de la transmision se debera achicar el
tamano de los bloques en el momento de la compresion.

8.9. Comando cpio


Si bien cpio no sirve para comprimir, nos ayudara a empaquetar todos nuestros archivos en uno solo para des-
pues comprimirlo con alguna utilidad. Con cpio se puede empaquetar archivos y mandarlos al estandar output, a
un archivo, o a un dispositivo. El comando cpio tiene tres modos de operacion. El modo copia-afuera, cpio copia
varios archivos de entrada hacia otro unico de salida. Este modo funciona leyendo una lista de archivos, uno por
lnea de la entrada estandar, escribiendo el archivo en la salida estandar, este modo se representa utilizando el
argumento -o. El modo copia-adentro cpio copia archivos desde un archivo de entrada. Lee el archivo desde la entra-
da estandar, este modo se representa utilizando el argumento -i. El modo copia-de-paso cpio copia archivos desde
un arbol de directorio a otro, sin utilizar utilizar ningun archivo, este modo se representa utilizando el argumento -p.

Nota: El comando ls genera la lista que es mandada a traves de un pipe para que cpio la reciba, y empaquete
los archivos. Cuando queremos sacar los archivos ejecutamos el siguiente comando:

# cpio -iv < archivo.cpio

Si ya hubiese archivos con el mismo nombre y quisieramos sobreescribirlos utilizaramos el argumento u.

# cpio -iuv < archivo.cpio

Para ver solamente el contenido del archivo cpio el comando sera:

22
# cpio -tv < archivo.cpio

8.10. Comando unrar


El comando unrar permite descomprimir archivos comprimidos con la aplicacion rar. El mecanismo de compresion
del rar es propietario, razon por la cual no existen compresores tipo rar de libre uso.

8.11. Ejercicios
1. Buscar algun archivo de texto comprimido con gzip (*.gz); Ayuda: para buscar archivos, utilizar el comando
locate Archivo elegido:

2. Utilizar cat para ver el contenido. (Si la terminal queda mal configurada, comando reset)
3. Utilizar zcat para ver el contenido. Si es muy largo el texto pasarlo a traves de less o more.
4. descomprimir el archivo ( en /tmp)

5. Verificar que este sin compresion y comprimirlo nuevamente en el mismo formato .


6. Hacer un .tar.gz de todos los archivos en /bin. Utilizar los comandos tar y gzip unidos con un pipe.
7. descomprimirlos en /tmp
8. Obtener una salida equivalente a la que se obtendra realizando: # tar cvf backup.tar /etc
# gzip backup.tar
pero en una sola lnea y utilizando solo el comando tar.
9. comprimir todos los archivos de /etc en un archivo llamado backup etc utilizando el comando zip. Descom-
primirlo en /etc usando el comando unzip
10. Generar un archivo cpio que contenga todos los archivos del directorio /sbin.

11. Extraer los archivos desde el archivo cpio creado en el punto anterior en el directorio /sbin.
12. Generar un archivo bzip2 que contenga todos los archivos del directorio /sbin.
Generar un archivo zip que contenga todos los archivos del directorio /sbin.
Generar un archivo tar.gz que contenga todos los archivos del directorio /sbin.
Anotar los tamanos de los archivos resultantes.

Nota: Si los tamanos difieren demasiado, puede deberse a la inclusion o no de links.en la compresion. Para
que la comparacion sea valida, incluir los archivos apuntados con links dentro de los archivos comprimidos.
(El significado de links o enlaces se vera mas adelante)

Sbin.cpio
Sbin.zip
Sbin.bz2
Sbin.tar.gz

9. BUSQUEDA DE ARCHIVOS
OBJETIVO: Conocer herramientas mas utilizadas en la busqueda de archivos

23
9.1. COMANDO find
El comando FIND, es el comando que se encarga de buscar archivos. Para utilizarlo, debemos saber algun dato
que nos ayude en la busqueda, por ejemplo: su nombre, parte de su nombre, fecha de creacion, tamano, etc. Casi
siempre cuando se busca un archivo, se lo busca por su nombre, o parte de el. Para buscar un archivo por su
nombre, hay que ejecutar el comando find, seguido del directorio en el cual queremos buscar (ruta a partir de la
cual comenzar a buscarlo), la opcion -name , y el nombre, o parte, del nomre del archivo. La sintaxis del comando
find para busquedas por nombre de archivo es:

# find <ruta de inicio> -name <nombre_archivo>

El comando find buscara todos los archivos que coincidan con <nombre archivo> realizando esta busqueda en
el directorio <ruta de inicio> y todos los subdirectorios del mismo en forma recursiva. Ejemplo:

#find / -name main.c

Buscara en todo el sistema (por debajo del directorio raz /) archivos con el nombre main.c Ahora veamos
otro ejemplo. Si no recordamos el nombre del archivo, pero s, que lo creamos hace dos das, existe una solucion, la
cual es, buscar todos los archivos del sistema, creados luego de cierto tiempo.

# find / -ctime 2

Esto nos mostrara todos los archivos creados a partir de hace dos das.

Tambien puede pasar que no recordemos ni el nombre ni cuando fue creado, pero si que sepamos que el tamano
es de 650 Kb y que debe estar dentro de nuestro directorio home. Podemos buscar los archivos que tengan un
tamano de 650 Kb bajo nuestro directorio home usando:

# find ~ -size 650k

El comando find tambien permite buscar archivos por propietario, grupo, por tipo de permisos, por tipo de
archivo y otras opciones mas. Ademas se pueden realizar busquedas compuestas por dos criterios. Para una des-
cripcion detallada de este comando consultar las paginas de manual (man find). Tambien existen ejemplos en info
find El comando find, es una utilidad realmente buena, pero a veces, puede resultar un poco lenta. Existen otras
utilidades que son mas rapidas, con las que se puede obtener listados de archivos, que coincidan con lo que se quiere
buscar

9.2. COMANDO: locate


Este comando se ejecuta casi de forma instantanea, es muy rapido, ya que no busca por todo el sistemas de
archivos, sino que busca la palabra elegida, en una base de datos de todos los archivos del sistema. Periodicamente
el sistema actualiza esta base de datos, pero puede ser que los archivos mas nuevos no figuren en ella. Para actualizar
manualmente esta base de datos, se puede recurrir al comando updatedb. El formato mas simple del comando locate
es:

# locate <nombre_archivo>

El comando locate tiene otras opciones, para un listado completo de las mismas, consultar man locate.

9.3. COMANDO: which


El comando which, realiza la busqueda en los directorios especificados en su variable de entorno PATH. Es
muy rapido para buscar la ubicacion de algun comando ejecutable. El formato del comando which es:

# which <nombre_ejecutable>

24
9.4. COMANDO: whereis
Este comando busca por directorios, y devuelve la ubicacion de los ejecutables, codigos fuente y paginas de
manual que concuerden con la busqueda. En s, se puede decir que el comando whereis, sirve para ver donde esta
X programa, en el sistema de archivos. El formato simple del comando whereis es:

# whereis <nombre_ejecutable>

9.5. COMANDO: grep


Ya hemos visto anteriormente la utilizacion del comando grep, pero ahora que conocemos otros comando de
busquedas y la utilizacion de pipes, podemos utilizarlo de forma eficiente para realizar busquedas de archivos y
busquedas de texto dentro de los mismos. Por ejemplo si deseamos encontrar en el directorio actual un archivo html
con el texto GNU podramos probar:
# grep -H *.html "GNU"

El -H nos informa el archivo al que pertenece la lnea encontrada. Como alternativa sencilla al find, tambien
podramos buscar archivos con el siguiente comando:

# ls -lR <directorio_origen> | grep <patron_de_busqueda>

Para buscar archivos comprimidos con gzip que ademas esten debajo de /home podramos usar:

# locate *.gz |grep ^/home

Por supuesto, existen muchas otras formas de combinar el comando grep

9.6. Ejercicios
1. Buscar en el directorio /usr y subdirectorios, directorios que comienzen con man. Utilizar find (ver las
opciones name y type).
2. Crear en (home/usuario) un archivo de la siguiente forma: touch APELLIDO.NOMBRE reemplazando
NOMBRE y APELLIDO. Cambiar de directorio y buscar el archivo con el comando locate. Se encontro?
Por que? Realizar la busqueda en (home/usuario) combinando ls con grep

3. Utilizar locate pare encontrar archivos comprimidos con gzip, pero que se encuentren en /usr/doc (combinar
locate con grep)
4. Encontar el binario ifconfig y su pagina de manual. Binario:
Manual:

5. Utlizar grep para ubicar archivos en /etc que contengan el texto tcp. Utilizar less para ver los resultados.
(hacer que grep nos informe de que archivo proviene cada resultado)
6. Ahora, realizar la misma busqueda pero para lneas que ademas de tcp tengan el texto 80 Que archivos
da como resultado?

7. Crear un directorio nuevo. Copiar al mismo 5 archivos de texto comprimidos con gzip. Realizar una busqueda
de texto dentro de los 5 archivos (usar zcat y grep).
8. Explicar para que sirve la opcion -mount o -xdev del find.
9. Buscar en /etc archivos con permisos 0600 (lectura y escritura solo para el propietario root)

10. Como podra obtenerse el mismo resultado utilizando el comando ls en conjunto con grep?

25
10. INFORMACION DEL SISTEMA
OBJETIVO: Identificar recursos y componentes hardware del sistema
Hay varios comandos que nos permiten obtener informacion sobre el hardware y el software de nuestro siste-
ma GNU/Linux. La misma informacion se puede obtener muchas veces por diferentes metodos. A veces existen
variaciones segun las distribucion sobre la que estemos trabajando o la version del kernel utilizada. Mucha de la
informacion del hardware de nuestro sistema puede accederse a traves del directorio /proc, llamado pseudo-sistema
de archivos. Para una descripcion detallada del mismo consultar la pagina de manual man proc(Descripcion del
contenido del pseudo-sistema de archivos proc)

A continuacion se presenta una lista con algunas de las herramientas basicas para obtener informacion acerca
de las caractersticas de nuestro sistema:

10.1. Informacion sobre el nombre de host y parametros de red


Archivo : /etc/hostname
Archivo : /etc/network
Archivo: /etc/hosts
Comando : /sbin/ifconfig, netstat
Comando: hostname -Muestra informacion sobre el nombre y la IP del host

10.2. Informacion sobre el procesador


Archivo : /proc/cpuinfo
Informacion sobre la memoria y su utilizacion
Comando : free - memoria total, libre y usada, swap.
Comando : top - Utilizacion de memoria y de cpu
Comando : ps - Procesos corriendo en el sistema
Archivo: /proc/meminfo

10.3. Version del kernel


Comando : uname -a
Archivo : /proc/version
Comando : /sbin/kernelversion
Comando : ls /boot
Comando : ls -l /

10.4. Modulos (drivers)


Archivo : /proc/modules (modulos cargados)
Archivo : /etc/modules (modulos que se desean cargar en el arranque)
Comando : /sbin/lsmod -Lista modulos cargados
Herramientas para el manejo de modulos:
modprobe (8) - high level handling of loadable modules
rmmod (8) - unload loadable modules

10.5. Discos
Comando : df - Espacio total y utilizado por cada filesystem. Punto de montaje
Comando: mount - Discos montados
Archivo : /etc/fstab -filesystems montados en el arranque y mas utilizados.
Archivo : /etc/mtab -filesystems montados actualmente.
Archivo : /proc/mounts -Discos montados
Archivo : /proc/swaps -Discos swap

26
Archivo : /proc/partitions (particiones, bloques)
Archivos dentro de: /proc/ide o /proc/scsi
Por ejemplo:
/proc/ide/hda/geometry - Geometra del disco
/proc/ide/hda/model - Modelo
/proc/ide/hda/media - Tipo (disco, cdrom,etc)
Comando : cfdisk o sfdisk (solo como root)
Comando : fdlist (listado de dispositivos de discos removibles)

10.6. Interrupciones y puertos de e/s


Archivo : /proc/interrupts
Archivo : /proc/ioports
Archivo : /etc/modules (se define aqu que interrupcion y direccion base usa una placa)
Comando: lspci (lista los dispositivos conectados al bus PCI)

10.7. Generales
Comando : dmesg - Examinar el buffer anillo del Kernel. Utilizado por ejemplo para visualizar la informacion
que presenta el sistema en el arranque.
Comando : uptime - Muestra el tiempo que el sistema estuvo encendido, la hora, la cantidad de usuarios y la carga
promedio.
Archivo : /proc/rtc - Informacion sobre la configuracion del hardware del reloj de tiempo real.
Archivo : /proc/filesystems - Filesystems soportados
Comando : history - Historial de comandos del bash (.bash history)
Comando : set -Muestra todas las variables del shell. Algunas variables nos muestran como esta configurado el
entorno.

10.8. Ejercicios
1. Nombre de host:
2. IP:
3. Modelo de procesador:
4. Velocidad:
5. Memoria :
6. Tamano de disco rgido:
7. modelo:
8. geometra:
9. Particiones
10. nombre: tama~
no: utilizado: tipo(ext2/swap):
11. nombre: tama~
no: utilizado: tipo:
12. nombre: tama~
no: utilizado: tipo:
13. nombre: tama~
no: utilizado: tipo:
14. Distribucion:
15. Version del Kernel:
16. Modulo de placa de red:

27
17. Tiempo de funcionamiento del sistema:

18. Interrupcion utilizada por la placa de red:


19. Interrupcion utilizada por ide0:
20. Puertos de e/s utilizados por la placa de red:
21. Puertos de e/s utilizados por la placa de video:

22. Variables de entorno


23. UID:
24. TERM:

11. ENLACES DUROS Y SIMBOLICOS. Hardlinks - symlinks


OBJETIVO: Comprender el significado y la diferencia entre enlaces duros y simbolicos

11.1. Manejando enlaces de archivos


Los enlaces le permiten dar a un unico archivo multiples nombres. Los archivos son identificados en el sistema
por su numero de inodo, el cual es el unico identificador del archivo para el sistema de archivos. Un directorio es una
lista de numeros de inodo con sus correspondientes nombres de archivo. Cada nombre de archivo en un directorio
es un enlace a un inodo particular.

11.2. Enlaces duros (Hard links)


El comando ln es usado para crear multiples enlaces para un archivo. Por ejemplo, supongamos que tiene un
archivo foo en un directorio. Usando ls -i, veremos el numero de inodo para el archivo.
# ls -i foo
22192 foo

Aqu, el archivo foo tiene el numero de inodo 22192 en el sistema de archivos. Podemos crear otro enlace a foo,
llamado bar:
# ln foo bar

Con ls -i veremos que los dos archivos tienen el mismo inodo.


# ls -i foo bar
22192 bar 22192 foo

Ahora, accediendo a foo o a bar accederemos al mismo archivo. Si hace cambios en foo, estos cambios tambien
seran efectuados en bar. Para todos los efectos, foo y bar son el mismo archivo. Estos enlaces son conocidos como
enlaces duros (hard links) porque directamente crean el enlace al inodo. Notese que solo podemos crear enlaces duros
entre archivos del mismo sistema de archivos. Los enlaces simbolicos (ver mas adelante) no tienen esta restriccion.
Cuando borra un archivo con rm, esta solamente borrando un enlace a un archivo. Si usa el comando
# rm foo

La orden ls -i mostrara los numeros de inodo. Solo el enlace de nombre foo es borrado; bar todava existira. Un
archivo es borrado definitivamente del sistema cuando no quedan enlaces a el. Usualmente, los archivos tienen un
unico enlace, por lo que el uso de rm los borra. Pero si el archivo tiene multiples enlaces, el uso de rm solo borrara
un unico enlace; para borrar el archivo, debera borrar todos los enlaces del archivo. La orden ls -l muestra el
numero de enlaces a un archivo (entre otra informacion).
# ls -l foo bar
-rw-r--r-- 2 root root 12 Aug 5 16:51 bar
-rw-r--r-- 2 root root 12 Aug 5 16:50 foo

La segunda columna en el listado, 2, especifica el numero de enlaces al archivo. Un directorio no es mas que
un archivo que contiene informacion sobre la translacion enlace a inodo. Tambien, cada directorio tiene al menos

28
dos enlaces duros en el: . (un enlace apuntando a s mismo) y . (un enlace apuntando al directorio padre). En
el directorio raz (/), el enlace .. simplemente apunta a /.

11.3. Enlaces simbolicos


Los enlaces simbolicos son otro tipo de enlaces, diferente al enlace duro. Un enlace simbolico permite dar a un
archivo el nombre de otro, pero no enlaza el archivo con un inodo. Dentro del enlace simbolico se guarda la ruta
donde ubicar al archivo destino. La orden ln -s crea un enlace simbolico a un archivo. Por ejemplo, si usamos la
orden
# ln -s foo bar

crearemos un enlace simbolico bar apuntando al archivo foo. Si usamos ls -i, veremos que los dos archivos
tienen inodos diferentes, en efecto.
# ls -i foo bar
22195 bar 22192 foo
#

De cualquier modo, usando ls -l vemos que el archivo bar es un enlace simbolico apuntando a foo.
# ls -l foo bar
lrwxrwxrwx 1 root root 3 Aug 5 16:51 bar -> foo
-rw-r--r-- 1 root root 12 Aug 5 16:50 foo
#

Los bits de permisos en un enlace simbolico no se usan (siempre aparecen como rwxrwxrwx). En su lugar, los
permisos del enlace simbolico son determinados por los permisos del archivo apuntado por el enlace (en nuestro
ejemplo, el archivo foo). Funcionalmente, los enlaces duros y simbolicos son similares, pero hay algunas diferencias.
Por una parte, se puede crear un enlace simbolico a un archivo que no existe; lo mismo no es cierto para enlaces
duros. Los enlaces simbolicos son procesados por el nucleo de forma diferente a los enlaces duros, lo cual es solo una
diferencia tecnica, pero a veces importante. Los enlaces simbolicos son de ayuda puesto que identifican al archivo al
que apuntan; con enlaces duros no hay forma facil de saber que archivo esta enlazado al mismo inodo. Los enlaces
se usan en muchas partes del sistema Linux. Los enlaces simbolicos son especialmente importantes para el sistema
de libreras compartidas en /lib. La operacion rm sobre un fichero simbolico no actua sobre el fichero apuntado
sino sobre el propio enlace simbolico destruyendolo.

11.4. Ejercicios.
1. Crear un archivo de texto llamado ej0 que contenga su NOMBRE y AELLIDO.
2. Crear un par de enlaces duros con ej0 llamados hard1 y hard2.
3. Crear un enlace simbolico a ej0 llamado sym1

4. Crear un directorio dir1 y crear un enlace llamado dir2.


5. Hacer un ls -l para ver los enlaces creados. $ $ $ $ $

Figura 1: img1

29
Los enlaces rgidos no muestran nada particular listados con ls -l pero los enlaces simbolicos vienen acom-
panados de una flecha que apunta a otro nombre de fichero. Hay una columna de numeros a continuacion de
los permisos. Se trata de una columna que indica el numero de enlaces rgidos que estan asociados a un mismo
fichero.

En el caso de ej0, hard1 y hard2 aparece un 3 y esta claro porque son enlaces creados por nosotros
pero el directorio dir1 tiene un 2. Esto significa que existe otro enlace rgido para ese directorio que nostros
no hemos creado. Se ha creado automaticamente al crear dir1. Acuerdese que todos los directorios se crean
con un par de entradas que . y .. El 2 por lo tanto en este caso se debe a la entrada . dentro del propio
dir1 y si dentro de dir1 existieran directorios habra que contabilizar cada uno de los .. de los directorios
hijos como enlaces rgidos de dir1.
6. Ver el contenido de ej0 .
7. Agregar (usando el operador >>) el texto CC al archivo hard1.
8. Ver nuevamente el contenido de ej0. $ $ $ $
La informacion es accesible desde distintos nombres de ficheros pero no son copias sino que se trata de la
misma unidad de informacion.
9. Borrar ej0. Hacer un cat a sym1. Hacer un cat a hard1.

Figura 2: img2

En el caso de los enlaces rgidos da igual cual es el enlace o fichero original. Son totalmente equivalentes y
la informacion solo desaparecera del sistema cuando el ultimo enlace rgido sea eliminado. La diferencia con
el enlace simbolico es que actua simplemente accediendo al nombre del fichero que tiene almacenado en su
interior. Por eso en el caso que acabamos de ver sym1 queda apuntando a ej0 que es un fichero que ya
no existe.
10. Hacer un ls -li La opcion -i sirve para visualizar el numero de inodo. Un inodo es una clave numerica para
el acceso al sistema plano de ficheros donde cada almacen de informacion tiene una unica clave y por eso los
distintos enlaces rgidos contienen el mismo valor de inodo.
11. Cambiar el nombre de hard2 por ej0 usando el comando mv. Con esto el link simbolico debera funcionar
nuevamente.
12. Verificar que sym1 es valido (cat sym1)
13. Mover el enlace simbolico sym1 a dir1 usando el comando mv.
14. Verificar si funciona sym1 (que esta ahora dentro de dir1). Hay error? Por que? :
Los enlaces simbolicos son relativos si no se especifica la ruta completa del target al momento de su creacion.
15. Trasladar ej0 a dir2 y comprobar como queda todo y si ./dir1/sym1 es valido nuevamente
16. Ahora vamos acrear un symlink con ruta absoluta. Dentro de dir1 creamos un symlink de nombre ultimo
symlink, pero esta vez especificando el path completo del target (/..../dir1/ej0). Una manera de hacerlo facil
para los casos donde el path completo sea muy largo: ln -s pwd/ej0 ultimo symlink $
17. Verificar que ultimo symlink funcione correctamente y luego moverlo a otro directorio. El symlink debera
seguir apuntando correctamente a su target.

30
Figura 3: img3

12. COMPILANDO C/C++ BAJO LINUX


OBJETIVO: Utilizar en forma basica el compilador de C en Linux

12.1. Compilando un programa C de un solo fuente


La forma mas facil de compilar es cuando se tiene todo el codigo fuente en un solo archivo. Esto evita el trabajo
de sincronizar muchos archivos al compilar. Supongamos que tenemos un archivo simple main. que queremos
compilar.

Archivo simple main


#include <stdio.h>
int main(int argc, char* argv[])
{
printf ("Hola Mundo!!\n");
return 0;
}

Utilizamos la siguiente lnea de comando para compilarlo: # gcc simple_main.c

Si la compilacion resulto exitosa, se obtendra un archivo a.out. Si se desea que el compilador genere un archivo
con nombre distinto a a.out lo especificamos con la opcion -o nombre archivo salida:
# gcc simple_main.c -o simple_main

Como resultado obtendremos un archivo ejecutable llamado simple main

1) Crear el archivo simple main.c y compilarlo

Ejecutando el programa resultante


Una vez que hemos creado nuestro archivo ejecutable, lo corremos simplemente tipeando :
$ # simple_main

Para esto es necesario que el directorio donde se encuentra el programa figure en el PATH. En caso de que no
figure, debemos ejecutar el programa especificando su ruta:
$ # ./simple_main

Si aun el programa no ejecuta, puede ser que los permisos no esten correctamente seteados. Debemos utilizar el
comando chmod para agregar permiso de ejecucion. Si el archivo se transfiere a otro directorio o a otra maquina,
es posible que se modifiquen los permisos originales.

31
2) Ejecutar el archivo simple main

12.2. Creando codigo con informacion de debug


Normalmente cuando estamos haciendo un programa, deseamos tener la informacion para realizar un debugging
del codigo ( usar un debugger que nos permita ejecutar el codigo paso a paso, colocar breakpoints, mirar el contenido
de las variables, etc.). Para que el debugger tenga la capacidad de relacionar entre el programa ejecutable y nuestro
codigo fuente, es necesario indicarle al compilador que inserte , en el codigo ejecutable, informacion que ayude al
debugger en su tarea. Para esto es necesario agregar el switch -g :

# gcc -g simple_main.c -o simple_main2

El archivo ejecutable obtenido es de mayor tamano que el obtenido sin agregar la informacion de debug. Si lo
deseamos podemos quitar esta informacion de debug con el comando strip:

$ # strip simple_main2

El archivo obtenido es aun menor que el que se obtuvo sin utilizar el switch -g. Esto se debe a que incluso
estos archivos contienen cierta informacion, como por ejemplo nombres de funciones, etc.

3) Compilar agregando informacion de debug y comparar el archivo obtenido con el archivo anterior.

4) Quitar informacion de debug con el comando strip y comparar.

12.3. Creando codigo optimizado


Luego de crear un programa y debuguearlo adecuadamente, deberemos compilarlo nuevamente para obtener
el codigo ejecutable mas eficiente posible. El compilador nos puede ayudar en optimizar nuestro codigo, para que
ejecute a mayor velocidad, para que ocupe menos espacio, o para alguna combinacion de ambos. La forma basica
de crear un programa optimizado es la siguiente:

# gcc -O simple_main.c -o simple_main

El flag -O le dice al compilador que optimice el codigo. El compilador demorara mas ya que tratara de aplicar
varios algoritmos de optimizacion. Podemos especificar el nivel de optimizacion de la siguiente forma:

# cc -O2 simple_main.c -o simple_main (nivel 2 de optimizacion)

Cuanto mayor es el nivel de optimizacion, es mas probable que nuestro codigo deje de funcionar correctamente.
Esto es debido a bugs en el compilador ya que las optimizaciones aplicadas se hacen mas complejas.

12.4. Warnings adicionales del compilador


Normalmente el compilador solo genera mensajes de error sobre codigo erroneo que no se ajusta con el estandar
de C y advertencias acerca de problemas que normalmente causan errores durante la ejecucion del programa. Sin
embargo, podemos decirle al compilador que nos de mas avisos (warnings) que nos ayuden a mejorar la calidad de
nuestro codigo y para resaltar bugs que mas tarde deberemos corregir de todas formas. En el gcc esto se hace con
la opcion -W. Por ejemplo para que el compilador nos de todo tipo de advertencias:

# gcc -Wall single_source.c -o single_source

5) Definir dentro del archivo simple main.c una variable cualquiera, sin utilizarla. Compilar el fuente con y
sin warnings. Comparar resultados.

12.5. Compilando un programa C de multiples fuentes


Algunos de los inconvenientes de tener todo el codigo de programa en un solo fuente son los siguientes:

32
A medida que el programa crece, el tiempo de compilacion se incrementa y para cada pequeno cambio es nece-
sario re-compilar el programa completo.

Es mucho mas complicado que varias personas tranbajen juntas en el mismo proyecto con este tipo de organi-
zacion.

Administrar el codigo se hace mucho mas dificultoso.

La solucion a esto es separar el codigo en varios archivos, cada uno conteniendo funciones con algun tipo de
relacion entre s. Hay dos formas posibles de compilar un programa C de multiples archivos. La primera es utilizar
una sola lnea de comandos para compilar todos los archivos. Supongamos que tenemos un programa que tiene sus
fuentes en main.c , a.c y b.c:

main.c:
#include <stdio.h>
/* define some external functions */
extern int func_a();
extern int func_b();
int
main(int argc, char* argv[])
{
int a = func_a();
int b = func_b();
char c;
char* bc = &c;
printf("hello world,\n");
printf("a - %d; b - %d;\n", a, b);
return 0;
}
a.c:
int func_a()
{
return 5;
}
b.c:
int func_b()
{
return 10 * 10;
}

Podemos compilarlo de esta forma:

# gcc main.c a.c b.c -o hello_world

Esto ocasionara que el compilador compile cada archivo en forma separada y luego los enlace (linking)

6) Compilar el ejemplo de 3 fuentes.


El problema con esta forma de compilar es que al realizar un cambio en uno de los archivos, es necesario recompi-
lar todos nuevamente. Para evitar esta limitacion podemos subdividir el proceso en dos partes: compilacion y enlace:

# gcc -c main.cc
# gcc -c a.c
# gcc -c b.c
# gcc main.o a.o b.o -o hello_world

Los primeros 3 comandos toman el codigo fuente y lo compilan en algo llamado objet file, con el mismo nombre
pero con la extension .o. Es el flag -c que le dice al compilador que solo genere archivos objeto y no archivos
ejecutables. En el archivo objeto, existen smbolos no resueltos todava. Para crear el ejecutable final, luego de crear

33
los 3 objetos, utilizamos el cuarto comando para enlazar todo en un solo programa. De esta forma necesitamos
re-compilar solamente los archivos modificados y luego re-enlazar todos los archivos objeto. Supongamos que cam-
biamos el archivo a.c :

# gcc -c a.c
# gcc main.o a.o b.o -o hello_world

Este ahorro en tiempo de compilacion , se hace mas importante en grandes programas con muchos archivos fuente.

7)Modificar a.c y re-compilar de esta ultima forma.

12.6. Otras herramientas de programacion


Existen, ademas del compilador, muchas otras herramientas que ayudan al programador a crear, depurar y
administrar codigo fuente y ejecutable. Algunas de estas herramientas son:

g++ (compilador C++)


make (automatiza compilacion y re-compilacion de codigo)
gdb (debugger)
editores para programacion, IDEs (rhide, setedit, kdevelop)
diff (encuentra diferencias entre archivos fuente)
patch (genera parches)
repositorio CVS
y muchos otros...

12.7. Resolucion de los Ejercicios enunciados


1.

2.
3.
4.
5.

6.
7.

34

Você também pode gostar