每次安装USB闪存盘时,其名称都一样吗?


9

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

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

该脚本可以根据需要运行和创建目录,并且非常完美。在某个时候,将拔出USB密钥并用新的(相同型号)替换。新的USB密钥仍会使用该名称/dev/sdc1还是会有所不同?

如果是不同的零件,如何将安装零件包括在脚本中以使其自动制成?


2
答案是否定的,但是您可以使用udev rules来解决。请参阅此处,以获得更好但有些过时的解释。
佐藤桂

@AlexTartan如果在可能获得sdc之前将任何其他USB磁盘插入任何其他USB端口。因此,您的约束“其他任何东西都不能归于sdc1”是正确的。通常,这是一个非常危险的假设,永远无法做出。使用sd [az]作为持久设备名称绝不是一个好主意。从那时起,我们就有了带有四个静态端口的IDE控制器,可以通过设置硬件跳线并选择正确的电缆插头来设置。
ikrabbe 2015年

1
我知道@ikrabbe,这就是为什么我根据标签标识发布答案(可以更轻松地管理它们)的原因。
亚历克斯·塔坦

Answers:


6

虽然通过进行访问/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


1
如果您的文件系统没有标签,那么/dev/disk/by-id/可能会有用(这是我在文件系统中使用的标签)。
Toby Speight 2015年

3

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

  1. 插入您的设备,检查它得到的设备(例如,通过观看dmesg)。
  2. 作为超级用户调用udevadm info --query all /dev/sdc(或其他)。
  3. 设置udev规则,这是我的皮夹示例。字段ID_SERIAL_SHORTID_FS_UUID我从在步骤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"
    

    我在这里设置了OWNER,可以用我的主要用户帐户安装它。同样,在我的皮夹中,我没有分区,但是挂载了普通磁盘。如果您有分区更改:

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

    在udev规则行上为1号分区。

/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字段中定义任何名称。


1
谢谢您的回答。但是我将无法使用它。我正在使用的设备安装在火山上,并且USB记忆棒用于存储在此获取的数据。我们只会每三个mounths到那里去一次更换USB记忆棒。我只有一个远程访问权限,没有任何“屏幕”界面。由于USB一直不同,但是插入相同的USB端口,我认为更简单的方法是保留sdc1路径。我会用udev规则看到我能做什么。
Gudrun

0

只是添加到@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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.