¿Se puede guardar un archivo no secuencialmente en el disco? Quiero decir, parte del archivo se encuentra en la dirección física X y la otra parte en la dirección física Y, que no está cerca de X + desplazamiento).
Sí; esto se conoce como fragmentación de archivos y no es raro, especialmente con archivos más grandes. La mayoría de los sistemas de archivos asignan espacio según sea necesario, más o menos secuencialmente, pero no pueden adivinar el comportamiento futuro; por lo tanto, si escribe 200 MiB en un archivo y luego agrega 100 MiB adicionales, existe una probabilidad distinta de cero de que ambos conjuntos de datos almacenarse en diferentes áreas del disco (básicamente, cualquier otra escritura que necesite más espacio en el disco, que ocurra después de la primera escritura y antes de la segunda, podría estar entre las dos). Si un sistema de archivos está casi lleno, la situación suele ser peor:es posible que no haya un área contigua de espacio libre lo suficientemente grande para contener un nuevo archivo, por lo que tendrá que fragmentarse.
¿Puedo controlar de alguna manera la secuencialidad del archivo? Quiero asignar un archivo grande de 10 GB. Quiero que sea secuencial en disco y no dividido entre diferentes compensaciones.
Puede informarle al sistema de archivos sobre el tamaño de destino de su archivo cuando se crea; esto ayudará al sistema de archivos a almacenarlo de manera óptima. Muchos sistemas de archivos modernos utilizan una técnica conocida como asignación retrasada, donde el diseño en disco de un nuevo archivo se calcula lo más tarde posible, para maximizar la información disponible cuando se realiza el cálculo. Puedes ayudar en este proceso usando el posix_fallocate(3)
función para decirle al sistema de archivos cuánto espacio en disco debe asignarse en total. Los sistemas de archivos modernos intentarán realizar esta asignación secuencialmente.
¿Actúa de manera diferente entre los diferentes tipos?
Los diferentes sistemas de archivos se comportan de manera diferente, sí. Los sistemas de archivos basados en registros, como NILFS2, no asignan almacenamiento de la misma manera que los sistemas de archivos basados en extensiones, como Ext4, y ese es solo un ejemplo de variación.
El comando filefrag
le dirá cómo se almacena físicamente su archivo en su dispositivo:
# filefrag -v /var/log/messages.1
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 2130567 1
1 1 15907576 2130568 1
2 2 15910400 15907577 1
3 3 15902720 15910401 7
4 10 2838546 15902727 1 eof
/var/log/messages.1: 5 extents found
Si escribe su archivo en una sola pasada, creo que su archivo no se fragmentará.
La página man de fallocate
(1) es bastante claro:
fallocate
se utiliza para preasignar bloques a un archivo. Para sistemas de archivos que admiten fallocate
llamada al sistema, esto se hace rápidamente asignando bloques y marcándolos como no inicializados, lo que no requiere E/S en los bloques de datos. Esto es mucho más rápido que crear un archivo rellenándolo con ceros.
A partir de Linux Kernel v2.6.31, el fallocate
La llamada al sistema es compatible con los sistemas de archivos btrfs, ext4, ocfs2 y xfs.
es secuencial? El sistema primero intentará asignar los bloques secuencialmente. Si no puede, no te avisará.
Menciona archivos dispersos y ninguna de las otras respuestas los ha mencionado.
La mayoría de los archivos no son escasos. La forma más común de crear un archivo es escribirlo todo de una vez, desde el principio hasta el final. No hay agujeros allí.
Sin embargo, puede decir "mover a la posición 1,000,000,000,000 y escribir un byte allí". Esto creará un archivo que parece tener un tamaño de etabyte, pero en realidad solo usa (probablemente) 4k en el disco. Este es un archivo disperso.
Puede hacer esto muchas veces para el mismo archivo, dejando pequeñas cantidades de datos esparcidos por el vasto vacío.
Si bien esto puede ser útil, hay dos inconvenientes.
La primera es que el archivo se fragmentará, que es lo que le preocupaba.
La segunda es que no todos los programas manejan bien estos archivos. P.ej. algún software de copia de seguridad intentará hacer una copia de seguridad del vacío y, por lo tanto, crear una copia de seguridad que sea mucho más grande de lo necesario, posiblemente también grande para el medio de copia de seguridad.