Cách ngắt kết nối thiết bị bận


244

Tôi đã có một số ổ đĩa samba đang được nhiều người dùng truy cập hàng ngày. Tôi đã có mã để nhận ra các ổ đĩa được chia sẻ (từ bảng SQL) và gắn chúng vào một thư mục đặc biệt nơi tất cả người dùng có thể truy cập chúng.

Tôi muốn biết, nếu tôi loại bỏ một ổ đĩa khỏi bảng SQL của mình (thực sự mang nó ngoại tuyến), hoặc thậm chí là, có cách nào để ngắt kết nối một thiết bị bận rộn? Cho đến nay tôi đã thấy rằng bất kỳ hình thức umountnào không hoạt động.

Bỏ qua khả năng hủy dữ liệu - có thể ngắt kết nối thiết bị hiện đang được đọc không?


3
Một câu trả lời tổng quát hơn giải quyết nhiều nguyên nhân gây ra lỗi không được tìm thấy ở đây oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole Tange

2
Xin chào, có lẽ bạn đã cdgắn dir, sau đó bạn trở thành root hoặc đăng nhập lại sau đó shell khác bị kẹt. Làm exittrên tất cả các vỏ.
Smeterlink

Câu trả lời:


456

ĐÚNG!! Có một cách để tháo thiết bị bận ngay lập tức (ngay cả khi thiết bị đang bận và không thể bị ngắt kết nối mạnh mẽ). Bạn có thể dọn dẹp tất cả sau:

umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS(NETWORK-FILE-SYSTEM)

GHI CHÚ:

  1. Các lệnh này có thể phá vỡ một quy trình đang chạy, gây mất dữ liệu HOẶC các tệp đang mở bị hỏng. Các chương trình truy cập tệp DEVICE / NFS đích có thể gây ra lỗi HOẶC không thể hoạt động chính xác sau khi ngắt kết nối.
  2. Cố gắng thực hiện các lệnh này khi KHÔNG bên trong Thư mục / Ổ đĩa / Thiết bị được gắn.

22
Lưu ý: -lđây là chữ thường L(dành cho "lười biếng không đếm được"). (Xem câu trả lời liên quan này .)
ョ ー ジ

4
Đã làm việc. Một sắc thái, nếu bạn đã đăng nhập thông qua ứng dụng khách FTP, bạn phải đăng xuất để thư mục ngắt kết nối thành công.
Alexander Kim

Họ không làm việc. Cả hai chỉ treo mãi mãi. (Debian 8, cifs-utils 2: 6.4-1)
Hubro

1
-l/ --lazysẽ không làm hỏng các tệp đang mở, nhưng trên Linux, có vẻ như bạn không thể biết khi nào thiết bị thực sự chưa được khắc phục và có thể bị xóa
Tom Hale

1
Kinda sợ. Tôi lười biếng - không đếm được sau đó kể lại trong khi một số quy trình khác vẫn đang truy cập nó. Vì vậy, tôi đoán tôi đã gắn nó hai lần vào cùng một vị trí? Không chắc chắn những gì đã làm.
sudo

120

Nếu có thể, hãy xác định vị trí / xác định quá trình bận rộn, tiêu diệt quá trình và sau đó ngắt kết nối samba để giảm thiểu thiệt hại.

  • lsof | grep '<mountpoint of /dev/sda1>' (hoặc bất kể thiết bị được gắn là gì)

  • pkill target_process(giết chết bận rộn. theo tên | kill PID| killall target_process)

  • umount /dev/sda1 (hoặc bất kể thiết bị được gắn là gì)


6
Điều đó không trả lại bất cứ điều gì. Tôi giả sử nó là ổ đĩa mạng và tôi không thể thấy các quá trình của các máy tính khác truy cập ổ đĩa. Tương tự với các lệnh "fuser".
Tối đa

trời ơi ... bạn cần các lệnh samba ... / usr / bin / smbclient service <password>: Xem nếu điều này khiến bạn bắt đầu ... tldp.org/HOWTO/SMB-HOWTO-8.html
Frank Tudor

2
Các lệnh smb đã thực sự bị phản đối và được thay thế bằng "umount.cifs" .... cũng không hoạt động. Có vẻ như tôi bị mắc kẹt vì không thể di chuyển trong khi bận rộn.
Tối đa

Nếu bạn đang sử dụng Asuswrt-Merlin, bạn cần cài đặt lsof:# opkg install lsof
Tonatio

1
bạn cần sudo lsof để có kết quả
aheigins

78

Đảm bảo rằng bạn không còn trong thiết bị được gắn khi bạn đang cố gắng vượt qua.


4
Chính xác, chỉ cần mở thư mục hiện tại (nằm trên thiết bị đích) trong thiết bị đầu cuối của bạn (thông qua lệnh cd) là để ngăn chặn quá trình không đếm ngược :)
jave.web

2
Đúng, tôi có một vỏ chạy trong một thư mục trên thiết bị. Đóng cửa sổ terminal và voila
sh78 31/12/18

Ngoài ra, hãy chắc chắn rằng không có bất kỳ điểm gắn kết nào khác bên trong điểm bạn đang cố gắng umount.
chiến thắng

@victe Cảm ơn; Tôi đã tạo ra một thư mục bằng pfexec mount -F vboxfs rugacompartida ~ / Tài liệu trên Solaris 11; nhưng Tài liệu có các thư mục con và đó là vấn đề.
Dani Aya

44

Hãy thử làm như sau, nhưng trước khi chạy, lưu ý rằng -kcờ sẽ giết mọi tiến trình đang chạy khiến thiết bị luôn bận rộn.

Các -ilàm cho lá cờ fuserhỏi trước khi giết chết.

fuser -kim /address  # kill any processes accessing file
unmount /address

5
lsof | grep '/dev/<my-device>đã không trả lại bất cứ điều gì, nhưng điều này làm việc tuyệt vời! Cũng có thể muốn đề nghị fuser -m /dev/<my-device>trong trường hợp bạn muốn tìm hiểu quá trình trước khi giết nó.
modulitos

3
Chạy lệnh fuser ngay lập tức ngắt kết nối tôi khỏi VPS.
giorgio79

21

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 -llà 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,rohuy hiệu, bạn biết rằng:

  1. Tất cả dữ liệu đang chờ xử lý đã được ghi vào đĩa
  2. Tất cả các nỗ lực viết trong tương lai sẽ thất bại
  3. 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 fuserthua kémlsof

Tại sao không sử dụng sử dụng fusersớm hơn? Chà, bạn có thể có, nhưng fuserhoạ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:

  1. Tạm thời sao chép điểm gắn kết với mount -o bind /media/hdd /mntvị trí khác
  2. Ẩ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ó:

  1. 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)
  2. 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 -wtắc giới hạn các quy trình viết và -itươ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 umounttrên mountpoint hai lần nếu bạn đã gắn kết một 000thư 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ở đâ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-pointcó ý 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.


1
Nếu --lazyquá nguy hiểm, tại sao không có nhiều cảnh báo trong umounttrang người đàn ông? Tất cả những gì nó nói là " Lazy unmount. Tách hệ thống tệp khỏi hệ thống phân cấp tệp ngay bây giờ và dọn sạch tất cả các tham chiếu đến hệ thống tệp này ngay khi nó không còn bận nữa. "
bitinerant

7

Kiểm tra hệ thống tệp NFS đã xuất với exportfs -v. Nếu tìm thấy, hãy xóa bằng thư mục exportfs -d share: /. Chúng không hiển thị trong danh sách fuser / lsof và có thể ngăn không cho thành công.


1
Cảm ơn lời khuyên này. Tôi đã phải sử dụng exportfs -ua để loại bỏ khóa.
FuePi

6

Kiểm tra umount2:

Linux 2.1.116 đã thêm lệnh gọi hệ thống umount2 (), giống như umount (), ngắt kết nối một mục tiêu, nhưng cho phép các cờ bổ sung kiểm soát hành vi của hoạt động:

MNT_FORCE (kể từ Linux 2.1.116) Buộc ngắt kết nối ngay cả khi bận. . MNT_EXPIRE (kể từ Linux 2.6.8) Đánh dấu điểm gắn kết là hết hạn. Nếu một điểm gắn kết hiện không được sử dụng, thì một cuộc gọi ban đầu đến umount2 () với cờ này không thành công với lỗi EAGAIN, nhưng đánh dấu điểm gắn kết là hết hạn. Điểm gắn kết vẫn hết hạn miễn là nó không được truy cập bởi bất kỳ quy trình nào. Cuộc gọi umount2 () thứ hai chỉ định MNT_EXPIRE hủy kết nối điểm gắn kết đã hết hạn. Cờ này không thể được chỉ định bằng MNT_FORCE hoặc MNT_DETACH. Giá trị trả về

Về thành công, số không được trả về. Khi có lỗi, -1 được trả về và errno được đặt một cách thích hợp.


Thật không may những cái này không gắn kết NFS, nhưng CIFS. Tôi sẽ thử MNT_DETACH mặc dù. Tuy nhiên nếu umount -l không hoạt động tôi không thể tưởng tượng điều này sẽ khác đi nhiều. Cảm ơn mặc dù!
Tối đa

2

Ai đó đã đề cập rằng nếu bạn đang sử dụng thiết bị đầu cuối và thư mục hiện tại của bạn nằm trong đường dẫn mà bạn muốn ngắt kết nối, bạn sẽ gặp lỗi.
Là một bổ sung, trong trường hợp này, bạn lsof | grep path-to-be-unmountedphải có đầu ra dưới đây:

bash ... path-to-be-unmounted

1

Một cách khác khi mọi thứ hoạt động là chỉnh sửa /etc/fstab, thêm noautocờ và khởi động lại máy. Thiết bị sẽ không được gắn kết và khi bạn hoàn thành bất kỳ việc gì, hãy xóa cờ và khởi động lại.


0

Câu trả lời thích hợp:

Nếu bạn có nhóm zfs trên thiết bị đó, ít nhất là khi đó là nhóm dựa trên tệp, lsofsẽ không hiển thị mức sử dụng. Nhưng bạn chỉ có thể chạy

sudo zpool export mypoo

và sau đó không đếm được.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.