Tại sao người dùng không có đặc quyền có thể thực thi lệnh `sync`?


11

Hiện tại trên Ubuntu Linux, nhưng tôi cũng nhận thấy điều này trên các HĐH khác. Rõ ràng bất kỳ người dùng nào cũng có thể thực thi synclệnh - nhưng tại sao lại như vậy? Tôi chỉ có thể thấy nhược điểm: hệ thống bị chậm do ghi đĩa không cần thiết.

Tại sao mọi người dùng có thể thực thi sync?


1
Câu hỏi của tôi về chủ đề này sẽ là: Thậm chí có cách nào để ngăn người dùng sử dụng đồng bộ hóa () không?
Bonsi Scott

@BonsiScott Chắc chắn, bạn có thể xóa các bit cho phép khỏi tệp thực thi. Nhưng tôi không biết nếu một cái gì đó sẽ bị phá vỡ khi bạn làm điều đó.
jippie

Không chỉ bất kỳ người dùng nào có thể chạy đồng bộ hóa, bạn cũng không cần có tài khoản. Tài khoản 'đồng bộ hóa' chạy /bin/syncnhư vỏ của nó, vì vậy bạn có thể đồng bộ hóa mà không cần đăng nhập.
camh

Điều đó hữu ích cho việc gì? BTW không có mật khẩu trên tài khoản đồng bộ hóa trên hộp tôi hiện đang làm việc, vì vậy nó sẽ không hoạt động.
jippie

Các hệ thống sản xuất được khuyến nghị giảm thời gian chờ giữa các synctrung tâm (ví dụ: trên HP-Unix). Lý do là để tránh sự chờ đợi không cần thiết do hàng loạt các bài viết xuất sắc được ghi vào đĩa cùng một lúc.
Nils

Câu trả lời:


16

Có rất nhiều cách để người dùng không có đặc quyền làm chậm hệ thống và chạy đồng bộ hóa sẽ không hiệu quả hơn. Mặt khác, việc dữ liệu hệ thống tệp được cam kết vào đĩa là một yêu cầu hợp pháp nên việc cấm người dùng (và do đó các quy trình của họ) thực hiện sẽ là quá mức.

Trong mọi trường hợp, tôi không đồng ý về tuyên bố "ghi đĩa không cần thiết" của bạn. Những bài viết này chắc chắn là cần thiết và sẽ tự động xảy ra sau một khoảng thời gian nhỏ.

Thậm chí không có gì đảm bảo cuộc gọi đồng bộ hóa sẽ làm bất cứ điều gì cụ thể tùy thuộc vào việc thực hiện nó. Gọi đồng bộ hóa, như tiêu chuẩn POSIX định nghĩa , chỉ là một "gợi ý" cho HĐH để xóa bộ đệm hệ thống tệp của nó, nó không nhất thiết phải buộc các lần xả xảy ra ngay lập tức. Chính xác hơn, các cuộc gọi yêu cầu HĐH lên lịch xóa bộ nhớ cache nhưng không có gì đảm bảo nó sẽ xảy ra trước thời gian đã lên lịch mặc dù việc triển khai Linux không chờ nó xảy ra trước khi quay lại.

Ngoài ra, việc gọi đồng bộ hóa nhiều lần liên tiếp sẽ không làm chậm hệ thống nhiều như vậy, vì một khi bộ đệm bị xóa, nếu không có quá trình nào chủ động ghi vào tệp thì bộ đệm sẽ trống nên đồng bộ hóa là không có.

Nếu bạn thực sự muốn ngăn người dùng chạy đồng bộ hóa trên hệ thống của mình, bạn chỉ có thể chạy các lệnh sau:

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

Điều đó phần lớn sẽ không được người dùng chú ý và không có tác động tiêu cực nào ngoại trừ những người chỉ chạy đồng bộ hóa sau đó gỡ bỏ các thiết bị lưu trữ (ví dụ: usb thumbdrive) mà không ngắt kết nối chúng, nhưng dù sao những người dùng này đã hành động dại dột.

Lưu ý rằng tôi sẽ không đề xuất liên kết / bin / đồng bộ hóa trước với / bin / true. syncchắc chắn là hữu ích trong một số trường hợp. Ví dụ: nếu bạn sợ tắt máy tàn bạo (thiếu điện, hoảng loạn hệ thống, ...) có thể xảy ra trong thời gian ngắn, điều đó sẽ giúp bảo vệ nội dung hệ thống tệp. Đây là những gì tôi gọi là một yêu cầu hợp pháp.


2
@jippie Tất cả các syncnhị phân đều gọi sync()hàm, vì vậy (như Bonsi Scott đã nói) điều bạn thực sự hỏi là tại sao kernel lại cho phép người dùng không có quyền gọisync()
Michael Mrozek

2
@jippie Tôi nghĩ bạn đang thiếu điểm. Tất cả đồng bộ hóa từng làm là cam kết (ngay lập tức) với đĩa những thứ sẽ phải được cam kết bằng mọi cách. Khi tôi gỡ bỏ ổ đĩa flash, tôi muốn chắc chắn rằng tất cả mọi thứ tôi đã viết cho nó thực sự đã được viết. Và, trong khi umount được cho là đảm bảo điều này, tôi không yên tâm, vì vậy tôi muốn (với tư cách là người dùng) đảm bảo trước khi tôi lấy nó. KHÔNG CÓ HARM WHATSOEVER trong việc buộc hệ thống xả bộ đệm vào đĩa. Tệ nhất, một số thứ bị trễ trong một giây trong khi hệ thống chủ động xóa bộ đệm. Nguy hiểm sẽ là từ chối người dùng chức năng này.
killermist

2
@killermist: đồng bộ hóa không bắt buộc, chỉ gợi ý. Đồng bộ hóa có thể trở lại với trạng thái thoát thành công mà không cần xả bất cứ thứ gì vào đĩa, chưa kể bản thân đĩa cũng có thể trì hoãn ghi dưới mui xe. Mặc dù tôi thường chia sẻ ý kiến ​​Windows thiếu các tính năng cần thiết, nhưng lệnh đồng bộ hóa sẽ là mối quan tâm tối thiểu của tôi.
jlliagre

3
@killermist @jippie là chính xác. Bạn nên tin tưởng tốt hơn umount, dù hệ điều hành nào, luôn luôn xóa bộ đệm (trừ khi đĩa bị mất ...) thay vì synckhông đảm bảo sẽ làm điều đó tùy thuộc vào HĐH. Lưu ý rằng Linux syncchờ cho phép tuôn ra có hiệu quả nên cũng có thể tin tưởng được.
jlliagre

1
linux.die.net/man/2/sync -> Theo thông số kỹ thuật tiêu chuẩn (ví dụ: POSIX.1-2001), sync () lên lịch ghi, nhưng có thể quay lại trước khi thực hiện viết. Tuy nhiên, kể từ phiên bản 1.3.20 Linux thực sự chờ đợi. (Điều này vẫn không đảm bảo tính toàn vẹn dữ liệu: các đĩa hiện đại có bộ nhớ cache lớn.)
Bonsi Scott

5

synckhông thể làm hại hệ thống Nó có thể làm chậm nó, nhưng không nhiều hơn là chạy các chương trình truy cập vào đĩa. Tại sao nó nên được hạn chế?

Có một lý do chính đáng để cho phép bất kỳ người dùng nào chạy sync. Điều này là cần thiết nếu một số thao tác phải được thực hiện theo thứ tự ngay cả khi hệ thống gặp sự cố hoặc mất điện. Ví dụ, hãy xem xét một đại lý chuyển thư nhận email. Khi nó đã ghi tệp chứa email vào ống chỉ, nó sẽ gọi syncvà chỉ sau đó nó mới trả lời máy gửi thông báo rằng email đã được nhận. Nếu nó không gọi syncvà máy nhận bị mất điện ngay sau khi gửi thông báo nhận nhưng trước khi gửi tệp vào đĩa thì email sẽ bị mất.

Hệ điều hành trì hoãn ghi đĩa cho hiệu quả. Họ không thể biết khi nào một ứng dụng thực sự cần ghi để xảy ra. Vì vậy, các ứng dụng được cung cấp một cách để nói với các hệ điều hành để viết bây giờ, với sync(1)sync(2)fsync(2).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.