Freebsd qué sistema de archivos elegir. Instrucciones detalladas con explicaciones. Creando marcado GPT

Crear particiones y sistemas de archivos en ellas es una cuestión de preparación. espacio en disco no termina para su uso. Todos los sistemas de archivos creados también deben estar disponibles para FreeBSD. ¿Por qué deberían montarse, es decir, incluirse en una única jerarquía de directorios y archivos, que también se designa con el nombre del sistema de archivos? Sin embargo, si antes estuviéramos hablando de organización física datos, ahora es el momento de familiarizarse con su lógica.

Lógica del sistema de archivos

Lógicamente, el sistema de archivos FreeBSD (como cualquier sistema Unix) está organizado según un principio de árbol: en su base se encuentra la raíz (el directorio raíz, denotado por el símbolo / y también llamado directorio raíz; este último no debe confundirse con el directorio raíz /, que sirve como directorio de inicio para el superusuario).

Desde el directorio raíz, que puede parecerse más al tronco de un árbol, hay ramas, subdirectorios anidados en él y brotes, archivos normales. Estos últimos, sin embargo, son pocos: en Versiones de FreeBSD Este es un tipo de archivo de entropía (/entropy) y un archivo que describe los derechos de autor del sistema /COPYRIGHT.

Pero hay bastantes subdirectorios en el directorio raíz, y algunos de ellos están organizados de manera muy compleja en su interior y contienen una buena cantidad de subdirectorios anidados de niveles más profundos.

En principio, la jerarquía de directorios en todos los sistemas Unix es similar, ya que está regulada, en primer lugar, por una larga tradición y, en segundo lugar, por todo tipo de documentos estandarizados, en particular, FHS (Filesystem Hierarchy Standard), que ahora es disponible en traducción al ruso (por lo cual gracias Viktor Kostromin).

El estándar FHS se desarrolló originalmente para optimizar las estructuras de directorios en múltiples Distribuciones de Linux. Y sólo más tarde se adaptó para otros. Sistemas tipo Unix(incluido el clan BSD). Sin embargo, es la jerarquía de directorios de FreeBSD la que puede servir como ejemplo de adherencia ejemplar al espíritu de FHS. Y, literalmente, las desviaciones individuales de su letra siempre están funcionalmente determinadas.

El estándar FHS se basa en dos principios fundamentales: una clara separación en la jerarquía de archivos de directorios compartidos y no compartidos, por un lado, e inmutables y mutables, por el otro.

El contraste entre directorios compartidos y no compartidos se debe a la naturaleza de red inherente de Unix en general y de FreeBSD en particular. Es decir, los datos relacionados con la máquina local (por ejemplo, archivos de configuración de sus dispositivos) deben ubicarse en directorios separados de aquellos cuyos contenidos son accesibles desde otras máquinas de la red, locales o globales (un ejemplo de los cuales no es solo el usuario datos, pero también programas).

La esencia del contraste entre directorios mutables e inmutables se puede explicar fácilmente con un ejemplo. si, lo mismo programas de usuario por su naturaleza deben ser inmutables (o mejor dicho, disponibles para modificación sólo para el administrador del sistema, pero no para el propio usuario que los utiliza en su trabajo). Al mismo tiempo, estos programas, durante su funcionamiento, generan no sólo archivos de datos, digamos, textos o imágenes (su naturaleza variable es evidente sin comentarios), sino todo tipo de información de servicio, como archivos de registro, archivos temporales y la como). Los cuales deben estar agrupados en directorios separados de los propios archivos ejecutables de programas, bibliotecas, archivos de configuración, etc., necesarios para su lanzamiento.

El estricto cumplimiento del concepto de separar directorios compartidos y no compartidos, inmutables e inmutables entre sí permite, dentro de una única jerarquía de archivos en forma de árbol, aislar físicamente sus ramas individuales, es decir, en forma de sistemas de archivos independientes ubicados en dispositivos aislados (discos, segmentos de disco, particiones; V caso general- y en medios remotos conectados a la red, pero esto no se discutirá ahora). Hay muchas razones para esto: aumento de velocidad, mayor confiabilidad y simplemente consideraciones de conveniencia, pero no hablaremos de ellas ahora. Porque ahora lo único que nos importa es que estas ramas del árbol de archivos deben incorporarse al sistema de archivos general.

En los sistemas Unix, el sistema reconoce cada archivo (incluido un directorio) no por su nombre, sino por el identificador único de su entrada en la tabla. inodos. Existen herramientas para ver estos ID de archivos. Uno es el comando ls con la opción -i, que imprimirá los ID de cada archivo nombrado. Dado para el directorio raíz -

$ls-i/

nos mostrará una imagen algo inesperada (para simplificar la salida, la información sobre archivos regulares y enlaces simbólicos en la raíz se excluye de la salida, y los directorios restantes se ordenan por sus identificadores):

2 ../ 2 ./ 2 dev/ 2 home/ 2 tmp/ 2 usr/ 2 var/ 3 cdrom/ 4 mnt/ 5 root/ 8257 dist/ 8258 bin/ 8294 proc/ 8295 sbin/ 16512 stand/ 24768 etc/ 24776 bota/

De este ejemplo (relativo al sistema de archivos de la máquina en la que están escritas estas líneas) queda claro que hasta 7 directorios tienen los mismos identificadores digitales, igual a 2. La pregunta es, ¿cuál es la unicidad aquí?

Los primeros dos elementos de la lista son fáciles de entender: ./ representa el directorio actual (en en este caso root), a../ - directorio padre del actual; y dado que, por definición, no hay nada por encima de la raíz en la jerarquía de archivos, esta última se denota a sí misma. Por lo tanto, no es sorprendente que ./ y ../ tengan el mismo identificador; estas son designaciones diferentes (enlaces físicos o, en otras palabras, nombres duplicados) para el mismo directorio raíz.

Pero lo mismo, como parece a primera vista, el significado del identificador de los directorios /dev, /home, /tmp, /usr, /var requiere explicación. Sin embargo, es simple: todos estos son directorios en los que se montan sistemas de archivos independientes, ya sea ubicados en dispositivos separados (particiones de disco, como los directorios /home, /usr, /var o sistemas de archivos virtuales que no se basan en cualquier dispositivo de disco real (el directorio /dev con el sistema de archivos del dispositivo y, en este caso, el directorio /tmp, en el que está montado el sistema de archivos en la RAM, que se analizará más adelante). Y desde la mesa inodos- diferentes para cada sistema de archivos, no es de extrañar que la raíz de cada uno de ellos esté identificada con el número 2 - numeración inodos en ellos entra propio sistema cuenta atrás.

Entonces, el montaje es la inclusión de un archivo del sistema en cualquiera de los directorios existentes en el sistema raíz (no necesariamente directamente en la raíz, puede tener cualquier grado de anidamiento, como se ilustra a continuación). Sin esto, los directorios y archivos de dicho sistema montado son simplemente inaccesibles. Es importante entender esto cuando te encuentres con expresiones como "crear el sistema de archivos /usr". De lo anterior, es obvio que lo que se está creando (mediante el comando newfs) es simplemente algún tipo de sistema de archivos abstracto, y adquiere su "nombre" sólo en el momento de montarlo en el directorio especificado.

Es interesante que el identificador de directorio para el montaje (también llamado punto de montaje) se encuentre sólo en el momento del montaje. Para verificar esto, realicemos un experimento simple. En el directorio /mnt, diseñado específicamente para montar sistemas de archivos montados temporalmente), puede ver tres subdirectorios: /mnt/disk, mnt/iso, /mnt/usb (esto está en mi sistema, los creé para mi propia conveniencia; inicialmente el directorio /mnt que estaba en FreeBSD está vacío). Cuando se inicia el sistema, no hay nada montado en ellos y su estado normal es estar vacío. Si observa sus identificadores, puede ver algo como esto:

$ ls -i /mnt 18 disco/ 24 iso/ 19 usb/

Ahora tomemos y montemos una unidad flash con una interfaz USB en /mnt/usb (esto es exactamente para lo que la planeé) y repitamos la visualización. Y vemos:

18 discos/ 24 iso/ 2 usb/

Es decir, los identificadores de los directorios que permanecieron vacíos (/mnt/disk y /mnt/iso) no cambiaron, pero el identificador del directorio /mnt/usb cambió mágicamente a 2. Porque al momento del montaje se convirtió en la raíz de su propio sistema de archivos y el punto de referencia para el cálculo inodos todos los archivos grabados en él.

Divagámonos un poco y recordemos los enlaces duros, a través de los cuales lo mismo inodo y los bloques de datos asociados con él pueden recibir diferentes nombres. Ahora está claro por qué todos estos archivos duplicados deberían ubicarse en el mismo sistema de archivos: después de todo, diferentes sistemas de archivos tienen su propia numeración que no coincide. inodos, y es imposible identificarlos por números (de lo contrario, ¿cómo distinguiría el sistema entre los directorios /usr y /var de nuestro ejemplo? Después de todo, no le importan los nombres de los archivos). Para enlaces simbólicos que tienen su propio inodo(de hecho, casi nada excepto ellos) con sus identificadores, numerados en el marco de referencia del sistema de archivos en el que se encuentran, no existe tal restricción. Y los enlaces simbólicos pueden ubicarse en cualquier lugar (incluso en una máquina remota, no sólo en otra partición).

Sin embargo, volvamos al ejemplo de nuestro directorio raíz. De todo lo considerado, queda claro que varias de sus ramas se encuentran en particiones separadas y forman sus propios sistemas de archivos (de hecho, es exactamente por eso que creamos ambas). Y, por tanto, es necesario montarlos todos.

Práctica de montaje

Los propósitos de montaje son atendidos por el comando mount, ejecutado automáticamente durante el inicio del sistema o manualmente desde línea de comando. En realidad, en el sentido completo, en cualquier caso sólo se monta automáticamente el sistema de archivos raíz. No es necesario que esté en el disco; cuando se inicia desde un CD de rescate u otro medio de seguridad, se puede ubicar en un disco virtual en la RAM.

Sin embargo, el proceso de montar el sistema de archivos raíz es tan inevitable como la victoria del socialismo a escala global: así como el socialismo, sin ganar a escala global, simplemente pierde la capacidad de existir (lo que observamos recientemente), también puede hacerlo un sistema de archivos raíz. El sistema operativo no puede existir sin un sistema raíz. En Linux, esto provoca un modo de pánico en el kernel, aproximadamente el estado en el que cayeron nuestros líderes hace unos 20 años. Es cierto que resultaron ser más fuertes que Linux y se recuperaron bastante rápido, por lo que todavía nos están reiniciando (¿o reiniciando? - pero nos estamos volviendo más fuertes :)). Sin embargo, esto no se aplica al proceso de instalación, que intentaré presentarles ahora.

Entonces, para montar todos los sistemas de archivos excepto el raíz, debe seguir algunos pasos. Primero veremos cómo hacerlos manualmente y luego cómo inmortalizarlos en los archivos de configuración apropiados.

Entonces, el comando de montaje. En realidad, se trata de toda una familia de programas, cada uno de los cuales está diseñado para montar sistemas de archivos de ciertos tipos, no solo UFS, sino también cualquiera de los compatibles con FreeBSD. La lista de estos es bastante extensa; puede hacerse una idea al respecto mirando el directorio /sbin:

$ ls -1 /sbin/montaje*

¿Qué nos dará en respuesta?

/sbin/mount_cd9660* /sbin/mount_devfs* /sbin/mount_ext2fs* /sbin/mount_fdescfs* /sbin/mount_linprocfs* /sbin/mount_mfs* /sbin/mount_msdosfs* /sbin/mount_nfs* /sbin/mount_nfs4* /sbin/mount_ntfs* /sbin/mount_nullfs* /sbin/mount_procfs* /sbin/mount_std* /sbin/mount_udf* /sbin/mount_umapfs* /sbin/mount_unionfs*

Cada comando de esta lista es responsable de montar un tipo diferente de sistema de archivos, a algunos de los cuales volveremos más adelante. Por ahora, solo mencionaremos /sbin/mount, diseñado para funcionar con UFS y UFS2.

Llamado desde la línea de comando, requiere dos argumentos: el nombre del dispositivo que se va a montar y el punto de montaje (es decir, el directorio en el que se debe montar el sistema de archivos subyacente). El nombre del dispositivo debe indicar una patricia ya asignada en un segmento BSD existente con un sistema de archivos UFS2 (UFS) creado en él, por ejemplo,

$ montar /dev/ads0d /usr

Monta el sistema de archivos en la partición especificada en el directorio /usr de la raíz del árbol de archivos. Si el sistema de archivos en el dispositivo no se crea o es de un tipo distinto a UFS/UFS2, aparecerá un mensaje de error, una indicación de superbloque incorrecto: a diferencia del del mismo nombre. Utilidades de Linux, el comando de montaje en FreeBSD no puede reconocer el tipo de sistema de archivos.

Se imponen los siguientes requisitos al punto de montaje: a) debe existir un directorio con el mismo nombre en el momento del montaje, y b) estar lo más vacío posible. Lo primero es imprescindible, pero lo segundo no es del todo cierto. El montaje en un directorio con cualquier archivo se realizará sin problemas (recuerdo que en Linux no hace mucho esto provocó un fallo del sistema), pero todo su contenido quedará inaccesible hasta que se desmonte. Y si los archivos que contiene desempeñan un papel importante para cualquier subsistema, esto puede tener todo tipo de consecuencias negativas. Por ejemplo, si el contenido del directorio /tmp se bloqueara al montar un sistema de archivos allí mientras se ejecutaba el sistema X window, el resultado probablemente sería un fallo del servidor X. Afortunadamente, si es necesario, puedes realizar un montaje combinado (ver más abajo).

En la forma especificada, el montaje se realizará con algunas características predeterminadas: el sistema de archivos se leerá/escribirá en el llamado modo. noasync (el mismo en el que las operaciones de metadatos se realizan de forma sincrónica y las operaciones de datos se realizan de forma asincrónica). Esta posición se puede cambiar usando los valores de la opción -o. Hay bastantes, pero prácticamente los principales en en esta etapa para nosotros habrá:

  • async: proporcionará un modo completamente asincrónico (a pesar de las terribles advertencias en publicaciones anteriores, más adelante hablaré sobre la situación en la que esto puede estar justificado);
  • sincronización: por el contrario, habilita el modo completamente sincrónico (aunque no entiendo muy bien por qué esto es prácticamente necesario);
  • noatime es una opción muy útil que evita que el atributo de hora del último acceso actualice los archivos, lo que mejora enormemente el rendimiento;
  • rdonly: monta el sistema de archivos en modo de solo lectura (a veces esto es necesario);
  • union es la misma opción que permite realizar un montaje de unión, en el que el contenido anterior del directorio del punto de montaje permanece visible; verdadero, con algunas limitaciones, consulte man (8) mount .

Hay varios otros valores de la opción -o que prohíben que ciertos tipos de archivos se coloquen en el sistema de archivos montado, por ejemplo, archivos ejecutables (-o noexec), archivos de dispositivo (-o nodev) o archivos con tal -llamado. un poco de suicidio. Sin embargo, son de importancia práctica principalmente para los administradores de servidores y tienen fines de seguridad. En una máquina de escritorio, la forma habitual de montaje sería algo como esto:

$ montaje -o noatime /dev/ads0d /usr; $ montaje -o noatime /dev/ads0e /var; $ montar -o noatime /dev/ads0f /home

Todo lo anterior se aplica únicamente al montaje de sistemas de archivos FreeBSD. Sin embargo, en la práctica suele ser necesario incorporar otros tipos de sistemas de archivos en su árbol de directorios. Esto es especialmente necesario para ISO9660 (el sistema de archivos habitual para todos los CD excepto los de Mac) y FAT de varios tipos. En este caso, se debe llamar explícitamente al comando de montaje apropiado, p.e.

$ mount_cd9660 /dev/acd0 /cdrom

para montar un compacto, o

$ mount_msdosfs /dev/ad## /mnt

para FAT de cualquier tipo (incluido FAT32). Sin embargo, esto se puede hacer indirectamente especificando la opción -t file_system_type en el comando mount.

$ montaje -t text2fs /dev/ad## /mnt/linux

monta el sistema de archivos de Linux (si la característica correspondiente está incluida en el kernel). En este caso, el montaje estándar para particiones BSD simplemente se reemplaza por el comando /mount_ext2fs, diseñado para montar particiones ext2fs (y también ext3fs, pero, por supuesto, sin funciones de registro en diario). Es decir, la forma

$ montaje -t fstipo... ...

será el equivalente completo del comando

$mount_fstipo... ...

Todas las operaciones para montar sistemas de archivos (incluso en medios extraíbles) en FreeBSD requieren derechos de superusuario. Los valores de la opción -o aquí, a diferencia de la versión de Linux del comando de montaje, no incluyen el parámetro de usuario -o, que permite el montaje para usuarios normales. Es cierto que hay varias formas de solucionar este problema, como se analiza en una nota especial.

Configurar el montaje automático

Sin embargo, en la práctica, se recurre al montaje manual sólo para sistemas de archivos que se utilizan con poca frecuencia. Todo fundamentalmente importante para el funcionamiento. Archivo FreeBSD Los sistemas se montan automáticamente cuando se inicia el sistema, y ​​los de uso frecuente se montan en modo semiautomático, por así decirlo.

Para el montaje automático, el programa de montaje se ejecuta durante el proceso de arranque desde los scripts de inicialización. ella esta buscándola archivo de configuración- /etc/fstab y monta todo lo que encuentra en él, con algunas excepciones (que se analizan a continuación).

El archivo /etc/fstab se genera automáticamente cuando instalando FreeBSD, incluidos todos los sistemas de archivos necesarios para sustentar la vida. Sin embargo, en el futuro se podrá editar manualmente para agregar nuevos dispositivos para montaje u opciones adicionales para dispositivos ya habilitados.

El archivo /etc/fstab es una base de datos simple en formato de texto (campos separados por espacios o tabulaciones), que incluye los siguientes campos:

  • Dispositivo: el nombre del archivo del dispositivo en el que se encuentra el sistema de archivos, similar al primer argumento del comando de montaje cuando se usa manualmente;
  • Mountpoint: punto de montaje (corresponde al segundo argumento del comando de montaje);
  • FStype: tipo de sistema de archivos, también especificado como el valor de la opción -t;
  • Opciones: opciones de montaje adicionales, similares a los valores de la opción -o;
  • Volcado: condiciones para realizar una copia de seguridad del sistema de archivos utilizando la utilidad de volcado;
  • Pass#: condiciones para verificar el sistema de archivos con la utilidad fsck.

En un FreeBSD recién instalado /etc/fstab necesariamente incluirá siguientes entradas(ejemplo para el primer segmento del disco maestro en el primer canal IDE):

# Dispositivo Mountpoint FStype Opciones Dump Pass# /dev/ad0s1a / ufs rw 1 1 /dev/ad0s1b none swap sw 0 0

Si sigue los consejos de personas razonables (y los valores predeterminados de sysinstall) y selecciona algunas ramas del sistema de archivos desde la raíz, entradas como

/dev/ad0s1d /var ufs rw 0 0 /dev/ad0s1e /usr ufs rw 0 0 /dev/ad0s1f /tmp ufs rw 0 0

/dev/ad0s1g /home ufs rw 0 0

responsable del sistema de archivos con los directorios de inicio de los usuarios.

Obviamente, en el campo Opciones puede agregar cualquier valor disponible (y razonable) de la opción -o (separado por comas, sin espacios), por ejemplo, noatime para todos los sistemas de archivos y para /tmp, también async, porque Se supone que el contenido de este directorio no se guarda después del reinicio.

Lo anterior se aplica a los sistemas de archivos que se montan automáticamente al inicio. Sin embargo, nadie le molesta en realizar entradas en /etc/fstab para sistemas que se conectan de vez en cuando; en este caso, se pueden montar de acuerdo con un esquema simplificado (esto es lo que quise decir anteriormente con modo semiautomático). Entonces, para una unidad de CD puede agregar una línea (de hecho, aparece automáticamente al generar el archivo /etc/fstab si se seleccionó el CD como fuente de instalación en sysinstall)

/dev/acd0 /cdrom cd9660 ro,noauto 0 0

en el que las opciones, como puede imaginar, requieren negarse a montar al inicio (noauto) y modo de solo lectura (ro). Después de lo cual, para montar un CD, bastará con especificar solo el punto de montaje:

$montaje/cdrom

o. por el contrario, el nombre del archivo del dispositivo

$ montar /dev/acd0

Se pueden realizar entradas similares para todas las unidades extraíbles (Zip, unidades USB, incluso disquetes) y para particiones que no sean BSD (FAT o Ext2fs). Por cierto, puede montar sistemas de archivos usando un esquema simplificado inmediatamente después de realizar cambios en /etc/fstab, sin esperar a que la máquina se reinicie.

Desmontaje

Todos los sistemas de archivos involucrados deben desmontarse antes de apagar o reiniciar la máquina. Tras un cierre ordenado, esto se hace automáticamente, lo que da como resultado que cada sistema de archivos grabable reciba un bit de desmontaje limpio escrito en su propio superbloque. La presencia de este bit impide que la utilidad fsck verifique la coherencia de los sistemas de archivos la próxima vez que se inicie el sistema.

Sin embargo, en varios casos (por ejemplo, al conectar o desconectar el mecanismo de actualizaciones suaves o para realizar una verificación de integridad), es necesario desmontar (y volver a montar) manualmente los sistemas de archivos, para lo cual se utiliza el comando umount. Requiere un único argumento: especificar el punto de montaje del sistema de archivos "eliminado" del árbol de directorios, por ejemplo:

$monto/tmp

o, como en el caso del montaje semiautomático, el nombre del archivo del dispositivo de “apagado”:

$ desmontar /dev/ad#s#?

Puede desmontar varios sistemas de archivos con una línea:

$ desmontar /usr /var /home

O puede hacerlo: todos los sistemas de archivos montados o todos los sistemas de archivos enumerados en el archivo /etc/fstab (excepto el raíz), lo que requerirá opciones

$monto -A

$monto -a

respectivamente. También es posible desmontar ciertos tipos de sistemas de archivos especificando los valores de la opción -t. si, equipo

$ cantidad -t ufs

desmontará sólo particiones BSD, sin afectar el CD y todo lo demás que esté involucrado en el sistema.

Los sistemas de archivos no deben estar en uso en el momento del desmontaje, es decir, no debe haber acceso a los archivos ubicados en ellos. Por lo tanto, estar en cualquier directorio de un sistema de archivos es razón suficiente para negarse a desmontarlo (con un mensaje como dispositivo ocupado), razón por la cual ninguno de los comandos enumerados anteriormente podrá desmontar el sistema de archivos raíz. El motivo para negarse a desmontar será la lectura del archivo de datos por parte de cualquier programa; al igual que con la eliminación de un archivo, el descriptor de archivo abierto por cualquier proceso no permitirá que se haga esto.

Sin embargo, también puede desmontar el sistema de archivos que está utilizando; para hacer esto, deberá ejecutar el comando umount con la opción -f (desde la fuerza, es decir, por la fuerza). Es cierto que esto puede provocar errores, por lo que es mejor no recurrir a él a menos que sea absolutamente necesario. Y la opción de desmontaje forzado no tendrá ningún efecto en el sistema de archivos raíz.

Montaje a granel

Para continuar trabajando después de realizar operaciones de bajo nivel en sistemas de archivos, será necesario volver a montarlos. Esto se puede hacer no sólo sin reiniciar, sino también sin tediosos montajes individuales. Simplemente use la opción -a:

$montaje -a

a través del cual se montarán todos los sistemas de archivos para los que haya entradas en /etc/fstab. En este caso se intentará montar aquellos que estén marcados con la bandera noauto. Para evitar esto, puede definir aún más el tipo de sistema de archivos. Es decir, el equipo

$ montar -a -t ufs

montará sólo particiones BSD, sin invadir CD o unidades flash. O, por el contrario, puede excluir del proceso de montaje global algunos de los sistemas de archivos enumerados en /etc/fstab, por ejemplo, los FAT actualmente innecesarios:

$ montar -a -t nomsdosfs

Preámbulo en lugar de conclusión

Por cierto, el comando de montaje sin opciones ni argumentos (y de esta forma, a diferencia de todos los casos discutidos anteriormente, puede ser administrado por un usuario normal) mostrará una lista de los sistemas de archivos actualmente montados, indicando el punto de montaje, sus condiciones y modo de funcionamiento. Por ejemplo, para la máquina en la que están escritas estas líneas, su salida se verá así:

/dev/ad0s1a en / (ufs, local, noatime, actualizaciones suaves) devfs en /dev (devfs, local) /dev/ccd0e en /var (ufs, local, noatime, actualizaciones suaves) /dev/ccd1e en / usr (ufs, local, noatime, actualizaciones suaves) /dev/ccd2e en /home (ufs, local, noatime, actualizaciones suaves) /dev/md0 en /tmp (ufs, local, noatime, async)

La primera línea de resultado muestra que la partición /dev/ad0s1a está montada en nuestro directorio raíz, lleva un sistema de archivos UFS (específicamente en este caso - UFS2, pero en el resultado del comando de montaje no difieren) con las Actualizaciones suaves El mecanismo está habilitado, es local (es decir, está ubicado en el disco de esta máquina; las unidades de red también se montan con el comando mount) y no está sujeto a la actualización del atributo atime.

$ más /etc/fstab /dev/ad0s1b ninguno swap sw 0 0 /dev/ar0s1b ninguno swap sw 0 0 /dev/ad0s1a / ufs rw,noatime 1 1 /dev/ccd0e /var ufs rw,noatime 2 2 /dev/ ccd1e /usr ufs rw,noatime 2 2 /dev/ccd2e /home ufs rw,noatime 2 2 /dev/acd0 /cdrom cd9660 ro,noauto 0 0 /dev/da0s1 /mnt/usb ext2fs rw,noauto,noatime 0 0 / dev/md0 /tmp mfs rw,noatime,async,-s32m 2 0

entonces veremos que una de las líneas de salida

Devfs en /dev (devfs, local)

No hay correspondencia alguna entre sus registros. ¿Cuáles son estos dispositivos y sistemas de archivos?

Alexey Fedorchuk
2004-2005

En esta nota hablaremos del método de organización física de los bloques de partición del disco, brindando la capacidad de escribir, almacenar y manipular archivos, específico de FreBSD, más precisamente, de sus sistemas de archivos UFS y UFS2, que eran los únicos nativos en este SO antes de la migración ZFS.

Introducción

El sistema de archivos FreeBSD pertenece a la familia de sistemas de archivos Unix y tiene muchas características comunes a todos ellos. Se llama UFS y en la quinta rama se utiliza su versión mejorada: UFS2. Primero, veamos principios generales dispositivos de ambos, y luego pasaremos a considerar las características inherentes a UFS2.

Para el sistema de archivos FreeBSD (y los sistemas BSD en general, a partir de 4.2BSD) también puede encontrar otro nombre: FFS (Fast Sistema de archivos). Para comprender la correlación de estos términos, es necesario recurrir a la historia...

El sistema de archivos Unix original se llamaba s5fs (es decir, sistema de archivos sistema sistema V). Según sus contemporáneos, era extremadamente lento e incluso no permitía nombres de archivos de más de 14 caracteres. Y como en ese momento también se estaba desarrollando una versión de Unix en la Universidad de Berkeley (llamada BSD Unix, el precursor de todos los sistemas BSD modernos), decidieron mejorar el asunto. Y crearon un sistema de archivos llamado FFS (donde Rápido significaba su velocidad en comparación con s5fs).

Dado que los desarrollos de los habitantes de Berkeley fueron inicialmente libres (incluso antes de que RMS creara Open Sources y la Free Software Foundation), los desarrolladores del Unix original no dudaron en incluir el soporte FFS en la próxima versión del System V canónico. Y la mayoría de los sistemas de archivos Unix modernos provienen de él, tanto propietarios como gratuitos. Y UFS es una de esas implementaciones, que incluye elementos de un sistema de archivos virtual, vfs/vnode (al menos así interpreta Yu. Vakhalia estos conceptos en su libro "Unix from the Inside"). Y UFS2, como puedes imaginar, es una versión mejorada de 64 bits de este último.

Aunque en términos generales, UFS simplemente significa Sistema de archivos Unix. Y con este nombre también se conocen los sistemas de archivos de otros sistemas operativos de esta familia, que no son en absoluto idénticos al UFS de FreeBSD. Entonces hay cierta incertidumbre en la terminología...

Como se descubrió en, una partición de disco lógica (parte de un segmento) es, metafóricamente hablando, un grupo de cilindros adyacentes divididos en bloques físicos de 512 bytes. Sin embargo, la especificidad de los sistemas de archivos del clan BSD es que, en realidad, también se dividen en partes de un volumen fijo (dependiendo del volumen de la partición). Este es el llamado un grupo de cilindros (llamémoslo interno), cada uno de los cuales tiene cuatro partes independientes:

  • superbloque, idéntico en contenido para todos los grupos;
  • bloque de un grupo de cilindros que lo describe; una de sus partes más importantes es
  • tabla de índice (o tabla inodos);
  • área del bloque de datos.

Es recomendable empezar a examinarlos desde el final de la lista, es decir, desde el área de datos.

bloques de datos

El área de datos (que ocupa la abrumadora cantidad de espacio de cada grupo de cilindros) está formada por bloques del sistema de archivos. Al igual que un bloque físico, un bloque de sistema de archivos (también llamado bloque lógico) es una cantidad de información disponible en una operación de lectura/escritura, pero no desde el cabezal del disco, sino desde el sistema operativo. Evidentemente, un bloque lógico no puede ser más pequeño que un bloque físico (es decir, 512 bytes), y su tamaño es necesariamente múltiplo de un número entero de este último.

Concepto bloque lógico introducido para mejorar el rendimiento de las operaciones de disco. La afirmación no requiere prueba de que la velocidad de intercambio de datos de cuantos de 1 KB será mayor que la de cuantos de 512 bytes, que la de cuantos de 2 KB será incluso más rápida, etc. Y por lo tanto, desde el punto de vista del rendimiento operaciones de archivos El tamaño máximo de bloque lógico del sistema de archivos es beneficioso.

Por otro lado, aumentar el tamaño de un bloque lógico conduce a un desperdicio de espacio en disco debido al llamado. fragmentación de datos internos. No debe confundirse con la fragmentación externa, para combatir la cual alguna vez se movilizaron todo tipo de discos rápidos con combatientes en los sistemas de archivos de la familia FAT: debido a las peculiaridades de los algoritmos de gestión de datos, los sistemas de archivos de la familia Unix son tan poco susceptibles a la fragmentación externa que es imposible de superar, prácticamente no hablan de ello en absoluto.

La fragmentación interna se expresa en el hecho de que los datos de archivos cuyo tamaño es menor que un bloque del sistema de archivos todavía lo ocupan por completo. Además, se necesitará un bloque completo para almacenar las colas de los archivos, es decir, los residuos que exceden el volumen que es un múltiplo del tamaño del bloque lógico. Para combatir la fragmentación en UFS, perdón por la tautología, se introdujo el concepto de fragmento: una parte lógica de un bloque del sistema de archivos que se puede escribir o leer independientemente del resto.

Está claro que el tamaño del fragmento aún no puede ser menor que un bloque físico. Al mismo tiempo, UFS también le impone una contrarestricción: el tamaño mínimo de fragmento se determina en 1/8 de un bloque lógico. Otros valores posibles son 1/4 y 1/2 de un bloque del sistema de archivos (obviamente, asignar un fragmento en el tamaño del bloque equivale a negarse a fragmentar el bloque en absoluto, aunque esto supuestamente no está prohibido).

Inodos

¿Cómo se determina que un bloque de datos pertenece a un archivo en particular? Usar una tabla de índice, también llamada tabla o tabla de inodos inodos. Está formado por un número determinado (finito) de registros de longitud fija (128 bytes en UFS, 256 en UFS2), cada uno de los cuales corresponde de forma única a un archivo, tanto el existente como el que sólo puede crearse.

Esta entrada de la tabla de índice se llama inodo, que dejaremos atrás. Porque todas las traducciones de este término que conozco, como nodos de información o descriptores de índice, parecen muy torpes. Además, la palabra “descriptor” también aparece en el contexto de “descriptor de archivo”, que significa un identificador (único, de lo contrario, ¿qué identificará?) de un archivo utilizado por un determinado proceso (que no tiene nada que ver con los sistemas de archivos). - este es el alcance del subsistema de control de procesos). Y estos descriptores no tienen nada en común entre sí. Entonces, inodo con identificador 2 (y este es siempre el identificador del directorio raíz del sistema de archivos) y un descriptor de archivo con el número 2 (y para cualquier proceso este será dispositivo estándar mensajes de error de salida, /dev/stderr) no están relacionados entre sí de ninguna manera (aunque por alguna razón no les gusta hablar de esto en voz alta).

Sin embargo, estoy divagando: volvamos a nuestro inodos. Cada miembro de esta tabla contiene lo que se denomina metadatos de archivo. Verdadero archivo existente incluyen:

  • identificador único inodo(y, en consecuencia, el archivo cuyos metadatos contiene) es simplemente un contador de archivos creados en el sistema de archivos);
  • tipo de archivo: puede ser un directorio, un enlace simbólico, un archivo de dispositivo, una tubería o socket con nombre o un archivo normal (es decir, no relacionado con ninguno de los tipos enumerados);
  • tamaño del archivo en bytes;
  • el número de enlaces al archivo (volveremos a este tema un poco más abajo);
  • direcciones de bloques lógicos y sus fragmentos que componen el archivo;
  • el número de bloques que ocupa;
  • atributos del archivo: propiedad, acceso, modo, hora.

Pero ¿qué hay en inodo no se puede descubrir de ninguna manera - entonces este es el nombre correspondiente a él (¿o ella? - por alguna razón me parece que inodo, contrariamente a la gramática, es femenino). En cualquier libro sobre Unix no se cansan de repetir (y no me apartaré de esta buena tradición) que el nombre del archivo no es un atributo del archivo en sí, sino un elemento del directorio al que pertenece. Dado que será necesario comprender esto pronto cuando se familiarice con el mecanismo de actualizaciones suaves, haré una pequeña digresión para aclarar la cuestión de los nombres de archivos en FreeBSD (y en Unix en general).

Al describir el contenido de la tabla. inodos el campo tipo de archivo se mencionó de pasada. Entonces, en Unix todos los archivos (y todo lo que Unix tiene, incluido dispositivos fisicos, para el sistema se representa como archivos) se dividen en dos grupos: directorios y otros. Otros archivos pueden servir para diversos fines (almacenar datos y programas ejecutables, ser enlaces simbólicos, describir dispositivos o medios de interacción entre procesos). La finalidad de los directorios es única, pero muy importante: ser custodios de los nombres de los ficheros incluidos en ellos, los cuales son identificadores asignados de forma única. inodos, que almacena los metadatos de estos archivos.

Es decir, el nombre del archivo existe sólo en el listado del directorio y en ningún otro lugar del sistema. Y crear un archivo significa no solo completar la entrada relacionada con él en la tabla de índice y completar los bloques de datos especificados en ella, sino también ingresar un registro del tipo "identificador - nombre_archivo" en el área de datos de un directorio. Y el directorio, como cualquier otro archivo, tiene sus propios metadatos en la tabla. inodos y su área de datos. Y, a su vez, su nombre junto con el identificador del inodo se incluye en el directorio más alto nivel, y así sucesivamente, hasta llegar a la raíz del sistema de archivos. En el campo número de enlaces inodo el archivo creado se establece en el valor mínimo posible igual a uno, ya que cualquier archivo está incluido en al menos un directorio; de lo contrario, simplemente no estará disponible para el sistema; los archivos con un número cero de enlaces no parecen existir (y de hecho ellos inodos y los bloques de datos inevitablemente se sobrescribirán físicamente con el tiempo; a menos, por supuesto, que el archivo se haya abierto en algún programa (en este caso existirá incluso si su nombre se elimina de todos los directorios).

De hecho, el mismo conjunto de datos y metadatos se puede asignar a un número arbitrario de directorios dentro del mismo sistema de archivos e incluso aparecer bajo diferentes nombres en un directorio; en este caso, la cantidad de enlaces al mismo será adecuada. Pero el número mínimo de enlaces a un directorio es dos, ya que existe una entrada al respecto tanto en el directorio principal (..) como en el actual (.. - es decir, en sí mismo). Y cada subdirectorio anidado aumenta el número de enlaces del directorio en uno.

Enlaces que vinculan un nombre de archivo como una entrada de directorio a su entrada de tabla inodos y los bloques de datos que forman un archivo de datos también se llaman enlaces duros, un buen equivalente en ruso sería la palabra "conexión", pero de alguna manera no tuvo éxito). A través de enlaces físicos al mismo conjunto de datos o programa ejecutable Puede dar un número arbitrario de nombres, que nadie prohíbe incluir en el mismo o en diferentes directorios. La única condición para esto es que todos estos nombres duplicados deben estar ubicados en directorios de un único sistema de archivos (en sentido figurado, en la misma partición del disco, aunque, como se mostrará en la sección sobre RAID de software, esto no es del todo exacto). .

En aras de la certeza, observo que los enlaces físicos deben distinguirse de los enlaces simbólicos (enlaces simbólicos, a menudo llamados simplemente enlaces, razón por la cual sería razonable conservar la designación de enlaces para ellos y llamar enlaces duros en ruso). Los enlaces simbólicos son un tipo especial de archivo, vagamente similar a los accesos directos en Windows o a la sombra en OS/2, que en sí mismos no contienen ningún dato, sino que simplemente describen la ruta al nombre de otro archivo (que puede estar ubicado fuera del archivo dado). sistema).

Para archivos inexistentes, entradas gratuitas en la tabla. inodos simplemente reservado. Y dado que el número de estos registros es, por supuesto, el tamaño de la tabla de índice determina cuántos archivos se pueden crear realmente en un sistema de archivos determinado. El agotamiento de las entradas libres lleva al hecho de que, independientemente de la cantidad de espacio libre en el disco, no se puede crear ni un solo archivo nuevo.

Bloque de grupo de cilindros y superbloque.

Mesas inodos están contenidos en el bloque del grupo de cilindros, junto con las tarjetas de disponibilidad inodos y mapas de bloques de datos de disponibilidad). Esto tiene como objetivo acomodar inodos y los bloques de datos relacionados con ellos están lo más cerca posible entre sí, lo que, además de aumentar el rendimiento (al minimizar los movimientos de la cabeza), también implica minimizar la fragmentación de datos muy externa mencionada anteriormente.

Sin embargo, en el bloque del grupo de cilindros no se encuentra ninguna información sobre el tamaño de la tabla de índices. Porque el lugar donde se ubican es el mismo superbloque que viene primero en nuestra partición (de hecho, el primero en cualquier partición será el bloque de arranque, pero en realidad está ocupado solo en la partición de arranque - en todas las demás, un simplemente se le reserva un lugar). También está duplicado en cada grupo de cilindros, lo que garantiza la resistencia al daño mecánico del disco. Además, el superbloque registra el tamaño del bloque del sistema de archivos y su número total, el número de bloques de datos, el tamaño del fragmento de bloque y su número en el bloque, el número de bloques realmente ocupados por archivos, el volumen del partición reservada permanentemente como gratuita y muchas más características del sistema de archivos, de las que no es apropiado hablar ahora.

Práctica de formato

Por lo tanto, el proceso de creación de un sistema de archivos se reduce a a) asignar un superbloque y registrar los parámetros generales del sistema de archivos, b) crear una tabla inodos(en UFS, a diferencia de algunos sistemas de archivos modernos para Linux, todos los inodos se crean de una vez por todas y no se asignan dinámicamente según sea necesario), y c) la disposición de los bloques en el área de datos. De todo esto, como la inolvidable Katerina Matvevna, se encarga un único programa, llamado simplemente newfs.

El comando newfs requiere un único argumento: el nombre del archivo de la partición a formatear, por ejemplo,

$newfs /dev/ad0s1a

después de lo cual todas las propiedades básicas del sistema de archivos se definirán de forma predeterminada. Sin embargo, el usuario tiene el poder de influir en ellos utilizando las opciones del comando newfs, especificadas en la línea de comando o de una vez por todas de forma global, a través del elemento Opciones programas de instalación del sistema. Consideraremos la más importante de estas opciones:

La opción -b especifica el tamaño del bloque lógico del sistema de archivos. Tamaño mínimo su tamaño es 4096 bytes, el máximo es 65536. Sin embargo, como dicen, con el tamaño máximo posible son posibles todo tipo de problemas y, por lo tanto, el límite superior de 32768 bytes se considera confiable. Y desde el punto de vista del sentido común, el valor "predeterminado" de 16384 bytes parece razonable en la mayoría de los casos.

La opción -f establece el tamaño del fragmento de bloque. Se recomienda definirlo en 1/8 del tamaño del bloque, que por defecto es 2048 bytes. Los valores de 1/4 o 1/2 bloque también son aceptables, pero se desaconsejan en la documentación.

La opción -i es muy importante: establece indirectamente el número de entradas en la tabla de índice (es decir, cantidad máxima archivos en el sistema de archivos). El valor de esta opción se proporciona en bytes asignados por elemento de la tabla de índice y debe ser un múltiplo del tamaño del fragmento de bloque. El valor predeterminado es cuatro veces el tamaño, lo que determina el tamaño de archivo promedio previsto (8192 bytes). Y la cantidad máxima de archivos en un sistema de archivos en particular se puede calcular fácilmente en función del tamaño de la partición asignada para él.

Otra opción interesante es -m, cuyo valor se indica como un porcentaje de la cantidad total de espacio en disco asignado a la partición. Y representa la cantidad reservada por escritura. usuarios comunes(pero no root; siempre tiene la oportunidad de registrar sus acciones en el disco). Se determina porque el rendimiento de las operaciones con archivos en UFS simplemente cae catastróficamente cuando el número de bloques libres en el área de datos está cerca de agotarse (probado en la práctica). Y por lo tanto, una cierta cantidad del sistema de archivos se reserva a la fuerza (por defecto, 8%).

Asociada a esta opción hay otra, -o , que especifica el algoritmo para asignar bloques de datos libres al crear nuevos archivos. El caso es que UFS puede colocarlos de dos formas. El primero es el método de empaquetado denso para minimizar la fragmentación interna y ahorrar espacio en el disco. Y se llama optimización por volumen (la opción -o toma el espacio de valores). El segundo método (-o tiempo) proporciona selección más rápida bloques libres para aumentar la velocidad de creación de archivos (es decir, contrariamente al principio de Leonid Ilyich Brezhnev: "la economía debe ser económica"). Entonces, el valor predeterminado -o se correlaciona con el valor -m: si es mayor o igual al 8%, se aplica la optimización del tiempo, si es menor, se aplica la optimización del volumen. Aunque es posible indicar explícitamente exactamente los valores opuestos.

En realidad, todas las opciones anteriores son muy importantes, interesantes y útiles para educación general, pero es poco probable que el usuario tenga que recurrir a ellos: sus valores predeterminados, como casi todo en FreeBSD, son razonables y aceptables en la gran mayoría de los casos. Pero la opción -U no está habilitada de forma predeterminada al iniciar newfs. Proporciona soporte para algo extremadamente útil: el mecanismo de actualizaciones suaves, que ayuda (paradójicamente, pero es cierto) tanto a aumentar la velocidad de las operaciones con archivos como la estabilidad del sistema de archivos.

El tema de las actualizaciones suaves, sin embargo, es tan interesante en sí mismo que merece una discusión aparte, que haremos en la siguiente sección. Mientras tanto, veamos las diferencias entre la versión actual del sistema de archivos FreeBSD, UFS2, y su predecesor, UFS.

Todo lo dicho anteriormente sobre el sistema de archivos FreeBSD aplicado a igualmente a sus dos variedades. La característica principal de UFS2 es que es de 64 bits y, en consecuencia, es capaz de trabajar con volúmenes de disco de más de un terabyte (curiosamente, esto pronto será relevante para usuario de escritorio? A juzgar por el ritmo de las discusiones, esta fecha límite no está lejos). En este sentido, permítanme recordarles que la longitud de la entrada en la tabla de inodos en UFS2 se ha duplicado y es igual a 256 bytes.

Además, UFS2 incluye soporte para atributos de archivos extendidos, en particular ACL, pero esto es esencial para los administradores de red. Pero lo que el usuario puede notar es que crear un nuevo sistema de archivos es más rápido (en grandes particiones de disco esto se nota mucho, como dicen, organolépticamente). Esto sucede debido al llamado. inicialización "perezosa" inodos, aunque no existe una asignación dinámica de ellos, como, por ejemplo, en XFS.

En general, desde el punto de vista del usuario, es posible que las diferencias entre UFS y UFS2 no sean visibles. Sin embargo, tampoco hay razón para abandonar UFS2. Además, tanto newfs, que se mencionó anteriormente, como sysinstall de forma predeterminada ahora (en la quinta rama) crean exactamente esto. Si solo desea crear UFS (para compatibilidad con versiones de ramas anteriores que no admiten UFS2), debe hacerlo a la fuerza especificando la opción -O 1 para newfs.

Actualizaciones suaves de Paradox

A pesar de todas sus numerosas ventajas, el sistema de archivos FreBSD no puede presumir de una cosa: velocidad. Y esto a pesar de que se basa en el FFS general de Berkeley, un sistema de archivos rápido. Sin embargo, el epíteto aquí es en comparación con el anterior sistema de archivos Unix: s5, cuyas variaciones, como dicen personas conocedoras, se distinguían por una consideración excepcional. Si comparamos el rendimiento del sistema de archivos FreeBSD con el Ext2fs nativo de Linux, el usuario lo verá significativamente más lento que este último, especialmente en operaciones con un gran número archivos pequeños.

¿Por qué? La respuesta es fácil: debido al modo predeterminado de FreeBSD para manejar archivos modificados. La mayoría de los sistemas de archivos normales son capaces de funcionar en uno de tres modos:

  • completamente sincrónico, cuando las actualizaciones de las áreas de datos y metadatos del archivo se escriben en el disco inmediatamente después de su cambio;
  • completamente asíncrono, en el que todos los cambios en el archivo (y sus metadatos y área de datos) se almacenan en caché en la RAM y, de hecho, se escriben en el disco en el momento adecuado;
  • mixto, implementando un mecanismo sincrónico para metadatos modificados y almacenamiento en caché para modificaciones del área de datos.

Obviamente, el primer modo proporciona la mayor resistencia del sistema de archivos a fallas, el segundo proporciona la mayor velocidad de operación de archivos (a costa de la posibilidad de violar la integridad del sistema de archivos e incluso su destrucción completa en caso de una emergencia). cierre), y la tercera es una especie de compromiso entre la primera y la segunda solución.

Entonces, en el archivo sistema linux(Específicamente, en ext2fs, Linux ahora reconoce muchos sistemas de archivos como nativos) de forma predeterminada, se usa un modo de operación completamente asíncrono, y en FreeBSD es mixto. Por supuesto, esto se determina cuando se montan los sistemas de archivos, y con las opciones apropiadas para el comando de montaje (que mostraré en una publicación relacionada), se puede hacer que el sistema de archivos FreeBSD se ejecute de forma completamente asincrónica. Sin embargo, las personas razonables no recomiendan categóricamente hacer esto y, probablemente, tienen razones para ello (una de las razones quedará clara al final de esta sección). Y, como se desprende de las pruebas, el montaje asincrónico de sistemas de archivos en FreeBSD no proporciona un aumento significativo en el rendimiento.

De hecho, en el modo predeterminado, el sistema de archivos FreeBSD (en comparación con ext2fs) demuestra una estabilidad notable. A lo largo de los años que he estado trabajando con este sistema operativo (y la mitad de los cuales fueron en condiciones rurales, cuando los cortes de energía inesperados eran más que comunes), nunca tuve que enfrentar problemas debido a chocar sesión (en Linux, estos problemas surgieron con bastante frecuencia antes de la introducción de los sistemas de archivos registrados).

Sin embargo, el precio de esto es la velocidad. O mejor dicho, la ausencia de él. Y esto es especialmente evidente al copiar. gran cantidad archivos pequeños (un procedimiento que es muy común cuando se trabaja principalmente con materiales de texto). De hecho, en este caso una gran cantidad de archivos se actualizan en modo sincrónico. inodos, mientras que la cantidad de datos en sí cambia en un volumen insignificante y almacenarlos en caché trae poca alegría. En cualquier caso, copiar lo que escribiste. editor de texto Artículos del tamaño de esta nota y el volumen total de un CD estándar toman un tiempo bastante delicado (a diferencia de Linux, donde dicha operación se realiza aparentemente instantáneamente; otra cosa es que el indicador de actividad del disco duro puede parpadear durante mucho tiempo).

Además, a pesar de toda su estabilidad real, el sistema de archivos FreeBSD, al no estar registrado en un diario, no tiene un mecanismo para garantizar su propia integridad. Es decir: en caso de parada de emergencia, cuando se produzca el llamado. bit de desmontaje limpio (el byte limpio es uno de parámetros importantes sistema de archivos, escrito en su superbloque al salir correctamente del sistema), durante el procedimiento de arranque posterior, se llama a la fuerza a un programa para verificar si encuentra inconsistencias entre metadatos y áreas de datos (y eliminarlas). Y con los tamaños de disco modernos (y, en consecuencia, los sistemas de archivos que contienen), dicha verificación puede llevar horas. Por supuesto, esto es especialmente desafortunado para los servidores, pero incluso en una máquina de escritorio trae pocas emociones positivas.

El problema de la violación de la integridad también existe en Linux (por las razones expuestas anteriormente, incluso en mayor medida). Y en Linux lo combaten mediante el registro, es decir, el registro proactivo de los cambios en los metadatos (y, en algunos casos, incluso en los datos). En FreeBSD, la lucha por la integridad del sistema de archivos se libró históricamente en dos direcciones. Uno de ellos (aunque históricamente el segundo) es una verificación de integridad del sistema de archivos en segundo plano que apareció en la quinta rama, lo que permite iniciar funcionamiento normal inmediatamente después de un reinicio de emergencia de la máquina. Dado que se trata de una de las innovaciones fundamentales, diré algunas palabras sobre este tema.

Para comprobar la integridad del sistema de archivos en FreeBSD, se utiliza la utilidad fsck (existe una utilidad del mismo nombre en Linux; para ext2fs, existen herramientas similares para otros sistemas de archivos). Puede ser iniciado por el usuario (o mejor dicho, root) desde la línea de comando. Sin embargo, el esquema de inicio del sistema prevé su inicio forzado si no se detecta el bit de desmontaje limpio en ninguno de los sistemas de archivos montados automáticamente. Y dado que fsck es una operación bit a bit, generalmente se realiza en sistemas de archivos desmontados para evitar consecuencias nefastas.

Este fue el caso en FreeBSD hasta las versiones de la cuarta rama. Pero en las versiones de la quinta rama, a partir de la primera, la verificación del disco se puede realizar en un sistema de archivos montado y listo para usar. Y, en consecuencia, en segundo plano después de que el sistema esté completamente cargado, en paralelo con la ejecución del trabajo normal. Parecería una nimiedad, pero es bonito: es difícil decir cuánto costaría cheque completo ahora son tornillos comunes de 80 o 120 gigabytes.

Sin embargo, la primera vez que se implementó una forma de luchar por la integridad del sistema de archivos fue el mecanismo de actualizaciones suaves, que simultáneamente (o más bien, principalmente) proporcionó un aumento en el rendimiento de las operaciones con archivos.

El mecanismo de actualizaciones suaves se describe a continuación. En pocas palabras, la esencia de este mecanismo es minimizar las operaciones de escritura sincrónica sin manipulación explícitamente asincrónica de los metadatos, por un lado, pero también sin un registro preliminar de los metadatos (como en sistemas de archivos como ReiserFS o XFS), por el otro.

Esto se implementa, nuevamente hablando de manera bastante aproximada (los detalles de la implementación están más allá de mi comprensión, lo confieso) debido a las llamadas dependencias de actualización. Cuáles son estas dependencias queda intuitivamente claro en el ejemplo de creación de un archivo nuevo (para simplificar, vacío). Esto requiere:

  • entrada de tabla inodos, completando los campos del tipo de archivo, su identificador, contador de enlaces (con un valor de 1 - cada archivo debe pertenecer al menos a un directorio), y otros allí - derechos de acceso de acuerdo con la máscara predeterminada, etc. ;
  • cambiar el mapa libre/ocupado inodos en el bloque del grupo de cilindros (correspondiente al nuevo archivo inodo debe estar marcado con un bit de ocupado);
  • agregar una entrada del formato "identificador - nombre_archivo" a la estructura del directorio en el que nuevo archivo se crea, lo que proporciona ese único enlace en el campo correspondiente inodo archivo.

Desde la perspectiva de la integridad del sistema de archivos, estas operaciones deben realizarse en este orden. Es decir, la presencia en el directorio de un nombre de archivo con un identificador que está vacío (aún no creado o ya destruido) inodo- un trastorno evidente: para corregir este tipo de atrocidades se lanza el programa de comprobación del disco tras una terminación anormal de la sesión.

Realizar operaciones de actualización relacionadas con dependencias en modo sincrónico lleva mucho tiempo (cada una requerirá su propio acceso al disco, en modo asincrónico no hay garantía de mantener la secuencia (las actualizaciones en el caché se pueden escribir cuando Dios lo desee); Entonces, el mecanismo de actualizaciones suaves proporciona, por un lado, control sobre la secuencia de ejecución de las actualizaciones dependientes (lo que contribuye a la integridad del estado del sistema de archivos), por otro lado, las agrupa en una única operación atómica de sincronización. acceso al disco, al reducir el número de los cuales aumenta la productividad. Ésta, hasta donde tengo entendido, es la explicación de la paradoja de las actualizaciones suaves: un aumento inesperado tanto en la confiabilidad como en el rendimiento.

En general, traté de explicarlo lo mejor que pude y tal como lo entendí; consulte el artículo mencionado para obtener más detalles. Además, solo señalaré, para evitar malentendidos: el mecanismo de actualizaciones suaves no solo no garantiza la seguridad de los datos del usuario que no se escribieron en el disco debido al descuido del usuario antes de la falla del sistema, sino que tampoco persigue tal objetivo. Su trabajo es garantizar que el sistema de archivos se presente siempre de la forma más coherente posible. Sin embargo, lo mismo puede decirse de cualquier sistema de archivos con registro diario: ninguno de ellos protege contra errores del usuario...

Ahora veamos cómo se pueden utilizar las actualizaciones suaves. Si crea sistemas de archivos a través de sysinstall, todo es simple: de forma predeterminada, la habilitación de este mecanismo se proporciona desde hace mucho tiempo (versiones desde aproximadamente 4.3) para todos los sistemas de archivos excepto el raíz. Esto último se justifica por consideraciones de seguridad. Y para el sistema de archivos raíz, las actualizaciones suaves no son particularmente necesarias: con la partición y el funcionamiento correctos del disco, escribir en él (después de instalación inicial) ocurre sólo al instalar un nuevo kernel, pero ¿con qué frecuencia se hace esto en condiciones normales?

Al crear sistemas de archivos manualmente usando el comando newfs, las Actualizaciones suaves no se habilitan automáticamente: esto debe hacerse, como ya se mencionó, especificando la opción:

$ newfs -U /dev/ad#s#?

Sin embargo, si se olvidó durante el formateo, está bien: para todas las particiones excepto la raíz, puede habilitar fácilmente las actualizaciones suaves usando el comando tunefs. Para hacer esto, debe cambiar al modo de usuario único (muy recomendable; de ​​alguna manera me las arreglé sin él, pero es mejor seguir los consejos de personas razonables), lo cual se hace mediante el comando

$ cerrar ahora

Desmonte todos los sistemas de archivos excepto el raíz (este número no funcionará de todos modos) con el comando

$monto -Af

dar una orden

$ tunefs -n habilitar /dev/ad#s#?

para cada partición cuyo sistema de archivos requiera actualizaciones suaves. Y finalmente, repitiendo el comando.

A menudo presto atención al hecho de que preguntas simples la mayoría de las veces mal cubiertos en Internet. Probablemente esto se deba a que todos los gurús están seguros de que nadie hará preguntas tan estúpidas, porque todo el mundo lo sabe. Pero mi práctica ha demostrado que son precisamente estas pequeñas preguntas simples las más comunes no solo entre los principiantes, sino también entre los administradores serios que simplemente no tuvieron que lidiar con esto. Incluso los administradores serios no hacen esto todos los días, pero, para no olvidar, se guardan una especie de hoja de trucos, sin confesárselo a nadie. Arreglemos todo. Ahora aprenderás a sumar en 5 minutos. disco duro en FreeBSD. Entonces. Se traducirá primero. instrucciones completas para entender el proceso, y al final habrá breve lista de acciones, que sólo contendrá una lista de comandos a modo de hoja de referencia.

Instrucciones detalladas con explicaciones.

Seleccionar un nombre de disco duro

Primero debemos determinar el nombre del dispositivo que acabamos de agregar. El siguiente comando nos ayudará con esto:

Lista de discos geométricos

O este comando:

Lista de desarrolladores de Camcontrol

En un sistema real, estos comandos mostrarán más información útil, concretamente nombres de dispositivos y números de serie.

Antes de instalar el nuevo dispositivo, sabíamos que nuestro sistema estaba instalado en ada0, lo que significa, lógicamente, que nuestra nueva unidad es ada1. Puede determinar esto por el nombre del nuevo dispositivo, número de serie o volumen.

Ahora verifiquemos si hay marcas en nuestro nuevo disco.

Gpart muestra ada1

El disco no tiene marcas.

Eliminar el marcado existente

Si el disco ya se ha utilizado y es necesario eliminar particiones, simplemente ejecute:

Gpart destruir -F ada1

Creando marcado GPT

Primero, debemos crear una partición de disco. Recomiendo encarecidamente olvidarse de MBR y cambiar a uno nuevo, más conveniente y funcional: GPT.

Creamos marcado GPT en el disco y luego comprobamos qué sucede:

Gpart crear -s gpt /dev/ada1 gpart mostrar ada1

Ahora nuestro disco tiene partición GPT. En el resultado se puede ver que absolutamente todo el disco, desde LBA 34 hasta LBA 8388541, está vacío. LBA 0−33: reservado por el sistema para la tabla de particiones.

Digamos que necesitamos crear dos particiones en este disco:

  • intercambio- intercambiar partición
  • datos- una sección del tipo ufs para almacenar cualquier dato que necesitemos.

Crear secciones (rebanadas)

Si la instalación se realiza en discos duros modernos con un tamaño de sector de 4 KB, se debe utilizar la alineación al crear particiones. Puede hacer esto de dos maneras: 1) si especificamos los parámetros de la sección en bloques, luego ingresamos el número de bloque como múltiplo de 8, por ejemplo: -b 40; 2) si indicamos el tamaño de la partición en bytes, o no indicamos el comienzo y el tamaño en absoluto, use el parámetro -un 4k, que ajustará el inicio y el final de la sección a sectores de 4 kb de tamaño. ya que estamos en en este ejemplo nosotros producimos instalación de prueba a un disco duro virtual, entonces no es necesario que haga esto. En cualquier caso, antes de crear particiones, necesita saber exactamente el tamaño del sector de su disco; de lo contrario, se producirá una terrible ralentización del trabajo.

Ahora creemos las particiones. Para esto existe un comando gpart add con varios parámetros. Primer parámetro -t- indica el tipo de sistema de archivos que se está creando. En nuestro caso se utilizarán dos tipos: freebsd-swap y freebsd-ufs. A continuación se muestran dos parámetros opcionales: -b- indica el número LBA a partir del cual se debe crear la partición. Si no especifica este parámetro, la partición se creará automáticamente a partir del primer LBA libre. -s- indica el tamaño de la partición en el LBA. Tamaño de un bloque LBA = 512 bytes. Es recomendable indicarlo en número de bloques LBA, pero también es posible en kilo/mega/giga/… bytes (sufijo k/M/G). Si no especifica este parámetro, la partición se creará con el máximo LBA posible dentro del área vacía. También puede especificar la etiqueta de la sección como parámetro, por ejemplo: -l intercambio1- en este caso, se creará la etiqueta /dev/gpt/swap1, que se puede utilizar para acceder más cómodamente a la partición. El último parámetro requerido es la ruta al disco. En nuestro caso: /dev/ada1.

Creemos dos particiones y luego veamos qué tenemos. Crearemos la primera partición sin especificar el LBA inicial, pero especificando el tamaño de 1 GB (2097152 bloques). Crearemos la segunda partición sin especificar el LBA inicial y sin especificar el tamaño; por lo tanto, se creará en todo el espacio libre.

Gpart agregar -t freebsd-swap -s 2097152 /dev/ada1 gpart agregar -t freebsd-ufs /dev/ada1 gpart show ada1

El tamaño se puede especificar en bytes en lugar de bloques. Es mucho más conveniente. El único inconveniente es que el sistema no siempre puede calcular correctamente el número de bloques. Puede haber casos en los que una cierta cantidad de bloques permanezcan vacíos en el disco al especificar el tamaño de la partición en bytes.

Crear un sistema de archivos (formatear)

No es necesario formatear las particiones de intercambio. Pero las particiones como ufs deben formatearse antes de usarse. Sería más correcto decir: se debería crear un sistema de archivos en ellos.

Para crear un sistema de archivos en la segunda partición, simplemente ejecute el siguiente comando:

Nuevos -U /dev/ada1p2

En este caso, se utilizó el parámetro -U; indica que se debe utilizar el mecanismo de actualizaciones suaves en este sistema de archivos. Puede omitir esta opción para evitar habilitar este mecanismo.

Montaje

El siguiente paso es montar las particiones. Primero, para no olvidarlo, agreguemos nuestras nuevas secciones a /etc/fstab. Mi archivo después de editarlo se ve así:

Para volver a montar todas las particiones según el archivo /etc/fstab, simplemente ejecute el comando:

Monte -a

Como puede ver en el resultado, la partición /dev/ada1p2 está montada. Ahora veamos qué pasó con la sección SWAP. Ejecutemos el comando:

Como puede ver, la nueva partición SWAP no está montada. Para poder montar SWAP, debe habilitarlo con un comando especial:

Intercambio /dev/ada1p1

De la misma manera, usando el comando swapoff, debes deshabilitar la partición SWAP antes de realizar cualquier acción en ella.

Eso es todo por agregar. nuevo duro disco en el sistema.

Breves instrucciones

Dado: disco duro /dev/ada1

Objetivo: borrar marcado existente, cree una nueva partición GPT, cree dos particiones: intercambio y datos y conéctelas al sistema de trabajo.

Después de cada acción, haz espectáculo de parte para observar el resultado. Secuencia de acciones:

  1. Eliminar la partición existente: gpart destroy -F ada1
  2. Cree una nueva partición: gpart create -s gpt /dev/ada1
  3. Cree dos particiones: swap y datos: gpart add -t freebsd-swap -s 2097152 /dev/ada1 gpart add -t freebsd-ufs /dev/ada1
  4. Crear un sistema de archivos UFSv2 en la segunda partición: newfs -U /dev/ada1p2
  5. Agregue líneas al archivo /etc/fstab para el montaje automático en el arranque: /dev/ada1p1 none swap sw 0 0 /dev/ada1p2 /mnt ufs rw 2 2
  6. Monte una nueva partición (el comando monta todas las particiones desde el archivo /etc/fstab): mount -a
  7. Habilite la nueva partición de intercambio con el comando: swapon /dev/ada1p1

Esto completa la configuración.




Arriba