Dlaczego nieuprzywilejowany użytkownik może wykonać polecenie `sync`?


11

Obecnie na Ubuntu Linux, ale zauważyłem to również w innych systemach operacyjnych. Najwyraźniej każdy użytkownik może wykonać syncpolecenie - ale dlaczego? Widzę tylko wadę: spowolnienie systemu z powodu niepotrzebnego zapisu na dysku.

Dlaczego każdy użytkownik może wykonać sync?


1
Moje pytanie na ten temat brzmiałoby: czy jest jakiś sposób, aby uniemożliwić użytkownikom używanie sync ()?
Bonsi Scott,

@ BonsiScott Oczywiście, możesz usunąć bity uprawnień z pliku wykonywalnego. Ale nie wiem, czy coś się zepsuje, kiedy to zrobicie.
jippie

Każdy użytkownik może nie tylko uruchamiać synchronizację, ale także nie potrzebuje konta. Konto „synchronizacja” działa /bin/syncjako powłoka, więc możesz synchronizować bez logowania.
camh

Do czego to jest przydatne? BTW, nie ma hasła do konta synchronizacji na polu, nad którym obecnie pracuję, więc to nie zadziała.
jippie

Zaleca się, aby systemy produkcyjne syncskróciły czas oczekiwania między wywołaniami (np. W systemie HP-Unix). Powodem jest uniknięcie niepotrzebnego oczekiwania ze względu na masę zaległych zapisów zapisywanych jednocześnie na dysk.
Nils

Odpowiedzi:


16

Istnieje wiele sposobów spowolnienia systemu przez nieuprzywilejowanego użytkownika, a synchronizacja nie jest wcale bardziej wydajna. Z drugiej strony, posiadanie danych systemu plików na dysku jest dość uzasadnionym żądaniem, więc zabranianie użytkownikom (a tym samym ich procesom) robienia tego byłoby nadmierne.

W każdym razie nie zgadzam się z twoim stwierdzeniem „niepotrzebne zapisywanie na dysku”. Te zapisy są z pewnością konieczne i i tak będą się automatycznie pojawiać po krótkim czasie.

Nie ma nawet gwarancji, że połączenie synchroniczne zrobi coś konkretnego w zależności od jego implementacji. Wywoływanie synchronizacji jest, jak definiuje standard POSIX , tylko „sugestią”, aby system operacyjny opróżnił pamięć podręczną systemu plików, niekoniecznie wymusza natychmiastowe wykonanie operacji opróżniania. Mówiąc dokładniej, połączenia proszą system operacyjny o zaplanowanie opróżnienia pamięci podręcznej, ale nie ma gwarancji, że nastąpi to przed już zaplanowanym czasem, chociaż implementacja Linuksa czeka, aż nastąpi przed powrotem.

Co więcej, wywoływanie synchronizacji wiele razy z rzędu nie spowolniłoby systemów tak bardzo, jak po opróżnieniu pamięci podręcznej, jeśli żaden proces nie zapisuje aktywnie plików, pamięci podręczne są puste, więc synchronizacja jest niemożliwa.

Jeśli naprawdę chcesz uniemożliwić użytkownikom synchronizację w systemie, możesz po prostu uruchomić następujące polecenia:

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

To byłoby w dużej mierze niezauważone przez użytkowników i nie ma żadnych negatywnych skutków, z wyjątkiem osób, które po prostu uruchamiają synchronizację, a następnie usuwają urządzenia pamięci masowej (np. Napęd USB thumbdrive) bez ich odmontowywania, ale ci użytkownicy i tak już postępowali głupio.

Zauważ, że nie poleciłbym poprzedniego linku / bin / sync z / bin / true. syncjest z pewnością przydatne w niektórych przypadkach. Na przykład, jeśli obawiasz się, że może nastąpić brutalne wyłączenie (brak zasilania, panika systemu, ...), pomoże to zachować zawartość systemów plików. To właśnie nazywam uzasadnioną prośbą.


2
@jippie Jedyne, co syncrobi plik binarny, to wywołanie sync()funkcji, więc (jak powiedział Bonsi Scott) tak naprawdę pytasz, dlaczego jądro pozwala użytkownikom nieuprzywilejowanym dzwonićsync()
Michael Mrozek

2
@jippie Myślę, że brakuje ci sensu. Wszystko, co synchronizacja kiedykolwiek wykonuje, to zatwierdzanie (natychmiast) na dysku rzeczy, które i tak będą musiały zostać zatwierdzone. Kiedy idę, aby usunąć dysk flash, chcę się upewnić, że wszystko, co do niego napisałem, rzeczywiście zostało zapisane. I chociaż umount ma to zagwarantować, nie jestem pewien, więc chcę (jako użytkownik) upewnić się, zanim to zrobię. Nie ma ŻADNEGO SZKODLIWOŚCI w zmuszaniu systemu do opróżniania buforów na dysk. W najgorszym przypadku niektóre rzeczy są opóźnione na sekundę, podczas gdy system aktywnie opróżnia bufory. Zagrożeniem byłoby odmawianie użytkownikom tej funkcji.
killermist,

2
@killermist: synchronizacja nie wymusza, tylko sugeruje. Synchronizacja może powrócić z pomyślnym zakończeniem, bez opróżniania czegokolwiek na dysk, nie wspominając o tym, że sam dysk może również opóźniać zapisy pod maską. Chociaż ogólnie podzielam opinię, że w systemie Windows brakuje niezbędnych funkcji, polecenie synchronizacji byłoby najmniejszym z moich problemów.
jlliagre

3
@killermist @jippie jest poprawny. Powinieneś lepiej zaufać umount, który bez względu na system operacyjny zawsze opróżnia bufory (chyba że dysk zniknie ...), a syncnie gwarantuje, że zrobi to w zależności od systemu operacyjnego. Pamiętaj, że Linux syncczeka, aż kolor będzie skuteczny, więc można mu również zaufać.
jlliagre,

1
linux.die.net/man/2/sync -> Zgodnie ze standardową specyfikacją (np. POSIX.1-2001), sync () planuje zapisy, ale może powrócić przed faktycznym zapisaniem. Jednak od wersji 1.3.20 Linux faktycznie czeka. (To wciąż nie gwarantuje integralności danych: nowoczesne dyski mają duże pamięci podręczne.)
Bonsi Scott,

5

syncnie może wyrządzić żadnej szkody systemowi. Może to spowolnić, ale nie bardziej niż uruchamianie programów uzyskujących dostęp do dysku. Dlaczego należy to ograniczyć?

Istnieje dobry powód, aby zezwolić każdemu użytkownikowi na uruchomienie sync. Jest to konieczne, jeśli niektóre operacje muszą być wykonane w kolejności, nawet jeśli system ulegnie awarii lub utraci zasilanie. Rozważmy na przykład agenta przesyłania poczty, który odbiera wiadomość e-mail. Po zapisaniu pliku zawierającego wiadomość e-mail w buforze wywołuje synci dopiero wtedy odpowiada na urządzenie wysyłające, powiadamiając go o otrzymaniu wiadomości e-mail. Jeśli nie zadzwoni sync, a urządzenie odbierające straci zasilanie tuż po wysłaniu powiadomienia o odbiorze, ale przed wysłaniem pliku na dysk, wiadomość e-mail zostanie utracona.

Systemy operacyjne opóźniają zapisywanie na dysku w celu zwiększenia wydajności. Nie mogą wiedzieć, kiedy aplikacja naprawdę potrzebuje zapisu. Więc aplikacje otrzymują sposób powiadomić system operacyjny napisać teraz, z sync(1)i sync(2)a fsync(2).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.