连接时尝试在 Debian Bookworm 上自动安装 USB 驱动器

连接时尝试在 Debian Bookworm 上自动安装 USB 驱动器

我无法在 debian 12(书虫)上通过 autofs 安装我的 USB 硬盘 - 我发现这个资源和一些类似的问题,但似乎没有任何作用。当前在 debian bookworm 下自动挂载 USB 驱动器的方法是什么(在终端上 - 没有运行 GUI)?

我的/etc/auto.master:

+dir:/etc/auto.master.d
+auto.master
/media   /etc/auto.ext-usb --timeout=2,sync,nodev,nosuid

我的/etc/auto.ext-usb:

usbbackup             -fstype=auto       UUID=7c26a13b-2f28-4fbd-a0dc-6ce6c8a63dad

(我通过 blkid 计算出 uuid,驱动器采用 ext4 格式化;我可以手动将其安装到例如 /mnt/usb 中,不会出现问题)。

答案1

我使用的是 Linux Mint,它是基于 debian 的,但这也应该适用于 debian bookworm。
这是一份工作udev服务,来自 systemd 的扩展设备管理器。
如果插入了某些硬件并且您可以加载一些额外的模块或启动一些正在运行的操作,它会收到内核通知。
但是您不能在 udev 运行操作中调用 bin 文件夹的低级挂载命令,这将不起作用并导致问题。
你需要系统挂载 https://manpages.debian.org/bookworm/systemd/systemd-mount.1.en.html,当 udev 完成执行时,它会在 udev 之外完成工作。

  1. 检查 udev 守护进程是否正在运行systemctl list-units *udevd.service
    ,并检查是否有 systemd-mountls /usr/bin/systemd-mount
  2. 获取设备节点/路径 - 使用文件管理器手动安装 USB 驱动器,我使用 USB 棒
    打开终端并在 USB 驱动器
    df "filename|directory on your USB drive"
    输出的文件或目录上运行命令 df:
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sdf1        3997696 2821980   1175716  71% ...

现在您有了 USB 驱动器的设备节点/路径:/dev/sdf1

  1. 从 udev 数据库获取设备的属性和环境变量,这是 udev 规则所需的。
    我们必须准确识别应应用 udev 规则的设备,因为每次断开和连接 USB 驱动器
    udevadm info /dev/sdf1或第一个 USB 驱动器的
    udevadm info --attribute-walk /dev/sdf1详细输出时,开发路径都会发生变化:

P: /devices/pci0000:00/0000:00:09.0/0000:02:00.0/usb8/8-1/8-1:1.0/host6/target6:0:0/6:0:0:0/block/sdf/sdf1
N: sdf1
L: 0
S: disk/by-id/usb-SanDisk_U3_Cruzer_Micro_0000186F6A60343E-0:0-part1
S: disk/by-uuid/3CF6-EEA5
S: disk/by-path/pci-0000:02:00.0-usb-0:1:1.0-scsi-0:0:0:0-part1
S: disk/by-partuuid/e41c7c97-01
E: DEVPATH=/devices/pci0000:00/0000:00:09.0/0000:02:00.0/usb8/8-1/8-1:1.0/host6/target6:0:0/6:0:0:0/block/sdf/sdf1
E: DEVNAME=/dev/sdf1
E: DEVTYPE=partition
E: DISKSEQ=21
E: PARTN=1
E: MAJOR=8
E: MINOR=81
E: SUBSYSTEM=block
E: USEC_INITIALIZED=2220353618
E: ID_VENDOR=SanDisk
E: ID_VENDOR_ENC=SanDisk\x20
E: ID_VENDOR_ID=0781
E: ID_MODEL=U3_Cruzer_Micro
E: ID_MODEL_ENC=U3\x20Cruzer\x20Micro\x20
E: ID_MODEL_ID=5406
E: ID_REVISION=3.21
E: ID_SERIAL=SanDisk_U3_Cruzer_Micro_0000186F6A60343E-0:0
E: ID_SERIAL_SHORT=0000186F6A60343E
E: ID_TYPE=disk
E: ID_INSTANCE=0:0
E: ID_BUS=usb
E: ID_USB_INTERFACES=:080650:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=usb-storage
E: ID_PATH=pci-0000:02:00.0-usb-0:1:1.0-scsi-0:0:0:0
E: ID_PATH_TAG=pci-0000_02_00_0-usb-0_1_1_0-scsi-0_0_0_0
E: ID_PART_TABLE_UUID=e41c7c97
E: ID_PART_TABLE_TYPE=dos
E: ID_DRIVE_THUMB=1
E: ID_FS_UUID=3CF6-EEA5
E: ID_FS_UUID_ENC=3CF6-EEA5
E: ID_FS_VERSION=FAT32
E: ID_FS_TYPE=vfat
E: ID_FS_USAGE=filesystem
E: ID_PART_ENTRY_SCHEME=dos
E: ID_PART_ENTRY_UUID=e41c7c97-01
E: ID_PART_ENTRY_TYPE=0xc
E: ID_PART_ENTRY_NUMBER=1
E: ID_PART_ENTRY_OFFSET=2048
E: ID_PART_ENTRY_SIZE=8011776
E: ID_PART_ENTRY_DISK=8:80
E: DEVLINKS=/dev/disk/by-id/usb-SanDisk_U3_Cruzer_Micro_0000186F6A60343E-0:0-part1 /dev/disk/by-uuid/3CF6-EEA5 /dev/disk/by-path/pci-0000:02:00.0-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-partuuid/e41c7c97-01
E: TAGS=:systemd:
E: CURRENT_TAGS=:systemd:

E:意思是,这是我的 udev 规则的环境变量,
我使用变量ID_FS_UUID=3CF6-EEA5识别我的设备
这是我的 U 盘上文件系统的 uuid 号。

  1. 编写 udev 规则并将其保存到/etc/udev/rules.d目录
    规则必须以扩展名保存.规则
    udev 规则按字典顺序执行,并且可以相互覆盖,因此我在名称的开头使用数字。
    获取root权限->打开文件99_myrule.规则

udev规则:

ENV{ID_FS_UUID}=="3CF6-EEA5", ACTION=="add", RUN{program}+="/usr/bin/systemd-mount --no-block --collect $devnode /my/mount/directory/"

保存!
ENV{ID_FS_UUID}==“3CF6-EEA5”表示
检查设备的环境变量ID_FS_UUID是否等于3CF6-EEA5,
ACTION==“add”表示
检查为什么触发udev事件,因为设备是在时刻(其他状态已删除,更改)

如果条件为真,则识别出设备,事件:已添加 -> RUN systemd-mount
$devnode ... 扩展到设备路径,udev 设置为设备 (/dev/...)

该设备将被安装到/我的/挂载/目录/,可以肯定,它存在!
以下是 udev 规则的完整语法:https://www.linux.org/docs/man7/udev.html

  1. 重新加载udev规则
    sudo udevadm control --reload-rules

  2. 您已准备好断开并连接 USB 驱动器,看看它是否有效!

您还可以通过供应商 ID 和产品 ID 来另外识别您的设备,但您需要详细查看 udev 数据库。
udevadm info --attribute-walk /dev/sdf1
我在子系统==“usb”中找到:

ATTRS{idProduct}=="5406"
ATTRS{idVendor}=="0781"

udev规则:

ATTRS{idVendor}=="0781", ATTRS{idProduct}=="5406", ENV{ID_FS_UUID}=="3CF6-EEA5", ACTION=="add", RUN{program}+="/usr/bin/systemd-mount --no-block --collect $devnode /my/mount/directory/"

相关内容