Pourquoi un utilisateur non privilégié peut-il exécuter la commande `sync`?

11

Actuellement sur Ubuntu Linux, mais je l'ai également remarqué sur d'autres systèmes d'exploitation. Apparemment, n'importe quel utilisateur peut exécuter la synccommande - mais pourquoi? Je ne peux que constater l'inconvénient: le système ralentit en raison d'écritures de disque inutiles.

Pourquoi chaque utilisateur peut-il s'exécuter sync?

jippie
la source
1
Ma question sur ce sujet serait: Existe-t-il même un moyen d'empêcher les utilisateurs d'utiliser sync ()?
Bonsi Scott
@BonsiScott Bien sûr, vous pouvez supprimer les bits d'autorisation de l'exécutable. Mais je ne sais pas si quelque chose se cassera lorsque vous ferez cela.
jippie
Non seulement n'importe quel utilisateur peut exécuter la synchronisation, mais vous n'avez pas non plus besoin d'un compte. Le compte 'sync' fonctionne /bin/synccomme son shell, vous pouvez donc synchroniser sans vous connecter.
camh
À quoi cela sert-il? BTW il n'y a pas de mot de passe sur le compte de synchronisation sur la boîte sur laquelle je travaille actuellement, donc cela ne fonctionnera pas.
jippie
Il est recommandé pour les systèmes de production de réduire le temps d'attente entre les syncappels (par exemple sur HP-Unix). La raison est d'éviter les attentes inutiles en raison de l'écriture simultanée de nombreuses écritures en attente sur le disque.
Nils

Réponses:

16

Il existe de nombreuses façons pour un utilisateur non privilégié de ralentir un système et l'exécution de la synchronisation est loin d'être la plus efficace. D'un autre côté, avoir les données des systèmes de fichiers validées sur disque est une demande tout à fait légitime, donc interdire aux utilisateurs (et donc à leurs processus) de le faire serait excessif.

Dans tous les cas, je ne suis pas d'accord sur votre déclaration "écritures de disque inutiles". Ces écritures sont certainement nécessaires et se produiront automatiquement après une courte période de toute façon.

Il n'y a même aucune garantie que l'appel de synchronisation fera quelque chose de particulier en fonction de sa mise en œuvre. L'appel de synchronisation n'est, comme le définit la norme POSIX , qu'une "suggestion" pour que le système d'exploitation vide ses caches de système de fichiers, il ne force pas nécessairement les vidages à se produire immédiatement. Plus précisément, les appels demandent au système d'exploitation de planifier un vidage du cache, mais il n'y a aucune garantie que cela se produira avant l'heure déjà programmée, bien que l'implémentation Linux attende qu'elle se produise avant de revenir.

De plus, appeler la synchronisation plusieurs fois d'affilée ne ralentirait pas beaucoup les systèmes, comme une fois que les caches sont vidés, si aucun processus n'écrit activement dans des fichiers, les caches sont vides, donc la synchronisation est un no-op.

Si vous voulez vraiment empêcher les utilisateurs d'exécuter la synchronisation sur votre système, vous pouvez simplement exécuter ces commandes:

mv /bin/sync /bin/.sync
ln /bin/true /bin/sync

Cela serait largement inaperçu par les utilisateurs et n'a aucun effet négatif, sauf avec les personnes qui exécutent simplement la synchronisation, puis retirent les périphériques de stockage (par exemple: clé USB) sans les démonter, mais ces utilisateurs agissaient déjà de façon stupide de toute façon.

Notez que je ne recommanderais pas le lien précédent / bin / sync avec / bin / true. syncest certainement utile dans certains cas. Par exemple, si vous craignez qu'un arrêt brutal (panne de courant, panique du système, ...) puisse se produire sous peu, cela aiderait à préserver le contenu des systèmes de fichiers. C'est ce que j'appelle une demande légitime.

jlliagre
la source
2
@jippie Tout ce que le syncbinaire fait est d'appeler la sync()fonction, donc (comme l'a dit Bonsi Scott) ce que vous demandez vraiment, c'est pourquoi le noyau permet aux utilisateurs non privilégiés d'appelersync()
Michael Mrozek
2
@jippie Je pense que vous manquez le point. Tout ce que la synchronisation fait est de valider (immédiatement) sur le disque des choses qui allaient devoir être validées de toute façon. Lorsque je vais retirer un lecteur flash, je veux m'assurer que tout ce que j'y ai écrit a bien été écrit. Et, bien que umount soit censé garantir cela, je ne suis pas sûr, donc je veux (en tant qu'utilisateur) m'assurer avant de le tirer. Il n'y a AUCUN DOMMAGE QUE CE SOIT pour forcer le système à vider les tampons sur le disque. Au pire, certaines choses sont retardées pendant une seconde tandis que le système vide activement les tampons. Le danger serait de refuser aux utilisateurs cette fonction.
killermist
2
@killermist: la synchronisation n'est pas forcée, juste une suggestion. La synchronisation peut revenir avec un état de sortie réussie sans avoir vidé quoi que ce soit sur le disque, sans oublier que le disque lui-même peut également retarder les écritures sous le capot. Bien que je partage généralement l'opinion que Windows ne dispose pas des fonctionnalités nécessaires, une commande de synchronisation serait la moindre de mes préoccupations.
jlliagre
3
@killermist @jippie est correct. Vous devriez mieux faire confiance umount, ce qui, quel que soit le système d'exploitation, vide toujours les tampons (à moins que le disque ne soit parti ...) au lieu de syncquoi il n'est pas garanti de le faire en fonction du système d'exploitation. Notez que Linux syncattend que la vidange soit efficace et peut donc également être approuvée.
jlliagre
1
linux.die.net/man/2/sync -> Selon la spécification standard (par exemple, POSIX.1-2001), sync () planifie les écritures, mais peut revenir avant que l'écriture proprement dite soit terminée. Cependant, depuis la version 1.3.20, Linux attend réellement. (Cela ne garantit toujours pas l'intégrité des données: les disques modernes ont de grands caches.)
Bonsi Scott
5

syncne peut pas nuire au système. Il peut le ralentir, mais pas plus que l'exécution de programmes qui accèdent au disque. Pourquoi devrait-il être restreint?

Il existe une bonne raison d'autoriser tout utilisateur à s'exécuter sync. Cela est nécessaire si certaines opérations doivent être effectuées dans l'ordre, même si le système tombe en panne ou perd de la puissance. Par exemple, considérons un agent de transfert de courrier qui reçoit un e-mail. Une fois qu'il a écrit le fichier contenant l'e-mail dans le spool, il appelle sync, et alors seulement il répond à la machine émettrice pour l'informer que l'e-mail a été reçu. S'il n'appelait pas syncet que la machine réceptrice perdait de l'énergie juste après l'envoi de la notification de réception mais avant de valider le fichier sur le disque, l'e-mail serait perdu.

Les systèmes d'exploitation retardent les écritures sur disque pour plus d'efficacité. Ils ne peuvent pas savoir quand une application a vraiment besoin que l'écriture se produise. Les applications ont donc la possibilité de dire au système d'exploitation d'écrire maintenant, avec sync(1)et sync(2)et fsync(2).

Gilles 'SO- arrête d'être méchant'
la source