Уникайте umount -l
На момент написання відповіді, голосуючий на вершині радить використовувати umount -l.
umount -lнебезпечно або в кращому випадку небезпечно . Підсумовуючи:
- Він фактично не відключає пристрій, він просто видаляє файлову систему з простору імен. Записи на відкриття файлів можуть продовжуватися.
- Це може призвести до пошкодження файлової системи btrfs
Подолання / альтернатива
Корисна поведінка компанії umount -l- це приховування файлової системи від доступу абсолютними іменами шляхів, тим самим мінімізуючи подальше використання маршрутизації.
Такої ж поведінки можна досягти, встановивши порожній каталог з дозволами 000на каталог, який потрібно відключити.
Тоді будь-який новий доступ до імен файлів у нижній точці монтажу потрапить до нещодавно накладеного каталогу з нульовими дозволами - тим самим запобігаються нові блокатори до відключення.
Спочатку спробуйте remount,ro
Основне досягнення, яке потрібно розблокувати, - це перерахунок лише для читання. Коли ви отримуєте remount,roзначок, ви знаєте, що:
- Усі очікувані дані були записані на диск
- Усі майбутні спроби запису не зможуть
- Дані перебувають у постійному стані, якщо вам потрібно фізично відключити пристрій.
mount -o remount,ro /dev/device гарантовано не вдасться, якщо є файли, відкриті для запису , тому спробуйте це прямо. Можливо, вам пощастить, панку!
Якщо вам не пощастило, зосередьтеся лише на процесах із відкритими для запису файлами :
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
Тоді ви маєте змогу перезавантажувати пристрій лише для читання та забезпечувати стабільний стан.
Якщо ви не можете перекомпонувати лише для читання в даний момент, дослідіть деякі інші можливі причини, перелічені тут .
Розблоковане досягнення для повторного монтажу лише для читання 🔓☑
Вітаємо, ваші дані на точці моменту тепер є послідовними та захищеними від подальших записів.
Чому fuserвона поступаєтьсяlsof
Чому б не використовувати використання fuserраніше? Ну, ви могли б мати, але fuserпрацює над каталогом , а не пристроєм , тому якщо ви хочете видалити місце монтажу з простору імен файлів і все-таки використовувати fuser, вам потрібно буде:
- Тимчасово скопіюйте
mount -o bind /media/hdd /mntточку монтажу в інше місце
- Сховати початкову точку монтажу та заблокувати простір імен:
Ось як:
null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"
# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked. https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"
# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"
# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"
Потім у вас буде:
- Прихована простора імен прихована (більше файлів неможливо відкрити, проблема не може погіршитися)
- Дублікат встановленого каталогу, що встановлюється (на відміну від пристрою), на якому потрібно запускати
fuser.
Це більш складне [1] , але дозволяє використовувати:
fuser -vmMkiw <mountpoint>
який інтерактивно попросить знищити процеси з файлами, відкритими для запису. Звичайно, ви могли це зробити, не ховаючи точки кріплення взагалі, але вищезазначені міміки umount -l, без жодної небезпеки.
У -wкомутаторі обмежує для написання процесів, і -iє інтерактивним, тому після того, як тільки для читання перемонтування, якщо ви це поспіхом ви могли б використовувати:
fuser -vmMk <mountpoint>
щоб знищити всі процеси, що залишилися, з файлами, відкритими під монтом.
Сподіваємось, що в цей момент ви можете відключити пристрій. (Вам потрібно буде запуститись umountна точку кріплення двічі, якщо ви прив’язали змонтований 000каталог режимів зверху.)
Або скористайтеся:
fuser -vmMki <mountpoint>
інтерактивно вбивати залишилися процеси лише для читання, блокуючи відключення.
Чорт, я все одно отримую target is busy!
Відкриті файли - не єдиний блокувальник відключення. Дивіться тут і тут про інші причини та способи їх усунення.
Навіть якщо у вас є якийсь ховається гремлін, який заважає вам повністю відключити пристрій, ви, принаймні, переконайтеся, що ваша файлова система не працює.
Потім ви можете скористатись lsof +f -- /dev/deviceсписком усіх процесів з відкритими файлами на пристрої, що містить файлову систему, а потім знищити їх.
[1] Використання менш складне mount --move, але це вимагає mount --make-private /parent-mount-pointнаслідків . В основному, якщо точка монтажу встановлена під /файловою системою, ви хочете цього уникнути.