Що відбувається, коли я вбиваю "cp"? Чи безпечно це та чи має це наслідки?


23

Які наслідки для файлової системи ext4, коли я припиняю cpкоманду копіювання , набравши Ctrl+, Cпоки вона працює?

Чи пошкоджується файлова система? Чи залишається простір розділу, який займає неповний скопійований файл, після його видалення?

І, найголовніше, чи закінчити cpпроцес безпечною справою?


1
Майте на увазі, що хоча відповіді правильні для ext4, файлові системи без журналу можуть бути не настільки безпечними.
пр.

3
@Ave Journaling нічого спільного з цим не має. Системні дзвінки є атомними незалежно від файлової системи, яку ви використовуєте. Журналізація корисна в ситуаціях, коли влада може різко втрачатися.
ліс

Відповіді:


22

Це можна зробити безпечно, але ви, природно, копію не закінчили.

Коли cpкоманда виконується, вона робить системні виклики, які інструктують ядро ​​робити копії файлу. Syscall - це функція, яку може викликати програма, яка вимагає послуги з ядра, наприклад, читання або запис даних на диск. Процес простору користувача просто чекає завершення системного виклику. Якби ви відстежували дзвінки, це виглядало б приблизно так:

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

Це повторюється для кожного файлу, який потрібно скопіювати. Корупція не відбудеться через те, як працюють ці системні виклики. Коли системні виклики , як вони вводяться, фатальний сигнал буде приймати тільки силу після того , системний виклик був закінчений , чи не в той час як він працює. Через це примусове вбивство процесу призведе до його припинення лише після закінчення поточного системного виклику. Це означає, що ядро, де живе драйвер файлової системи, може вільно закінчити ті операції, які йому потрібно виконати, щоб перевести файлову систему в здоровий стан. Будь-який подібний I / O ніколи не припиняється в середині операції, роблячи їх атомними операціями.

Цікаво, що саме такі команди, як, наприклад, cpможуть не припинятися негайно, коли вони вбиваються. Якщо ви копіюєте дуже великий файл і вбиваєте його, навіть за допомогою SIGKILL, процес все одно буде тривати до завершення поточного системного виклику. З великим файлом це може зайняти деякий час, оскільки процес буде перебувати в безперебійному стані.


2
@qwr Це, швидше за все, частина бібліотеки glibc, а не cpсама вона. Він має різні функції доступу до файлів, які внутрішньо використовують це як значення.
ліс

2
Чудова відповідь! Я ніколи не розумів, що затримка припинення cpпісля SIGKILLing є навіть за умови великої роботи файлів ... можливо, тривалість цих безперебійних атомних операцій процесу занадто мала. Чи працює те саме пояснення щодо вбивства ddта інших процесів читання / запису диска?
Сенінья

1
@Seninha Операції є досить короткими, оскільки доступ є кешованим, тому ви можете скопіювати набагато більше даних за секунду, ніж ваш накопичувач насправді може обробити, якщо це зроблено під час вибухів. Якщо файл дійсно великий і на повільному носії, кеш може заповнитись, а процес вбивства може зайняти деякий час. Що стосується вбивства dd, то це залежить від того, що bsви для нього встановили. Якщо це лише 512 (за замовчуванням), він повинен швидко припинитися. Якщо вона більша, то це може зайняти трохи більше часу.
ліс

3
@qwr 128kb шматки є стандартними за замовчуванням в coreutils при зчитуванні з blockdevices, це робиться, намагаючись мінімізувати системні дзвінки. Аналіз наведений у джерелі coreutils: git.savannah.gnu.org/cgit/coreutils.git/tree/src/ioblksize.h
Fiisch

1
@AndrewHenle Можливо, я мав би сказати, що метадані файлової системи є атомними. Ви вірні, що запис може бути частковим.
ліс

20

Оскільки cpце команда простору користувача, це не впливає на цілісність файлової системи.

Звичайно, потрібно бути готовим до того, що принаймні один файл не буде скопійований повністю, якщо ви знищите запущену cpпрограму.


14
Чому потік? Просто тому, що це шилі?
Стівен Кітт

6
Напевно, здається, щонайменше одна людина, яка оскаржує всі мої відповіді. Чи знаєте ви про спосіб дізнатися, хто зробив протиріччя?
schily

2
Навіть модератори не можуть дізнатись, хто голосував конкретно - це, зрозуміло, обмежено для працівників ДП. Ви можете скористатися посиланням «зв’яжіться з нами», щоб попросити їх розслідувати.
Філіп Кендалл

1
Було б дуже сумно, якби програма простору користувачів змогла поставити під загрозу цілісність файлової системи. Примітка. Звичайно, можуть бути, були, і будуть проблеми в реалізації файлової системи. Примітка №2. Також, звичайно, програми користувальницького простору, що працюють з підвищеними привілеями (наприклад, CAP_SYS_RAWIOв Linux або еквівалентом в інших ОС), які надають їм прямий доступ до базового пристрою файлової системи (наприклад sudo dd if=/dev/urandom of=/dev/sda1), можуть спричинити загрозу різного роду.
Йорг W Міттаг

3
І якби файлова система виявилася достатньо помилковою, щоб cpвона була пошкоджена після перерви , вона, ймовірно, cp
зіпсується і
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.