Discos y Sistemas de ficheros 1. Introducción 2. Esquemas de disco por volúmenes lógicos 2.1. LVM 2.2. Disco Dinámico (Windows) 3. Raid por software 4. Sistemas de ficheros 4.1. Operaciones habituales con sistemas de archivos 4.2. El sistema de ficheros EXT3 4.2.1. El Inodo 4.2.2. Estructura del sistema de ficheros ext3 4.2.3. El Journal 4.3. Reiser FS 5. Otras utilidades interesantes del disco Bibliografía Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 1 1. Introducción Los discos de los ordenadores son dispositivos de bloques que se encuentran en el directorio /dev. Típicamente y según la configuración del equipo se pueden encontrar discos de distintos tipos: ● IDE (en desuso): /dev/hda (el primary master), /dev/hdb (primary slave), /dev/hdc (secondary master) y /dev/hdd (secondary slave) ● Disqueteras (en desuso): /dev/fd0 y /dev/fd1 ● Discos SCSI y Serial ATA: /dev/sda, /dev/sdb, /dev/sdc, /dev/sdd … ● Discos virtuales de XEN: /dev/xvda, /dev/xvdb, /dev/xvdc... Para obtener un listado de discos es común el uso de la herramienta fdisk (con el argumento ­l) ó lshw (aunque esta última es necesario instalarla). Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 2 # fdisk -l Disco /dev/sda: 1073 MB, 1073741824 bytes 106 heads, 39 sectors/track, 507 cylinders, 2097152 sectores en total Units = sectores of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Identificador del disco: 0x00093847 Disposit. Inicio /dev/sda1 * Comienzo Fin 2048 2095103 Bloques Id Sistema 1046528 83 Linux Disco /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders, 2097152 sectores en total Units = sectores of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Identificador del disco: 0x00000000 El disco /dev/sdb no contiene una tabla de particiones válida Disco /dev/sdc: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders, 2097152 sectores en total Units = sectores of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Identificador del disco: 0x00000000 El disco /dev/sdc no contiene una tabla de particiones válida # apt-get install lshw Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se instalarán los siguientes paquetes NUEVOS: lshw 0 actualizados, 1 se instalarán, 0 para eliminar y 0 no actualizados. Necesito descargar 287 kB de archivos. Se utilizarán 705 kB de espacio de disco adicional después de esta operación. Des:1 http://ftp.es.debian.org/debian/ wheezy/main lshw i386 02.16-1 [287 kB] Descargados 287 kB en 0seg. (739 kB/s) Seleccionando el paquete lshw previamente no seleccionado. (Leyendo la base de datos ... 26398 ficheros o directorios instalados actualmente.) Desempaquetando lshw (de .../archives/lshw_02.16-1_i386.deb) ... Procesando disparadores para man-db ... Configurando lshw (02.16-1) ... # lshw -class disk *-cdrom description: DVD-RAM writer physical id: 0.0.0 bus info: scsi@1:0.0.0 logical name: /dev/cdrom logical name: /dev/cdrw logical name: /dev/dvd logical name: /dev/dvdrw logical name: /dev/sr0 capabilities: audio cd-r cd-rw dvd dvd-r dvd-ram partitioned partitioned:dos configuration: signature=5608539f status=ready Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 3 *-disk:0 description: SCSI Disk physical id: 0.0.0 bus info: scsi@2:0.0.0 logical name: /dev/sda size: 1GiB (1073MB) capabilities: partitioned partitioned:dos configuration: sectorsize=512 signature=00093847 *-disk:1 description: SCSI Disk physical id: 0.1.0 bus info: scsi@2:0.1.0 logical name: /dev/sdb size: 1GiB (1073MB) configuration: sectorsize=512 *-disk:2 description: SCSI Disk physical id: 0.2.0 bus info: scsi@2:0.2.0 logical name: /dev/sdc size: 1GiB (1073MB) configuration: sectorsize=512 En cuanto a los dispositivos, a continuación se muestra un ejemplo de discos virtuales Xen de un equipo. $ ls /dev/xvd* /dev/xvda /dev/xvdb1 /dev/xvdd /dev/xvdf /dev/xvdg1 /dev/xvda1 /dev/xvdc /dev/xvde /dev/xvdf1 /dev/xvdh /dev/xvdb /dev/xvdc1 /dev/xvde1 /dev/xvdg /dev/xvdh1 $ ls -l /dev/xvd* brw-r--r-- 1 root root 202, 0 abr 18 2012 /dev/xvda brw-r--r-- 1 root root 202, 1 abr 18 2012 /dev/xvda1 brw-r--r-- 1 root root 202, 16 abr 18 2012 /dev/xvdb brw-r--r-- 1 root root 202, 17 abr 18 2012 /dev/xvdb1 brw-r--r-- 1 root root 202, 32 abr 18 2012 /dev/xvdc brw-r--r-- 1 root root 202, 33 sep 30 07:08 /dev/xvdc1 brw-r--r-- 1 root root 202, 48 abr 18 2012 /dev/xvdd brw-r--r-- 1 root root 202, 64 abr 18 2012 /dev/xvde brw-r--r-- 1 root root 202, 65 sep 30 07:08 /dev/xvde1 brw-r--r-- 1 root root 202, 80 abr 18 2012 /dev/xvdf brw-r--r-- 1 root root 202, 81 sep 30 07:08 /dev/xvdf1 brw-r--r-- 1 root root 202, 96 sep 29 13:50 /dev/xvdg brw-r--r-- 1 root root 202, 97 sep 30 07:08 /dev/xvdg1 brw-r--r-- 1 root root 202, 112 oct 1 07:58 /dev/xvdh brw-r--r-- 1 root root 202, 113 oct 1 08:29 /dev/xvdh1 En linux los dispositivos se pueden crear con el comando mknod aunque existen utilidades de rastreo de hardware que permiten la creación en disco de todos los dispositivos necesarios (aunque a veces pueden fallar). Para crear un disco (ó una partición) en linux se usa el comando: Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 4 mknod /dev/<device> b <mayor> <minor> En este comando, el dispositivo es el nombre del dispositivo, mayor es el código del driver y minor es una especificación del dispositivo. Mayor y minor se usan de la siguiente forma: ● Discos IDE: El mayor es 3 y los minor se distribuyen de 64 en 64 (0, 64, 128…). Así el primary master (hda) tiene el minor 0, el primary slave (hdb) tiene el minor 64, el secondary master (hdc) tiene el 128 y el secondary slave (hdd) tiene el minor 192. Los identificadores intermedios de minor se usan para identificar las particiones (hda1, hda2, etc). Así el mayor 3 con el minor 1 se refiere a la primera partición del disco primary master. Esta distribución resultó muy adecuada para una época en la que los ordenadores contaban sólo con 4 ranuras para colocar discos (bus IDE). ● Discos SCSI y SATA: El mayor es 8 y los minor se distribuyen en saltos de 16 (0, 16, 32…). Los códigos intermedios entre dos identificadores de dos discos SATA/SCSI se usan para identificar las particiones del correspondiente disco. Así el mayor 8 con el minor 1 se refiere a la primera partición del primer disco del bus (que a su vez seria el mayor 8 con el minor 0) y que corresponde con /dev/sda1. ● Discos virtuales XEN: El mayor es 202 y los minor se distribuyen en saltos de 16 de la misma forma que los discos SATA/SCSI. En cuanto a los disquetes, en la actualidad están en desuso. El código del mayor es 2 y los minor son números consecutivos 0 (primera disquetera ó fd0), 1 (segunda disquetera o fd1). No se dejan identificadores de hardware intermedios porque los disquetes no permiten el particionado. Los discos se organizan en particiones (aunque se pueden usar esquemas basados en volúmenes como LVM ó el disco dinamico de Windows) y estas particiones son a su vez dispositivos. Las herramientas cfdisk (más cómoda) o fdisk (con un menú “cutre”) permiten crear particiones. A veces puede ocurrir que, tras particionar el disco no se encuentren los dispositivos correspondientes a las particiones y haya que crearlos manualmente con mknod. De la misma forma el hecho de que exista /dev/sda3 no significa que el disco /dev/sda tenga 3 particiones ni que exista una partición con un identificador 3 en /dev/sda. En este tipo de situaciones en las que existe /dev/sdaX pero no la partición correspondiente, cualquier operación sobre /dev/sdaX (formatear, montar, etc) dará como resultado un error de entrada/salida. A mayores, se puede crear dispositivos de bloques que emulen discos mediante el uso de dispositivos de loop (/dev/loopX). Estos dispositivos tienen el mayor 7 y códigos de minor consecutivos (0, 1, 2, …). No se puede representar, por tanto, particiones dispositivos de loop. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 5 Estos dispositivos usan un fichero como soporte de almacenamiento con el dispositivo de loop correspondiente. Para asociar el fichero de almacenamiento a un dispositivo de loop se emplea con el comando losetup. A continuación se muestra un ejemplo de uso del comando losetup y de la herramienta fdisk (en la que se particiona el dispositivo de loop aunque esas particiones no puedan ser direccionables). $ ls /dev/loop* /dev/loop0 /dev/loop2 /dev/loop4 /dev/loop6 /dev/loop1 /dev/loop3 /dev/loop5 /dev/loop7 $ dd if=/dev/zero of=ej bs=1M count=512 512+0 records in 512+0 records out $ sudo losetup /dev/loop0 $(pwd)/ej $ sudo losetup /dev/loop0 /dev/loop0: [ca01]:295310 (/home/moncho/ej) $ sudo cfdisk /dev/loop0 cfdisk (util-linux-ng 2.17.2) Disk Drive: /dev/loop0 Size: 536870912 bytes, 536 MB Heads: 255 Sectors per Track: 63 Cylinders: 65 Name Flags Part Type FS Type [Label] Size (MB) -----------------------------------------------------------------------------Pri/Log Free Space 534,65 [ Help [ Write ] [ ] New ] [ Print ] [ Quit ] [ Units ] Create new partition from free space Ejercicio: Emplear CFDISK para particionar el dispositivo de loop Las particiones de disco (o los discos sin particionar) se pueden formatear con el comando mkfs empleando distintos esquemas para guardar los ficheros y directorios. Estos esquemas de representar los ficheros y directorios contenidos en un disco se conocen como sistemas de ficheros y se estudian con mayor detalle en el apartado 4. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 6 2. Esquemas de disco por volúmenes lógicos La principal limitación de un esquema de uso de disco por particiones es la dificultad y complejidad para redimensionar las particiones. Así, por ejemplo, en un esquema de uso de disco como el que se expone en la siguiente imagen, resulta complejo (aunque posible) redimensionar la partición sda2. Los volúmenes nacieron principalmente para facilitar la resolución de este tipo de problemas permitiendo que un volumen (que es el concepto análogo a particion en un sistema de gestión de volúmenes) pueda distribuirse en distintas zonas de disco empleando esquemas de combinación RAID. Así, por ejemplo, con un sistema de gestión de volúmenes es posible el siguiente despliegue: Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 7 Usando este esquema de gestión por volúmenes es posible aumentar las particiones tanto como sea necesario siempre que haya espacio ó se añadan más discos. Nótese que un volumen puede extenderse en varios discos físicos. Las implementaciones más conocidas de gestores de volúmenes son LVM para Linux y Disco dinámico de Windows. 2.1. LVM LVM (Logical Volume Manager) es una implementación de un administrador de volúmenes lógicos para el kernel de Linux que nos permite: ● Redimensionado de grupos lógicos ● Redimensionado de volúmenes lógicos ● Respaldos de lectura y escritura (solo en su versión 2, LVM2) ● RAID0 de volúmenes lógicos. En LVM existen 5 niveles de abstracción (ó conceptos) que se emplean para manera el almacenamiento. Estos niveles son: ● Volúmenes Físicos o Physical Volumes: Son los contenedores de almacenamiento de la información. Un volumen físico puede ser un disco entero ó una partición de un disco de tipo Linux LVM. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 8 ● Grupos de volúmenes o Volume Groups: Enlaza varios volúmenes físicos (que se usan como soporte de la información) con varios volúmenes lógicos (particiones). ● Volúmenes Lógicos o Logical Volumes: Es el equivalente a una partición de un disco duro, por lo que puede contener un sistema de archivos como por ejemplo /home. ● Extensión Lógica o Logical Extents: Cada volumen lógico está dividido en trozos de datos (que se almacenan en volúmenes físicos distintos) llamados extensión lógica (logical extents). ● Extensión Física o Physical Extents: Cada volumen físico esta divido en pequeños trozos datos (que pertenecen a distintas extensiones lógicas de volúmenes de datos) que se llaman extensión física (physical extents). En el ejemplo que se coloca a continuación se usa LVM para poder redimensionar fácilmente el directorio /home. el primer paso para emplear LVM consiste en instalar el paquete LVM: # apt-get install lvm2 Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se instalarán los siguientes paquetes extras: libdevmapper-event1.02.1 libreadline5 Se instalarán los siguientes paquetes NUEVOS: libdevmapper-event1.02.1 libreadline5 lvm2 0 actualizados, 3 se instalarán, 0 para eliminar y 0 no actualizados. Necesito descargar 774 kB de archivos. Se utilizarán 1.718 kB de espacio de disco adicional después de esta operación. ¿Desea continuar [S/n]? s Des:1 http://ftp.es.debian.org/debian/ wheezy/main libdevmapper-event1.02.1 i386 2:1.02.74-8 [32,4 kB] Des:2 http://ftp.es.debian.org/debian/ wheezy/main libreadline5 i386 5.2+dfsg-2~deb7u1 [146 kB] Des:3 http://ftp.es.debian.org/debian/ wheezy/main lvm2 i386 2.02.95-8 [596 kB] Descargados 774 kB en 0seg. (2.388 kB/s) Seleccionando el paquete libdevmapper-event1.02.1:i386 previamente no seleccionado. (Leyendo la base de datos ... 26404 ficheros o directorios instalados actualmente.) Desempaquetando libdevmapper-event1.02.1:i386 (de .../libdevmapper-event1.02.1_2%3a1.02.74-8_i386.deb) ... Seleccionando el paquete libreadline5:i386 previamente no seleccionado. Desempaquetando libreadline5:i386 (de .../libreadline5_5.2+dfsg-2~deb7u1_i386.deb) ... Seleccionando el paquete lvm2 previamente no seleccionado. Desempaquetando lvm2 (de .../lvm2_2.02.95-8_i386.deb) ... Procesando disparadores para man-db ... Configurando libdevmapper-event1.02.1:i386 (2:1.02.74-8) ... Configurando libreadline5:i386 (5.2+dfsg-2~deb7u1) ... Configurando lvm2 (2.02.95-8) ... [....] Setting up LVM Volume Groups... No volume groups found No volume groups found done. update-initramfs: deferring update (trigger activated) Procesando disparadores para initramfs-tools ... update-initramfs: Generating /boot/initrd.img-3.2.0-4-686-pae Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 9 A continuación se crearán particiones de tipo Linux LVM en el espacio de disco que se vaya a emplear. Este paso se puede hacer con las herramientas cfdisk ó con fdisk. Las particiones serán de tipo Linux LVM (8E). # cfdisk /dev/sdc # cfdisk /dev/sdc # ls -la /dev/sd* brw-rw---T 1 root disk 8, 0 oct brw-rw---T 1 root disk 8, 1 oct brw-rw---T 1 root disk 8, 16 oct brw-rw---T 1 root disk 8, 17 oct brw-rw---T 1 root disk 8, 32 oct brw-rw---T 1 root disk 8, 33 oct 2 12:55 /dev/sda 2 12:55 /dev/sda1 2 13:06 /dev/sdb 2 13:06 /dev/sdb1 2 13:07 /dev/sdc 2 13:07 /dev/sdc1 Crear los volúmenes físicos que se vayan a emplear: # pvcreate /dev/sdb1 Writing physical volume data to disk "/dev/sdb1" Physical volume "/dev/sdb1" successfully created # pvcreate /dev/sdc1 Writing physical volume data to disk "/dev/sdc1" Physical volume "/dev/sdc1" successfully created # pvdisplay "/dev/sdb1" is a new physical volume of "1023,97 MiB" --- NEW Physical volume --PV Name /dev/sdb1 VG Name PV Size 1023,97 MiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 0QO8cj-gZrn-dpdK-yavs-22gQ-hQ49-LsCRW6 "/dev/sdc1" is a new physical volume of "1023,97 MiB" --- NEW Physical volume --PV Name /dev/sdc1 VG Name PV Size 1023,97 MiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID pZ3P1O-P8ak-O37Z-rl4k-k5mW-flrP-Cgfy1v El comando pvremove <partición> permite eliminar un volumen físico. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 10 Una vez creados los volúmenes físicos, se deben crear los grupos de volúmenes. Se puede crear un grupo de volúmenes con un solo volumen físico ó con varios volúmenes a la vez. # vgcreate vg1 /dev/sdb1 Volume group "vg1" successfully created # vgdisplay --- Volume group --VG Name vg1 System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size 1020,00 MiB PE Size 4,00 MiB Total PE 255 Alloc PE / Size 0/0 Free PE / Size 255 / 1020,00 MiB VG UUID UHPxsa-Yrrk-ja2z-93lm-eK39-BXPy-cTVQ1Y # vgremove vg1 Volume group "vg1" successfully removed # vgcreate vg1 /dev/sdb1 /dev/sdc1 Volume group "vg1" successfully created # vgdisplay --- Volume group --VG Name vg1 System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 1,99 GiB PE Size 4,00 MiB Total PE 510 Alloc PE / Size 0/0 Free PE / Size 510 / 1,99 GiB VG UUID ve47jL-D309-X4Ft-sMBH-wKPA-GHyS-kyigdG # pvdisplay --- Physical volume --PV Name /dev/sdb1 VG Name vg1 Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 11 PV Size Allocatable PE Size Total PE Free PE Allocated PE PV UUID 1023,97 MiB / not usable 3,97 MiB yes 4,00 MiB 255 255 0 0QO8cj-gZrn-dpdK-yavs-22gQ-hQ49-LsCRW6 --- Physical volume --PV Name /dev/sdc1 VG Name vg1 PV Size 1023,97 MiB / not usable 3,97 MiB Allocatable yes PE Size 4,00 MiB Total PE 255 Free PE 255 Allocated PE 0 PV UUID pZ3P1O-P8ak-O37Z-rl4k-k5mW-flrP-Cgfy1v # pvcreate /dev/sdd1 Writing physical volume data to disk "/dev/sdd1" Physical volume "/dev/sdd1" successfully created # vgextend vg1 /dev/sdd1 Volume group "vg1" successfully extended # vgdisplay --- Volume group --VG Name vg1 System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size 2,99 GiB PE Size 4,00 MiB Total PE 765 Alloc PE / Size 50 / 200,00 MiB Free PE / Size 715 / 2,79 GiB VG UUID ve47jL-D309-X4Ft-sMBH-wKPA-GHyS-kyigdG El comando vgremove <grupo de volumenes> permite la eliminación de grupos de volúmenes. Por último es necesario crear sobre los volúmenes lógicos sobre los grupos de volúmenes que se hace con el comando lvcreate tal como sigue: # lvcreate -n home_vol -L200M vg1 Logical volume "home_vol" created Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 12 # lvdisplay --- Logical volume --LV Path /dev/vg1/home_vol LV Name home_vol VG Name vg1 LV UUID PgnUuw-iDKx-qWgi-8Wj4-zQ0n-s2MK-8tjks3 LV Write Access read/write LV Creation host, time debian, 2014-10-02 13:19:49 +0200 LV Status available # open 0 LV Size 200,00 MiB Current LE 50 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:0 Una vez creados los volúmenes lógicos, estos funcionan como particiones (el dispositivo tiene la forma /dev/<volume_group>/<logical_volume_name>) que habrá que formatear adecuadamente y montar como cualquier dispositivo normal. Cierto es que habitualmente lso volúmenes lógicos se emplean como soporte de imágenes de máquinas virtuales en plataformas como Xen, libvirt, etc. # mkfs -t ext3 /dev/vg1/home_vol mke2fs 1.42.5 (29-Jul-2012) Etiqueta del sistema de ficheros= OS type: Linux Tamaño del bloque=1024 (bitácora=0) Tamaño del fragmento=1024 (bitácora=0) Stride=0 blocks, Stripe width=0 blocks 51200 inodes, 204800 blocks 10240 blocks (5.00%) reserved for the super user Primer bloque de datos=1 Número máximo de bloques del sistema de ficheros=67371008 25 bloque de grupos 8192 bloques por grupo, 8192 fragmentos por grupo 2048 nodos-i por grupo Respaldo del superbloque guardado en los bloques: 8193, 24577, 40961, 57345, 73729 Allocating group tables: hecho Escribiendo las tablas de nodos-i: hecho Creating journal (4096 blocks): hecho Escribiendo superbloques y la información contable del sistema de ficheros: hecho # mkdir /home2 # mount /dev/vg1/home_vol /home2 # mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 13 udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=62963,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=51440k,mode=755) /dev/disk/by-uuid/5c27f42c-e65b-455c-8ba6-992e0bad2236 on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=102860k) rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) /dev/mapper/vg1-home_vol on /home2 type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered) Redimensionar un volumen se puede hacer fácilmente con el comando lvresize tal como se muestra a continuación. # umount /home2 # lvextend --size +50M /dev/vg1/home_vol Rounding up size to full physical extent 52,00 MiB Extending logical volume home_vol to 252,00 MiB Logical volume home_vol successfully resized # resize2fs /dev/vg1/home_vol resize2fs 1.42.5 (29-Jul-2012) Por favor ejecute antes 'e2fsck -f /dev/vg1/home_vol'. # e2fsck -f /dev/vg1/home_vol e2fsck 1.42.5 (29-Jul-2012) Paso 1: Verificando nodos-i, bloques y tamaños Paso 2: Verificando la estructura de directorios Paso 3: Revisando la conectividad de directorios Paso 4: Revisando las cuentas de referencia Paso 5: Revisando el resumen de información de grupos /dev/vg1/home_vol: 11/51200 files (0.0% non-contiguous), 12126/204800 blocks # resize2fs /dev/vg1/home_vol resize2fs 1.42.5 (29-Jul-2012) Resizing the filesystem on /dev/vg1/home_vol to 258048 (1k) blocks. The filesystem on /dev/vg1/home_vol is now 258048 blocks long. # mount /dev/vg1/home_vol /home2/ # mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=62963,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=51440k,mode=755) /dev/disk/by-uuid/5c27f42c-e65b-455c-8ba6-992e0bad2236 on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=102860k) rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) /dev/mapper/vg1-home_vol on /home2 type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered) # df -h S.ficheros Tamaño Usados Disp Uso% Montado en rootfs 1006M 657M 299M 69% / udev 10M 0 10M 0% /dev Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 14 tmpfs 51M /dev/disk/by-uuid/5c27f42c-e65b-455c-8ba6-992e0bad2236 1006M tmpfs 5,0M tmpfs 101M /dev/mapper/vg1-home_vol 244M 260K 657M 0 0 6,1M 50M 1% /run 299M 69% / 5,0M 0% /run/lock 101M 0% /run/shm 226M 3% /home2 Por supuesto, el redimensionado de estos volúmenes se hace sin perder los datos originales. El comando lvremove <dispositivo_volumen_logico> permite la eliminación de volúmenes lógicos. Además de esto, mediante la herramienta lvcreate, se permite la creación de volúmenes mediante técnicas de RAID. Con este objetivo, se puede forzar la división de un volúmen lógico en varias extensiones lógicas (logical extents) que se colocarán en distintos volúmenes físicos configurando las extensiones físicas de un volumen físico (phisical extents). Los comandos lvdisplay ­m y pvdisplay ­m permiten consultar respectivamente las extensiones lógicas y físicas de volúmenes lógicos y físicos. # lvdisplay -m --- Logical volume --LV Path /dev/vg1/home_vol LV Name home_vol VG Name vg1 LV UUID PgnUuw-iDKx-qWgi-8Wj4-zQ0n-s2MK-8tjks3 LV Write Access read/write LV Creation host, time debian, 2014-10-02 13:19:49 +0200 LV Status available # open 1 LV Size 252,00 MiB Current LE 63 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:0 --- Segments --Logical extent 0 to 62: Type linear Physical volume /dev/sdb1 Physical extents 0 to 62 # pvdisplay -m --- Physical volume --PV Name /dev/sdb1 VG Name vg1 PV Size 1023,97 MiB / not usable 3,97 MiB Allocatable yes PE Size 4,00 MiB Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 15 Total PE Free PE Allocated PE PV UUID 255 192 63 0QO8cj-gZrn-dpdK-yavs-22gQ-hQ49-LsCRW6 --- Physical Segments --Physical extent 0 to 62: Logical volume /dev/vg1/home_vol Logical extents 0 to 62 Physical extent 63 to 254: FREE --- Physical volume --PV Name /dev/sdc1 VG Name vg1 PV Size 1023,97 MiB / not usable 3,97 MiB Allocatable yes PE Size 4,00 MiB Total PE 255 Free PE 255 Allocated PE 0 PV UUID pZ3P1O-P8ak-O37Z-rl4k-k5mW-flrP-Cgfy1v --- Physical Segments --Physical extent 0 to 254: FREE --- Physical volume --PV Name /dev/sdd1 VG Name vg1 PV Size 1023,97 MiB / not usable 3,97 MiB Allocatable yes PE Size 4,00 MiB Total PE 255 Free PE 255 Allocated PE 0 PV UUID v6oRQG-BccN-oLtX-qOx7-5S4r-gXwY-uHcZ9j --- Physical Segments --Physical extent 0 to 254: FREE Como se puede ver en el comando anterior, el volúmen lógico /dev/vg1/home_vol se compone de 63 (0­62) extensiones lógicas que se almacenan linealmente en el volumen físico /dev/sdb1. Este volumen físico tiene 254 extensiones físicas de las cuales las 63 primeras están ocupadas por el volumen lógico /dev/vg1/home_vol. A continuación, se crea un raid 1 y se puede ver cómo se distribuye este el almacenamiento en los volúmenes físicos: # lvcreate -m1 -L100M -n prueba_raid1 vg1 Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 16 Logical volume "prueba_raid1" created # pvdisplay -m --- Physical volume --PV Name /dev/sdb1 VG Name vg1 PV Size 1023,97 MiB / not usable 3,97 MiB Allocatable yes PE Size 4,00 MiB Total PE 255 Free PE 167 Allocated PE 88 PV UUID 0QO8cj-gZrn-dpdK-yavs-22gQ-hQ49-LsCRW6 --- Physical Segments --Physical extent 0 to 62: Logical volume /dev/vg1/home_vol Logical extents 0 to 62 Physical extent 63 to 87: Logical volume /dev/vg1/prueba_raid1_mimage_0 Logical extents 0 to 24 Physical extent 88 to 254: FREE --- Physical volume --PV Name /dev/sdc1 VG Name vg1 PV Size 1023,97 MiB / not usable 3,97 MiB Allocatable yes PE Size 4,00 MiB Total PE 255 Free PE 230 Allocated PE 25 PV UUID pZ3P1O-P8ak-O37Z-rl4k-k5mW-flrP-Cgfy1v --- Physical Segments --Physical extent 0 to 24: Logical volume /dev/vg1/prueba_raid1_mimage_1 Logical extents 0 to 24 Physical extent 25 to 254: FREE --- Physical volume --PV Name /dev/sdd1 VG Name vg1 PV Size 1023,97 MiB / not usable 3,97 MiB Allocatable yes PE Size 4,00 MiB Total PE 255 Free PE 254 Allocated PE 1 PV UUID v6oRQG-BccN-oLtX-qOx7-5S4r-gXwY-uHcZ9j --- Physical Segments --Physical extent 0 to 0: Logical volume /dev/vg1/prueba_raid1_mlog Logical extents 0 to 0 Physical extent 1 to 254: FREE Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 17 Ejercicio: A la vista de los resultados del comando anterior ¿Dónde se guardan las imágenes replicadas del RAID1 creado? En los comandos de abajo se crean volúmenes lógicos RAID0 (stripped) usando 3 discos (­i 3) y RAID5 . # lvcreate -i 3 -L100M -n prueba_raid0 vg1 Using default stripesize 64,00 KiB Rounding size (25 extents) up to stripe boundary size (27 extents) Logical volume "prueba_raid0" created # lvcreate --type raid5 -i 2 -L100M -n prueba_raid5 vg1 Using default stripesize 64,00 KiB Rounding size (25 extents) up to stripe boundary size (26 extents) Logical volume "prueba_raid5" created Ejercicio: Averigua dónde se colocan los datos de los volúmenes prueba_raid_0 y prueba_raid_5. Los volúmenes RAID 6 requieren de la existencia de 5 volúmenes físicos. No obstante se colocan aquí los comandos correspondientes para su creación. # lvcreate --type raid6 -i 3 -L100M -n prueba_raid6 vg1 2.2. Disco Dinámico (Windows) Se trata de otra implementación de un gestor de volúmenes lógicos y es la empleada por Microsoft. Esta funcionalidad se incluye desde Windows 2000. Esta implementación no se incluye en este manual pero puede ser consultada en los materiales ofrecidos por el Centro de profesores y recursos Juan de Lanuza (ver Bibliografía). 3. Raid por software En Linux es posible crear arrays de disco mediante software. Para ello es necesario instalar las herramientas mdadm. # apt-get install mdadm Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se instalarán los siguientes paquetes NUEVOS: Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 18 mdadm 0 actualizados, 1 se instalarán, 0 para eliminar y 0 no actualizados. Necesito descargar 566 kB de archivos. Se utilizarán 1.098 kB de espacio de disco adicional después de esta operación. Des:1 http://ftp.es.debian.org/debian/ wheezy/main mdadm i386 3.2.5-5 [566 kB] Descargados 566 kB en 0seg. (1.514 kB/s) Preconfigurando paquetes ... Seleccionando el paquete mdadm previamente no seleccionado. (Leyendo la base de datos ... 26535 ficheros o directorios instalados actualmente.) Desempaquetando mdadm (de .../mdadm_3.2.5-5_i386.deb) ... Procesando disparadores para man-db ... Configurando mdadm (3.2.5-5) ... Generating array device nodes... done. Generating mdadm.conf... done. update-initramfs: deferring update (trigger activated) [ ok ....] Assembling MD arrays...done (no arrays found in config file or automatically). [ ok ] Starting MD monitoring service: mdadm --monitor. Procesando disparadores para initramfs-tools ... update-initramfs: Generating /boot/initrd.img-3.2.0-4-686-pae W: mdadm: /etc/mdadm/mdadm.conf defines no arrays. W: mdadm: no arrays defined in configuration file. Durante el proceso de instalación pregunta sobre los arrays que se cargan al arrancar el ordenador. Dejar la configuración por defecto en el valor “all”. Todas las particiones empleadas en un raid por software creado con mdadm (y gestionados por el kernel) deben ser de tipo Raid Autodetect (0xfd). Se debe cambiar con cfdisk los tipos de partición implicadas a este tipo. La variable del kernel mdstat (/proc/mdstat) proporciona información sobre los niveles de raid soportados por el kernel. # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] unused devices: <none> La creación de dispositivos de se hace con el comando mdadm. Los siguientes ejemplos pretenden ser ilustrativos de cómo crear distintos tipos de RAID con mdadm (L, 0, 1 y 5). Además, se pueden definir discos de reserva (­­spare­devices n <list_devices>) . Se pueden observar los cambios en /proc/mdstat. # mdadm --create --verbose /dev/md0 --level=linear --raid-devices=2 /dev/sdb1 /dev/sdc1 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. # cat /proc/mdstat Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 19 Personalities : [raid1] [raid6] [raid5] [raid4] [linear] md0 : active linear sdc1[1] sdb1[0] 2097073 blocks super 1.2 0k rounding unused devices: <none> # mdadm --stop /dev/md0 mdadm: stopped /dev/md0 # mdadm --remove /dev/md0 # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] [linear] md0 : active linear sdc1[1] sdb1[0] 2097073 blocks super 1.2 0k rounding unused devices: <none> # mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdb1 /dev/sdc1 mdadm: chunk size defaults to 512K mdadm: /dev/sdb1 appears to be part of a raid array: level=linear devices=2 ctime=Mon Oct 6 14:37:41 2014 mdadm: /dev/sdc1 appears to be part of a raid array: level=linear devices=2 ctime=Mon Oct 6 14:37:41 2014 Continue creating array? yes mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] [linear] [raid0] md0 : active raid0 sdc1[1] sdb1[0] 2096128 blocks super 1.2 512k chunks unused devices: <none> # mdadm --stop /dev/md0 mdadm: stopped /dev/md0 # mdadm --remove /dev/md0 # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] [linear] [raid0] unused devices: <none> # mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 /dev/sdc1 --spare-devices=1 /dev/sdd1 mdadm: /dev/sdb1 appears to be part of a raid array: level=raid5 devices=2 ctime=Mon Oct 6 14:49:29 2014 mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 mdadm: /dev/sdc1 appears to be part of a raid array: level=raid5 devices=2 ctime=Mon Oct 6 14:49:29 2014 mdadm: /dev/sdd1 appears to be part of a raid array: level=raid5 devices=2 ctime=Mon Oct 6 14:49:29 2014 mdadm: size set to 1048000K Continue creating array? yes mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] [linear] [raid0] md0 : active raid1 sdd1[2](S) sdc1[1] sdb1[0] 1048000 blocks super 1.2 [2/2] [UU] unused devices: <none> Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 20 # mdadm --stop /dev/md0 mdadm: stopped /dev/md0 # mdadm --remove /dev/md0 # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] [linear] [raid0] unused devices: <none> # mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1 /sdb1 /dev/sdc1 /dev/sdd1 mdadm: layout defaults to left-symmetric mdadm: layout defaults to left-symmetric mdadm: chunk size defaults to 512K mdadm: /dev/sdb1 appears to be part of a raid array: level=raid5 devices=3 ctime=Mon Oct 6 14:57:48 2014 mdadm: /dev/sdc1 appears to be part of a raid array: level=raid5 devices=3 ctime=Mon Oct 6 14:57:48 2014 mdadm: /dev/sdd1 appears to be part of a raid array: level=raid5 devices=3 ctime=Mon Oct 6 14:57:48 2014 mdadm: size set to 1047552K Continue creating array? yes mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] [linear] [raid0] md0 : active raid5 sdd1[3] sdc1[1] sdb1[0] 2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_] [=>...................] recovery = 6.1% (64316/1047552) finish=1.5min speed=10719K/sec unused devices: <none> # mdadm --stop /dev/md0 mdadm: stopped /dev/md0 # mdadm --remove /dev/md0 # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] [linear] [raid0] unused devices: <none> Una vez creada la configuración de arrays de disco, si se desea que esta persista tras apagar el ordenador, es necesario guardar la configuración en un fichero que se cargará al siguiente arranque del ordenador. No obstante las opciones ­­detail y ­­scan de mdadm permiten obtener las líneas de configuración necesarias para el fichero. A continuación es necesario actualizar los ficheros initrd. # update-initramfs -u update-initramfs: Generating /boot/initrd.img-3.2.0-4-686-pae W: mdadm: no arrays defined in configuration file. # mdadm --detail --scan --verbose > /etc/mdadm/mdadm.conf # cat /etc/mdadm/mdadm.conf ARRAY /dev/md0 level=raid5 num-devices=2 metadata=1.2 spares=1 name=debian:0 UUID=31c1516a:0babf049:fa94bda6:ba2790cf devices=/dev/sdb1,/dev/sdc1,/dev/sdd1 # update-initramfs -u update-initramfs: Generating /boot/initrd.img-3.2.0-4-686-pae Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 21 4. Sistemas de ficheros Un sistema de archivos es un método para el almacenamiento y organización de archivos y los datos que estos contienen, para hacer más fácil la tarea encontrarlos y acceder a su contenido. Los sistemas de archivos son usados en dispositivos de almacenamiento como discos duros y CD­ROM e involucran el mantenimiento de la localización física de los archivos. Más formalmente, un sistema de archivos es un conjunto de tipo de datos abstractos que son implementados para el almacenamiento, la organización jerárquica, la manipulación, el acceso, el direccionamiento y la recuperación de datos. Los sistemas de archivos comparten mucho en común con la tecnología de las bases de datos. En este apartado se estudian algunos sistemas de archivos empleados habitualmente en entorno GNU/Linux y se aprenden los comandos necesarios para su inicialización y manejo. 4.1. Operaciones habituales con sistemas de archivos Crear un sistema de archivos (también llamado formatear) implica la creación e inicialización de ciertas estructuras de datos que se guardan en un dispositivo de bloques (partición/disco) y permiten la representación de los ficheros, directorios, permisos, y contenidos. Dado que existen muchos sistemas de ficheros distintos (ext3, ntfs, vfat…, etc), y que cada uno de ellos representa la información de distinta forma, es necesario contar diferentes herramientas para realizar el formateo. Como la opción de emplear múltiples herramientas resulta poco amigable para los usuarios se ha creado un wrapper que simplifica la creación de estos sistemas de ficheros. Este wrapper es mkfs y se ocupa de llamar a herramientas específicas de formateo como son mkfs.ext3, mkfs.msdos, mkfs.vfat, mkfs.xfs, … etc en función del valor del parámetro ­t (tipo de formato). Las herramientas de formato (por ejemplo mkfs.xfs) se deben instalar (típicamente el paquete se llama <nombre_fs>progs). # apt-get install dosfstools ntfsprogs xfs xfs xfslibs-dev xfstt xfsdump xfsprogs xfswitch-plugin root@debian:~# apt-get install dosfstools ntfsprogs xfsprogs Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se instalarán los siguientes paquetes extras: fuse ntfs-3g Paquetes sugeridos: xfsdump acl attr quota Se instalarán los siguientes paquetes NUEVOS: dosfstools fuse ntfs-3g ntfsprogs xfsprogs 0 actualizados, 5 se instalarán, 0 para eliminar y 0 no actualizados. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 22 Necesito descargar 2.390 kB de archivos. Se utilizarán 5.467 kB de espacio de disco adicional después de esta operación. ¿Desea continuar [S/n]? s Des:1 http://ftp.es.debian.org/debian/ wheezy/main fuse i386 2.9.0-2+deb7u1 [71,5 kB] Des:2 http://ftp.es.debian.org/debian/ wheezy/main ntfs-3g i386 1:2012.1.15AR.5-2.1 [667 kB] Des:3 http://ftp.es.debian.org/debian/ wheezy/main dosfstools i386 3.0.13-1 [70,0 kB] Des:4 http://ftp.es.debian.org/debian/ wheezy/main ntfsprogs all 1:2012.1.15AR.5-2.1 [17,5 kB] Des:5 http://ftp.es.debian.org/debian/ wheezy/main xfsprogs i386 3.1.7+b1 [1.564 kB] Descargados 2.390 kB en 0seg. (3.023 kB/s) Preconfigurando paquetes ... Seleccionando el paquete fuse previamente no seleccionado. (Leyendo la base de datos ... 26589 ficheros o directorios instalados actualmente.) Desempaquetando fuse (de .../fuse_2.9.0-2+deb7u1_i386.deb) ... Procesando disparadores para initramfs-tools ... update-initramfs: Generating /boot/initrd.img-3.2.0-4-686-pae Procesando disparadores para man-db ... Configurando fuse (2.9.0-2+deb7u1) ... Creating fuse group... Añadiendo el grupo `fuse' (GID 106) ... Hecho. udev active, skipping device node creation. update-initramfs: deferring update (trigger activated) Procesando disparadores para initramfs-tools ... update-initramfs: Generating /boot/initrd.img-3.2.0-4-686-pae Seleccionando el paquete ntfs-3g previamente no seleccionado. (Leyendo la base de datos ... 26604 ficheros o directorios instalados actualmente.) Desempaquetando ntfs-3g (de .../ntfs-3g_1%3a2012.1.15AR.5-2.1_i386.deb) ... Seleccionando el paquete dosfstools previamente no seleccionado. Desempaquetando dosfstools (de .../dosfstools_3.0.13-1_i386.deb) ... Seleccionando el paquete ntfsprogs previamente no seleccionado. Desempaquetando ntfsprogs (de .../ntfsprogs_1%3a2012.1.15AR.5-2.1_all.deb) ... Seleccionando el paquete xfsprogs previamente no seleccionado. Desempaquetando xfsprogs (de .../xfsprogs_3.1.7+b1_i386.deb) ... Procesando disparadores para initramfs-tools ... update-initramfs: Generating /boot/initrd.img-3.2.0-4-686-pae Procesando disparadores para man-db ... Configurando ntfs-3g (1:2012.1.15AR.5-2.1) ... update-initramfs: deferring update (trigger activated) Configurando dosfstools (3.0.13-1) ... Configurando xfsprogs (3.1.7+b1) ... Procesando disparadores para initramfs-tools ... update-initramfs: Generating /boot/initrd.img-3.2.0-4-686-pae Configurando ntfsprogs (1:2012.1.15AR.5-2.1) ... # mkfs -t ntfs /dev/sdb1 Cluster size has been automatically set to 4096 bytes. Initializing device with zeroes: 100% - Done. Creating NTFS volume structures. mkntfs completed successfully. Have a nice day. # mkfs -t ext3 /dev/sdc1 mke2fs 1.42.5 (29-Jul-2012) Etiqueta del sistema de ficheros= OS type: Linux Tamaño del bloque=4096 (bitácora=2) Tamaño del fragmento=4096 (bitácora=2) Stride=0 blocks, Stripe width=0 blocks 65536 inodes, 262143 blocks 13107 blocks (5.00%) reserved for the super user Primer bloque de datos=0 Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 23 Número máximo de bloques del sistema de ficheros=268435456 8 bloque de grupos 32768 bloques por grupo, 32768 fragmentos por grupo 8192 nodos-i por grupo Respaldo del superbloque guardado en los bloques: 32768, 98304, 163840, 229376 Allocating group tables: hecho Escribiendo las tablas de nodos-i: hecho Creating journal (4096 blocks): hecho Escribiendo superbloques y la información contable del sistema de ficheros: hecho # mkfs -t xfs /dev/sdd1 meta-data=/dev/sdd1 = data = = naming =version 2 log =internal log = realtime =none isize=256 sectsz=512 bsize=4096 sunit=0 bsize=4096 bsize=4096 sectsz=512 extsz=4096 agcount=4, agsize=65536 blks attr=2, projid32bit=0 blocks=262143, imaxpct=25 swidth=0 blks ascii-ci=0 blocks=1200, version=2 sunit=0 blks, lazy-count=1 blocks=0, rtextents=0 Algunos sistemas de ficheros permiten la utilización de parámetros concretos (como el tamaño de bloque en ext3) que se especifican directamente sobre la herramienta mkfs y esta añade los parámetros específicos a la herramienta concreta de formateo (­b 1024). Una vez que un sistema de ficheros se construye, es necesario hacerlo disponible a partir de un determinado directorio en el árbol global de directorios de Linux. Esta operación se conoce informalmente como montar el disco. Nuevamente, y con el mismo objetivo de la creación del wrapper mkfs, se creó el wrapper mount que permite manejar distintas utilidades de montado (mount.ntfs, mount.nfs, etc) en función de los resultados de la autodetección del sistema de ficheros del dispositivo a montar o de lo especificado por el usuario con la opción ­t. Para montar un sistema de ficheros únicamente es necesario especificar a mount el dispositivo de bloques que lo contiene y la carpeta a partir de la que se hará disponible el sistema de ficheros. # mount /dev/sdb1 /mnt # mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=62963,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=51440k,mode=755) /dev/disk/by-uuid/5c27f42c-e65b-455c-8ba6-992e0bad2236 on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=102860k) rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime) /dev/sdb1 on /mnt type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,blksize=4096) Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 24 # umount /dev/sdb1 # mount /dev/sdc1 /mnt # mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=62963,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=51440k,mode=755) /dev/disk/by-uuid/5c27f42c-e65b-455c-8ba6-992e0bad2236 on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=102860k) rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime) /dev/sdc1 on /mnt type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered) # umount /mnt # mount /dev/sdd1 /mnt # mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=62963,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=51440k,mode=755) /dev/disk/by-uuid/5c27f42c-e65b-455c-8ba6-992e0bad2236 on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=102860k) rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime) /dev/sdd1 on /mnt type xfs (rw,relatime,attr2,delaylog,noquota) Finalmente, comentar la importancia de la herramienta df que permite conocer en cada momento la cantidad de disco libre y usado de todas los sistemas de ficheros montados. Resulta especialmente útil la opción ­h (human readable) que realiza la medición usando KB, MB, GB, etc. # df -h S.ficheros Tamaño Usados rootfs 1006M 672M udev 10M 0 tmpfs 51M 264K /dev/disk/by-uuid/5c27f42c-e65b-455c-8ba6-992e0bad2236 1006M 672M tmpfs 5,0M 0 tmpfs 101M 0 /dev/sdd1 1020M 33M Disp Uso% Montado en 284M 71% / 10M 0% /dev 50M 1% /run 284M 71% / 5,0M 0% /run/lock 101M 0% /run/shm 988M 4% /mnt 4.2. El sistema de ficheros EXT3 El sistema de ficheros ext3 es una mejora del antiguo sistema de ficheros EXT2 y precursor del sistema de ficheros ext4. Como novedad de este sistema de ficheros cabe comentar que este Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 25 sistema de ficheros cuenta con un sistema de journaling que permite la restauracion del sistema de ficheros hasta recuperar el último estado conocido. Los sistemas de ficheros ext se basan típicamente en el concepto de inodo que se describe en el apartado 2.1. 4.2.1. El Inodo Un inodo es una estructura de datos de 128 bytes asociada a cada fichero/directorio que tiene un esquema similar al presentado en la siguiente figura. Como se puede comprobar, el inodo permite almacenar metainformación del fichero incluyendo tiempo de acceso, creación y modificación, usuario y grupo al que pertenece y tamaño. A mayores de estos atributos, también se almacenan otros que no se representan en la figura por cuestiones de espacio (como el número de links, etc) y que se pueden ver en la siguiente extracto del fichero de cabecera linux/include/linux/ext3_fs.h: /* Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 26 * Constants relative to the data blocks */ #defineEXT3_NDIR_BLOCKS 12 #defineEXT3_IND_BLOCK EXT3_NDIR_BLOCKS #defineEXT3_DIND_BLOCK (EXT3_IND_BLOCK + 1) #defineEXT3_TIND_BLOCK (EXT3_DIND_BLOCK + 1) #defineEXT3_N_BLOCKS (EXT3_TIND_BLOCK + 1) … /* * Structure of an inode on the disk */ struct ext3_inode { __u16 i_mode; /* File mode */ __u16 i_uid; /* Low 16 bits of Owner Uid */ __u32 i_size; /* Size in bytes */ __u32 i_atime; /* Access time */ __u32 i_ctime; /* Creation time */ __u32 i_mtime; /* Modification time */ __u32 i_dtime; /* Deletion Time */ __u16 i_gid; /* Low 16 bits of Group Id */ __u16 i_links_count; /* Links count */ __u32 i_blocks; /* Blocks count */ __u32 i_flags; /* File flags */ union { struct { __u32 l_i_reserved1; } linux1; struct { __u32 h_i_translator; } hurd1; struct { __u32 m_i_reserved1; } masix1; } osd1; /* OS dependent 1 */ __u32 i_block[EXT3_N_BLOCKS];/* Pointers to blocks */ __u32 i_generation; /* File version (for NFS) */ __u32 i_file_acl; /* File ACL */ __u32 i_dir_acl; /* Directory ACL */ __u32 i_faddr; /* Fragment address */ union { struct { __u8 l_i_frag; /* Fragment number */ __u8 l_i_fsize; /* Fragment size */ __u16 i_pad1; __u16 l_i_uid_high; /* these 2 fields */ __u16 l_i_gid_high; /* were reserved2[0] */ __u32 l_i_reserved2; } linux2; struct { __u8 h_i_frag; /* Fragment number */ __u8 h_i_fsize; /* Fragment size */ __u16 h_i_mode_high; __u16 h_i_uid_high; __u16 h_i_gid_high; __u32 h_i_author; } hurd2; Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 27 struct { __u8 __u8 __u16 __u32 } masix2; m_i_frag; /* Fragment number */ m_i_fsize; /* Fragment size */ m_pad1; m_i_reserved2[2]; } osd2; /* OS dependent 2 */ }; Como se puede ver en el código fuente mostrado, además de los atributos se permite direccionar 15 bloques (campo i_block). Cada bloque de datos tiene un tamaño de 4096 bytes por defecto (se puede configurar). Los primeros 12 elementos del array i_block (EXT3_NDIR_BLOCKS) son punteros a bloques de datos son directamente accesibles. El elemento 13 de i_block (EXT3_IND_BLOCK) es un puntero de acceso indirecto de primer nivel que apunta a un bloque que contiene a su vez punteros a los siguientes bloques del contenido del fichero. El elemento 14 de i_block (EXT3_DIND_BLOCK) es un puntero un un bloque de acceso indirecto de segundo nivel que contiene apunta a un bloque punteros a otros bloques que a su vez tienen punteros a otros bloques que contienen contenido del fichero. Por último, el elemento 15 de i_block (EXT3_TIND_BLOCK) permite el acceso con indirección de tercer nivel (un nivel más de indirección). Para entender este concepto de indirección, se incluye la siguiente figura: Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 28 Como se puede ver, el sistema de ficheros ext3 no permite usar ficheros de más de 4GB de datos, limitación que parece no ser acorde a las necesidades actuales pero sí a las necesidades del momento de mayor auge de este sistema de ficheros (ext3 fue ideado en el año 2001). Ejercicio: Véase la siguiente ejecución de comandos e intenta explicar que se está consultando en cada comando. # cat spam.eng_.labels_0.txt | wc -c 199314 # ls -l spam.eng_.labels_0.txt -rw-r--r-- 1 moncho moncho 199314 sep 30 07:14 spam.eng_.labels_0.txt # du -b spam.eng_.labels_0.txt Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 29 199314 spam.eng_.labels_0.txt # ls -lh spam.eng_.labels_0.txt -rw-r--r-- 1 moncho moncho 195K sep 30 07:14 spam.eng_.labels_0.txt # du --apparent-size spam.eng_.labels_0.txt 195 spam.eng_.labels_0.txt # du -h spam.eng_.labels_0.txt 196K spam.eng_.labels_0.txt La siguiente tabla muestra los valores de tamaños máximos y ocupación mínima de ficheros en función del tamaño del bloque (nótese que el tamaño mínimo no es el del fichero sino el de la utilización de disco): Tamaño de bloque Ocupación mínima por un fichero Tamaño máximo del Tamaño máximo fichero sistema de archivos almacenable 1024 (1 KB) 1024 16 GB 2 TB 2048 (2KB) 2048 256 GB 8 TB 4096 (4KB) 4092 2 TB 16 TB 8192 (8KB sólo en Alpha) 8192 2 TB 32 TB Dado que el tamaño del bloque influye directamente en la cantidad de espacio desperdiciado, se debe seleccionar un tamaño de bloque acorde al uso que se le va a otorgar al sistema de ficheros. Si se prevé trabajar con muchos enlaces simbólicos o con muchos ficheros que no alcanzan 1 KB de tamaño es conveniente ajustar el tamaño de bloque. 4.2.2. Estructura del sistema de ficheros ext3 Un sistema de ficheros ext3 organiza el espacio del disco según la figura que se muestra abajo: Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 30 El superbloque ocupa 1024 bytes y se sitúa con un desplazamiento de 1024 bytes respecto del inicio de partición ó disco. En el superbloque se guarda meta­información sobre el sistema de ficheros ext3 incluyendo el tamaño total, número de bloques, número de inodos, tamaño de cada bloque, tamaño de cada grupo de bloques, etc. Los bloques en ext3 son por defecto de 4K (4096 bytes). Por cuestiones de rendimiento, los bloques se agrupan en grupos de bloques. Un grupo de bloques puede estar compuesto por mile de bloques aunque en el superbloque se guarda información sobre el número de bloques que se incluirán en cada grupo de bloques (Number of blocks per group). A continuación se muestra cómo emplear la herramienta ext3grep para obtener información del superbloque. Sobre el listado de comandos y la salida se ha resaltado en azul la información sobre el número de bloques por grupo que tiene este sistema de ficheros así como el tamaño de bloque). # apt-get install ext3grep Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se instalarán los siguientes paquetes NUEVOS: ext3grep 0 actualizados, 1 se instalarán, 0 para eliminar y 57 no actualizados. Necesito descargar 116 kB de archivos. Se utilizarán 303 kB de espacio de disco adicional después de esta operación. Des:1 http://ftp.es.debian.org/debian/ squeeze/main ext3grep i386 0.10.1-3+b1 [116 kB] Descargados 116 kB en 0seg. (587 kB/s) Seleccionando el paquete ext3grep previamente no seleccionado. (Leyendo la base de datos ... 82433 ficheros o directorios instalados actualmente.) Desempaquetando ext3grep (de .../ext3grep_0.10.1-3+b1_i386.deb) ... Procesando disparadores para man-db ... Configurando ext3grep (0.10.1-3+b1) ... # ext3grep /dev/xvda1 --superblock Running ext3grep version 0.10.1 Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 31 WARNING: EXT3_FEATURE_INCOMPAT_RECOVER is set. This either means that your partition is still mounted, and/or the file system is in an unclean state. Inodes count: 524288 Blocks count: 1048233 Reserved blocks count: 52411 Free blocks count: 648329 Free inodes count: 504219 First Data Block: 0 Block size: 4096 Fragment size: 4096 Number of blocks per group: 32768 Number of fragments per group: 32768 Number of inodes per group: 16384 Mount time: Thu Jun 6 15:45:32 2013 Write time: Thu Jun 6 15:45:32 2013 Mount count: 14 Maximal mount count: 30 Magic signature: 0xef53 File system state: 'Unmounted cleanly' Size of inode structure: 128 Block group # of this superblock: 0 compatible feature set: HAS_JOURNAL RESIZE_INODE DIR_INDEX incompatible feature set: FILETYPE RECOVER readonly-compatible feature set: SPARSE_SUPER LARGE_FILE Per group desc for online growth: 255 UUID of journal superblock: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 Inode number of journal file: 8 Device number of journal file: 0 Start of list of inodes to delete: 442376 First metablock block group: 0 Number of groups: 32 Group 0: block bitmap at 257, inodes bitmap at 258, inode table at 259 15402 free blocks, 16357 free inodes, 2 used directory Group 1: block bitmap at 33025, inodes bitmap at 33026, inode table at 33027 30901 free blocks, 16274 free inodes, 1 used directory Group 2: block bitmap at 65536, inodes bitmap at 65537, inode table at 65538 31591 free blocks, 16365 free inodes, 1 used directory Group 3: block bitmap at 98561, inodes bitmap at 98562, inode table at 98563 31135 free blocks, 16264 free inodes, 0 used directory Group 4: block bitmap at 131072, inodes bitmap at 131073, inode table at 131074 31070 free blocks, 16374 free inodes, 0 used directory Group 5: block bitmap at 164097, inodes bitmap at 164098, inode table at 164099 29788 free blocks, 16247 free inodes, 11 used directory Group 6: block bitmap at 196608, inodes bitmap at 196609, inode table at 196610 30292 free blocks, 16374 free inodes, 0 used directory Group 7: block bitmap at 229633, inodes bitmap at 229634, inode table at 229635 29894 free blocks, 16362 free inodes, 5 used directory Group 8: block bitmap at 262144, inodes bitmap at 262145, inode table at 262146 32149 free blocks, 16379 free inodes, 1 used directory Group 9: block bitmap at 295169, inodes bitmap at 295170, inode table at 295171 31612 free blocks, 16368 free inodes, 1 used directory Group 10: block bitmap at 327680, inodes bitmap at 327681, inode table at 327682 30619 free blocks, 16370 free inodes, 1 used directory Group 11: block bitmap at 360448, inodes bitmap at 360449, inode table at 360450 8980 free blocks, 13086 free inodes, 103 used directory Group 12: block bitmap at 393216, inodes bitmap at 393217, inode table at 393218 Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 32 17722 free blocks, 14833 free inodes, 136 used directory Group 13: block bitmap at 425984, inodes bitmap at 425985, inode table at 425986 7484 free blocks, 16199 free inodes, 42 used directory Group 14: block bitmap at 458752, inodes bitmap at 458753, inode table at 458754 25389 free blocks, 15677 free inodes, 75 used directory Group 15: block bitmap at 491520, inodes bitmap at 491521, inode table at 491522 20804 free blocks, 16004 free inodes, 3 used directory Group 16: block bitmap at 524288, inodes bitmap at 524289, inode table at 524290 8576 free blocks, 14618 free inodes, 122 used directory Group 17: block bitmap at 557056, inodes bitmap at 557057, inode table at 557058 22504 free blocks, 15939 free inodes, 9 used directory Group 18: block bitmap at 589824, inodes bitmap at 589825, inode table at 589826 17479 free blocks, 11824 free inodes, 736 used directory Group 19: block bitmap at 622592, inodes bitmap at 622593, inode table at 622594 17382 free blocks, 11381 free inodes, 758 used directory Group 20: block bitmap at 655360, inodes bitmap at 655361, inode table at 655362 4089 free blocks, 15935 free inodes, 58 used directory Group 21: block bitmap at 688128, inodes bitmap at 688129, inode table at 688130 17778 free blocks, 13728 free inodes, 83 used directory Group 22: block bitmap at 720896, inodes bitmap at 720897, inode table at 720898 17618 free blocks, 10264 free inodes, 628 used directory Group 23: block bitmap at 753664, inodes bitmap at 753665, inode table at 753666 27915 free blocks, 15029 free inodes, 37 used directory Group 24: block bitmap at 786432, inodes bitmap at 786433, inode table at 786434 30954 free blocks, 16294 free inodes, 14 used directory Group 25: block bitmap at 819457, inodes bitmap at 819458, inode table at 819459 26999 free blocks, 16068 free inodes, 4 used directory Group 26: block bitmap at 851968, inodes bitmap at 851969, inode table at 851970 30820 free blocks, 16242 free inodes, 4 used directory Group 27: block bitmap at 884993, inodes bitmap at 884994, inode table at 884995 27968 free blocks, 16341 free inodes, 10 used directory Group 28: block bitmap at 917504, inodes bitmap at 917505, inode table at 917506 32176 free blocks, 16377 free inodes, 1 used directory Group 29: block bitmap at 950272, inodes bitmap at 950273, inode table at 950274 32001 free blocks, 16374 free inodes, 1 used directory Group 30: block bitmap at 983040, inodes bitmap at 983041, inode table at 983042 31850 free blocks, 16377 free inodes, 1 used directory Group 31: block bitmap at 1015808, inodes bitmap at 1015809, inode table at 1015810 30664 free blocks, 16297 free inodes, 0 used directory Minimum / maximum journal block: 777 / 17179 Loading journal descriptors... sorting... done The oldest inode block that is still in the journal, appears to be from 9244189 = Fri Apr 17 23:49:49 1970 Number of descriptors in journal: 12734; min / max sequence numbers: 487502394 / 487516634 No action was specified. For example, specify one of: --inode ino Show info on inode 'ino'; inode 2 is the root. --block blk [--ls] Show info on block 'blk'. --histogram=dtime --after=1000000000 --before=1400000000 Show deletion-time histogram (zoom in afterwards). --help Show all possible command line options. Del campo de los descriptores de grupo contiene punteros a los campos de cada grupo de bloques (puntero al bitmap de bloque, puntero al bitmap de inodos, puntero al primer inodo de la Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 33 tabla de inodos) e información del estado de cada grupo (bloques libres, inodos libres, etc). En la figura anterior se ha resaltado en rojo la información proporcionada por la herramienta ext3grep de este campo. La siguiente figura muestra la estructura básica del campo de los descriptores de grupo. Cada grupo de bloques puede comenzar con una copia de respaldo de la información contenida en el superbloque a modo de copia de seguridad. Durante el proceso de formateado se pueden ver entre qué grupos de bloques se encuentran las copias de seguridad del superbloque. Esta misma información se puede consultar con la herramienta dumpe2fs cuyo funcionamiento es similar a ext3grep pero que proporciona mayor cantidad de información. # dumpe2fs /dev/xvda1 | grep -i superbloque dumpe2fs 1.41.12 (17-May-2010) Primario superbloque en 0, descriptores de grupo en 1-1 Respaldo superbloque en 32768, descriptores de grupo en 32769-32769 Respaldo superbloque en 98304, descriptores de grupo en 98305-98305 Respaldo superbloque en 163840, descriptores de grupo en 163841-163841 Respaldo superbloque en 229376, descriptores de grupo en 229377-229377 Respaldo superbloque en 294912, descriptores de grupo en 294913-294913 Respaldo superbloque en 819200, descriptores de grupo en 819201-819201 Respaldo superbloque en 884736, descriptores de grupo en 884737-884737 Dentro de cada grupo de bloques, el bitmap de bloques contiene bits a 0 ó a 1 indicando para cada uno de los bloques si está asignado a un fichero ó se puede emplear. El bitmap de inodes Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 34 hace lo mismo que el bitmap de bloques pero para inodos. La información de inodos libres y bloques libres se puede consultar con las utilidades ext3grep y dump2fs. Ejercicio: ¿Cuánto ocupa Block Bitmap de cada grupo? ¿Cuanto ocupa el Inode Bitmap de cada grupo? Una vez colocados los bitmaps de bloques y lo bitmaps de inodos, se dispone la información del grupo de bloques. En primer lugar se colocan la información de los inodos (cada inodo con sus 128 bytes). Y una vez colocados todos los inodos se colocan los bloques de datos (cada bloque de datos con 4096 bytes). Existe una relación de tamaño de 32(por defecto) entre el tamaño de bloque y el tamaño del inodo (4096/128=32). Además, el número de inodos por cada grupo de bloques se hace coincidir con un múltiplo de 32. Debido a esta relación en muchos trabajos se habla de que no existe el concepto tabla de inodos sinó que los inodos se colocan en los primeros bloques de datos (number of inodes per group/32) y se habla sólo de bloques de datos. Considerando el ejemplo de la salida del comando ext3grep en donde el número de inodos por grupo es de 16384, se emplearían los primeros 512 bloques de datos para guardar los inodes y, a continuación se colocarán 32768 bloques de datos más. El total de bloques de datos sería de 33280 y se consumiría un espacio de 130 MB. 4.2.3. El Journal Un sistema con journaling es un sistema de ficheros tolerante a fallos en el cual la integridad de los datos está asegurada porque las modificaciones de la meta­información de los ficheros son primero grabadas en un registro cronológico (log o journal, que simplemente es una lista de transacciones) antes que los bloques originales sean modificados. En el caso de un fallo del sistema, un sistema con journaling asegura la recuperación de consistencia del sistema de ficheros. El método más común es el de grabar previamente cualquier modificación de la meta­información en un área especial del disco de modo que, el sistema realmente grabará los datos una vez que la actualización de los registros haya sido completada. A la hora de recuperar la consistencia después de un fallo, el módulo de recuperación analizará el registro y sólo repetirá las operaciones incompletas en aquellos ficheros inconsistentes, es decir que la operación registrada no se haya llevado a cabo finalmente, con lo que se recuperará la consistencia del sistema de ficheros casi al instante, ya que en vez de examinar todos los meta­ datos (como hace el "fsck"), sólo se inspeccionan aquellas porciones de los meta­datos que han sido cambiadas recientemente. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 35 Los sistemas ext3 y ext2 son iguales excepto por una pequeña diferencia: ext3 incorpora el concepto de journal o diario de transacciones. Esto permite que el sistema de ficheros pueda recuperar el último estado conocido válido tras un fallos súbito. En ext3 el journal se almacena como un superbloque. Ejercicio: Crea un sistema de ficheros ext3 añade contenido y móntalo especificando la opción ­t ext2. Haz un ls ­la en el directorio de montaje. Revisa los ficheros ¿Que ocurre? Con ext3, el código de las transacciones utiliza un API especial denominado la capa del dispositivo de bloques (Journaling Block Device layer), o JBD. JBD ha sido diseñado con el propósito expreso de implementar un diario de transacciones en cualquier dispositivo de bloque. Ext3 implementa sus transacciones "atrapándolas" con el API JBD. Por ejemplo, el código del sistema de ficheros ext3 informará a JBD de las modificaciones que está realizando, y también solicitará permiso al JBD antes de modificar ciertos datos en el disco. Haciendo ésto, se le proporcionan las oportunidades adecuadas para manejar el diario de transacciones a cargo del controlador del sistema de ficheros ext3 a JBD. Es una buena solución y, dado que JBD está siendo desarrollado como una entidad separada, genérica, puede ser añadido para sumar la capacidad del diario de transacciones a otros sistemas de ficheros en el futuro. El diario de transacciones de ext3 se almacena en un inodo (como si de un archivo se tratase). Por supuesto, almacenando el diario de transacciones en un inodo, ext3 es capaz de añadir el diario de transacciones al sistema de ficheros sin requerir extensiones innecesarias a los metadatos de ext2. Ésta es una de las claves por las que el sistema de ficheros ext3 mantiene su compatibilidad con los metadatos de ext2, y además, con el controlador del sistema de ficheros ext2. Cabe la posibilidad de emplear distintos esquemas para implementar un diario de transacciones. Por ejemplo, un desarrollador de un sistema de ficheros podría optar por desarrollar un diario de transacciones almacene exactamente los bytes que deben ser modificados en el sistema de ficheros anfitrión. La ventaja de este remedio es el diario de transacciones será capaz de almacenar muchas pequeñas modificaciones al sistema de ficheros de forma muy eficiente, dado que únicamente necesitará almacenar los bytes individuales que deben ser modificados y nada más. JBD usa otro esquema que resulta en ciertos aspectos, mejor. En lugar de almacenar gran cantidad de pequeñas transacciones (bytes que necesitan ser modificados), JBD almacena los bloques completos de datos modificados en sí mismos. El controlador del sistema de ficheros también utiliza este remedio y almacena réplicas completas de los bloques modificados (tanto de 1K, 2K o 4K) en la memoria para controlar las operaciones IO (entrada/salida) pendientes. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 36 En principio, ésto puede parecer una pérdida de recursos completamente innecesaria. Después de todo, los bloques completos contienen datos modificados pero además pueden contener datos sin modificar (ya presentes en el disco) también. El remedio que JBD usa se denomina diario de transacciones físico, lo que significa que JBD utiliza bloques físicos completos para implementar su diario de transacciones. Por contra, el remedio consistente en almacenar montones de bytes modificados en lugar de bloques completos se denomina diario de transacciones lógico, y es el remedio que utiliza XFS. Dado que ext3 utiliza el diario de transacciones físico, un diario de transacciones ext3 dejará, relativamente, una mayor huella en el disco que, digamos, el diario de transacciones de un sistema de ficheros XFS. Pero dado que ext3 usa bloques completos internamente y en su diario de transacciones, ext3 no se enfrenta a toda la complejidad que tendría que abordarse con la implementación de un diario de transacciones lógico. Además, el uso de bloques completos permite a ext3 realizar algunas optimizaciones adicionales, tales como "tomar huella" de múltiples operaciones pendientes IO (entrada/salida) dentro de un solo bloque en la misma estructura de la memoria. Ésto, además, permite a ext3 escribir todos esos cambios en el disco en una sola operación de escritura, en lugar de en muchas. Añadiendo a esto que los datos literales de los bloques son almacenados en la memoria, apenas se requiere ninguna modificación en la memoria antes de escribirlos al disco, reduciendo mucho la sobrecarga en la CPU. 4.3. Reiser FS En esencia, el sistema de ficheros ReiserFS en un sistema Journaling que trata a toda la partición del disco como si fuera una única tabla de una base de datos. Los directorios, ficheros y metadatos se organizan en una eficiente estructura de datos (el árbol balanceado). Esto difiere bastante de la manera tradicional de trabajar de otros sistemas de ficheros, pero ofrece grandes mejoras de velocidad en muchas aplicaciones, especialmente aquellas que utilizan gran cantidad de ficheros pequeños. Leer y escribir en ficheros grandes, como películas en AVI, normalmente está limitado por la velocidad del hardware implicado o por el canal de entrada / salida. Win embargo, los accesos a pequeños ficheros como los scripts de la shell estan normalmente limitados por la eficiencia del sistema de ficheros. Esto es debido a que la apertura de un fichero requiere que primero el sistema localice el fichero, lo que implica la lectura del directorio en el que se encuentra. Después, el sistema necesita examinar los metadatos para saber si el usuario tiene los permisos de accesos necesarios, lo conlleva una serie de lecturas adicionales del disco. En definitiva, el sistema pierde más tiempo decidiendo si permite el acceso al fichero que el tiempo que finalmente se tarda en obtener la información del mismo. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 37 ReiserFS utiliza los árboles balanceados (Árboles B*) para racionalizar el proceso de la localización de los ficheros y la obtención de la información de los metadatos (y otro tipo de información adicional). Para ficheros extremadamente pequeños, toda la información del fichero puede físicamente almacenarse cerca de los metadatos, de manera que ambos pueden ser accedidos simultáneamente con un poco o nada de movimiento en el mecanismo de búsqueda del disco. Si una aplicación necesita abrir ficheros muy pequeños rápidamente, este planteamiento mejora el rendimiento significativamente. Los nodos hojas (leaf nodes), almacenan los datos en sí, y no tienen hijos. Los nodos que contienen información se dice que están formateados. Solo los nodos hoja pueden estar no formateados. Los punteros se almacenan en nodos formateados por lo que los nodos intermedios (internal nodes) necesariamente tienen que estar formateados. El nodo raíz es de donde nace el árbol. Otra característica de ReiserFS es que los árboles balanceados no solo almacenan metadatos, si que también almacenan los datos en sí. En un sistema de ficheros tradicional como el ext2, el espacio en disco se reparte en bloques de tamaño desde 512 bytes a 4096 bytes. Si el tamaño de un fichero no es múltiplo del tamaño de bloque habrá cierto espacio que se desperdiciara (fragmentación interna). Por ejemplo, supongamos un tamaño de bloque de 1024 bytes y un espacio requerido de 8195 bytes. 8192 bytes estarán almacenados en 8 bloques (8 x 1024), y los restantes 3 bytes se tendrán que ubicar en un bloque de 1024, desperdiciándose de esta manera, 1021 bytes. De los 9 bloques que se han tenido que asignar casi uno por completo se desperdicia, lo que representa un 11% del total solicitado (1 byte / 9 bytes). Ahora imaginemos un fichero de 1025 bytes. Casi cabe por completo en un solo bloque, pero requiere dos. El espacio desperdiciado es del 50% (1/2). El peor de los casos se da con ficheros muy pequeños, como un script muy trivial de una sola línea. Este fichero podría ser de unos 50 bytes, teniendo que ocupar un bloque completo. Si como hemos dicho, el tamaño de bloque es de 1024 bytes, el espacio desperdiciado será de un 95 % del espacio asignado. Como se puede ver, el espacio desperdiciado (en porcentaje) es menor cuanto mayor es el tamaño del fichero. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 38 ReiserFS no utiliza el enfoque clásico de bloques a la hora dividir el espacio de disco, en vez de eso se apoya en la estructura arbórea para mantener un seguimiento de los bytes asignados. En ficheros pequeños, esto puede ahorrar como ya hemos dicho mucho espacio de almacenamiento. Es más, debido a que los ficheros tienden a colocarse cercanos unos de otros, el sistema es capaz de abrir y leer muchos ficheros pequeños con un único acceso físico al disco. Esto conlleva un ahorro de tiempo al disminuir el tiempo de búsqueda de la cabeza lectora del disco. Algunas aplicaciones se benefician más que otras de este tipo de optimización. Imagínate un directorio con cientos de pequeños ficheros PNG o GIF que son utilizados como iconos en una página Web muy visitada. Esta situación está hecha a la medida del sistema de ficheros ReiserFS. Así como una página Web con miles de ficheros HTML, cada uno de unos poco kilobytes de tamaño, es un excelente candidato. Por otro lado, una partición de disco que almacena imágenes ISO9660 de CDROM, cada una de cientos de megabytes, vera poca mejora en su rendimiento con el ReiserFS. Como con otras muchas cosas en el mundo de la informática, el mejor rendimiento se obtiene a través de la selección de la herramienta que más se ajuste a las necesidades específicas del problema a resolver. (Nota: esto no significa que ReiserFS sea más lento que Ext2 a la hora de gestionar ficheros de gran tamaño, solo que no se notara mucha diferencia de rendimiento en esos casos.) Para almacenar grandes ficheros, ReiserFS versión 3 utiliza el método BLOB (Binary Large OBject) que desbalanceaba el árbol reduciendo así el rendimiento. En este método se almacenan (en los nodos hoja formateados) punteros a nodos que contienen el fichero en su conjunto (como muestra la imagen). De manera que desbalancea al árbol. Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 39 En la versión 4 de ReiserFS se intenta solucionar este problema haciendo que todos los punteros a ficheros se almacenan en el mismo nivel. Los nodos Twig, son los padres de los nodos hojas. Los nodos Branch son nodos internos que no son Twig. En ReiserFS, los nodos Twig no solo apuntan a nodos hoja, sino que también apuntan a nodos Extendidos (Extended nodes). De esta manera se mantiene al árbol balanceado, almacenando los ficheros pequeños en nodos hoja y los grandes en nodos a través de punteros extendidos. Otra característica destacable del ReiserFS es la utilización de Plugins, lo que permite la adaptación del sistema de ficheros a nuevas características sin la necesidad de formateo. Los Plugins trabajan de forma independiente sobre el núcleo del sistema de ficheros. Todas las operaciones se implementan en Plugins, por lo que permite que se modifique la funcionalidad del sistema de ficheros (añadiendo o eliminando Plugins existentes) sin necesidad de modificar el núcleo. 5. Otras utilidades interesantes del disco Una cosa importante para la garantía de los discos es poder obtener el modelo ó el números de serie de un disco sin necesidad de desmontar el disco. Esta información se puede obtener con el comando hdparm (que habrá que instalar en algunos sistemas como Debian Squeeze) # apt-get install hdparm Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se instalarán los siguientes paquetes extras: powermgmt-base Paquetes sugeridos: apmd Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 40 Se instalarán los siguientes paquetes NUEVOS: hdparm powermgmt-base 0 actualizados, 2 se instalarán, 0 para eliminar y 0 no actualizados. Necesito descargar 125 kB de archivos. Se utilizarán 383 kB de espacio de disco adicional después de esta operación. ¿Desea continuar [S/n]? s Des:1 http://ftp.es.debian.org/debian/ wheezy/main hdparm i386 9.39-1+b1 [113 kB] Des:2 http://ftp.es.debian.org/debian/ wheezy/main powermgmt-base i386 1.31 [11,7 kB] Descargados 125 kB en 0seg. (464 kB/s) Seleccionando el paquete hdparm previamente no seleccionado. (Leyendo la base de datos ... 26759 ficheros o directorios instalados actualmente.) Desempaquetando hdparm (de .../hdparm_9.39-1+b1_i386.deb) ... Seleccionando el paquete powermgmt-base previamente no seleccionado. Desempaquetando powermgmt-base (de .../powermgmt-base_1.31_i386.deb) ... Procesando disparadores para man-db ... Configurando hdparm (9.39-1+b1) ... Configurando powermgmt-base (1.31) ... # hdparm -i /dev/sda /dev/sda: Model=ST250LT012-9WS141, FwRev=0001SDM1, SerialNo=W0V9TWGF Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4 BuffType=unknown, BuffSize=16384kB, MaxMultSect=16, MultSect=16 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=488397168 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 AdvancedPM=yes: unknown setting WriteCache=enabled Drive conforms to: unknown: ATA/ATAPI-4,5,6,7 * signifies the current active mode Otra utilidad interesante es la posibilidad de copiar discos bit a bit con el comando dd (incluído en el sistema). A mayores, dd permite ver la velocidad de copia entre los dispositivos lo cual puede permitir evaluar la rapidez de copia. # dd if=/dev/sdb of=/dev/sdc 2097152+0 registros leídos 2097152+0 registros escritos 1073741824 bytes (1,1 GB) copiados, 76,1723 s, 14,1 MB/s Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 41 Bibliografía DiarioLinux.com (2010). Disección del sistema de archivos ext3. Available at http://diariolinux.com/2010/09/11/diseccion­del­sistema­de­archivos­ext3/ [Last Access: 16/09/2014] Gentoo Linux (2005). Guia Avanzada de Implementacion de Sistemas de Ficheros. Available at https://www.gentoo.org/doc/es/articles/afig­ct­ext3­intro.xml [Last Access: 1/09/2014] Ignacio Solinis Cmalich y Emilio González Diaz (2014). Implementacion del sistema de ficheros: Superbloque. Available at http://sopa.dis.ulpgc.es/ii­dso/leclinux/fs/superbloque/superbloque.doc [Last Access: 1/10/2014] Linux Para Todos (2014). Volumenes Logicos (LVM). Available at http://www.linuxparatodos.net/web/comunidad/base­de­conocimiento/­/wiki/Base+de+Conocimi ento/Volumenes+Lógicos+(LVM) [Last Access: 2/10/2014] Centro de profesores y recursos Juan de Lanuza (2014). Configuración de un servidor de archivos. Available at http://cprzara2.educa.aragon.es/ficheros/recursosxp/Otras%20tareas%20administrativas/2.­%2 0Configuracion%20de%20un%20servidor%20de%20archivos.pdf [Last Access: 3/10/2014] Administración Avanzada de Sistemas José Ramón Méndez Reboredo David Ruano Ordás 42