¿Por qué un usuario sin privilegios puede ejecutar el comando `sync`?

11

Actualmente en Ubuntu Linux, pero también noté esto en otros sistemas operativos. Aparentemente, cualquier usuario puede ejecutar el synccomando, pero ¿por qué es esto? Solo puedo ver la desventaja: el sistema se ralentiza debido a escrituras innecesarias en el disco.

¿Por qué puede ejecutar cada usuario sync?

jippie
fuente
1
Mi pregunta sobre este tema sería: ¿Hay alguna forma de evitar que los usuarios usen sync ()?
Bonsi Scott, el
@BonsiScott Claro, puede eliminar los bits de permiso del ejecutable. Pero no sé si algo se romperá cuando hagas eso.
jippie
No solo cualquier usuario puede ejecutar la sincronización, sino que tampoco necesita una cuenta. La cuenta 'sync' se ejecuta /bin/synccomo su shell, por lo que puede sincronizar sin iniciar sesión.
camh
¿Para qué sirve eso? Por cierto, no hay contraseña en la cuenta de sincronización en el cuadro en el que estoy trabajando actualmente, por lo que eso no funcionará.
jippie
Se recomienda que los sistemas de producción syncreduzcan el tiempo de espera entre llamadas (por ejemplo, en HP-Unix). La razón es evitar esperas innecesarias debido a las masas de escrituras pendientes que se escriben en el disco de una vez.
Nils

Respuestas:

16

Hay muchas maneras para que un usuario no privilegiado reduzca la velocidad de un sistema y ejecutar la sincronización está lejos de ser más eficiente. Por otro lado, tener los datos del sistema de archivos comprometidos en el disco es una solicitud bastante legítima, por lo que prohibir a los usuarios (y, por lo tanto, sus procesos) hacerlo sería excesivo.

En cualquier caso, no estoy de acuerdo con su declaración de "escrituras de disco innecesarias". Estas escrituras son ciertamente necesarias y sucederán automáticamente después de un pequeño período de tiempo de todos modos.

Incluso no hay garantía de que la llamada de sincronización haga algo en particular dependiendo de su implementación. Llamar a sincronización es, como lo define el estándar POSIX , solo una "sugerencia" para que el sistema operativo limpie sus cachés del sistema de archivos, no necesariamente obliga a que los lavados ocurran de inmediato. Más precisamente, las llamadas solicitan al sistema operativo que programe un vaciado de caché, pero no hay garantía de que suceda antes de la hora ya programada, aunque la implementación de Linux espera a que ocurra antes de regresar.

Además, llamar a la sincronización varias veces seguidas no ralentizaría demasiado los sistemas, ya que una vez que se vacían los cachés, si ningún proceso está escribiendo activamente en los archivos, los cachés están vacíos, por lo que la sincronización no funciona.

Si realmente desea evitar que los usuarios ejecuten la sincronización en su sistema, puede ejecutar estos comandos:

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

Eso pasaría desapercibido para los usuarios y no tiene efectos negativos, excepto con las personas que simplemente ejecutan la sincronización y luego eliminan los dispositivos de almacenamiento (por ejemplo: memoria USB) sin desmontarlos, pero estos usuarios ya estaban actuando tontamente de todos modos.

Tenga en cuenta que no recomendaría el enlace anterior / bin / sync con / bin / true. synces ciertamente útil en algunos casos. Por ejemplo, si temes que se produzca un cierre brutal (falta de energía, pánico del sistema, ...) en breve, eso ayudaría a preservar el contenido del sistema de archivos. Esto es lo que llamo una solicitud legítima.

jlliagre
fuente
2
@jippie Todo lo que hace el syncbinario es llamar a la sync()función, así que (como dijo Bonsi Scott) lo que realmente estás preguntando es por qué el núcleo permite que los usuarios no privilegiados llamensync()
Michael Mrozek
2
@jippie Creo que te estás perdiendo el punto. Lo único que hace la sincronización es comprometerse (de inmediato) en el disco con cosas que iban a tener que confirmarse de todos modos. Cuando voy a quitar una unidad flash, quiero asegurarme de que todo lo que escribí realmente se escribió. Y, aunque se supone que umount garantiza esto, no estoy seguro, por lo que quiero (como usuario) asegurarme antes de tirar de él. NO HAY DAÑO LO QUE SEA al forzar al sistema a vaciar las memorias intermedias al disco. En el peor de los casos, algunas cosas se retrasan por un segundo, mientras que el sistema descarga activamente las memorias intermedias. El peligro estaría en negar a los usuarios esta función.
Killermist
2
@killermist: la sincronización no es forzada, solo sugiere. La sincronización puede regresar con un estado de salida exitoso sin haber vaciado nada en el disco, sin mencionar que el disco en sí también puede retrasar las escrituras debajo del capó. Si bien generalmente comparto la opinión de que Windows carece de las características necesarias, un comando de sincronización sería la menor de mis preocupaciones.
jlliagre
3
@killermist @jippie es correcto. Debería confiar mejor en lo umountque, sea cual sea el sistema operativo, siempre vacía los búferes (a menos que el disco haya desaparecido ...) en lugar de lo synccual no se garantiza que lo haga dependiendo del sistema operativo. Tenga en cuenta que Linux syncespera a que el vaciado sea efectivo, por lo que también se puede confiar en él.
jlliagre
1
linux.die.net/man/2/sync -> De acuerdo con la especificación estándar (por ejemplo, POSIX.1-2001), sync () programa las escrituras, pero puede regresar antes de que se realice la escritura real. Sin embargo, desde la versión 1.3.20 Linux realmente espera. (Esto todavía no garantiza la integridad de los datos: los discos modernos tienen grandes cachés.)
Bonsi Scott
5

syncno puede hacer ningún daño al sistema. Puede ralentizarlo, pero no más que ejecutar programas que acceden al disco. ¿Por qué debería ser restringido?

Hay una buena razón para permitir que cualquier usuario ejecute sync. Esto es necesario si algunas operaciones deben realizarse en orden, incluso si el sistema se bloquea o pierde energía. Por ejemplo, considere un agente de transferencia de correo que recibe un correo electrónico. Una vez que ha escrito el archivo que contiene el correo electrónico en la cola, llama sync, y solo entonces responde a la máquina de envío notificándole que se ha recibido el correo electrónico. Si no llamó sync, y la máquina receptora perdió energía justo después de enviar la notificación de recepción, pero antes de enviar el archivo al disco, se perdería el correo electrónico.

Los sistemas operativos retrasan las escrituras en disco para mayor eficiencia. No pueden saber cuándo una aplicación realmente necesita que se realice la escritura. Por lo tanto, las aplicaciones tienen una forma de decirle al sistema operativo que escriba ahora, con sync(1)y sync(2)y fsync(2).

Gilles 'SO- deja de ser malvado'
fuente