每次安装时,USB 闪存盘都会具有相同的名称吗?

每次安装时,USB 闪存盘都会具有相同的名称吗?

我有一个 USB 密钥,用于每天通过 bash 脚本保存数据。我设法为特定用户安装它,以便能够使用以下命令在其中写入文件夹:

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

该脚本可以根据需要运行并创建目录,非常完美。在某些时候,USB 密钥将被拔出并更换为新的(相同型号)。新的 USB 闪存盘是否仍保留该名称/dev/sdc1,还是会有所不同?

如果是不同的,我如何将安装部分包含在我的脚本中以使其自动制作?

答案1

虽然通过 访问它/dev/sdXy是有风险的,但通过 可以进行更准确的识别UUID

由于您提到(在某些时候)更换 USB 记忆棒,为了保持兼容性,您可能需要通过标签来识别您的 USB 记忆棒。为此,您可以/dev/disk/by-label/YourLabelHere

请注意,您需要在运行脚本之前将标签设置为新的 USB 记忆棒,并且/dev/disk/by-label仅当(至少)连接一个 USB 记忆棒时才可用(否则它会被删除)。

有关如何设置 USB 标签的详细信息,请参阅此处:https://askubuntu.com/questions/194510/how-to-edit-label-of-usb-drive

答案2

这就是我解决这个问题的方法,但通常正如 Sato Katsura 告诉你的那样,你需要编写一个 udev 规则。

  1. 插入您的设备,检查它获得的是哪个设备(例如通过观看 dmesg)。
  2. 作为超级用户调用udevadm info --query all /dev/sdc(或其他)。
  3. 设置 udev 规则,这是我的钱包的示例。我从步骤 2 中读取的字段ID_SERIAL_SHORTID_FS_UUID信息:

    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"
    

    我在这里设置了 OWNER,我可以使用我的主用户帐户安装它。另外,我的钱包没有分区,但安装了普通磁盘。如果您有分区更改:

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

    对于分区号 1,在 udev 规则行上。

/etc/udev/rules.d如果您有一个健全的系统,则可以在 中找到 udev 规则。

  1. 现在你可以

    udevadm control --reload
    

    重新加载规则并

    udevadm monitor
    

    监控第 5 步中发生的情况。

  2. 拔出并插入您的 USB 设备(当然,如果您安装了该设备,则在卸载之前)。监视器应在初始化时通知您有关新设备的信息。

  3. 检查是否/dev/包含正确的符号链接。在我的例子中我得到了这个:

    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
    

现在,您可以使用符号链接/dev/pocketbook和定义持久性规则/dev/pocketbook-sd,或者使用 udev 规则文件的 SYMLINK 字段中的任何名称。

答案3

只是为了添加@alextartan 的答案。

我推出了自己的备份系统,该系统使用 USB 驱动器作为目标。我需要确定发生了什么。由于 UUID 对用户来说不是特别友好,因此我依赖于磁盘标签。

UUID 也有一点问题,因为每当您重新格式化分区时,它都会获得一个新的唯一 UUID,因此必须修改使用该 UUID 的任何脚本。我可以将与以前相同的标签分配给重新格式化的分区(甚至分配给新/替换驱动器上的分区),并保留我的脚本。

我想出了自己独特的(人类友好的)标签约定,并在创建分区时使用 gparted 来标记各个分区。

当我的脚本需要访问特定分区时,我使用标签查找设备名称。

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
}

相关内容