Mengapa pengguna yang tidak mampu mengeksekusi perintah `sync`?

11

Saat ini di Ubuntu Linux, tapi saya perhatikan ini di OS lain juga. Tampaknya setiap pengguna dapat menjalankan syncperintah - tetapi mengapa ini? Saya hanya dapat melihat kekurangannya: sistem melambat karena penulisan disk yang tidak perlu.

Mengapa setiap pengguna dapat mengeksekusi sync?

jippie
sumber
1
Pertanyaan saya tentang topik ini adalah: Apakah ada cara untuk mencegah pengguna menggunakan sinkronisasi ()?
Bonsi Scott
@BonsiScott Tentu, Anda dapat menghapus bit izin dari file yang dapat dieksekusi. Tapi saya tidak tahu apakah ada sesuatu yang rusak ketika Anda melakukan itu.
jippie
Tidak hanya pengguna dapat menjalankan sinkronisasi, Anda juga tidak memerlukan akun. Akun 'sinkronisasi' berjalan /bin/syncsebagai cangkangnya, sehingga Anda dapat menyinkronkan tanpa masuk.
camh
Apa gunanya itu? BTW tidak ada kata sandi pada akun sinkronisasi pada kotak yang sedang saya kerjakan, sehingga tidak akan berfungsi.
jippie
Disarankan untuk sistem produksi untuk menurunkan waktu tunggu antar- syncpanggilan (mis. Pada HP-Unix). Alasannya adalah untuk menghindari menunggu yang tidak perlu karena banyak tulisan yang beredar sedang ditulis ke disk sekaligus.
Nils

Jawaban:

16

Ada banyak cara bagi pengguna yang tidak mampu untuk memperlambat sistem dan menjalankan sinkronisasi masih jauh dari efisien. Di sisi lain, memiliki data sistem file yang dikomit ke disk adalah permintaan yang sah sehingga melarang pengguna (dan dengan demikian proses mereka) untuk melakukannya akan berlebihan.

Bagaimanapun, saya tidak setuju tentang pernyataan "disk yang tidak perlu Anda tulis". Tulisan-tulisan ini tentu diperlukan dan secara otomatis akan terjadi setelah beberapa saat.

Bahkan tidak ada jaminan panggilan sinkronisasi akan melakukan hal tertentu tergantung pada implementasinya. Memanggil sinkronisasi, adalah, seperti yang didefinisikan oleh standar POSIX , hanya sebuah "saran" bagi OS untuk mem-flush cache sistem file-nya, itu tidak serta-merta memaksa flushes terjadi segera. Lebih tepatnya, panggilan meminta OS untuk menjadwalkan flush cache tetapi tidak ada jaminan itu akan terjadi sebelum waktu yang sudah dijadwalkan meskipun implementasi Linux menunggu hal itu terjadi sebelum kembali.

Selain itu, memanggil sinkronisasi beberapa kali secara berurutan tidak akan memperlambat sistem sebanyak itu, karena begitu cache dihapus, jika tidak ada proses yang secara aktif menulis ke file cache kosong maka sinkronisasi adalah no-op.

Jika Anda benar-benar ingin mencegah pengguna menjalankan sinkronisasi pada sistem Anda, Anda bisa menjalankan perintah ini:

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

Itu sebagian besar akan diperhatikan oleh pengguna dan tidak memiliki efek negatif kecuali dengan orang-orang yang baru saja menjalankan sinkronisasi kemudian menghapus perangkat penyimpanan (misalnya: usb thumbdrive) tanpa melepas mereka, tetapi pengguna ini sudah bertindak bodoh pula.

Perhatikan bahwa saya tidak akan merekomendasikan tautan / bin / sync sebelumnya dengan / bin / true. synctentu berguna dalam beberapa kasus. Misalnya, jika Anda takut pematian brutal (kekurangan daya, kepanikan sistem, ...) mungkin terjadi tidak lama, itu akan membantu menjaga konten sistem file. Inilah yang saya sebut permintaan yang sah.

Jlliagre
sumber
2
@ jippie Semua yang dilakukan syncbiner adalah memanggil sync()fungsi, jadi (seperti yang dikatakan Bonsi Scott) apa yang sebenarnya Anda tanyakan adalah mengapa kernel memungkinkan pengguna yang tidak terpanggil memanggilsync()
Michael Mrozek
2
@ Jippie saya pikir Anda tidak mengerti intinya. Semua sinkronisasi yang pernah dilakukan adalah commit (segera) ke disk hal-hal yang harus tetap dilakukan. Ketika saya pergi untuk menghapus flash drive, saya ingin memastikan bahwa semua yang saya tulis itu benar-benar ditulis. Dan, sementara umount seharusnya menjamin ini, saya tidak yakin, jadi saya ingin (sebagai pengguna) memastikan sebelum saya mencabutnya. TIDAK ADA HARM APA PUN dalam memaksa sistem untuk menyirami buffer ke disk. Paling buruk, beberapa hal tertinggal selama sedetik sementara sistem secara aktif menyiram buffer. Bahaya akan di pengguna menolak fungsi ini.
killermist
2
@killermist: sinkronisasi tidak memaksa, hanya menyarankan. Sinkronisasi mungkin kembali dengan status keluar yang sukses tanpa menyiram apa pun ke disk, belum lagi disk itu sendiri mungkin juga menunda penulisan di bawah tenda. Meskipun saya umumnya berbagi pendapat bahwa Windows tidak memiliki fitur yang diperlukan, sebuah perintah sinkronisasi akan menjadi yang paling tidak menjadi perhatian saya.
jlliagre
3
@killermist @jippie benar. Anda harus lebih percaya umount, yang, apa pun OSnya, selalu membersihkan buffer (kecuali jika disk sudah hilang ...) alih-alih synctidak dijamin untuk melakukannya tergantung pada OS. Perhatikan bahwa Linux syncmenunggu flush menjadi efektif sehingga dapat dipercaya juga.
jlliagre
1
linux.die.net/man/2/sync -> Menurut spesifikasi standar (misalnya, POSIX.1-2001), sinkronisasi () menjadwalkan penulisan, tetapi dapat kembali sebelum penulisan yang sebenarnya dilakukan. Namun, sejak versi 1.3.20 Linux benar-benar menunggu. (Ini masih tidak menjamin integritas data: disk modern memiliki cache yang besar.)
Bonsi Scott
5

synctidak dapat membahayakan sistem. Ini dapat memperlambatnya, tetapi tidak lebih dari menjalankan program yang mengakses disk. Mengapa harus dibatasi?

Ada alasan bagus untuk mengizinkan pengguna menjalankan sync. Ini diperlukan jika beberapa operasi harus dilakukan secara berurutan meskipun sistem mengalami gangguan atau kehilangan daya. Misalnya, pertimbangkan agen pengiriman surat yang menerima email. Setelah menulis file yang berisi email ke spool, ia memanggil sync, dan hanya kemudian ia membalas mesin pengirim yang memberitahukan bahwa email telah diterima. Jika tidak menelepon sync, dan mesin penerima kehilangan daya tepat setelah mengirim pemberitahuan penerimaan tetapi sebelum melakukan file ke disk, maka email akan hilang.

Sistem operasi menunda disk untuk efisiensi. Mereka tidak dapat mengetahui kapan aplikasi benar-benar membutuhkan penulisan untuk terjadi. Jadi aplikasi diberikan cara untuk memberitahu sistem operasi untuk menulis sekarang, dengan sync(1)dan sync(2)dan fsync(2).

Gilles 'SANGAT berhenti menjadi jahat'
sumber