Tema 3 (prácticas) - Departamento de Ingeniería y Tecnología de
Transcripción
Tema 3 (prácticas) - Departamento de Ingeniería y Tecnología de
Universidad de Murcia Facultad de Informática T ÍTULO DE G RADO EN I NGENIERÍA I NFORMÁTICA Fundamentos de Computadores Tema 3: Introducción a los Sistemas Operativos Boletines de prácticas y ejercicios C URSO / Departamento de Ingeniería y Tecnología de Computadores Área de Arquitectura y Tecnología de Computadores Tema 3: Introducción a los Sistemas Operativos Fundamentos de Computadores Índice general I. Boletines de prácticas B3.1. Boletín 1 . . . . . . . . . . . . . . . . . . . . B3.1.1. Objetivos . . . . . . . . . . . . . . . B3.1.2. Plan de trabajo . . . . . . . . . . . . B3.1.3. Ejercicios a realizar durante la sesión B3.2. Boletín 2 . . . . . . . . . . . . . . . . . . . . B3.2.1. Objetivos . . . . . . . . . . . . . . . B3.2.2. Plan de trabajo . . . . . . . . . . . . B3.2.3. Ejercicios a realizar durante la sesión II. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 2 2 5 5 5 5 8 1 Tema 3: Introducción a los Sistemas Operativos Fundamentos de Computadores Boletines de prácticas B3.1. Boletín 1 B3.1.1. Objetivos El objetivo de este primer boletín de prácticas del tema 3 es familiarizar a los alumnos con el uso básico del SO Linux, haciendo especial hincapié en el manejo de éste desde el intérprete de comandos bash. También se introducirán una serie de comandos básicos para dar los primeros pasos en este SO. Más concretamente, se tratarán los siguientes temas: Acceso al sistema. Interfaz gráfico (KDE/GNOME). Lanzamiento de programas. Utilidades varias (editores, navegadores, etc.). Intérprete de comandos bash. Formato general de una orden, uso del tabulador, historial de comandos. Documentación y búsqueda de información. Páginas del manual. Movimiento por la jerarquía de directorios. Listados. Creación y borrado de directorios. Metainformación sobre ficheros: dueño, permisos, fechas, tamaño, etc. B3.1.2. Plan de trabajo El plan de trabajo de esta sesión será el siguiente: 1. Lectura del boletín por parte del alumno. 2. Seguimiento de ejemplos presentados por el profesor. 3. Realización, en grupos de dos personas, de los ejercicios propuestos en el boletín (con supervisión del profesor, y completándolos en su caso como trabajo autónomo). B3.1.3. Ejercicios a realizar durante la sesión 1. Terminales de texto. Antes de acceder al modo gráfico, probaremos primero el interfaz puramente textual del sistema. Para ello, cambiar a un terminal de texto con Ctrl-Alt-Fn (con n=1-6 tenemos acceso a distintos terminales). Introducir nuestro login y password (alumno/alumno, en los laboratorios de prácticas). Probar distintos comandos desde el terminal: date, pwd, w, ls -l /, . . . . Para terminar, acabar la sesión con exit, y volver al terminal gráfico con Ctrl-Alt-F7. 2. Interfaz gráfico. Entrar en la sesión gráfica usando de nuevo nuestro login y password. Dependiendo de la instalación, habitualmente se entrará en uno de los dos entornos gráficos más conocidos, KDE o GNOME (éste último es el configurado por defecto en los laboratorios de prácticas, pero todo lo que veremos vale igualmente para KDE). Una vez allí, lanzar un terminal buscando el programa “Terminal” en el menú adecuado. Incluso podemos generar un acceso directo a la aplicación en el escritorio, arrastrando desde el menú el icono correspondiente. Una vez lanzado, desde esta ventana de terminal gráfico iremos ejecutando el resto de comandos de la práctica. 2 Tema 3: Introducción a los Sistemas Operativos Fundamentos de Computadores 3. Lanzamiento de programas. Existen varias formas de lanzar comandos en Linux: a través del menú o icono correspondiente (al estilo clásico de Windows), llamando al comando correspondiente desde el terminal, o usando el menú de lanzamiento rápido (Alt-F2). Como ejercicio, lanzar la calculadora de KDE (comando kcalc) y/o GNOME (gnome-calculator) usando estos tres métodos. Observar que las aplicaciones gráficas de KDE pueden ejecutarse perfectamente desde GNOME, y viceversa, puesto que en realidad ambos sistemas gráficos corren sobre una base común, llamada X-Windows. También podemos lanzar el famoso programa firefox para navegar por la web, o el visor de ficheros PDF acroread, por ejemplo. 4. Movimiento básico por el sistema. Ya desde el terminal, nos moveremos al subdirectorio bin bajo el directorio /usr que está en la raíz, usando el comando cd con una ruta absoluta. Ejecutar allí el comando ls -l para ver todos los ficheros ejecutables (comandos) allí almacenados. Comparar los contenidos de dicha carpeta con los contenidos mostrados por un navegador de archivos tradicional (en una ventana gráfica), konqueror (KDE) o nautilus (GNOME). Volver al directorio de inicio de sesión (directorio home) usando el comando cd sin parámetros. Comprobar en todo momento nuestra situación en la jerarquía de directorios usando pwd. Movernos con un sólo comando cd [ruta] al directorio /etc/X11, pero usando esta vez una ruta relativa (que NO comience con una /). Experimentar con la compleción de rutas con el tabulador (tecleando, por ejemplo, cd /us[tab]/bi[tab]/X[tab], etc.) 5. Consulta y modificación de ficheros. Permisos. Una vez allí, mostrar en pantalla el contenido del fichero xorg.conf usando el comando cat xorg.conf. Volver a nuestro directorio home (/home/alumno) y, desde allí, llamar al editor kate (KDE) o gedit (GNOME) para ver el fichero xorg.conf. Para ello, al llamar al editor pasarle como parámetro la ruta absoluta hasta el fichero (usar el tabulador para ir completándola sin necesidad de teclearla completamente). Dicho fichero es propiedad del superusuario, y como usuarios normales no tenemos permiso de escritura sobre él, así que no se podrán modificar sus contenidos desde el editor; sólo podremos consultarlos en lectura. Comprobar con ls -l el dueño y los permisos de dicho fichero. Compararlos con los del fichero /bin/ls, y con los de un tercer fichero (vacío) que generaremos en nuestro directorio home con el comando touch. Finalmente, consultar los códigos ASCII en hexadecimal de los caracteres contenidos en el fichero xorg.conf con el comando hexdump -C. 6. Selección y copia de texto. Mediante el ratón, seleccionar con el botón izquierdo la salida de los tres comandos anteriores (ls -l sobre los tres ficheros mencionados), y pegarla en la ventana de un editor de texto (gedit o kate) inicialmente vacío usando el botón central. Guardar el fichero generado en un fichero llamado salida.txt en el directorio home. 7. Metadatos de un fichero. Comprobar, usando de nuevo el comando ls -l, el tamaño lógico del fichero salida.txt, y compararlo con el que realmente ocupa en disco con el comando du -h. Observar también los distintos metadatos de los tres ficheros (fecha, dueño, grupo, permisos, etc.). 8. Historial de comandos. Ahora que hemos tecleado unos cuantos comandos, juguemos un poco con la historia de comandos. Ejecutar el comando history. Comprobar los comandos tecleados. Repetir el comando que listaba el fichero xorg.conf de tres formas distintas: a) utilizando las flechas del cursor para volver sobre los comandos anteriores b) con Ctrl-R y tecleando parte del comando (p.e., el nombre del fichero, xorg.conf), y c) usando !num, donde num es el número de orden del comando en el historial. Salir de la sesión con el comando exit, y volver a entrar abriendo otra ventana de terminal. Listar todos los ficheros (incluyendo los ocultos) con el comando ls -a. Comprobar la existencia de un fichero oculto llamado .bash_history. Consultar su 3 Tema 3: Introducción a los Sistemas Operativos Fundamentos de Computadores contenido con cat, y observar cómo bash guarda ahí el historial de comandos para recordarlo en sesiones posteriores. 9. Ayuda y documentación. Trabajaremos ahora con el sistema de ayuda. El comando man se puede usar para consultar la página del manual de un determinado comando. Por ejemplo, usar man ls para ver todas las posibles opciones del comando ls. Nos podemos mover por la página con las flechas y el avance o retroceso de página. Podemos incluso buscar palabras concretas dentro de páginas del manual muy largas, pulsando /palabra (intro). Pulsando de nuevo / (intro) se busca la siguiente aparición. 10. Permisos sobre directorios. Renombrar un fichero cualquiera de la jerarquía para que tenga el mismo nombre, pero todo con mayúsculas, usando el comando mv. Moviéndonos entonces al directorio padre, cambiar los permisos del directorio en el que se encuentra el fichero para que no tenga permiso x (permisos octales 600), e intentar hacer de nuevo un cd al directorio. Volver a cambiar los permisos del directorio ahora a 500 (r y x, pero no w). Comprobar si se pueden al menos listar los contenidos del directorio, e intentar volver a renombrar el fichero a minúsculas con mv. Finalmente, eliminar todos los permisos (octal 000) e intentar listar los contenidos del directorio. 4 Tema 3: Introducción a los Sistemas Operativos Fundamentos de Computadores B3.2. Boletín 2 B3.2.1. Objetivos En este segundo boletín continuaremos profundizando en el uso de la línea de comandos de Linux con unos cuantos comandos y funcionalidades adicionales de utilidad. Más concretamente: Comandos adicionales de manejo del sistema de ficheros (búsqueda, compresión/descompresión, acceso a contenidos). Comodines. Control y monitorización de procesos. Redireccionamiento de la E/S. Comunicación entre procesos mediante tuberías. B3.2.2. Plan de trabajo El plan de trabajo de esta sesión será el siguiente: 1. Lectura del boletín por parte del alumno. 2. Seguimiento de ejemplos presentados por el profesor. 3. Realización, en grupos de dos personas, de los ejercicios propuestos en el boletín (con supervisión del profesor, y completándolos en su caso como trabajo autónomo). B3.2.3. Ejercicios a realizar durante la sesión 1. Búsquedas en el sistema de ficheros. Comodines. Crear un subdirectorio prueba que cuelgue del directorio de inicio del usuario, y dentro de él, crear un árbol de directorios con un mínimo de dos niveles de profundidad, y de dos subdirectorios hijos por cada directorio, con nombres cualesquiera. Crear también un mínimo de seis ficheros (aunque estén vacíos) en cada uno de los directorios generados, incluyendo los subdirectorios intermedios, dos de ellos con un nombre cualquiera y extensión .cpp, otros dos con los mismos nombres pero usando la extensión .h, y otros dos con la extensión .txt1 . Al menos un fichero de cada subdirectorio debe llamarse con un nombre que empiece por ’a’. Usar para todo ello los comandos mkdir y touch. Volver finalmente al directorio de inicio y, desde allí, usar el comando find para mostrar toda la jerarquía construida. Usando convenientemente los comodines y las opciones -name, -type f y -type d, mostrar sólamente: a) todos los directorios, b) todos los ficheros, c) todos los ficheros con extensión .h, d) todos los ficheros con extensión de exactamente tres caracteres, e) todos los ficheros cuyo nombre empiece por ’a’, f) todos los ficheros cuyo nombre no empiece por ’a’, g) todos los ficheros cuyo nombre empiece por una letra entre la ’a’ y la ’g’. 2. Copias de seguridad. Compresión y descompresión. Generar una copia de todo el árbol de directorios prueba llamada copiaprueba, usando la orden cp -Rp. Consulta en el manual de cp qué significan exactamente estas dos opciones. Copiar también dentro de alguno de los subdirectorios algunos comandos del directorio /usr/bin (para que ocupen algún espacio). Genera ahora, usando la orden tar con las opciones czvf, un fichero comprimido llamado prueba.tgz, que contenga todo el directorio prueba. Comprobar el tamaño del directorio en disco (con du -hs, y compararlo con el tamaño del fichero comprimido generado (con ls -l). Listar los contenidos 1 Puede haber ficheros con nombres completamente iguales si están en distintos subdirectorios. 5 Tema 3: Introducción a los Sistemas Operativos Fundamentos de Computadores del mismo con tar tzvf, y una vez comprobada la corrección del mismo, intentar borrar íntegramente el directorio con rmdir. Al no estar vacío, no se puede borrar, así que tendremos que borrarlo usando las opciones -rf del comando rm (consultar en el manual su significado). Finalmente, y una vez comprobado con ls que el directorio ha sido convenientemente borrado, restaurarlo con tar xzvf2 . 3. Guiones de shell. El comando which es un comando realmente útil, que nos sirve para localizar el sitio en el que se almacena el fichero ejecutable de un determinado comando. Probar, por ejemplo, which firefox, which ls, o which con cualquiera de los programas que hemos utilizado hasta ahora (incluido, por ejemplo, which which). Se trata en realidad de un comando que está escrito en bash (es decir, es un guión de shell, más que un ejecutable en sí mismo). Comprobarlo usando el comando file, y mostrar sus contenidos usando el comando less (para poder visualizarlo cómodamente, usando las flechas y el avance y retroceso de página). Salir de less pulsando la letra q. 4. Más sobre permisos en ficheros. Concepto de PATH. Generar una copia (usando el comando cp) del fichero /bin/which en nuestro directorio de inicio, con el nombre mywhich. Comprobar que el comando sigue funcionando tecleando ./mywhich ls, por ejemplo3 . A continuación, usar el comando chmod sobre éste último fichero para eliminar su permiso de ejecución, y volver a intentar la ejecución del comando. Mostrar los contenidos del fichero con la orden cat. Editarlo y añadir una segunda línea con el contenido “# Esto es un comentario.”. Cambiar entonces los permisos del fichero para que nadie tenga acceso a él en escritura, y volver a intentar editarlo para modificarlo. Finalmente, eliminar también nuestro permiso de lectura y volver a intentar mostrarlo en pantalla con cat. 5. Control de procesos en primer y segundo plano. Lanzar los programas kcalc (calculadora) y kate (editor) desde el terminal, con la única línea de comandos kcalc ; kate ;. Observar cómo, al lanzarse en primer plano, hasta que no termine el primer proceso (cuando cerramos la calculadora) no se lanza el siguiente. Cerrar ambos programas consecutivamente, y volver a lanzarlos, pero esta vez en segundo plano, tecleando kcalc & kate &. Comprobar que ambos se lanzan y funcionan simultáneamente, y podrían terminarse ahora en cualquier orden. Con el comando fg, pasar a primer plano el último programa que se lanzó (el editor kate), y, desde el terminal, matarlo pulsando Ctrl-C. Repetir el comando fg para hacer lo propio con el comando anterior (kcalc), pero esta vez, en lugar de matarlo, pararlo pulsando Ctrl-Z desde el terminal. Observar que el programa kcalc temporalmente no responde al ratón ni al teclado (puesto que está durmiendo temporalmente, lo acabamos de parar). Volver entonces a despertarlo, pasándolo a segundo plano, con bg, y comprobar que su ventana ya responde perfectamente. Finalmente, matar al proceso desde el terminal esta vez usando el comando kill -9 [PID], usando el PID que nos indicó el terminal al lanzar el proceso inicialmente. 6. Listado de procesos. Usar el comando ps -Af para mostrar todos los procesos que se están ejecutando actualmente en el sistema. Localizar tres procesos cuyo dueño sea nuestro usuario, y otros tres cuyo dueño sea el superusuario (root). Localizar el proceso que ha consumido más tiempo de CPU. Localizar también el último que se lanzó, mirando las horas de inicio (lógicamente, será normalmente nuestro propio ps). Para dicho proceso, y mirando sucesivamente su PID y el de su padre, ascender en la jerarquía de procesos hasta llegar al proceso init (cuyo PID es uno), tomando nota de todos los PIDs sucesivos. Echar también un vistazo a los subdirectorios numéricos que 2 Todas las órdenes de éste apartado deberán obviamente ejecutarse estando situados en el directorio de inicio. Observar la necesidad de proporcionar la ruta hasta el comando, por no estar nuestro directorio de inicio en la lista de caminos por defecto para buscar los comandos ejecutables, más conocida como PATH; podéis consultar esta última lista de caminos mediante el comando echo $PATH. 3 6 Tema 3: Introducción a los Sistemas Operativos Fundamentos de Computadores cuelgan de /proc, y comprobar que se corresponden con los mismos PIDs listados con el comando ps -Af. 7. Monitorización de procesos en tiempo real. En un terminal, arrancar el proceso top , y observar en el mismo la evolución del consumo de CPU de los distintos procesos presentes en el sistema. En particular, arrancar simultáneamente (desde los menús correspondientes en el entorno gráfico) una o dos aplicaciones (por ejemplo el procesador de textos de OpenOffice, y el navegador firefox), y trabajar con ellos (por ejemplo navegando por distintas páginas con el firefox, mejor cuanto más recargadas), para observar la evolución dinámica del consumo de memoria y CPU de los procesos involucrados. 8. Redireccionamiento de la E/S: Listar todos los ficheros contenidos en /bin/, con el comando ls /bin. A continuación, repetir el comando redireccionando la salida a un fichero llamado f1.txt, usando el símbolo > . Comprobar el contenido de dicho fichero con cat f1.txt. Añadir ahora a dicho fichero la fecha actual y los ficheros del directorio /etc, con los comandos date y ls, usando esta vez el símbolo >>. Comprobar de nuevo el contenido del fichero, esta vez con un editor de textos (p.e. el kate). Finalmente, generar otro fichero f2.txt a partir del anterior f1.txt, con las líneas ordenadas alfabéticamente (usar para ello el comando sort, redireccionando la entrada desde f1.txt con <, y la salida a f2.txt con > (consultar el uso de los símbolos de redireccionamiento necesarios para este ejercicio en la transparencia 43 de teoría). 9. Tuberías: Combinando los comandos cat y wc -l mediante una tubería |, contar el número de líneas del fichero f2.txt generado anteriormente. Añadir entonces un comando grep a la tubería anterior para que sólo se cuenten líneas que contengan la letra “z”. Combinar mediante tuberías los comandos cat y cut -c para mostrar por pantalla los contenidos del fichero f2.txt donde se ha eliminado el primer carácter de cada línea. Añadir a la tubería así generada el comando sort -r para ordenar el resultado en orden alfabético inverso. Añadiendo ahora a la tubería los comandos head -[n] y tail -[n], conseguir que se muestren en pantalla sólo las líneas que van de las filas 5 a la 15. Finalmente, y añadiendo el comando tr adecuado, pasar toda la salida de minúsculas a mayúsculas (consultar comandos para este ejercicio en la transparencia 45 de teoría). 7 Tema 3: Introducción a los Sistemas Operativos Fundamentos de Computadores Ejercicios 1. Archiva y comprime con la orden tar todos los ficheros de tu directorio de trabajo y de sus subdirectorios en un fichero llamado trabajo.tgz. 2. Experimentar con todas las posibilidades de los comodines para referirse a conjuntos de ficheros comentadas en la transparencia 32 de la teoría (asterisco, interrogación, llaves, corchetes, etc.). Para ello, crear un subdirectorio nuevo, meterse en él, y generar una buena cantidad de ficheros con nombres distintos, pero que compartan ciertas características comunes en su nombre, para ir probando mediante comandos ls [expresion con comodines] las distintas posibilidades. 3. Utiliza la orden tar para crear un fichero llamado bin.tgz con los contenidos que cuelgan del directorio /bin. A continuación, utiliza el comando split (consultar en el manual su funcionamiento) para dividir dicho fichero en fragmentos con un tamaño no superior a 700 KB cada uno (por ejemplo, para que cupiesen sin problema en disquetes de 720 KB cada uno). Finalmente, usar el comando cat con la salida redireccionada al fichero bin2.tgz para reconstruir el fichero original. 4. Establece los permisos adecuados para que el fichero ∼/temp/solucion.txt (que deberás haber creado con anterioridad) sólo pueda ser borrado por el propietario, leído y modificado por el propietario y el grupo, y leído por el resto de usuarios. 5. Un directorio que pertenece al usuario juan y al grupo users, tiene los permisos rwxr-x--. Dentro de ese directorio existen únicamente dos ficheros, fich1 y fich2, también pertenecientes al usuario juan y al grupo users, y con permisos rw-rw-r- y r-xr-xr-x, respectivamente. Supongamos también que existe otro usuario pedro que también pertenece al grupo users. Determina si las siguientes afirmaciones son verdaderas o falsas: juan puede modificar fich1. pedro puede borrar fich1. Cualquier usuario puede ejecutar fich2. juan puede cambiar los permisos de fich2. El superusuario puede modificar fich1. 6. Genera en un fichero llamado salida.txt el contenido del directorio /usr/lib mostrando, para cada fichero, su nombre y su número de nodo-i (un número identificador único para cada fichero del sistema). Los ficheros deben estar ordenados por número de nodo-i, y las líneas deben aparecer numeradas, desde 1 hasta el número total de ficheros. Nota: usa sort y nl, y la opción -i del comando ls. 7. Experimentar con las opciones -size y -printf sobre una jerarquía de ficheros similar a la generada en la sesión de prácticas (puede incluso usarse la misma). Para ello, abrir con el editor de textos varios de los ficheros vacíos generados, y llenarlos con caracteres aleatorios para obtener ficheros de diferentes tamaños. Realizar entonces diferentes búsquedas de ficheros con un tamaño menor o mayor que un valor especificado, imprimiendo para cada fichero encontrado no sólo su ruta y nombre, sino también el tamaño y la profundidad (consultar el manual de find y usar la búsqueda con el carácter / en la misma para buscar palabras de interés). Ejemplo: 8 Tema 3: Introducción a los Sistemas Operativos Fundamentos de Computadores find prueba -size -80c -printf "El fichero %p tiene %s bytes (<80) y es del usuario %u \n" 8. Busca todos los ficheros del propietario root, a partir del directorio /usr/bin, que se hayan modificado hace más de una semana y que tengan un tamaño inferior a 5 KB. 9. Calcula la profundidad máxima de tu subárbol personal (a partir del directorio home). Nota: usa find con la opción -printf "%d \n" (consultar manual) junto con sort y tail. 10. Muestra una lista ordenada alfabéticamente de todos los usuarios que estén ejecutando el programa bash (cada usuario debe aparecer una única vez). Nota: usa cut, grep, sort, tr y uniq; la opción -v del grep puede resultarte útil si deseas eliminar alguna línea que contenga alguna cadena de caracteres (en lugar de cogerla, como hace el grep por defecto). 9