Esta imagen de TLDP es bastante impresionante. Muestra que antes de darle al espacio del usuario acceso real de lectura, escritura y apertura al sistema de archivos, los bloques se asignan al sistema de archivos virtual.
yWikipediadice que hay 3 versiones de sistemas de archivos en diferentes capas.
Entonces, ¿los estándares (nodos sd) se refieren a lo físico o, después delLVM¿sistema de archivos virtual mapeado?
¿O se refieren solo a la partición? (lo que significaría que escribir directamente en la partición omitiría el controlador del sistema de archivos, sin el cual ni siquiera podría interactuar con los archivos)
Si ese es el caso, ¿qué dispositivos representan los controladores del sistema de archivos o los sistemas de archivos o... simplemente no lo sé... ¿alguien podría vincularme con algo que explique el uso del disco por parte del núcleo?
Respuesta1
tl; dr: /dev/sdaX
representa una partición. Creo que un error fundamental que tienes es la diferencia entre sistemas de archivos y particiones. Una partición es realmente simple: básicamente es solo una sección del disco que está definida en una tabla de particiones al comienzo del disco. Un sistema de archivos, sin embargo, es algo mucho más avanzado. Un sistema de archivos es esencialmente una estructura de datos utilizada para realizar un seguimiento de los archivos que el núcleo (específicamente, un controlador del sistema de archivos) puede leer y escribir. Técnicamente, esa estructura de datos se puede colocar en cualquier lugar del disco, pero se espera que el comienzo de la estructura de datos fs sea el mismo que el comienzo de una partición.
Mencionaste LVM en tu pregunta; olvidemos eso por el momento, ya que es un tema más avanzado (explicaré LVM al final).
Supongamos que tiene un único disco duro de 100 GB con nada más que ceros. En este caso, tendrá un /dev/sda
archivo del que podrá obtener 100 GB (aunque, por ejemplo, du
lo informará como de longitud cero porque es un bloque especial) y no contiene nada más que ceros. /dev/sda
es el método mediante el cual el kernel expone el contenido sin formato del dispositivo al espacio de usuario para lectura y escritura. Es por eso que tiene la misma cantidad de datos que su disco y tiene el mismo contenido que su disco. Si activa el quinto bit /dev/sda
para que sea uno en lugar de cero, el núcleo activará el quinto bit en la unidad física para que coincida. En el diagrama que proporcionó, esta escritura pasaría por la interfaz de llamada del sistema hasta el kernel, luego por el controlador del disco duro IDE y, finalmente, hasta el disco duro.
Ahora digamos que desea hacer algo útil con esa unidad, como almacenar archivos en ella. Ahora necesitas un sistema de archivos. Hay una cantidad ridícula de sistemas de archivos disponibles en el kernel de Linux. Cada uno de ellos utiliza una estructura de datos diferente en el disco para realizar un seguimiento de los archivos y también pueden modificar sus estructuras de datos de diferentes maneras, por ejemplo para proporcionarescritura atómicagarantías (es decir, las escrituras tienen éxito o no; nunca puede haber datos a medio escribir incluso si la máquina falla). Esto es lo que la gente quiere decir cuando habla de un "controlador de sistema de archivos": un controlador de sistema de archivos es un fragmento de código que entiende cómo leer y escribir las estructuras de datos de un sistema de archivos en particular en el disco. Los ejemplos incluyen ext4, btrfs, XFS, etc.
Entonces quieres almacenar archivos. Digamos que eliges ext4 como sistema de archivos. Lo que debe hacer ahora es formatear el disco para que existan en el disco las estructuras de datos para un sistema de archivos vacío. Para hacer esto, usa mkfs.ext4
y le dice que escriba en /dev/sda
. mkfs.ext4
Luego escribirá un sistema de archivos ext4 vacío comenzando al principio de /dev/sda
. Luego, el kernel tomará las escrituras /dev/sda
y las aplicará al comienzo del disco físico. Ahora que el disco contiene las estructuras de datos de un sistema de archivos, puede hacer, por ejemplo, mount /dev/sda /mnt
montar el nuevo sistema de archivos, mover archivos a él, etc. Cualquier escritura en archivos /mnt
pasaría por la interfaz de llamada del sistema y luego por el controlador del sistema de archivos ext4 ( que sabe cómo convertir el más abstracto "escribir estos datos en tal o cual archivo" en cambios concretos que deben realizarse en las estructuras de datos fs en el disco), luego en el controlador del disco duro IDE y finalmente en el propio disco.
Ahora, lo anterior funcionará, pero normalmente no es la forma en que la gente hace las cosas. Usualmente usanparticionesen el camino. Una partición es básicamente una sección particular del disco. Cuando usas particiones, tienes unatabla de particionesal comienzo de la unidad que dice dónde, físicamente, se encuentra cada partición. Las particiones son ordenadas porque le permiten dividir una unidad en varias secciones que pueden usarse para diferentes propósitos.
Entonces digamos que quieres creardossistemas de archivos en la unidad, ambos de ~50 GB (es decir, mitad y mitad). Primero tendrías que particionar el disco. Para hacer esto, usarías una herramienta como fdisk
o gdisk
, las cuales crean diferentes tipos de tablas de particiones, y le indicarías a tu herramienta que escriba en /dev/sda
. Cuando terminara de particionar, tendría /dev/sda
, /dev/sda1
y /dev/sda2
. /dev/sda1
y /dev/sda2
son la forma en que el kernel representa las diferentes particiones del disco. Si escribe al principio de /dev/sda2
, escribirá al principio de la segunda partición, que está enel medio del disco.
Otra forma de explicar esto es hablando del contenido de /dev/sda
. Recuerde que /dev/sda
es, bit por bit, el contenido del disco duro físico. Y /dev/sda1
es, bit a bit, el contenido de la primera partición del disco duro. Esto significa que /dev/sda
tiene un poco de datos (el encabezado de la partición) seguido del contenido exacto de /dev/sda1
. y están asignados a regiones específicas del disco, que son particiones que ha configurado./dev/sda2
/dev/sda1
/dev/sda2
Desde aquí podemos usar mkfs.ext4
nuevamente para crear un sistema de archivos /dev/sda1
, que escribirá en el disco comenzando directamente después del encabezado de la partición. Si usamos mkfs.ext4
on /dev/sda2
, escribe comenzando al principio de la partición, que está en el medio del disco (y por lo tanto en el medio del /dev/sda
contenido de).
Ahora puedes hacer, por ejemplo mount /dev/sda2 /mnt
. Esto le dice al kernel que lea los datos del sistema de archivos comenzando al principio de la segunda partición y los exponga en una forma más útil, es decir, archivos y directorios en la ubicación /mnt
. Nuevamente, el kernel usa un controlador de sistema de archivos para realizar este mapeo.
Ahora hablemos brevemente de LVM. LVM es básicamente sólo una abstracción de particiones. Las particiones se asignan muy, muy directamente a ubicaciones físicas en el disco. En el ejemplo anterior de dos particiones, digamos que desea eliminar la primera partición y expandir la segunda al espacio recién liberado. Debido a que las particiones se asignan directamente a regiones del disco, la única forma de hacerlo es mover físicamente los 50 GB completos de datos de la partición al principio del disco y luego expandir la partición hasta el final.
LVM está diseñado para que esto sea menos doloroso. Básicamente, le das a LVM una gran cantidad de almacenamiento sin procesar y luego le dices cómo usarlo. LVM le proporciona un "disco" virtual que se puede dividir como particiones, pero cuyo almacenamiento subyacente puede estar en cualquier parte del grupo de almacenamiento sin formato que le haya asignado. Para usar el ejemplo anterior, si le dio a LVM todo el disco para usar y luego lo dividió en dos, podría eliminar la primera "partición" y expandir la segunda "partición" para llenar ese espacio instantáneamente, porque LVM puede realizar un seguimiento. de dónde están los datos en el disco sin necesidad de que estén estrictamente "en orden".
Para obtener muchos más detalles sobre cómo funciona LVM, consulte esta respuesta:https://unix.stackexchange.com/a/106871/29146
Respuesta2
/dev/sda
es una interfaz para todo el disco duro. Si tiene permiso, puede buscar directamente en cualquier parte del disco. /dev/sda1
es la primera partición del disco. En ese momento todavía no hay ningún sistema de archivos involucrado. Dentro de la partición, puede haber un sistema de archivos directamente o puede ser un contenedor LVM.