umount
est une commande UNIX qui adhère au point de vue traditionnel d'UNIX selon lequel le démontage d'un système de fichiers est une commande de type tâche d'administration du système .
La raison en est que le démontage d'un système de fichiers, s'il est mal planifié ou exécuté, peut être perturbant, voire destructeur, en particulier sur un système multi-utilisateurs. Ainsi, les utilisateurs réguliers sont protégés de cette commande potentiellement dangereuse et seuls les utilisateurs de Racine ou un utilisateur privilégié est autorisé à l'exécuter.
Cela a beaucoup de sens lorsqu'UNIX est utilisé comme système d'exploitation de serveur, mais un système d'exploitation de bureau basé sur UNIX (par exemple, OS X ou Ubuntu ) a d'autres besoins : tout utilisateur doit pouvoir démonter les lecteurs flash, les disques durs amovibles, etc.
Le Finder et diskutil
(voir man diskutil pour plus d'informations) fonctionnent de cette manière. Par exemple, je peux ouvrir Terminal et exécuter avec succès :
$ diskutil unmount /Volumes/Untitled
Volume Untitled on disk2s2 unmounted
alors que umount
échoue :
$ umount /Volumes/Untitled
umount: unmount(/Volumes/Untitled): Operation not permitted
Qu'est-ce que le Finder ou diskutil
faire différemment ? Dans les coulisses, ils envoient une requête à une démon appelé com.apple.SecurityServer (voir page de manuel pour plus d'informations), qui accorde le droit de démonter le système de fichiers :
$ tail -f /var/log/system.log
Feb 6 16:57:37 avallone.local com.apple.SecurityServer[17]: Succeeded authorizing right 'system.volume.removable.unmount' by client '/System/Library/CoreServices/Finder.app' [171] for authorization created by '/System/Library/CoreServices/Finder.app' [171] (100013,0)
Feb 6 16:57:37 avallone.local com.apple.SecurityServer[17]: Succeeded authorizing right 'system.volume.removable.unmount' by client '/usr/sbin/diskarbitrationd' [18] for authorization created by '/System/Library/CoreServices/Finder.app' [171] (100002,0)
Feb 6 17:01:46 avallone.local com.apple.SecurityServer[17]: Succeeded authorizing right 'system.volume.removable.unmount' by client '/usr/sbin/diskutil' [646] for authorization created by '/usr/sbin/diskutil' [646] (100013,0)
Feb 6 17:01:46 avallone.local com.apple.SecurityServer[17]: Succeeded authorizing right 'system.volume.removable.unmount' by client '/usr/sbin/diskarbitrationd' [18] for authorization created by '/usr/sbin/diskutil' [646] (100002,0)
Cela permet à n'importe quel utilisateur de démonter un lecteur sans nécessiter d'authentification supplémentaire. (Ubuntu a une philosophie similaire. Si vous êtes intéressé, jetez un coup d'œil à cette réponse sur AskUbuntu).
Pour prendre en charge le comportement expliqué ci-dessus, le Finder et le diskutil
utilisent plusieurs cadres Apple :
$ otool -L $(which diskutil) | grep Disk
/System/Library/PrivateFrameworks/DiskManagement.framework/Versions/A/DiskManagement (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
$ otool -L /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder | grep Disk
/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
/System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages (compatibility version 1.0.8, current version 344.0.0)
/System/Library/PrivateFrameworks/DiskManagement.framework/Versions/A/DiskManagement (compatibility version 1.0.0, current version 1.0.0)
umount
d'autre part, est uniquement liée à cette bibliothèque dynamique :
$ otool -L $(which umount)
/sbin/umount:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
( /usr/lib/libSystem.B.dylib
utilise plusieurs autres bibliothèques, mais n'est lié à aucun framework).