Un fichier peut-il être enregistré non séquentiellement sur le disque ? Je veux dire, une partie du fichier se trouve sous l'adresse physique X et l'autre partie sous l'adresse physique Y qui n'est pas proche de X + offset).
Oui; ceci est connu sous le nom de fragmentation de fichiers et n'est pas rare, en particulier avec des fichiers plus volumineux. La plupart des systèmes de fichiers allouent de l'espace selon les besoins, plus ou moins séquentiellement, mais ils ne peuvent pas deviner le comportement futur - donc si vous écrivez 200 Mo dans un fichier, puis ajoutez 100 Mo supplémentaires, il y a une chance non nulle que les deux ensembles de données soient être stocké dans différentes zones du disque (essentiellement, toute autre écriture nécessitant plus d'espace sur le disque, survenant après la première écriture et avant la seconde, pourrait se situer entre les deux). Si un système de fichiers est presque plein, la situation sera généralement pire :il se peut qu'il n'y ait pas de zone contiguë d'espace libre suffisamment grande pour contenir un nouveau fichier, il devra donc être fragmenté.
Puis-je contrôler d'une manière ou d'une autre la séquentialité des fichiers ? Je souhaite allouer un gros fichier de 10 Go. Je veux qu'il soit séquentiel sur le disque et non divisé entre différents décalages.
Vous pouvez indiquer au système de fichiers la taille cible de votre fichier lors de sa création; cela aidera le système de fichiers à le stocker de manière optimale. De nombreux systèmes de fichiers modernes utilisent une technique connue sous le nom d'allocation différée, dans laquelle la disposition sur disque d'un nouveau fichier est calculée le plus tard possible, afin de maximiser les informations disponibles lorsque le calcul est effectué. Vous pouvez aider ce processus en utilisant le posix_fallocate(3)
pour indiquer au système de fichiers combien d'espace disque doit être alloué au total. Les systèmes de fichiers modernes essaieront d'effectuer cette allocation de manière séquentielle.
Agit-il différemment entre les différents types ?
Différents systèmes de fichiers se comportent différemment, oui. Les systèmes de fichiers basés sur les journaux tels que NILFS2 n'allouent pas le stockage de la même manière que les systèmes de fichiers basés sur l'étendue tels que Ext4, et ce n'est qu'un exemple de variation.
La commande filefrag
vous indiquera comment votre fichier est physiquement stocké sur votre appareil :
# 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 vous écrivez votre fichier en une seule passe, je suppose que votre fichier ne sera pas fragmenté.
La page de manuel de fallocate
(1) est assez clair :
fallocate
est utilisé pour préallouer des blocs à un fichier. Pour les systèmes de fichiers qui supportent lefallocate
appel système, cela se fait rapidement en allouant des blocs et en les marquant comme non initialisés, ne nécessitant aucune entrée/sortie sur les blocs de données. C'est beaucoup plus rapide que de créer un fichier en le remplissant de zéros.Depuis le noyau Linux v2.6.31, le
fallocate
L'appel système est pris en charge par les systèmes de fichiers btrfs, ext4, ocfs2 et xfs.
Est-ce séquentiel ? Le système essaiera d'abord d'allouer les blocs de manière séquentielle. S'il ne le peut pas, il ne vous avertira pas.
Vous mentionnez des fichiers fragmentés et aucune des autres réponses ne les a mentionnés.
La plupart des fichiers ne sont pas clairsemés. La façon la plus courante de créer un fichier est de tout écrire en une seule fois, du début à la fin. Pas de trous ici.
Cependant, vous êtes autorisé à dire "passez à la position 1 000 000 000 000 et écrivez un octet à cet endroit". Cela créera un fichier qui ressemble à un étaoctet, mais qui n'utilise (probablement) que 4k sur le disque. Il s'agit d'un fichier clairsemé.
Vous pouvez le faire plusieurs fois pour le même fichier, laissant de petites quantités de données éparpillées dans le vaste vide.
Bien que cela puisse être utile, il y a deux inconvénients.
La première est que le fichier sera fragmenté, ce qui vous inquiète.
La seconde est que tous les programmes ne gèrent pas bien ces fichiers. Par exemple. certains logiciels de sauvegarde essaieront de sauvegarder le vide et créeront ainsi une sauvegarde beaucoup plus importante que nécessaire, peut-être trop gros pour le support de sauvegarde.