Khóa USB có cùng tên mỗi lần tôi gắn không?


9

Tôi có một khóa USB sẽ được sử dụng để lưu dữ liệu trên đó hàng ngày thông qua tập lệnh bash. Tôi đã quản lý để gắn kết nó cho một người dùng cụ thể để có thể viết các thư mục trong đó bằng lệnh:

mount /dev/sdc1 /media/usb -o rw,uid=sysop,gid=sysop

Kịch bản có thể chạy và tạo các thư mục theo ý muốn và nó hoàn hảo. Tại một số điểm, khóa USB sẽ được rút ra và thay thế bằng một cái mới (cùng kiểu). Khóa USB mới vẫn có tên /dev/sdc1hay nó sẽ là một tên khác?

Nếu nó là một cái khác, làm thế nào tôi có thể bao gồm phần gắn kết trong tập lệnh của mình để nó được tạo tự động?


2
Câu trả lời là không, nhưng bạn có thể giải quyết vấn đề đó với các quy tắc udev . Xem ở đây để giải thích tốt hơn nhưng hơi lỗi thời.
Satō Katsura

@AlexTartan Nếu bạn cắm bất kỳ đĩa usb nào khác vào bất kỳ cổng usb nào khác trước khi nó có thể nhận được sdc. Vì vậy, ràng buộc của bạn "và không có gì khác được quy định cho sdc1" là đúng. Nói chung đây là một giả định rất nguy hiểm không bao giờ có thể được thực hiện. Không bao giờ nên sử dụng sd [az] làm tên thiết bị liên tục. Đây là một di sản từ thời chúng ta có bộ điều khiển IDE với bốn cổng tĩnh có thể được đặt bằng cách đặt bộ nhảy phần cứng và chọn đúng đầu cắm cáp.
ikrabbe

1
@ikrabbe, tôi biết, đó là lý do tại sao tôi đăng câu trả lời dựa trên nhận dạng nhãn (những điều này có thể được quản lý dễ dàng hơn một chút).
Alex Tartan

Câu trả lời:


6

Mặc dù việc truy cập nó /dev/sdXyrất nguy hiểm, một nhận dạng chính xác hơn có thể được thực hiện bằng cách UUID.

Vì bạn đề cập (tại một số điểm) thay đổi thanh usb, để duy trì khả năng tương thích, bạn có thể muốn xác định thanh usb của mình bằng nhãn. Để làm như vậy, bạn có thể : /dev/disk/by-label/YourLabelHere.

Lưu ý rằng bạn cần đặt nhãn thành thanh usb mới trước khi chạy tập lệnh và cũng /dev/disk/by-labelchỉ khả dụng nếu (ít nhất) một thanh usb được kết nối (nếu không nó sẽ bị xóa).

Chi tiết về cách thiết lập nhãn usb có thể được tìm thấy ở đây: https://askubfox.com/questions/194510/how-to-edit-label-of-usb-drive


1
Nếu hệ thống tập tin của bạn không có nhãn, thì /dev/disk/by-id/có thể sử dụng thay thế (đó là những gì tôi sử dụng cho hệ thống tập tin của mình).
Toby Speight

3

Đây là cách tôi giải quyết vấn đề này, nhưng nói chung như Sato Katsura đã nói với bạn, bạn cần phải viết một quy tắc udev.

  1. Cắm thiết bị của bạn, kiểm tra thiết bị nào có (ví dụ: bằng cách xem dmesg).
  2. Như siêu người gọi udevadm info --query all /dev/sdc(hoặc bất cứ điều gì).
  3. Thiết lập quy tắc udev, đây là một ví dụ cho túi tiền của tôi. Các trường ID_SERIAL_SHORTID_FS_UUIDtôi đọc từ thông tin trong bước 2:

    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="YT440900877400W000Y0", ENV{ID_FS_UUID}=="3878-D432", ENV{DEVTYPE}=="disk", SYMLINK+="pocketbook", OWNER="ingo"
    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="YT440900877400W000Y0", ENV{ID_FS_UUID}=="9016-4EF8", ENV{DEVTYPE}=="disk", SYMLINK+="pocketbook-sd", OWNER="ingo"
    

    Tôi đặt OWNER ở đây, rằng tôi có thể gắn kết nó với tài khoản người dùng chính của mình. Ngoài ra với túi tiền của tôi, tôi không có phân vùng nhưng gắn các đĩa đơn giản. Nếu bạn có phân vùng thay đổi:

    ENV{ID_PART_ENTRY_NUMBER}=="1", ENV{DEVTYPE}=="partition",
    

    cho phân vùng Số 1, trên các dòng quy tắc udev.

Các quy tắc udev được tìm thấy trong /etc/udev/rules.d, nếu bạn có một hệ thống lành mạnh.

  1. Bây giờ bạn có thể

    udevadm control --reload
    

    để tải lại các quy tắc và

    udevadm monitor
    

    để theo dõi những gì xảy ra trong bước 5.

  2. Plugout và Plugin thiết bị usb của bạn (tất nhiên sau khi ngắt kết nối trước nếu bạn gắn nó). Màn hình sẽ thông báo cho bạn về thiết bị mới khi thiết bị được khởi tạo.

  3. Kiểm tra nếu /dev/chứa các liên kết tượng trưng đúng. Trong ví dụ của tôi, tôi đã nhận được điều này:

    brw-rw---- 1 ingo disk    8,  48 Aug  3 10:32 sdd
    brw-rw---- 1 ingo disk    8,  32 Aug  3 10:32 sdc
    lrwxrwxrwx 1 root root         3 Aug  3 10:32 pocketbook-sd -> sdd
    lrwxrwxrwx 1 root root         3 Aug  3 10:32 pocketbook -> sdc
    

Bây giờ bạn có thể định nghĩa quy tắc dai dẳng với các liên kết tượng trưng /dev/pocketbook/dev/pocketbook-sd, hoặc bất cứ điều gì là tên của bạn trong lĩnh vực liên kết tượng trưng của tập tin quy tắc udev.


1
Cảm ơn bạn vì câu trả lời. Tuy nhiên tôi sẽ không thể sử dụng nó. Thiết bị tôi đang làm việc được cài đặt trên một ngọn núi lửa và thanh usb được sử dụng để lưu trữ dữ liệu thu được ở đó. Chúng tôi sẽ chỉ đến đó một lần trong ba lần gắn kết để thay đổi thanh usb. Tôi chỉ có một điều khiển từ xa cho nó, không có giao diện "màn hình". Vì usb sẽ khác nhau mọi lúc, nhưng cắm trên cùng một cổng usb, tôi nghĩ cách dễ dàng hơn là giữ đường dẫn sdc1. Tôi sẽ thấy với các quy tắc udev những gì tôi có thể làm.
Gudrun

0

Chỉ cần thêm vào câu trả lời của @ alextartan.

Tôi đã cuộn hệ thống sao lưu của riêng mình, sử dụng ổ USB cho các mục tiêu. Tôi cần chắc chắn những gì đang đi đâu. Vì UUID không đặc biệt thân thiện với người dùng, tôi dựa vào nhãn đĩa.

UUID cũng có một chút vấn đề bởi vì bất cứ khi nào bạn định dạng lại phân vùng, nó sẽ nhận được một UUID duy nhất mới, do đó, bất kỳ tập lệnh nào sử dụng UUID đó đều phải được sửa đổi. Tôi có thể gán nhãn giống như trước cho phân vùng được định dạng lại (hoặc thậm chí cho phân vùng trên ổ đĩa mới / thay thế) và để các tập lệnh của tôi một mình.

Tôi đã đưa ra quy ước ghi nhãn độc đáo (thân thiện với con người) của riêng mình và sử dụng gparted để gắn nhãn cho các phân vùng khác nhau khi tôi tạo chúng.

Khi tập lệnh của tôi cần truy cập vào một phân vùng cụ thể, tôi tìm kiếm tên thiết bị bằng nhãn.

function get_dev {
  ## Return the device name of a partition
  ## In DEV
  ## Given its label
  ## Partition does not need to be mounted
  ## Usage get_dev <partition_label>
  ## Copyleft 04/28/2014 JPmicrosystems
  local LINE
  local VERBOSE=1  ## Verbose version
  local USAGE="ERROR Usage is: get_dev <partition_label>"
  unset DEV

  if [ -z "${1}" ]
  then
    (( VERBOSE )) && echo $USAGE
    return 1
  fi

  LINE=$(ls -l /dev/disk/by-label | grep " ${1} ")
  if (( $? ))
  then
    (( VERBOSE )) && echo "ERROR Partition [${1}] not found"
    return 1
  fi

  DEV="/dev/${LINE##*/}"
  return 0
}
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.