Tôi thấy rằng để gắn lại một thanh USB, tôi phải ngắt kết nối vật lý với nó, sau đó kết nối lại nó. Làm thế nào tôi có thể làm điều này mà không có hành động thể chất mệt mỏi như vậy?
Tôi thấy rằng để gắn lại một thanh USB, tôi phải ngắt kết nối vật lý với nó, sau đó kết nối lại nó. Làm thế nào tôi có thể làm điều này mà không có hành động thể chất mệt mỏi như vậy?
Câu trả lời:
Từ kinh nghiệm của tôi về Ubuntu, khi bạn "nhả" một thanh USB từ bên trong Nautilus, thiết bị thực sự biến mất khỏi hệ thống. Tôi không chắc tại sao lại như vậy, nhưng cả Nautilus và dòng lệnh đều không thể lấy lại được. Tôi đoán logic là một khi bạn rút ra một thanh USB, bạn không muốn nó quay lại, nhưng sẽ ngắt kết nối nó.
Cách tôi làm việc xung quanh điều này (khi cần), là bằng cách sử dụng umount
thay vì Nautilus. Bạn cũng có thể gọi sync
để xóa bộ đệm hệ thống tập tin vào đĩa.
Chỉ cần tìm một chủ đề có thêm thông tin: http://ubuntuforums.org/showthread.php?t=1477247
Vì vậy, về cơ bản, a) Xây dựng lại nautilus từ nguồn mà không có bản vá đó (và luôn cập nhật khi bạn cập nhật hệ thống của mình ...) hoặc b) sử dụng trình quản lý tệp khác (ít nhất là khi ngắt kết nối ^^).
/dev/disk/by-id
và xem nếu thiết bị đã thực sự biến mất. Tôi cá là không, và có thể được nhắc lại từ đó bằng một mount
lệnh.
/dev/disk/by-id
chứa liên kết tượng trưng đến các tập tin thiết bị /dev
, ví dụ /dev/disk/by-id/usb-Kingston_DT_100_G2_001CC0C60DBDFC90D32923CE-0:0 -> ../../sdb
. Khi thiết bị biến mất sau udisks --eject
đó (mà tôi giả sử xảy ra ở đây), symlink đã cũ và không thể được sử dụng để gắn lại.
Đây là hành vi tôi có trên hệ thống Ubuntu Lucid của mình:
Khi tôi cắm USB flash / thumbdrive có hai phân vùng, hệ thống sẽ báo cáo:
$ ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2
$ udisks --show-info /dev/sdb | grep -A2 'partition table\|by-id'
by-id: /dev/disk/by-id/usb-takeMS_USB_Mini_AA07013000010057-0:0
by-path: /dev/disk/by-path/pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0
detected at: Mon 29 Apr 2013 02:16:50 PM CEST
--
partition table:
scheme: mbr
count: 2
$ udisks --show-info /dev/sdb1 | grep -A2 'partition table\|by-id'
by-id: /dev/disk/by-id/usb-takeMS_USB_Mini_AA07013000010057-0:0-part1
by-id: /dev/disk/by-uuid/581E-EE0B
by-path: /dev/disk/by-path/pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0-part1
detected at: Mon 29 Apr 2013 04:24:25 PM CEST
$ udisks --show-info /dev/sdb2 | grep -A2 'partition table\|by-id'
by-id: /dev/disk/by-id/usb-takeMS_USB_Mini_AA07013000010057-0:0-part2
by-id: /dev/disk/by-uuid/4A0E-A166
by-path: /dev/disk/by-path/pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0-part2
detected at: Mon 29 Apr 2013 04:24:25 PM CEST
$ udevadm info --query=all --name=/dev/sdb | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host13/target13:0:0/13:0:0:0/block/sdb
$ udevadm info --query=all --name=/dev/sdb1 | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host13/target13:0:0/13:0:0:0/block/sdb/sdb1
$ udevadm info --query=all --name=/dev/sdb2 | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host13/target13:0:0/13:0:0:0/block/sdb/sdb2
$ sudo partprobe /dev/sdb
$
Vì vậy, chỉ có phân vùng có /dev/disk/by-uuid
; trong khi cả đĩa và phân vùng đều có (khác nhau) /dev/disk/by-id
.
Bây giờ, nếu tôi nhấp chuột trái vào một trong các mục phân vùng trong applet Disk Mount trong máy tính để bàn Gnome2 trong Lucid, tôi chỉ nhận được hai mục: "Mở" hoặc "Eject" (như đã đề cập trong [GIẢI QUYẾT] một ổ đĩa USB có nautilus trong lynx?, từ câu trả lời của @Thomas , đề cập đến 16_ leather_unmount.patch ). Ngoài ra, palimpsest
ở đây hiển thị hai phân vùng cho đĩa.
Khi tôi nhấp vào Eject trên một trong các phân vùng - cả hai đều biến mất; tại thời điểm này, palimpsest
hiển thị đĩa, nhưng không có phân vùng và thay vào đó là thông báo "Không tìm thấy phương tiện"; cũng thế:
$ ls /dev/sdb*
/dev/sdb
$ udisks --show-info /dev/sdb | grep -A2 'partition table\|by-id'
by-id: /dev/disk/by-id/usb-takeMS_USB_Mini_AA07013000010057-0:0
by-path: /dev/disk/by-path/pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0
detected at: Mon 29 Apr 2013 02:16:50 PM CEST
$ udisks --show-info /dev/sdb1 | grep -A2 'partition table\|by-id'
$
$ udevadm info --query=all --name=/dev/sdb | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host13/target13:0:0/13:0:0:0/block/sdb
$ udevadm info --query=all --name=/dev/sdb1 | grep DEVPATH
device node not found
$ sudo partprobe /dev/sdb
Error: Error opening /dev/sdb: No medium found
Vì vậy, như được đề cập trong bình luận của @ultrasawblade , thực sự đĩa có ở đó, nhưng không phải là phân vùng - mặc dù, tôi nghĩ rằng tôi cần phân vùng làm thiết bị , để mount
.
Ngoài ra, hành vi tương tự như nhấp chuột trái + "Eject" trong GUI máy tính để bàn, tôi có thể nhận được trong terminal với sudo eject /dev/sdb
. Lưu ý rằng người ta cũng có thể mở palimpsest
, từ đó nhấp vào từng trong hai phân vùng và nhấp vào "Unmount Volume" - tại thời điểm đó, các biểu tượng cho các phân vùng sẽ vẫn được hiển thị trong applet của Disk Mount, nhưng sẽ được ghi chú là không đếm được; và sau đó người ta có thể làm sudo udisks --detach /dev/sdb
: điều này làm cho các biểu tượng biến mất khỏi applet của Disk Mount - nhưng /dev/sdb
thiết bị sẽ không còn hiện diện trên hệ thống nữa (tuy nhiên, lsusb
vẫn sẽ hiển thị thiết bị)!
Sau khi tìm kiếm khá nhiều câu trả lời (đã thử công cụ udevadm monitor --environment
trong quá trình cắm và rút phích cắm, với việc sao chép tất cả các hành động thông qua udevadm trigger
, để xem xét những gì BLKRRPART
ioctl làm), nhưng không thành công - cuối cùng tôi cũng tình cờ tìm thấy Cách khắc phục một thanh USB mà không cần tháo và lắp lại - Ubuntu / Debian , có câu trả lời:
sudo eject -t /dev/sdb
Sau khi lệnh này được chạy - hai phân vùng xuất hiện lại trong applet Disk Mount - mà không cần rút / cắm lại khóa USB !! Đây là tất cả những người lạ, bởi vì nếu bạn đọc man eject
:
-t With this option the drive is given a CD-ROM tray close command.
Not all devices support this command.
... Bạn sẽ không bao giờ mong đợi nó có thể áp dụng cho ổ USB / Thumb! (Và tôi thậm chí đã thử nhìn vào sys-utils / eject.c , và tôi không thể thấy bất cứ điều gì rõ ràng :)
)
Tất nhiên, nếu sudo udisks --detach /dev/sdb
đã được chạy trước đó, thì nó /dev/sdb
sẽ không tồn tại, vì vậy eject -t /dev/sdb
sẽ thất bại với eject: unable to find or open device for: '/dev/sdb'
. Trong trường hợp đó, chu trình nguồn USB như được lưu ý trong # 7457 Làm cách nào để kết nối lại thiết bị USB bị ngắt kết nối logic? đã giúp tôi phục hồi:
$ sudo sh -c 'echo suspend > /sys/bus/usb/devices/1-2/power/level'
$ sudo sh -c 'echo auto > /sys/bus/usb/devices/1-2/power/level'
Điều này làm cho các biểu tượng của phân vùng hiển thị lại trong applet của Disk Mount, trực tiếp như được gắn kết; để tìm đúng địa chỉ, hãy thử trong khi đĩa được gắn:
$ udevadm info --attribute-walk --name=/dev/sdb | grep "looking\|busnum\|devnum" | grep -B1 'busnum\|devnum'
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-2':
ATTRS{busnum}=="1"
ATTRS{devnum}=="13"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1':
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
# the first (.../usb1/1-2) should be the right one, check bus/devnum:
$ lsusb -s 1:13
Bus 001 Device 013: ID 090c:1000 Feiya Technology Corp. Flash Drive
# looks good; check for symlinks in `sys/bus/usb/devices` as per "parent device" .../usb1/1-2
$ ls -la /sys/bus/usb/devices/ | grep "usb1/1-2"
lrwxrwxrwx 1 root root 0 2013-04-29 17:17 1-2 -> ../../../devices/pci0000:00/0000:00:1d.7/usb1/1-2
lrwxrwxrwx 1 root root 0 2013-04-29 17:21 1-2:1.0 -> ../../../devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0
# so it should be /sys/bus/usb/devices/1-2; check if it has power/level:
$ ls /sys/bus/usb/devices/1-2/power/level
/sys/bus/usb/devices/1-2/power/level
eject -t /dev/<DEVICE>
.
Trên các hệ thống dựa trên Debian, ít nhất, bạn sẽ có thể làm điều này:
Điều này hoạt động vì ... ma thuật.
# determine 'would be drive letter'
lsblk
# do magic
eject /dev/sdb; sleep 1; eject -t /dev/sdb
/dev
mục nào nữa và IIRC sẽ không xuất hiện ởlsusb
một trong hai. Tôi không biết có cách nào để kết nối lại không.