Perché un utente senza privilegi può eseguire il comando `sync`?


11

Attualmente su Ubuntu Linux, ma l'ho notato anche su altri sistemi operativi. Apparentemente qualsiasi utente può eseguire il synccomando - ma perché? Vedo solo lo svantaggio: il sistema rallenta a causa di scritture del disco non necessarie.

Perché ogni utente può eseguire sync?


1
La mia domanda su questo argomento sarebbe: esiste un modo per impedire agli utenti di usare sync ()?
Bonsi Scott,

@BonsiScott Certo, è possibile rimuovere i bit di autorizzazione dall'eseguibile. Ma non so se qualcosa si romperà quando lo fai.
jippie,

Non solo gli utenti possono eseguire la sincronizzazione, ma non hai nemmeno bisogno di un account. L'account 'sync' funziona /bin/synccome la sua shell, quindi puoi sincronizzarti senza effettuare il login.
camh

A cosa serve? A proposito, non c'è password sull'account di sincronizzazione nella casella su cui sto attualmente lavorando, quindi non funzionerà.
jippie,

Si consiglia ai sistemi di produzione di ridurre i tempi di attesa tra le syncchiamate (ad es. Su HP-Unix). Il motivo è quello di evitare inutili attese dovute alla scrittura su disco di masse di scritture in sospeso contemporaneamente.
Nils,

Risposte:


16

Esistono molti modi per un utente senza privilegi di rallentare un sistema e l'esecuzione della sincronizzazione è lungi dall'essere più efficiente. D'altra parte, avere i dati dei file system impegnati su disco è una richiesta abbastanza legittima, quindi vietare agli utenti (e quindi ai loro processi) di farlo sarebbe eccessivo.

In ogni caso, non sono d'accordo sulla tua dichiarazione "scritture su disco non necessarie". Queste scritture sono certamente necessarie e avverranno automaticamente dopo un breve periodo di tempo.

Non c'è nemmeno alcuna garanzia che la chiamata di sincronizzazione farà qualcosa di particolare a seconda della sua implementazione. Chiamare sync, come definisce lo standard POSIX , è solo un "suggerimento" per il sistema operativo di svuotare le sue cache del file system, non necessariamente costringe i flush ad avvenire immediatamente. Più precisamente, le chiamate chiedono al sistema operativo di pianificare lo svuotamento della cache ma non vi è alcuna garanzia che ciò accada prima dell'orario già programmato, sebbene l'implementazione di Linux attenda che accada prima di tornare.

Inoltre, chiamare la sincronizzazione più volte di seguito non rallenterebbe così tanto i sistemi, poiché una volta svuotate le cache, se nessun processo sta scrivendo attivamente su file le cache sono vuote, quindi la sincronizzazione è una no-op.

Se vuoi davvero impedire agli utenti di eseguire la sincronizzazione sul tuo sistema, puoi semplicemente eseguire questi comandi:

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

Ciò sarebbe in gran parte ignorato dagli utenti e non ha effetti negativi se non con le persone che eseguono la sincronizzazione e rimuovono i dispositivi di archiviazione (ad esempio: chiavetta USB) senza smontarli, ma questi utenti si sono già comportati in modo sciocco comunque.

Nota che non consiglierei il link precedente / bin / sync con / bin / true. syncè sicuramente utile in alcuni casi. Ad esempio, se si teme un arresto brutale (mancanza di alimentazione, panico di sistema, ...) potrebbe verificarsi a breve, ciò contribuirebbe a preservare il contenuto dei file system. Questo è ciò che chiamo una richiesta legittima.


2
@jippie Tutto syncciò che fa il binario è chiamare la sync()funzione, quindi (come ha detto Bonsi Scott) quello che stai veramente chiedendo è perché il kernel permette agli utenti senza privilegi di chiamaresync()
Michael Mrozek

2
@jippie Penso che ti manchi il punto. Tutta la sincronizzazione che mai fa è impegnarsi (immediatamente) nel disco cose che avrebbero dovuto essere comunque impegnate. Quando vado a rimuovere un'unità flash, voglio assicurarmi che tutto ciò che ho scritto sia stato effettivamente scritto. E, mentre umount dovrebbe garantirlo, non ne sono sicuro, quindi voglio (come utente) assicurarmi prima di strapparlo. Non vi è alcun danno nel forzare il sistema a scaricare i buffer su disco. Nel peggiore dei casi, alcune cose vengono ritardate per un secondo mentre il sistema scarica attivamente i buffer. Il pericolo sarebbe nel negare agli utenti questa funzione.
assassino

2
@killermist: la sincronizzazione non sta forzando, sta solo suggerendo. La sincronizzazione potrebbe tornare con uno stato di uscita riuscito senza aver scaricato nulla sul disco, per non parlare del disco stesso che potrebbe anche ritardare le scritture sotto il cofano. Mentre in genere condivido l'opinione che a Windows manchino le funzionalità necessarie, un comando di sincronizzazione sarebbe l'ultimo dei miei dubbi.
jlliagre,

3
@killermist @jippie è corretto. Dovresti fidarti meglio umount, che, qualunque sia il sistema operativo, scarica sempre i buffer (a meno che il disco non sia andato ...) invece del syncquale non è garantito farlo a seconda del sistema operativo. Nota che Linux syncattende che il flush sia efficace, quindi ci si può fidare anche di lui.
jlliagre,

1
linux.die.net/man/2/sync -> Secondo le specifiche standard (es. POSIX.1-2001), sync () pianifica le scritture, ma può tornare prima che la scrittura vera e propria sia terminata. Tuttavia, dalla versione 1.3.20 Linux in realtà attende. (Ciò non garantisce l'integrità dei dati: i dischi moderni hanno cache di grandi dimensioni.)
Bonsi Scott

5

syncnon può danneggiare il sistema. Può rallentarlo, ma non di più che eseguire programmi che accedono al disco. Perché dovrebbe essere limitato?

C'è una buona ragione per consentire a qualsiasi utente di correre sync. Ciò è necessario se alcune operazioni devono essere eseguite in ordine anche se il sistema si arresta in modo anomalo o perde energia. Ad esempio, considera un agente di trasferimento di posta che riceve un'email. Una volta che ha scritto il file contenente l'e-mail nello spool, chiama synce solo allora risponde al mittente notificandolo che l'e-mail è stata ricevuta. Se non chiamava synce la macchina ricevente perdeva energia subito dopo aver inviato la notifica di ricezione ma prima di eseguire il commit del file su disco, l'e-mail andrebbe persa.

I sistemi operativi ritardano le scritture del disco per l'efficienza. Non possono sapere quando un'applicazione ha davvero bisogno che avvenga la scrittura. Quindi alle applicazioni viene fornito un modo per dire al sistema operativo di scrivere ora, con sync(1)e sync(2)e fsync(2).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.