Уникайте 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
наслідків . В основному, якщо точка монтажу встановлена під /
файловою системою, ви хочете цього уникнути.