Por que um usuário sem privilégios pode executar o comando `sync`?

11

Atualmente no Ubuntu Linux, mas notei isso em outros sistemas operacionais também. Aparentemente, qualquer usuário pode executar o synccomando - mas por que isso? Só vejo a desvantagem: o sistema fica mais lento devido a gravações desnecessárias no disco.

Por que todo usuário pode executar sync?

jippie
fonte
1
Minha pergunta sobre este tópico seria: Existe alguma maneira de impedir que os usuários usem sync ()?
Bonsi Scott
@BonsiScott Claro, você pode remover os bits de permissão do executável. Mas não sei se algo vai quebrar quando você faz isso.
Jipie
Qualquer usuário não só pode executar a sincronização, como também não precisa de uma conta. A conta 'sync' é executada /bin/synccomo seu shell, para que você possa sincronizar sem fazer login.
camh
Para que isso é útil? BTW, não há senha na conta de sincronização na caixa em que estou trabalhando, portanto isso não funcionará.
jippie
É recomendado que os sistemas de produção syncreduzam o tempo de espera entre as chamadas (por exemplo, no HP-Unix). O motivo é evitar esperas desnecessárias devido ao grande número de gravações pendentes sendo gravadas no disco de uma só vez.
Nils

Respostas:

16

Existem várias maneiras de um usuário sem privilégios diminuir a velocidade do sistema e executar a sincronização está longe de ser a mais eficiente. Por outro lado, ter os dados dos sistemas de arquivos comprometidos com o disco é uma solicitação bastante legítima, portanto, proibir os usuários (e, portanto, seus processos) de fazê-lo seria excessivo.

De qualquer forma, discordo da sua declaração "gravações desnecessárias em disco". Essas gravações são certamente necessárias e ocorrerão automaticamente após um pequeno período de tempo.

Não há garantia de que a chamada de sincronização fará algo em particular, dependendo de sua implementação. A chamada de sincronização é, como define o padrão POSIX , apenas uma "sugestão" para o sistema operacional liberar seus caches de sistema de arquivos, não necessariamente força os descargas a acontecer imediatamente. Mais precisamente, as chamadas solicitam ao sistema operacional que agende uma liberação de cache, mas não há garantia de que isso aconteça antes do horário já agendado, embora a implementação do Linux espere que isso aconteça antes de retornar.

Além disso, chamar a sincronização várias vezes seguidas não reduziria a velocidade dos sistemas, pois uma vez que os caches são liberados, se nenhum processo estiver gravando ativamente nos arquivos, os caches estão vazios, portanto, a sincronização é uma operação não operacional.

Se você realmente deseja impedir que os usuários executem a sincronização no seu sistema, basta executar estes comandos:

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

Isso seria amplamente despercebido pelos usuários e não tem efeitos negativos, exceto com pessoas que apenas executam a sincronização e removem os dispositivos de armazenamento (por exemplo: usb thumbdrive) sem desmontá-los, mas esses usuários já estavam agindo de maneira tola de qualquer maneira.

Observe que eu não recomendaria o link / bin / sync anterior com / bin / true. syncé certamente útil em alguns casos. Por exemplo, se você teme que um desligamento brutal (falta de energia, pânico no sistema, ...) possa acontecer em breve, isso ajudaria a preservar o conteúdo do sistema de arquivos. É isso que chamo de pedido legítimo.

jlliagre
fonte
2
@jippie Todo o syncbinário faz é chamar a sync()função, assim (como Bonsi Scott disse) que você está realmente perguntando é porque o kernel permite que usuários sem privilégios chamarsync()
Michael Mrozek
2
@ippie Eu acho que você está perdendo o objetivo. Tudo o que a sincronização faz é confirmar (imediatamente) o disco de coisas que precisariam ser confirmadas de qualquer maneira. Quando removo uma unidade flash, quero ter certeza de que tudo o que escrevi foi realmente escrito. E, embora umount deva garantir isso, não tenho certeza, então quero (como usuário) ter certeza antes de puxá-lo. Não há nenhum dano ao forçar o sistema a liberar buffers para o disco. Na pior das hipóteses, algumas coisas ficam atrasadas por um segundo enquanto o sistema libera ativamente os buffers. O perigo seria negar aos usuários essa função.
Killermist #
2
@ killmist: sincronização não está forçando, apenas sugerindo. A sincronização pode retornar com um status de saída bem-sucedida sem liberar nada para o disco, sem mencionar que o próprio disco também pode atrasar as gravações sob o capô. Embora eu geralmente compartilhe da opinião de que o Windows não possui os recursos necessários, um comando de sincronização seria a menor das minhas preocupações.
Jlliagre 02/12/12
3
@killermist @jippie está correto. Você deve confiar melhor umount, que, independentemente do sistema operacional, sempre libera os buffers (a menos que o disco tenha acabado ...), em vez do syncque não é garantido, dependendo do sistema operacional. Observe que o Linux syncespera que o flush seja eficaz, portanto também pode ser confiável.
Jlliagre
1
linux.die.net/man/2/sync -> De acordo com a especificação padrão (por exemplo, POSIX.1-2001), sync () agenda as gravações, mas pode retornar antes que a gravação seja feita. No entanto, desde a versão 1.3.20, o Linux realmente espera. (Este ainda não garante a integridade dos dados: discos modernos têm grandes caches.)
Bonsi Scott
5

syncnão pode causar nenhum dano ao sistema. Ele pode diminuir a velocidade, mas não mais do que executar programas que acessam o disco. Por que deveria ser restrito?

Há um bom motivo para permitir que qualquer usuário execute sync. Isso é necessário se algumas operações tiverem que ser executadas em ordem, mesmo que o sistema trate ou perca energia. Por exemplo, considere um agente de transferência de email que recebe um email. Depois de gravar o arquivo que contém o email no spool, ele chama synce só então responde à máquina de envio notificando que o email foi recebido. Se não ligasse synce a máquina receptora perdesse energia logo após enviar a notificação de recepção, mas antes de enviar o arquivo para o disco, o e-mail seria perdido.

Os sistemas operacionais atrasam a gravação do disco por eficiência. Eles não sabem quando um aplicativo realmente precisa que a gravação aconteça. Portanto, os aplicativos têm uma maneira de dizer ao sistema operacional para escrever agora, com sync(1)e sync(2)e fsync(2).

Gilles 'SO- parar de ser mau'
fonte