我有一个 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 规则。
- 插入您的设备,检查它获得的是哪个设备(例如通过观看 dmesg)。
- 作为超级用户调用
udevadm info --query all /dev/sdc
(或其他)。 设置 udev 规则,这是我的钱包的示例。我从步骤 2 中读取的字段
ID_SERIAL_SHORT
和ID_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 规则。
现在你可以
udevadm control --reload
重新加载规则并
udevadm monitor
监控第 5 步中发生的情况。
拔出并插入您的 USB 设备(当然,如果您安装了该设备,则在卸载之前)。监视器应在初始化时通知您有关新设备的信息。
检查是否
/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
}