Créer fichier de SWAP sur partition NTFS

lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022 - Modifié le 3 nov. 2022 à 18:07
mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023 - 10 nov. 2022 à 10:04

Bonjour à tou.te.s :D,

Sur un ordinateur portable en dual-boot Windows 7/Linux, je souhaiterais dédier une partition de 12GB (le PC possède 4GB de RAM) qui contiendrait le fichier d'échange SWAP du système en cours (pas les 2 en même temps => gain de place).

J'ai créé une partition NTFS, son dossier de montage /swap et ajouté une entrée à /etc/fstab pour monter automatiquement la partition. Tout marche nickel !

J'essaye maintenant de créer le fichier SWAP avec ntfsfallocate :

root@host:~#

ntfsfallocate -l 8G /dev/sda6 swapfile
ntfsfallocate v2017.3.23AR.3 (libntfs-3g)
/dev/sda6 is mounted.
ERROR: Refusing to run!
Aborting...

J'ai testé de démonter avant => ERROR: Failed to open file "swapfile"

J'ai testé de faire touch /swap/swapfile avant de re-démonter => "ntfsfallocate completed successfully. Have a nice day."

J'ai alors vérifié que tout allait bien une fois remonté :

root@host:~# ls -hl /swap/swapfile
-rwxrwxrwx 1 root root 0  3 nov.  17:04 /swap/swapfile

=> ben non, le fichier est vide !

Pourtant je peux sans problème faire :

root@host:~# dd if=/dev/zero of=/swap/swapfile bs=1024 count=1048576
1048576+0 enregistrements lus
1048576+0 enregistrements écrits
1073741824 octets (1,1 GB, 1,0 GiB) copiés, 58,2171 s, 18,4 MB/s


root@host:~# ls -lh /swap/swapfile
-rwxrwxrwx 1 root root 1,0G  3 nov.  16:24 /swap/swapfile

=> pré-allocation d'un fichier de 1GB mais avec dd c'est looooong ... alors pour 8GB :( !

Remarque : fallocate sur EXT4 est quasiment instantané

Q1 : Comment feriez vous pour créer ce fichier de SWAP sur une partition NTFS sans passer par dd ?

Q2 : C'est normal le comportement de ntfsfallocate ? Ou alors je n'ai pas compris son fonctionnement ...

Note : j'avais ouvert un autre fil sur le même projet pour faire en sorte que le SWAP soit supprimé à la fermeture de Windows (voir ici), ce que je n'ai pas réussi à faire => tout doit se faire sous Linux

Merci d'avance pour le temps que vous allez me consacrer.

Avec adelphité,

lnj
Linux / Firefox 78.0


A voir également:

5 réponses

lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022 45
Modifié le 8 nov. 2022 à 12:44

Un retour

Comme me l'a suggéré mamiemando (#13), je formate désormais la partition au format SWAP plutôt que gérer par fichier SWAP.

Pour ce faire, j'ai utilisé les déclencheurs (services oneshot) de systemd.

manage_swap.sh

#!/bin/bash

PRT=/dev/sda6

case $1 in
 add)
         mkswap -L "SWAP" $PRT
         swapon $PRT
         ;;
 del)
         swapoff $PRT
         mkfs.ntfs -L "SWAP" -f $PRT &
         pid=$( jobs -p )
         while [[ $( ps xao pid | grep $pid ) ]] ; do true ; done
         ;;      
 *)
         echo "?"
         ;;
esac
chmod +x /data/config/manage_swap.sh

/etc/systemd/system/add_swap.service

Créer le déclencheur au démarrage du système

[Unit]
Description=Add SWAP

[Service]
Type=oneshot
ExecStart=/data/config/manage_swap.sh add

[Install]
WantedBy=multi-user.target

/etc/systemd/system/del_swap.service

Créer le déclencheur avant extinction du système

[Unit]
Description=Del SWAP
DefaultDependencies=no
Before=network.target

[Service]
Type=oneshot
ExecStart=/data/config/manage_swap.sh del

Note 1 : dans le script manage_swap.sh j'ai rencontré une difficulté dans la partie "del" pour m'assurer que le formatage en NTFS soit réellement terminé avant l'extinction finale ; curieusement si on ne le fait pas, la partition de SWAP reste formatée en SWAP Linux et n'est donc pas utilisable sous Windows.

Note 2 : je ne maîtrise pas vraiment l'écriture des fichiers service, je me suis basé sur des exemples que j'ai trouvé ; je pense que ces déclencheurs peuvent être mieux ciblés et optimisés.

J'essayerais de compléter la partie Windows qui doit prévoir que Linux puisse être éteint sauvagement et donc la possibilité que la partition reste formaté en SWAP au boot de Windows qui empêcherait Windows de créer son propre fichier de SWAP.


1
mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023 7 542
8 nov. 2022 à 12:51

Dans le premier script (manage_swap.sh) retire le & en fin de ligne et tu n'auras plus besoin des lignes 13 et 14. L'opérateur & en fin de ligne signifie "lance la commande écrite devant en arrière plan" et continue le reste du script. Si tu retires ce &, alors l'instruction est bloquante jusqu'à ce qu'elle ait fini de s'exécuter.

J'avoue ne pas non plus très bien comprendre pourquoi tu transformes ta partition en swap (à chaque démarrage) puis en NTFS (à chaque extinction). Pourquoi ne pas la laisser tout le temps en swap ? Car en admettant que quand tu redémarres sous windows, si utilises /dev/sda6 pour stocker des fichiers, son contenu sera perdu si tu redémarres sous Linux. C'est un peu étrange...

0
lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022 45 > mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023
Modifié le 8 nov. 2022 à 15:08

Dans le premier script (manage_swap.sh) retire le & en fin de ligne et tu n'auras plus besoin des lignes 13 et 14.

C'est ce que je faisais au début mais quand je bootais sous Windows, la partition était détectée au format RAW (Windows ne sait pas détecter le format SWAP) et donc empêchait la création d'un fichier de SWAP => "Windows a créé un SWAP temporaire en C:". Donc la seule solution que j'ai trouvé est d'être sûr que la partition est bien formatée AVANT que le script ne se termine (je vérifie que le PID lié au processus, n'existe plus).

Note : il faudra que je vérifie, mais je pense que les commandes mkfs s'exécutent en background (détachés) du script ; auquel cas & serait inutile à la fin de la commande puisqu'il est déjà exécuté détaché, MAIS il faut quand même un mécanisme (l 13,14) pour s'assurer qu'on éteint pas AVANT que le formatage soit effectif.

J'avoue ne pas non plus très bien comprendre ...

Windows alloue un espace de SWAP qui prend de la place (dans mon cas 6GB pour 4GB de RAM), Linux fait de même. Vu que j'utilise soit l'un, soit l'autre, pourquoi ne pas utiliser le même espace.

En plus, le fait de mettre le SWAP Windows sur une partition dédiée évite tous les problèmes dus à la fragmentation de fichiers sur la partition système (ce qui fait qu'on ne peut pas la réduire par exemple).

=> gain de place + fragmentation confinée

Nota 1 : oui je sais, à notre ère les disques de xxTB sont monnaie courante chez l'épicier du coin et ce qui était un problème avant ne l'est plus aujourd'hui, mais je trouve dommage de perdre de l'espace quand on peut le conserver pour autre chose.

Nota 2 : je pense qu'il y aura quelques problèmes de performance en utilisant la dernière partition sur un disque à plateaux (pas avec un SSD), car j'ai lu à plusieurs reprises qu'il était préférable de mettre la partition de SWAP Linux au début du disque

Car en admettant que quand tu redémarres sous windows, si utilises /dev/sda6 pour stocker des fichiers, son contenu sera perdu si tu redémarres sous Linux.

Je veux une partition dédiée au SWAP, donc il n'y aura rien d'autre dessus ;)

0
mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023 7 542 > lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022
8 nov. 2022 à 15:12

Ah je viens de comprendre, tu veux réserver cette espace comme fichier d'échange tantôt pour windows, tantôt pour Linux. Et effectivement, Windows utilise traditionnellement un fichier (stocké sur un système de fichier NTFS) alors que Linux utilise une partition dédiée au format swap.

Nota 1 : oui je sais, à notre ère les disques de xxTB sont monnaie courante chez l'épicier du coin et ce qui était un problème avant ne l'est plus aujourd'hui, mais je trouve dommage de perdre de l'espace quand on peut le conserver pour autre chose.

Oui mais là tu vas davantage solliciter ton disque, puisque tu vas reformater à chaque fois cet espace. Et si ton disque fait déjà quelques centaines de Go, ce n'est pas un drame de ne pas mutualiser ces deux espaces :-) Après pour la beauté de la science, pourquoi pas :-)

Nota 2 : je pense qu'il y aura quelques problèmes de performance en utilisant la dernière partition sur un disque à plateaux (pas avec le SSD), car j'ai lu à plusieurs reprises qu'il était préférable de mettre la partition de SWAP Linux au début du disque

Possible, même si je n'ai jamais entendu parlé de cette recommandation.

0
lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022 45 > mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023
Modifié le 8 nov. 2022 à 17:56

Oui mais là tu vas davantage solliciter ton disque, puisque tu vas reformater à chaque fois cet espace.

Ce sont des formatages rapides (<10s) et si je ne me trompe pas, ça ne fait que dire au FS que tout l'espace est disponible.

Et si ton disque fait déjà quelques centaines de Go, ce n'est pas un drame de ne pas mutualiser ces deux espaces

En dehors du gain de place, c'est quand même pratique sous Windows de confiner dans une autre partition car ça simplifie énormément les tâches de défragmentation, réduction de volume, etc. parce qu'on n'est pas sous Linux, c'est Windows qui décide (sûrement une contrainte technologique du formatage NTFS). Sous Linux tu peux créer, supprimer, recréer à ta guise un SWAP sans avoir à redémarrer, Windows impose le reboot et le fichier de SWAP est créé pendant le boot.

Mais on peut vivre sans, je suis d'accord avec toi ;)

0
mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023 7 542 > lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022
10 nov. 2022 à 10:04

Ce sont des formatages rapides (<10s) et si je ne me trompe pas, ça ne fait que dire au FS que tout l'espace est disponible.

En fait, c'est plus l'usure du disque et la consommation d'énergie (certes mineure mais existante) nécessaire pour gagner quelques gigaoctets que je remets en question, plus que le nécessaire à chaque formatage. Mais bon ça reste effectivement une tâche bien moins coûteuse par exemple qu'une défragmentation.

En dehors du gain de place, c'est quand même pratique sous Windows de confiner dans une autre partition car ça simplifie énormément les tâches de défragmentation, réduction de volume, etc. parce qu'on n'est pas sous Linux, c'est Windows qui décide (sûrement une contrainte technologique du formatage NTFS). Sous Linux tu peux créer, supprimer, recréer à ta guise un SWAP sans avoir à redémarrer, Windows impose le reboot et le fichier de SWAP est créé pendant le boot.

La défragmentation est à mon sens moins utile sous Windows de nos jours qu'elle ne l'était par le passé, car comme tu le soulignais, les disques de nos jours sont tellement grands qu'on n'a plus vraiment de problème d'espace disque. Et du coup, ça n'est pas bien grave si une partition ntfs est fragmentée. Personnellement, ça fait bien longtemps que je ne m'embête plus avec ça :-)

Ceci étant dit, j'entends tes arguments et respecte tes choix, donc tu fais comme tu le sens, mon message est juste un avis que tu es bien entendu libre d'ignorer :-)

0
mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023 7 542
Modifié le 3 nov. 2022 à 19:47

Bonjour,

Je te recommande de suivre ce tutoriel pour créer de la swap sur un système de fichier arbitraire. C'est d'ailleurs peut être celui que tu as utilisé.

Ensuite, je ne pense pas que l'étape avec dd soit indispensable. Cette étape sert juste à écraser toute trace des données présentes sur cet espace disque. Mais en réalité, les zones concernées n'ont pas besoin d'être réinitialisées à 0 pour être utilisables.

À tester, mais concernant ntfsfallocate, je pense qu'il faut :

  1. Monter la partition (disons dans /media/windows)
  2. Créer le fichier vide
  3. Démonter la partition
  4. Utiliser ntfsfallocate, car maintenant, le fichier cible a un inode dans le système de fichiers NTFS

Attention : Prends le temps de comprendre chaque commande, de t'assurer de savoir ce que tu fais, et de vérifier que les paramètres sont bien les bons dans ton cas de figure, car sinon tu risques d'écraser des données de manières irréversibles !). Une fois cet avertissement pris en compte, voici à quoi ça devrait ressembler :

sudo mkdir -p /media/windows
sudo mount /dev/sda6 /media/windows
sudo mkdir /media/windows/swap
sudo touch /media/windows/swap/swapfile
sudo umount /media/windows
sudo ntfsfallocate -l 8G /dev/sda6 swap/swapfile
sudo mount /dev/sda6 /media/windows
sudo dd if=/dev/null of=/media/windows/swap/swapfile bs=100M
ls -sh /media/windows/swap/swapfile

Remarque : Le paramètre bs de la commande dd permet d'accélérer la vitesse (après il faut que le disque suive). Plus de détails sur cette discussion.

Bonne chance

0
lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022 45
Modifié le 3 nov. 2022 à 19:26

Coucou mamiemando ;)

Je te recommande de suivre ce tutoriel pour créer de la swap sur un système de fichier arbitraire. C'est d'ailleurs peut être celui que tu as utilisé.

En FR ça marche aussi ;) (je n'ai pas regardé dans le détail, mais ça à l'air d'être le même)

Ensuite, je ne pense pas que l'étape avec dd soit indispensable. Cette étape sert juste à écraser toute trace des données présentes sur cet espace disque. Mais en réalité, les zones concernées n'ont pas besoin d'être réinitialisées à 0 pour être utilisables.

Je pense comme toi, mais dans mon cas c'était la seule méthode que j'ai trouvé pour créer un fichier pré-alloué sur une partition NTFS

Utiliser ntfsallocate, car maintenant, le fichier cible a un inode dans le système de fichiers NTFS

...

Attention : je me suis fait avoir c'est ntfsfallocate et NON ntfsallocate (comme la commande fallocate ; le f devant être pour "file")

sudo mkdir -p /media/windows
...
ls -sh /media/windows/swap/swapfile

 J'ai appliqué à la lettre tes commandes (en dehors de ntfsfallocate - voir dessus) :

root@host:~# mkdir -p /media/windows
root@host:~# mount /dev/sda6 /media/windows
root@host:~# mkdir /media/windows/swap
root@host:~# touch /media/windows/swap/swapfile
root@host:~# umount /media/windows
root@host:~# ntfsfallocate -l 8G /dev/sda6 swap/swapfile
ntfsfallocate v2017.3.23AR.3 (libntfs-3g)
ntfsfallocate completed successfully. Have a nice day.
root@host:~# mount /dev/sda6 /media/windows
root@host:~# ls -l /media/windows/swap
total 0
-rwxrwxrwx 1 root root 0  3 nov.  19:00 swapfile

=> Même résultat ! Elle est cassée cette commande ou quoi ? Tu es sûre qu'elle marche pour toi ?

Note : je n'ai pas retesté dd qui marche déjà, en plus comme tu l'as dis, ça ne sert pas à pré-allouer le fichier mais à en supprimer le contenu.

0
mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023 7 542 > lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022
Modifié le 3 nov. 2022 à 19:54

Bonjour,

ntfsfallocate

  • Ah oui effectivement, j'ai corrigé mon message en conséquence.

Même résultat ! Elle est cassée cette commande ou quoi ? Tu es sûre qu'elle marche pour toi ?

  • Je ne l'ai pas testée, mais je pense que vu qu'officiellement la commande ne fait que réserver de la place, ce n'est pas la taille effective du fichier. C'est un peu comme comparer std::vector::reserve et std::vector::resize (pardonne-moi si tu n'as pas la référence C++). Du coup tant que tu ne "remplis" pas le fichier (disons avec dd), ça ne m'étonne pas que le fichier ne semble pas avoir grossi.
  • Tiens d'ailleurs cette discussion suggère de nombreuses commandes pour créer un fichier rempli de 0 (dont truncate). Peut-être que ce sera plus rapide dans ton cas.

Note : je n'ai pas retesté dd qui marche déjà, en plus comme tu l'as dis, ça ne sert pas à pré-allouer le fichier mais à en supprimer le contenu.

  • La commande dd ne supprime pas réellement, elle recopie octet par octet un flux d'entrée vers un flux de sortie. Si tu voulais supprimer le contenu d'un fichier, ce serait plutôt : echo "" > fichier

Bonne chance

0
lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022 45 > mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023
Modifié le 3 nov. 2022 à 20:53

Tiens d'ailleurs cette discussion suggère de nombreuses commandes pour créer un fichier rempli de 0 (dont truncate). Peut-être que ce sera plus rapide dans ton cas.

J'étais tout content de voir que truncate avait un comportement similaire à fallocate (à savoir c'était immédiat) et j'allais te remercier quand je me suis rendu compte de ceci :

root@host:~# swapon /swap/swapfile
swapon: /swap/swapfile : droits 0777 non sûrs, 0600 conseillées.
swapon: /swap/swapfile : ignoré — semble avoir des trous.

=> truncate provoque donc des trous dans le fichier SWAP et d'ailleurs fallocate peut aussi en créer (la rubrique NOTES man de swapon indique explicitement qu'il ne faut pas utiliser fallocate), pourtant il est souvent indiqué dans les procédures de création de fichier SWAP.

=> je vais encore creuser comment créer un fichier sans trous mais mon projet de mutualiser l'espace du SWAP entre 2 systèmes semble tomber à l'eau (ça me semblait tellement simple dans le principe).

Et commencer par comprendre ce que sont les trous dans les fichiers ...

0
mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023 7 542 > lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022
4 nov. 2022 à 10:02

D'après cette discussion et cette discussionfilefrag pourrait limiter le problème. La commande filefrag suggère que le problème est lié à de la fragmentation. Du coup, je me dis que si tu défragmentais ton système de fichier NTFS avant de créer ton fichier swap/swapfile, cela pourrait éviter le problème (en gros, il y aurait directement 8Go adjacents pour créer ton fichier swap/swapfile). Ensuite, je suspecte que l'intérêt de dd est précisément d'obliger le système de fichiers sous-jacent à utiliser tous les blocs déclarés (et donc, éviter le phénomène de trous).

0
lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022 45 > mamiemando Messages postés 32123 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 février 2023
5 nov. 2022 à 23:47

Je tiens à repréciser que l'objectif est que la création du SWAP soit transparente pour l'utilisateur et que ça ne ralentisse pas le démarrage.

Ceci étant ta réponse m'a donné l'idée de carrément formater en rapide (quasi instantané) avant :

mkfs.ntfs -L "SWAP" -f /dev/sda6

Mais avec truncate :

root@host:~# swapon /swap/swapfile
swapon: /swap/swapfile : droits 0777 non sûrs, 0600 conseillées.
swapon: /swap/swapfile : ignoré — semble avoir des trous.

Et avec ntfsfallocate :

root@host:~# mkswap /swap/swapfile
mkswap: erreur : la zone d'échange (swap) doit être d'au moins 40 Kio

Mais je pense que c'est une voie prometteuse.

Note : j'ai aussi testé la commande mkfs.ntfs en formatage normal, avec le même résultat

0

Bonjour,

Précisions sur les comportements de truncate et ntfsfallocate :

En cas d'augmentation importante de taille, ces deux commandes créent un trou en fin de fichier ("sparse file"). Ce trou apparaît comme une suite de zéros qui n'existent pas sur disque. Toutefois ntfsfallocate alloue et réserve l'espace du trou, alors que truncate ne le réserve pas.

Dans le cas de ntfsfallocate, lorsqu'on écrit dans le trou, l'espace entre l'ancienne fin de fichier, et le début de la nouvelle zone d'écriture est réellement mis à zéro, ce qui n'est pas le cas après truncate. Cela a un effet sur la durée des premières écritures après ntfsfallocate, et on peut forcer une réelle mise à zéro initiale du trou en allongeant le fichier (du genre echo X >> /media/windows/swap/swapfile).

0
lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022 45
Modifié le 6 nov. 2022 à 01:06

Salut swap :D ;)

En cas d'augmentation importante de taille, ces deux commandes créent un trou en fin de fichier

 J'avoue ne pas comprendre le sens de cette phrase. Quand on utilise ces commandes il y a nécessairement augmentation, non ?

Ce trou apparaît comme une suite de zéros qui n'existent pas sur disque. Toutefois ntfsfallocate alloue et réserve l'espace du trou, alors que truncate ne le réserve pas.

Comme je le comprend, c'est dans les méta-données (tables du système de fichiers ?) qu'il y a un mécanisme qui évite d'avoir à physiquement écrire sur le support qui est interrogé quand un programme a besoin de place. C'est pas clair pour moi tout ça !

Aussi je ne suis pas sûr de la différence entre allouer et réserver un espace. Je suppose que réserver c'est demander à obtenir un espace et allouer c'est réellement l'obtenir, c'est bien ça ?

Dans le cas de ntfsfallocate, lorsqu'on écrit dans le trou, l'espace entre l'ancienne fin de fichier, et le début de la nouvelle zone d'écriture est réellement mis à zéro, ce qui n'est pas le cas après truncate. Cela a un effet sur la durée des premières écritures après ntfsfallocate, et on peut forcer une réelle mise à zéro initiale du trou en allongeant le fichier (du genre echo X >> /media/windows/swap/swapfile).

Pas tout compris ! Pourrais tu développer s'il te plaît avec un exemple concret ? En tout cas j'ai testé echo X >> sur le swapfile mais sans résultat

0

> Quand on utilise ces commandes il y a nécessairement augmentation, non ?

Oui, mais cela ne veut pas dire qu'un espace a été réservé sur disque. Les systèmes de fichier peuvent donner l'impression qu'il y a des zéros sans pour autant mettre ces zéros quelque part sur disque. C'est qu'on appelle un trou (hole), le fichier devient alors un "sparse file".

Comme je le comprend, c'est dans les méta-données (tables du système de fichiers ?) qu'il y a un mécanisme qui évite d'avoir à physiquement.

Oui, et dans ce cas l'allocation (c'est-à-dire l'attribution d'un espace sur le disque) n'est faite qu'en cas d'écriture dans le trou. Le trou est alors partiellement bouché, mais il peut rester des trous des deux côtés de l'espace qui est alors réservé.

fallocate et ntfsfallocate font des trous spéciaux qui sont réservés sur disque, mais dont les zéros ne sont pas écrits. Ces trous spéciaux ne peuvent exister qu'en fin de fichier.

Exemples (je ne l'ai pas testé). Noter que les zones allouées se font par clusters entiers (souvent 4096 octets).

1) création d'un fichier presque vide :

echo > fichier

A ce stade "du fichier" donne une petite valeur (par exemple 4) car un seul bloc a été alloué

2) allongement à 64k, sans allouer d'espace complémentaire

truncate -s 65536 fichier

A ce stade "du fichier" donne encre une petite valeur car peu de blocs supplémentaire n'ont été alloués, mais le fichier donne l'impression de contenir 65536 octets. Il peut y avoir un changement de représentation du fichier conduisant à une petite allocation complémentaire.

3) écriture de azerty au milieu du trou :

echo azerty | dd of=fichier bs=1024 seek=32 conv=notrunc count=1

A ce stade le fichier a un peu d'espace alloué au début et au milieu avec des trous entre les deux zones et à la fin. "du fichier" va donc encore augmenter un peu.

4) réservation d'espace en fin de fichier :

fallocate -o 65536 -l 65536 fichier

Au-delà de l'espace antérieur (avec deux trous), 65536 octets ont été réservés et donnent l'impression de contenir des zéros. Comme cet espace est réservé, la valeur de "du fichier" augmente de 64. Toutefois ces zéros n'ont pas été écrits.

5) écriture au-delà du trou en fin de fichier

echo X >> fichier

Comme l'espace du trou final a été réservé, le système de fichiers est cette fois obligé de mettre la totalité de ce trou à zéro. Ce n'est pas le cas des deux premiers trous, car ils n'ont pas été réservés.

NB ntfsfallocate fonctionne à peu près comme fallocate, mais il est spécifique aux fichiers sur partition ntfs non montés.

NB2 ne pas confondre une partition swap avec un fichier swap. La commande mkfs.ntfs crée une partition ntfs, pas une partition (ou un fichier) de swap.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lenainjaune Messages postés 550 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 13 décembre 2022 45
Modifié le 6 nov. 2022 à 15:28

@swap

Merci pour les éclaircissements.

Je vais étudier et tester précisément ce que tu dis ici (je me rends compte que j'ai des lacunes sur le sujet), mais si je lis entre les lignes ce que tu ne dis pas franchement, c'est que ce que je veux faire c'est impossible puisqu'il faut que la zone soit complètement allouée, donc remplie de zéros, donc passer par dd (ce qui rallongerait drastiquement le temps de démarrage).

Q1 : C'est bien ça ? Sinon comment ferais-tu pour créer un fichier de swap SANS trous sans passer par dd ?

Dans le commentaire #7 je teste le formatage de la partition (le formatage rapide ou complet donne le même résultat) avant d'utiliser truncate. En toute logique le système de fichier de la partition a tout l'espace disponible, donc pas de fragmentation possible et pourtant le fichier créé a quand même des trous.

Q2 : Comment ça se fait ?

Excuses-moi d'insister mais :

Q3 : Si le système de fichiers sait qu'un programme a besoin d'un espace continu de A à B, s'il n'a pas à gérer une quelconque fragmentation, qu'est ce qui l'empêche de le faire sans avoir à physiquement remplir cet espace de zéros ?

J'ai l'impression que dans mon cas, dd fait des choses en trop de ce qu'il devrait faire (et ça se traduit par une perte de temps). Un peu comme le formatage rapide et complet : le "rapide" prend quelques secondes car il y a juste à modifier les méta-données dans le système de fichiers, le "complet" prend tout le temps nécessaire pour remplir de zéros chaque blocs du disque (je peux me tromper de cible).

NB ntfsfallocate fonctionne à peu près comme fallocate, mais il est spécifique aux fichiers sur partition ntfs non montés.

Q4 : Tu sais pourquoi l'outil ntfsfallocate fonctionne hors montage (je trouve ce mécanisme aberrant) ?

NB2 ne pas confondre une partition swap avec un fichier swap. La commande mkfs.ntfs crée une partition ntfs, pas une partition (ou un fichier) de swap.

Il y a méprise, je ne veux pas créer de partition de swap mais une partition qui contienne un fichier de swap (formaté avec mkswap) et ce pour pouvoir partager cet espace entre systèmes dans un multiboot et gagner de la place (voir mon 1er post).


0