Universidad de Costa Rica | Escuela de Ingeniería Eléctrica IE-0117 Programación Bajo Plataformas Abiertas Archivos, directorios y medios de almacenamiento en GNU/Linux 1. Arivos y directorios Al igual que en la mayoría de los sistemas operativos, la información almacenada en los discos duros y otros medios de almacenamiento se organiza en archivos y directorios. Si bien los conceptos básicos involucrados son los mismos en todos los sistemas, existen detalles específicos en GNU/Linux y otros sistemas operativos tipo UNIX que deben conocerse para poder utilizar el sistema adecuadamente. 1.1. Tipos de arivos Archivos de texto plano: archivos que contienen texto que puede ser leído y editado por el usuario usando herramientas básicas como un editor de texto. Los archivos de texto plano son muy utilizados en GNU/Linux. Pueden usarse para almacenar documentos, configuraciones de los programas, etc. El uso de archivos de texto simples es consistente con los principios de diseño detrás de los sistema operativos tipo UNIX que buscan la utilización de herramientas y recursos simples y versátiles para el cumplimiento de las tareas. Archivos binarios: archivos que contienen datos que no pueden ser leídos directamente por los usuarios, sino que requieren de algún software específico para visualizarlos y editarlos. Un ejemplo son los archivos de imagen y sonido. También entran en esta categoría los programas ejecutables que contienen instrucciones en lenguaje de máquina. La diferencia entre los archivos binarios y de texto se da a nivel del tipo de datos, la forma de codificar la información y las herramientas necesarias para trabajarlos, pues técnicamente ambos tipos de archivo están compuestos por secuencias de bytes. Archivos de dispositivo: en GNU/Linux y otros sistemas operativos tipo UNIX, algunos de los dispositivos de entrada y salida de la computadora pueden accederse a través de archivos. Por ejemplo, el primer puerto serial puede accederse a través del archivo /dev/ttyS0 y una cámara web o tarjeta capturadora de vídeo a través de /dev/video0. Enlaces simbólicos: archivos que almacenan la dirección de otro archivo. Permiten referirse al archivo original usando una ruta distinta. 1.2. Jerarquía de arivos y directorios en GNU/Linux Los archivos y directorios deben organizarse de forma que el usuario sepa donde encontrar cada cosa. Para facilitar la compatibilidad entre distintas distribuciones de GNU/Linux se ha creado un estándar llamado Jerarquía del Sistema de Archivos (FHS: Filesystem Hierarchy Standard) que especifica las ubicaciones para los archivos, de acuerdo con su tipo y función dentro del sistema. Todos los archivos se encuentran dentro de la raíz ( / ). A diferencia de Microsoft Windows, donde cada volumen se accede de forma independiente (C:, D:, etc.), en GNU/Linux los volúmenes se asignan a directorios dentro de la jerarquía. Los directorios principales dentro de la jerarquía son: / : raíz del sistema de archivos. /bin : ejecutables esenciales. 1 IE-0117 Programación Bajo Plataformas Abiertas Sistema de paquetería en Debian y Ubuntu : kernel y archivos necesario para el arranque de la computadora. /boot /dev : archivos de dispositivo. /etc : archivos de configuración para las aplicaciones del sistema (para todos los usuarios). : directorios personales de los usuarios. /home /lib : bibliotecas esenciales del sistema. /media : puntos de montaje para medios removibles. /mnt : punto de montaje temporal genérico. /opt : directorio donde se instalan aplicaciones que no forman parte de la distribución. /proc : sistema de archivos virtual que contiene información de los procesos que se están ejecutando en la computadora. /root : directorio personal para el usuario root. /sbin : ejecutables esenciales para la administración del sistema. /srv : datos asociados a los servicios brindados por la computadora. /tmp : archivos temporales. /usr : jerarquía secundaria que contiene los datos de las aplicaciones no esenciales instaladas en el sistema. /usr/bin : ejecutables de las aplicaciones no esenciales. /usr/lib : bibliotecas no esenciales para el funcionamiento del sistema. /usr/sbin /var : ejecutables no esenciales para administración del sistema. /usr/share : datos de los programas, documentación, fuentes tipográficas, etc. /usr/local : jerarquía terciaria. Para programas instalados por el usuario que no forman parte de la distribución. : datos utilizados por los programas: bitácoras, bases de datos, caché, colas de impresión, correo electrónico, etc. 1.3. Comandos para trabajar con arivos y directorios en GNU/Linux Al trabajar en la línea de comandos, el usuario siempre se va a encontrar dentro de un directorio (por defecto el directorio personal del usuario: /home/usuario). Al utilizar nombres de archivo o directorio como parte de un comando, estos nombres pueden especificarse de dos maneras: Rutas absolutas: se escribe la ubicación del archivo, especificando su ruta completa desde la raíz. Por ejemplo: /etc/passwd, /var/log/syslog o /home/adiaz/Documentos/tarea1.odt. Rutas relativas: se escribe la ubicación del archivo a partir del directorio actual. Por ejemplo, si el usuario se encuentra dentro del directorio /home/adiaz y escribe la ruta img/foto1.jpg, entonces, la ruta absoluta del archivo sería /home/adiaz/img/foto1.jpg. Si está dentro del directorio /var/log y escribe kern.log, la ruta absoluta equivalente sería /var/log/kern.log. Conociendo esto, puede usarse entonces los siguientes comandos para manipular archivos y directorios: pwd: indica el directorio actual. cd: cambia el directorio actual. ls: lista los archivos de un directorio. mkdir: crea un directorio. 2 IE-0117 Programación Bajo Plataformas Abiertas rmdir: elimina un directorio vacío. touch: crea un archivo vacío. rm: elimina un archivo (o directorio). cp: copia un archivo (o directorio) de una ubicación a otra. mv: mueve o renombra un archivo (o directorio). Sistema de paquetería en Debian y Ubuntu 1.4. Sistemas de arivo Un sistema de archivo provee una forma de organizar los datos dentro de un medio de almacenamiento. El sistema de archivo provee mecanismos para almacenar metainformación como los permisos y la fecha de creación de un archivo, define los límites máximos para el tamaño de los archivos y las reglas para nombrarlos. Algunos sistemas de archivos proveen herramientas avanzadas tales como sistemas de bitácora para facilitar la recuperación de información en caso de error o mecanismos para control de versiones. Existen varios tipos de sistemas de archivo. Los sistemas de archivo más utilizados en GNU/Linux son ext2, ext3, ext4, reiserfs, jfs y xfs. Todos, excepto ext2 proveen mecanismos de bitácora (journaling) para facilitar la recuperación de errores. Algunos sistemas de archivo están optimizados para casos específicos. Por ejemplo, xfs fue diseñado para manejar de forma eficiente archivos muy grandes (de varios Gigabytes). Los sistemas GNU/Linux pueden leer y escribir sistemas de archivo de Microsoft Windows, como FAT32 y NTFS, lo que permite acceder volúmenes usados por este sistema operativo. Existen también sistemas de archivo especiales. Por ejemplo, nfs y cifs son sistemas de archivo que permiten acceder datos alojados en otra computadora a través de la red, como si se tratara de archivos locales. tmpfs y ramfs permiten crear sistemas de archivo virtules no persistentes (se borran al apagar la computadora) que almacenan sus datos en la memoria RAM como si fueran archivos convencionales. 1.5. Inodos Los sistemas de archivo de UNIX utilizan una estructura llamada inodo para almacenar la información de cada archivo o directorio. El inodo es una estructura de datos que contiene, entre otras cosas, los siguientes datos: Tamaño del archivo Fecha de creación Fecha de modificación Contador de enlaces Usuario y grupo Modo (permisos) Puntero a los datos Los inodos se almacenan en un sector reservado del volumen, de forma que sea fácil acceder a la información de un archivo o directorio aleatorio en cualquier momento, sin tener que abrir el archivo completo. Cuando se quiere acceder los datos de un archivo, debe leerse el puntero a los datos, que almacena la dirección dentro del volumen donde están almacenados. 1.6. Enlaces duros y simbólicos Un inodo almacena toda la información de un archivo, excepto su nombre y ubicación dentro de la jerarquía. Los datos del archivo son independientes de su nombre y ubicación, lo que permite optimizar algunas operaciones del sistema de archivo. El nombre de un archivo, o enlace duro se almacena dentro de cada directorio. El enlace duro consta de un par (nombre, número de inodo), permitiendo entonces usar un nombre para referirse a un inodo específico. Es posible crear 3 IE-0117 Programación Bajo Plataformas Abiertas Sistema de paquetería en Debian y Ubuntu varios enlaces duro al mismo archivo, en distintas ubicaciones, lo que permite referirse a los mismos datos mediante distintos nombres o aliases. Cada vez que se crea o se elimina un enlace duro, el contador de enlaces del inodo se incrementa o decrementa respectivamente. Cuando se elimina el último enlace duro a un inodo, este es marcado para ser borrado, junto con los datos a los que apunta. Puede verse cual es el inodo asociado a un nombre de archivo (enlace duro) agregando la opción -i al comando ls. Existe otro tipo de enlaces, llamados enlaces simbólicos o enlaces suaves. A diferencia de los enlaces duros, los enlaces simbólicos son un archivo independiente (con su propio inodo) y no una sólo una referencia. Los enlaces simbólicos apuntan a otro archivo del sistema, permitiendo referirse a él usando un nombre y ruta alternativos. Si se borra el archivo original el enlace simbólico sigue existiendo, pero cualquier intento de utilizarlo producirá un error pues será imposible encontrar el archivo al cual apunta el enlace. El comando ln permite crear enlaces, tanto duros como simbólicos (usando la opción -s). 2. Medios de almacenamiento Un medio de almacenamiento es un dispositivo físico que permite guardar información. GNU/Linux soporta una gran cantidad de medios de almacenamiento, tales como los discos duros, disquetes, memorias de estado sólido (llaves USB, tarjetas SD, etc), medios ópticos (discos compactos y DVD) y el almacenamiento por red. 2.1. Particiones y volúmenes Los discos duros y las memorias de estado sólido deben particionarse para poder utilizarse. Al particionar un disco, este se divide en varias secciones o particiones, que pueden usarse de forma independiente. Siempre debe crearse al menos una partición, aunque se vaya a utilizar el disco en su totalidad. Existen tres tipos de particiones: Partición primaria Partición extendida Partición lógica Originalmente un disco podía contener un máximo de cuatro particiones (primarias). Para contrarrestar esta limitación se crearon las particiones extendidas y las particiones lógicas. Las particiones extendidas son equivalentes a las primarias, pero su función es servir de contenedor para una o más particiones lógicas. Esto permite crear tantas particiones como sea necesario. Es común usar el término volumen para referirse a un área de almacenamiento que tiene un sistema de archivo único y que puede accederse directamente una vez montada. Generalmente toda partición es un volumen, pero ambos términos no son equivalentes, pues no todos los volúmenes son particiones. Los dispositivos ópticos (CD, DVD) y los disquetes son volúmenes pero no están particionados. También pueden tenerse volúmenes que se acceden a través de la red o que están distribuidos en varios discos duros o particiones. En un sistema GNU/Linux es posible hacer referencia a un volumen usando un archivo de dispositivo. Algunos ejemplos son: /dev/sda1 : Primer disco duro (a), primera partición primaria (1). /dev/sdc5 : Tercer disco duro (c), primera partición lógica (5). /dev/scd0 : Primera unidad óptica (CD, DVD). /dev/fd0 : Primera unidad de disquete. /dev/md0 : Primer volumen RAID. /dev/mapper/vg0-root : Volumen lógico LVM 4 IE-0117 Programación Bajo Plataformas Abiertas Sistema de paquetería en Debian y Ubuntu 2.2. Montaje de volúmenes Para montar un volumen en GNU/Linux debe usarse el comando mount: # mount [-t TIPO] VOLUMEN PUNTO_MONTAJE Ejemplos: Monta /dev/sda1 en /mnt: # mount /dev/sda1 /mnt Monta un CDROM (/dev/scd0) en /media/cdrom: # mount /dev/scd0 /media/cdrom Monta el volumen /dev/sdb1 en /media/usb: # mount /dev/sdb1 /media/usb Para que un volumen sea montado al arrancar el sistema, es necesario incluirlo en el archivo de configuración que especifica los sistemas de archivo que usa el sistema regularmente. El formato de las entradas en es el siguiente: /etc/fstab /etc/fstab volumen volumen: pto_montaje pass: dump pass ubicación en la jerarquía de archivos y directorios donde se montará el volumen. Ej. /media/windows. tipo de sistema de archivo. Ej. vfat, ext4. opciones: dump: opciones volumen que se quiere montar. Ej. /dev/sda5. pto montaje: tipo: tipo opciones de montaje. Generalmente con las opciones predeterminadas (defaults) es suficiente. no tiene relevancia en sistemas modernos. Debe usarse un 0. orden en que los volúmenes serán revisados al arranque. El volumen de la raíz debe tener un pass de 1, y los otros un número mayor. Si se usa 0, el volumen no será revisado. Ejemplos: Monta automáticamente /dev/sdb1 en /home: /dev/sdb1 /home ext4 defaults 0 2 Monta automáticamente /dev/sda5 en /media/windows: /dev/sda5 /media/windows vfat defaults 0 2 Los volúmenes pueden especificarse también usando la etiqueta (definida por el usuario) o el UUID (identificador numérico único). Esto permite montar un volumen incluso si se cambia el orden de los discos duros o las particiones. Ejemplo: 5 IE-0117 Programación Bajo Plataformas Abiertas Sistema de paquetería en Debian y Ubuntu LABEL=winXP /media/windows vfat defaults 0 2 UUID=2f072cfc-8728-45d5-a7a6-59f441d5057c /home ext4 defaults 0 2 2.3. Creación de sistemas de arivo dentro de un volumen Un sistema de archivos puede crearse usando alguna variante del comando mkfs. Por ejemplo, para crear un sistema de archivo ext3 en el volumen /dev/sda5 debe usarse el siguiente comando: # mkfs.ext3 /dev/sda5 Para crear un sistema de archivo FAT32 en el volumen /dev/sdb1, el comando sería: # mkfs.vfat /dev/sdb1 2.4. Particiones swap Para utilizar una partición como área de intercambio (swap), primero debe formatearse usando el comando mkswap. Por ejemplo, para usar la partición /dev/sda2 como swap debe usarse el comando: # mkswap /dev/sda2 Luego la partición debe activarse usando el comando swapon: # swapon /dev/sda2 Esta configuración no es persistente. Si se desea que la partición se active cada vez que el sistema inicia, debe indicarse en el archivo /etc/fstab: /dev/sda2 none swap sw 0 0 2.5. Mantenimiento y atención de fallas Es posible tener fallas lógicas, a nivel del sistema de archivos, o bien físicas, en el medio de almacenamiento. Existen herramientas para ambos casos. Las fallas lógicas pueden diagnosticarse y repararse usando alguna variante de la herramienta fsck: # fsck.ext4 /dev/sda1 # fsck.vfat /dev/sdb1 Las fallas físicas en discos duros y memorias de estado sólido pueden diagnosticarse usando la herramienta badblocks, que busca sectores dañados. Un medio dañado físicamente no puede repararse. 6 IE-0117 Programación Bajo Plataformas Abiertas 3. Sistema de paquetería en Debian y Ubuntu Lectura recomendada 1. Computer File. Wikipedia. http://en.wikipedia.org/wiki/Computer_file. 2. File system. Wikipedia. http://en.wikipedia.org/wiki/File_system. 3. Filesystem Hierarchy Standard. Wikipedia. http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard. 4. Filesystem Hierarchy Standard. http://www.pathname.com/fhs/. 5. Volume (computing). Wikipedia. http://en.wikipedia.org/wiki/Volume_(computing). 6. Páginas de manual de los comandos mencionados. 7