Tránh umount -l
Tại thời điểm viết, câu trả lời được bình chọn hàng đầu khuyên bạn nên sử dụng umount -l
.
umount -l
là nguy hiểm hoặc tốt nhất là không an toàn . Tóm tắt:
- Nó không thực sự ngắt kết nối thiết bị, nó chỉ loại bỏ hệ thống tập tin khỏi không gian tên. Viết để mở tập tin có thể tiếp tục.
- Nó có thể gây ra tham nhũng hệ thống tập tin btrfs
Làm việc xung quanh / thay thế
Hành vi hữu ích của việc umount -l
ẩn hệ thống tệp khỏi quyền truy cập bằng tên đường dẫn tuyệt đối , do đó giảm thiểu việc sử dụng điểm tiếp theo.
Hành vi tương tự này có thể đạt được bằng cách gắn một thư mục trống với các quyền 000
đối với thư mục sẽ không được đếm.
Sau đó, bất kỳ quyền truy cập mới nào vào tên tệp ở bên dưới điểm gắn kết sẽ đánh vào thư mục mới được phủ lên với quyền 0 - các trình chặn mới đối với việc ngắt kết nối sẽ bị ngăn chặn.
Trước tiên hãy thử remount,ro
Thành tích lớn chưa từng có để được mở khóa là phần tiếp theo chỉ đọc. Khi bạn đạt được remount,ro
huy hiệu, bạn biết rằng:
- Tất cả dữ liệu đang chờ xử lý đã được ghi vào đĩa
- Tất cả các nỗ lực viết trong tương lai sẽ thất bại
- Dữ liệu ở trạng thái nhất quán, nếu bạn cần ngắt kết nối vật lý thiết bị.
mount -o remount,ro /dev/device
được đảm bảo không thành công nếu có các tệp được mở để ghi , vì vậy hãy thử ngay lập tức. Bạn có thể cảm thấy may mắn, punk!
Nếu bạn không may mắn, chỉ tập trung vào các quy trình với các tệp được mở để viết :
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
Sau đó, bạn sẽ có thể kết nối lại thiết bị chỉ đọc và đảm bảo trạng thái nhất quán.
Nếu bạn không thể chỉ đọc lại vào thời điểm này, hãy điều tra một số nguyên nhân có thể khác được liệt kê ở đây .
Đã mở khóa thành tích chỉ đọc lại 🔓☑
Xin chúc mừng, dữ liệu của bạn trên mountpoint hiện nhất quán và được bảo vệ khỏi văn bản trong tương lai.
Tại sao lại fuser
thua kémlsof
Tại sao không sử dụng sử dụng fuser
sớm hơn? Chà, bạn có thể có, nhưng fuser
hoạt động trên một thư mục , không phải thiết bị , vì vậy nếu bạn muốn xóa điểm gắn kết khỏi không gian tên tệp và vẫn sử dụng fuser
, bạn cần phải:
- Tạm thời sao chép điểm gắn kết với
mount -o bind /media/hdd /mnt
vị trí khác
- Ẩn điểm gắn kết ban đầu và chặn không gian tên:
Đây là cách thực hiện:
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"
Sau đó, bạn sẽ có:
- Không gian tên ban đầu bị ẩn (không thể mở thêm tệp, vấn đề không thể trở nên tồi tệ hơn)
- Một thư mục gắn kết liên kết trùng lặp (trái ngược với một thiết bị) để chạy
fuser
.
Điều này phức tạp hơn [1] , nhưng cho phép bạn sử dụng:
fuser -vmMkiw <mountpoint>
sẽ tương tác yêu cầu tiêu diệt các tiến trình với các tệp được mở để ghi. Tất nhiên, bạn có thể làm điều này mà không cần che giấu điểm gắn kết, nhưng các mô phỏng ở trênumount -l
, không có bất kỳ nguy hiểm nào.
Công -w
tắc giới hạn các quy trình viết và -i
tương tác, do đó, sau khi chỉ đọc lại, nếu bạn vội, bạn có thể sử dụng:
fuser -vmMk <mountpoint>
để giết tất cả các tiến trình còn lại với các tệp được mở dưới điểm gắn kết.
Hy vọng tại thời điểm này, bạn có thể ngắt kết nối thiết bị. (Bạn sẽ cần chạy umount
trên mountpoint hai lần nếu bạn đã gắn kết một 000
thư mục chế độ trên đầu.)
Hoặc dùng:
fuser -vmMki <mountpoint>
để tương tác tiêu diệt các quá trình chỉ đọc còn lại chặn kết nối không đếm được.
Chết tiệt, tôi vẫn nhận được target is busy
!
Các tệp đang mở không phải là trình chặn duy nhất. Xem ở đây và ở đây cho các nguyên nhân khác và biện pháp khắc phục của họ.
Ngay cả khi bạn có một số gremlin ẩn giấu đang ngăn bạn hoàn toàn ngắt kết nối thiết bị, ít nhất bạn vẫn có hệ thống tập tin của mình ở trạng thái nhất quán.
Sau đó, bạn có thể sử dụng lsof +f -- /dev/device
để liệt kê tất cả các quy trình với các tệp đang mở trên thiết bị chứa hệ thống tệp và sau đó giết chúng.
[1] Nó ít phức tạp hơn để sử dụng mount --move
, nhưng điều đó đòi hỏi phải mount --make-private /parent-mount-point
có ý nghĩa . Về cơ bản, nếu mountpoint được gắn kết dưới /
hệ thống tập tin, bạn muốn tránh điều này.