Depuis la version 10.2, Mac OS X dispose d’un mécanisme particulier et intéressant pour la gestion des partitions. Ce dossier va expliquer pourquoi il faut l’utiliser, comment, et montrer les manipulations pour déplacer sur une autre partition les comptes utilisateurs ou le swap.
Depuis la version 10.2, Mac OS X dispose d’un mécanisme particulier et intéressant pour la gestion des partitions. Ce dossier va expliquer pourquoi il faut l’utiliser, comment, et montrer les manipulations pour déplacer sur une autre partition les comptes utilisateurs ou le swap.
Pour les utilisateurs de versions précédentes de Mac OS X, vous pouvez me contacter pour obtenir le kit namedFS.
Pour comprendre les risques de l’utilisation du mode de gestion automatique, il faut comprendre comment fonctionne Mac OS X. Il y a deux niveaux pour la gestion des partitions :
Le premier point correspond à la création des fichiers de périphériques dans le dossier /dev/
. Les disques sont nommés selon leur ordre de chargement. Ainsi, le disque /dev/disk0
est le premier disque chargé au démarrage, le disque /dev/disk1
est le deuxième, etc…
Dans le mode de gestion automatique, le deuxième point correspond à la création du point de montage au nom du volume dans le dossier /Volumes/
.
Le premier problème que l’on peut rencontrer est que le nom du dossier dans /Volumes/
n’est pas forcément toujours le même. (un volume « Données », par exemple, peut, sous certaines conditions être monté sur /Volumes/Données 1
et apparaître tout de même dans le Finder en tant que « Données »). Cela peut se produire quand un dossier du même nom existe déjà dans /Volumes/
(soit parce-qu’un volume du même nom est déjà monté, soit parce-que, suite à un plantage, le dossier n’avait pas été effacé la fois d’avant).
À cause de ça, on ne peut pas se baser de manière fiable sur ce point de montage automatique lorsque le chemin d’accès est important (utilisation du volume pour les comptes utilisateurs, pour les fichiers de swap, dans des scripts…).
Il faut donc utiliser le fichier /etc/fstab
pour définir un point de montage fixe pour notre volume.
Le problème alors, c’est qu’on ne peut être sûr, lorsque l’on a plusieurs disques, que /dev/disk0
(ou autre) représente toujours le même disque. Pour vérifier ce comportement, voici un essai simple :
df
. Vous verrez alors la liste des partitions montées.df
. Notez le nom des partitions relatives au CD (dans la première colonne).df
et constatez que les noms des partitions du CD ont changé.Avec plusieurs disques, l’ordre de chargement n’est absolument pas déterministe. Donc, les noms que l’on donne dans le fichier /etc/fstab ne sont pas forcément les bons noms. Cela peut amener à des gros problèmes où on se retrouve avec des points de montage qui n’ont pas les bonnes partitions montées.
On ne peut donc utiliser les noms de périphériques de la forme /dev/diskXsY dans fstab car ils peuvent changer d’un démarrage à l’autre.
On peut mettre dans le fichier /etc/fstab
des informations complémentaires. Ceci est géré par la commande autodiskmount
dans Mac OS X 10.2 et par le démon diskarbitrationd
dans Mac OS X 10.3 et 10.4. On peut ainsi définir des partitions en fonction de leur nom de volume ou en fonction d’un identifiant unique de partition.
Il faut créer un fichier /etc/fstab
avec votre éditeur de texte préféré (VI, TextEdit ou BBEdit par exemple). Attention toutefois si vous utilisez TextEdit à bien sauver votre fichier au format texte et non au format RTF. Ce fichier contient les descriptions des points de montage des partitions.
Il faudra ensuite vérifier que ce fichier appartient bien à l’utilisateur « system ». Pour cela, dans le Finder, dans le menu « Aller » sélectionnez l’élément « Aller au dossier… » et tapez /etc
.
Dans la fenêtre qui s’ouvre, sélectionnez le fichier fstab
et affichez la fenêtre d’informations sur le fichier (raccourci clavier Pomme-i). Dans cette fenêtre, cliquez sur le triangle de la ligne « Possesseur et autorisations : ». Si le possesseur n’est pas « system », vous devez le changer.
Pour changer le possesseur, il suffit de déverrouiller le cadenas situé à côté du nom du possesseur en cliquant dessus. (vous pouvez aussi le faire par la commande sudo chown root /etc/fstab
)
Le tag LABEL permet de définir le point de montage en fonction du nom de volume. Cela est utile pour des disques de sauvegarde par exemple. En effet, si vous avez plusieurs disques de sauvegarde que vous inter-changez de temps en temps, il faut, pour simplifier les scripts de sauvegarde, que tous les disques de sauvegardes soient montés sur le même point de montage. Vous nommerez alors vos disques « Sauvegarde » et vous mettrez le tag label sur le nom « Sauvegarde ».
Le tag LABEL se présente dans le fichier fstab sous la forme suivante :
LABEL=NomVolume PointDeMontage type mode
NomVolume
est le nom de volume de la partition (qui apparaît dans le Finder)PointDeMontage
est le dossier où vous voulez monter la partitiontype
est le type de la partition (hfs ou ufs)mode
est le mode de montage de la partition (rw pour read/write, ro pour read-only)Il se peut que vous ayez plusieurs volumes de même nom. Dans ce cas là, la solution proposée ci-dessus ne marchera pas comme prévue. Apple y a pensé et propose une solution : un identifiant unique de partition, l’UUID (Universal Unique IDentifier).
Cet identifiant est unique pour chaque partition et il est donc impossible qu’il puisse y avoir un problème pour trouver la partition voulue.
Voici la démarche à suivre pour définir un UUID :
/etc/fstab
C’est en fait le nom de la forme diskXsY. Pour cela, dans le Terminal, tapez la commande /usr/sbin/disktool -l
. Le premier champ entre parenthèses indique l’identifiant temporaire de la partition, le deuxième indique le point de montage actuel de la partition, le troisième indique le type de la partition et le dernier le nom du volume :
Alumousse:~> disktool -l
***Disk Appeared ('disk0',Mountpoint = '', fsType = '', volName = '')
***Disk Appeared ('disk0s1',Mountpoint = '', fsType = '', volName = '')
***Disk Appeared ('disk0s3',Mountpoint = '/Volumes/Data', fsType = 'ufs', volName = 'Data')
***Disk Appeared ('disk0s5',Mountpoint = '/', fsType = 'hfs', volName = 'Tiger')
***Disk Appeared ('disk0s7',Mountpoint = '/Volumes/Archives', fsType = 'hfs', volName = 'Archives')
***Disk Appeared ('disk0s9',Mountpoint = '/Lynx', fsType = 'hfs', volName = 'Docs')
L’identifiant du volume Docs est donc disk0s9, et son type est HFS (HFS+, en fait, mais disktool ne fait pas la différence). Par contre, le volume Data (disk0s3) est de type UFS.
Pour Mac OS X 10.2 seulement (depuis Mac OS X 10.3, toutes les partitions ont automatiquement un UUID d’attribué, vous pouvez cependant l’écraser et en créer un nouveau en suivant cette même procédure).
Pour pouvoir générer un UUID, il faut que la partition ne soit pas utilisée. Nous allons donc « démonter » la partition. Attention, pour pouvoir démonter un volume, aucun fichier ni aucune application ne doit être ouvert sur ce volume. La seule manière fiable est de le faire depuis le Terminal : sudo diskutil unmount <i>id_partition</i>
Alumousse:~> sudo diskutil unmount disk0s9
Volume disk0s9 unmounted
Alumousse:~> sudo diskutil unmount disk0s3
Volume disk0s16 unmounted
Depuis Mac OS X 10.3, vous pouvez également le faire avec « Utilitaire de Disque », mais il a la fâcheuse manie d’essayer de démonter tous les volumes d’un disque lorsqu’on veut en démonter qu’un seul.
Pour générer un UUID, la commande diffère suivant le type de partition. Pour une partition de type HFS+, la commande à lancer est hfs.util
tandis que pour une partition UFS, c’est ufs.util
. L’option à utiliser est -s
.
Alumousse:~> sudo /System/Library/Filesystems/hfs.fs/hfs.util -s disk0s9
Alumousse:~> sudo /System/Library/Filesystems/ufs.fs/ufs.util -s disk0s3
Les commandes à utiliser pour lire l’UUID sont hfs.util
et ufs.util
, avec l’option -k
. Cependant, l’affichage de l’UUID ne se termine pas par un retour à la ligne, il est donc préférable de faire afficher une ligne vide après la commande (en rajoutant « ;echo » à la fin de la ligne) :
Alumousse:~> sudo /System/Library/Filesystems/hfs.fs/hfs.util -k disk0s9 ;echo
864E0B743DB37A48
Alumousse:~> sudo /System/Library/Filesystems/ufs.fs/ufs.util -k disk0s3 ;echo
A589585BF578DEBB
Notez l’UUID en faisant attention à ne pas vous tromper.
/etc/fstab
Le tag UUID se présente dans le fichier fstab sous la forme suivante :
UUID=NumeroUUID PointDeMontage type mode
NumeroUUID
est l’UUID noté plus hautPointDeMontage
est le dossier où vous voulez monter la partitiontype
est le type de la partition (hfs ou ufs)mode
est le mode de montage de la partition (rw pour read/write, ro pour read-only)Un redémarrage vous permettra de vérifier que les montages sont corrects.
Avant tout, je tiens à rappeler quelques points. La première, c’est qu’il n’est pas possible, sous Mac OS X, de gérer une partition de swap proprement dite, mais uniquement une partition dédiée aux fichiers de swap. L’intérêt de déplacer le fichier de swap sur une autre partition est limité et cela reste risqué. Risqué parce qu’on court toujours le risque de sous-estimer la taille de la partition. Ensuite, il y a un intérêt à avoir les fichiers de swap sur une partition dédiée que si cette partition se trouve sur un autre disque que le disque système et que le disque de données, et que ce disque est au moins aussi rapide que le disque système.
Si vous êtes vraiment sûr de vouloir déporter le fichier de swap, il faut savoir que les disques ne sont montés qu’après l’activation de la mémoire virtuelle car ils ne sont montés qu’au lancement de autodiskmount
ou diskarbitrationd
. En effet, même si les pages man de fstab et de mount disent que mount devrait gérer le fichier fstab correctement, depuis Mac OS X 10.2, Apple n’a toujours pas mis à jour mount pour qu’il gère les tags LABEL et UUID.
Il existe des solutions de contournement, mais il est peu fiable de les utiliser car les modifications que l’on doit faire dans le fichier /etc/rc peuvent être effacées lors d’une mise à jour système (et créer des situations ou le swap crée un fichier sur une partition et le modifie sur une autre…….). La seule solution fiable serait de faire un StartupItem qui lancerait le swap et qui vérifierait, en modifiant si nécessaire le fichier /etc/rc pour que celui-ci ne lance pas lui-même le swap (en forçant un redémarrage en cas de modification automatique du fichier /etc/rc). Étant donné l’intérêt tout de même limité du swap déporté, je ne fournis pas ici de StartupItem pour faire ceci, mais je peux aider ceux qui sont intéressés à en écrire un.
Pour ceux qui veulent absolument déporter le swap sur une autre partition et ne pas tenter de faire un StartupItem, voici les solutions de contournement pour Mac OS X 10.2 et 10.3 (je n’ai pas trouvé de moyen simple autre que le startupitem pour le 10.4) :
Il suffit de modifier le fichier /etc/rc
pour faire appel à autodiskmount.
Commencez par faire une copie de sauvegarde du fichier :
sudo cp /etc/rc /etc/rc.bak
Ce qui vous permettra de revenir à un état normal en faisant l’opération inverse à celle décrite ci-dessous si vous rencontrez des problèmes.
Ensuite, ouvrez le fichier /etc/rc
dans votre éditeur de texte favori (attention, ce fichier doit être édité avec les droits root).
Cherchez les lignes commençant par mount -vat
. Après ce bloc de 4 lignes, juste après la ligne commençant par mkdir
, insérez une ligne contenant uniquement /sbin/autodiskmount -va
:
...
mount -vat hfs
mount -vat ufs
mount -t fdesc -o union stdin /dev
mkdir -p -m 0555 /.vol && chmod 0555 /.vol && mount_volfs /.vol
/sbin/autodiskmount -va
...
Une fois la modification effectuée, vous pouvez redémarrer.
Il suffit également de modifier le fichier /etc/rc
.
Commencez par faire une copie de sauvegarde du fichier :
sudo cp /etc/rc /etc/rc.bak
Ce qui vous permettra de revenir à un état normal en faisant l’opération inverse à celle décrite ci-dessous si vous rencontrez des problèmes.
Ensuite, il faut rajouter les lignes suivantes juste avant le lancement de la mémoire virtuelle :
result=`grep -v "^#" /etc/fstab |grep "${swapdir}"`
if [ "${result}RES" != "RES" ]
then
let i=12
while [ $i -ne 0 ]
do
mount |grep "${swapdir}"
if [ $? -eq 0 ]
then
break
fi
echo "Waiting for mounted swap directory... ($i)"
sleep 5
let i=i-1
done
if [ $i -eq 0 ]
then
echo "WARNING : ${swapdir} was not mounted"
fi
fi
Vous pouvez ajouter ces lignes soit avec votre éditeur de texte favori (attention, ce fichier doit être édité avec les droits root, consultez l’article)
Après, vous pouvez redémarrer…
Voici une explication du fonctionnement de ces lignes. Si un montage de $swapdir
est défini dans le fichier fstab
, toutes les 5 secondes pendant une minute (12 fois 5s), on regarde si le montage est effectué et on attend si ce n’est pas le cas. Au bout d’une minute, le démarrage continue sans attendre le montage, ce qui permet d’éviter de bloquer le démarrage si la partition n’est pas disponible. Si vous avez beaucoup de volumes non journalisés et que 1mn ne suffit pas (ce qui devrait être très rare), vous pouvez augmenter la valeur de i pour mettre un chiffre supérieur à 12.
Si vous voulez que le volume correspondant à la partition n’apparaisse pas dans le Finder, il faut modifier les attributs du dossier racine du volume pour le rendre invisible en utilisant les commandes SetFile et GetFileInfo (livrées avec les outils développeurs). Tapez la commande suivante :
sudo /Developer/Tools/SetFile -a V /point/de/montage
Déplacer les dossiers utilisateurs est beaucoup plus utile, et donc plus courant que le déplacement de la mémoire virtuelle. Cependant, il existe plusieurs manière de la faire, plus ou moins simples. Dans tous les cas, il est fortement recommandé d’utiliser la méthode UUID pour faire le montage de la partition.
Sous Mac OS X Server, personnellement, je préfère laisser les comptes locaux (administrateurs) du serveur sur la partition système à leur emplacement standard (/Users/
) et créer un dossier indépendant (par exemple /UsersData/) qui sera défini comme point de montage pour le volume contenant les comptes utilisateurs. Il n’y a aucune difficulté particulière à cela, il faudra juste penser à partager ce « dossier » une fois le montage effectué et sélectionner ce point de partage lors de la création des comptes dans Workgroup Manager.
Sous Mac OS X non serveur, il y a plusieurs possibilités, en fonction de si l’on veut déplacer uniquement un compte ou l’ensemble des comptes actuels et futurs. Avant tout, il faut décider du point de montage de la partition contenant le ou les comptes utilisateurs. Si vous souhaitez que l’ensemble des comptes utilisateurs soient sur la nouvelle partition, le plus simple est alors de faire de /Users le point de montage, mais cela implique de faire quelques manipulations que je vais détailler plus bas. Si c’est juste quelques comptes que vous voulez déporter sur une autre partition, il faudra alors juste créer un dossier indépendant (par exemple /UsersData/) et le définir dans fstab comme point de montage de votre partition.
Pour déplacer tous les comptes actuels sur un autre volume et s’assurer que tous les comptes futurs y seront également créés, le plus simple est d’utiliser le dossier /Users (qui contient les comptes utilisateurs sur le disque système) comme point de montage.
Pour cela, il faut d’abord copier tout le contenu du dossier sur la partition définie (utiliser par exemple ditto pour le faire) :
sudo ditto -rsrc /Users /Volume/NomPartition/
Attention, il est préférable de quitter tout les applications avant de faire cette copie. En effet, si, par exemple, votre logiciel de messagerie est lancé pendant cette copie, vous n’aurez pas une copie à jour de votre base de messagerie…
Une fois la copie effectuée, modifiez le fichier fstab en utilisant le tag UUID pour définir le point de montage /Users pour votre partition puis, tapez les commandes suivantes :
sudo mv /Users /Users.bak
sudo mkdir /Users
sudo chown root:admin /Users
sudo chmod 1775 /Users
sudo shutdown -r now
Cela déplace le dossier utilisateurs actuel dans une copie de sauvegarde, recrée le point de montage à l’identique et redémarre.
Une fois que vous êtes sûr que tout va bien, vous pouvez effacer le dossier /Users.bak .
Il existe, comme toujours, de nombreuses manières de faire, la bonne et les autres. Même si ce n’est pas la meilleure solution, une manière simple de faire est de déplacer le dossier de l’utilisateur sur l’autre volume puis de faire un lien symbolique (on considère que le point de montage de la partition est /UsersData) :
sudo mv /Users/toto /UsersData/toto
sudo ln -s /UsersData/toto /Users
Cette solution peut être utilisée en attendant de le faire de manière propre.
Pour le faire de manière propre, il faudrait indiquer au système que le répertoire de l’utilisateur n’est plus au même endroit. L’article Déplacer le répertoire de départ d’un utilisateur sur une autre partition détaille les manipulations à faire pour cela.
Bonjour,
pourquoi la solution du ln n’est pas viable ? Merci :-)
Pour la gestion du swap sur Leopard…
Comme pour le 10.4, il n’y a pas de manière simple de s’assurer sous 10.5 que les disques sont bien montés avant le lancement de la mémoire virtuelle. En fait, sous 10.5, il n’y a même plus de fichier /etc/rc
…
Il reste donc la solution du StartupItem qui désactiverait le LaunchDaemon dynamic_pager et le lancerait à la main une fois les disques montés.
Ce StartupItem devrait déplacer le fichier /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
et redémarrer (ou tuer dynamic_pager) si il est présent, et faire une boucle pour attendre que le volume soit monté si le fichier est déjà déplacé.
… et le contenu du Startupitems ressemblerait à quoi ?
Désolé, mais bien que j’ai parfaitement compris ce qu’il faut faire, je suis incapable créer le fichier en question. Merci de « m’aider »
Philippe
Sur un poste de travail MacOSX 10.4 (donc non serveur) il y a des petites différences. Il s’agit peut-être d’erreurs dans l’article ?
hfs.util -k est censé donner un UUID (man hfs.util l’indique) mais dans la pratique ce qu’on obtient n’est pas l’UUID - ou alors il faut encore le transformer. Par contre en passant par l’utilitaire « utilitaire disque » on obtient le bon.
ditto -rsrc /Users/* /Volume/nomPartition/ copie le contenu des dossiers contenus dans /Users vers /Volume/nomPartition, et non le contenu du dossier /Users. La bonne commande est ditto -rsrc /Users/ /Volume/nomPartition/
Sinon, excellent article, merci beaucoup.
Y-a-t-il moyen de masquer le volume sans passer par les outils dévelopeurs ?
Ce n’est effectivement pas le même UUID qui s’affiche dans les deux, mais je confirme que c’est bien celui affiché par hfs.util qui est utilisé dans le fstab. En cherchant un peu, je vois que l’utilitaire de disque donne la même information que l’utilitaire diskutil avec l’option -info… Normalement, le fait de recréer un UUID avec hfs.util devrait mettre à jour l’information affichée avec diskutil (après un reboot), mais ça ne semble pas être le cas en 10.4.
En tout cas, pour l’utilisation avec fstab, se fier à ce que dit hfs.util…
Pour ditto, en revanche, il y a bien une erreur… Trop l’habitude de faire du rsync… :-) Je corrige de suite…
Merci pour la réponse rapide !
En tout cas, pour l’utilisation avec fstab, se fier à ce que dit hfs.util
Justement non, chez moi ça ne marche qu’avec l’UUID de l’utilitaire de disque. Peut-être parce que je n’ai pas regénéré l’UUID ?
Et puisque vous metttez à jour l’article, pour ce petit paragraphe :
sudo mv /Users /Users.bak sudo mkdir /Users …je suggère d’expliquer qu’on peut le faire sans quitter l’interface graphique. Parce que quand on vient d’autres Unix c’est déroutant.