Co się stanie, gdy zabiję „cp”? Czy to jest bezpieczne i czy ma jakieś konsekwencje?

23

Jakie są konsekwencje dla systemu plików ext4, kiedy kończę cppolecenie kopiowania , wpisując Ctrl+, Cgdy jest uruchomiony?

Czy system plików ulega uszkodzeniu? Czy przestrzeń partycji zajmowana przez niekompletny skopiowany plik jest nadal użyteczna po usunięciu?

A co najważniejsze, czy zakończenie cpprocesu jest bezpieczne?

Seninha
źródło
1
Należy pamiętać, że chociaż odpowiedzi są prawidłowe dla ext4, systemy plików bez kronikowania mogą nie być tak bezpieczne.
Ave
3
@Ave Journaling nie ma z tym nic wspólnego. Połączenia systemowe są atomowe niezależnie od używanego systemu plików. Kronikowanie jest przydatne w sytuacjach, w których moc może zostać nagle utracona.
las

Odpowiedzi:

22

Jest to bezpieczne, ale oczywiście możesz nie ukończyć kopiowania.

Po uruchomieniu cppolecenia wywołuje syscall, które instruują jądro, aby tworzyło kopie pliku. Syscall to funkcja, którą może wywołać aplikacja, która żąda usługi z jądra, takiej jak odczyt lub zapis danych na dysk. Proces przestrzeni użytkownika po prostu czeka na zakończenie syscall. Gdybyś śledził połączenia, wyglądałoby to tak:

open("/home/user/hello.txt", O_RDONLY)           = 3
open("/mnt/hello.txt", O_CREAT|O_WRONLY, 0644)   = 4
read(3, "Hello, world!\n", 131072)               = 14
write(4, "Hello, world!\n", 14)                  = 14
close(3)                                         = 0
close(4)                                         = 0

Powtarza się to dla każdego pliku, który ma zostać skopiowany. Z powodu sposobu działania tych połączeń systemowych nie nastąpi uszkodzenie. Kiedy syscalli takie jak te są wprowadzane, sygnał śmiertelny zajmie tylko efekt po syscall została zakończona , nie jest uruchomiona. Z tego powodu wymuszone zabicie procesu spowoduje jego zakończenie dopiero po zakończeniu aktualnie działającego syscall. Oznacza to, że jądro, w którym znajduje się sterownik systemu plików, może zakończyć operacje, które musi wykonać, aby wprowadzić system plików w normalny stan. Wszelkie tego rodzaju operacje we / wy nigdy nie zostaną zakończone w trakcie operacji, co czyni je operacjami atomowymi.

Co ciekawe, dlatego takie polecenia cpmogą nie kończyć się natychmiast po ich zabiciu. Jeśli kopiujesz bardzo duży plik i go zabijesz, nawet przy użyciu SIGKILL, proces będzie nadal działał, aż do zakończenia bieżącego połączenia systemowego. W przypadku dużego pliku może to chwilę potrwać, ponieważ proces będzie w stanie nieprzerwanym.

las
źródło
2
@qwr To najprawdopodobniej część biblioteki glibc, a nie cpsama. Posiada różne funkcje dostępu do plików, które wewnętrznie wykorzystują to jako wartość.
las
2
Świetna odpowiedź! Nigdy nie zdawałem sobie sprawy, że istnieje opóźnienie w zakończeniu cppo SIGKILLINGU, nawet w przypadku dużych plików ... może czas tych nieprzerwanych operacji atomowych procesu jest zbyt krótki. Czy to samo wyjaśnienie działa w przypadku zabijania ddi innych procesów odczytu / zapisu na dysku?
Seninha,
1
@Seninha Operacje są dość krótkie, ponieważ dostępy są buforowane, więc możesz skopiować o wiele więcej danych na sekundę, niż dysk faktycznie może obsłużyć, jeśli jest wykonywany w seriach. Jeśli plik jest naprawdę duży i znajduje się na wolnym nośniku, pamięć podręczna może się zapełnić, a zabicie procesu może zająć trochę czasu. Jeśli chodzi o zabijanie dd, to zależy od tego bs, co dla niego ustawiłeś. Jeśli jest to tylko 512 (domyślnie), to powinno zakończyć się szybko. Jeśli jest większy, może to potrwać nieco dłużej.
las
3
Fragmenty @qwr 128kb są domyślnie wbudowane w coreutils podczas odczytu z urządzeń blokowych, w celu zminimalizowania wywołań systemowych. Analiza jest podana w źródle coreutils: git.savannah.gnu.org/cgit/coreutils.git/tree/src/ioblksize.h
Fiisch
1
@AndrewHenle Być może powinienem powiedzieć, że to metadane systemu plików, które są atomowe. Masz rację, że zapis może być częściowy.
las
20

Ponieważ cpjest to polecenie przestrzeni użytkownika, nie wpływa to na integralność systemu plików.

Oczywiście musisz być przygotowany, że co najmniej jeden plik nie zostanie całkowicie skopiowany, jeśli zabijesz uruchamiany cpprogram.

schily
źródło
14
Dlaczego głosowanie negatywne? Tylko dlatego, że jest schily?
Stephen Kitt
6
Zdecydowanie wydaje się, że przynajmniej jedna osoba głosuje za wszystkimi moimi odpowiedziami. Czy znasz sposób, aby dowiedzieć się, kto głosował?
schily
2
Nawet moderatorzy nie mogą dowiedzieć się, kto głosował - co jest zrozumiałe ograniczone do pracowników SO. Możesz użyć linku „skontaktuj się z nami”, aby poprosić ich o zbadanie sprawy.
Philip Kendall,
1
Byłoby bardzo smutne, gdyby program przestrzeni użytkownika był w stanie naruszyć integralność systemu plików. Uwaga: Oczywiście mogą istnieć, były i będą błędy w implementacjach systemu plików. Uwaga # 2: Oczywiście programy przestrzeni użytkownika działające z podwyższonymi uprawnieniami (np. CAP_SYS_RAWIOW systemie Linux lub równoważnym w innych systemach operacyjnych), które dają im bezpośredni dostęp do bazowego urządzenia systemu plików (np. sudo dd if=/dev/urandom of=/dev/sda1) Mogą siać spustoszenie wszelkiego rodzaju.
Jörg W Mittag
3
A jeśli system plików cpbyłby wystarczająco wadliwy, aby ulec uszkodzeniu po przerwaniu , prawdopodobnie zostałby również uszkodzony z ukończonego cpzbyt ...
ilkkachu