Linux 系统上,我们通常必须使用文件资源管理器中的挂载选项或使用”mount”命令才能开始使用外部驱动器。
这就显得非常不方便,在系统启动时如果需要像挂载内部磁盘一样来挂载外部存储的情况下,它就可能出现问题。想象一下,如果媒体服务器不显示任何媒体,或许是因为保存媒体的外接磁盘未被挂载。
好消息是,可以通过自动挂载外部存储设备来解决此问题。
在本教程中,我们将探讨在 Linux 上自动挂载磁盘驱动器的两种流行方法:
- 配置 fstab 文件以进行启动挂载
- 使用 udev 和 autofs 进行动态设置
1] 方法1:配置 fstab 文件以进行启动挂载
如果希望外部驱动器在系统启动时自动安装,则可以通过配置 fstab(文件系统表)来实现。
对于在系统启动期间保持连接的驱动器,此方法非常可靠。
图.1 Linux 主机外接存储器信息
如图.1 所示,有一容量为 16GB 的外部存储器接入了 Linux 主机,我们现在演示如何自动挂载它。
首先,使用如下命令查看连接到主机的外部存储器 UUID 信息:
# blkid
图.2 查看主机块设备 UUID
找到外部存储器的UUID信息,示例是”4A484BF6484BDEF7″,文件类型是”ntfs”。
然后,编辑”/etc/fstab”文件,在文件中加入如下内容:
UUID=4A484BF6484BDEF7 /media/usb auto defaults,nofail,x-systemd.automount 0 2
示例将外部存储器挂载到”/media/usb”目录,根据实际情况修改设备 UUID 及挂载点(注意挂载点目录为已经存在的目录,否则挂载不成功)。
最后,使用如命令重新启动系统服务使配置生效:
# systemctl daemon-reload
重新启动主机后,就会发现连接到主机的外部存储器被自动挂载到设置的挂载点了。
图.3 外部存储器自动挂载成功
当使用双启动系统并且想要自动挂载 Windows 分区时,也可以使用以上的方法。
2] 方法2:使用 udev 和 autofs 进行动态设置
当然,如果我们希望外部驱动器仅在插入时挂载,udev 规则和 autofs 就提供了一种动态的方法。
如果需要经常更换 USB 驱动器或都不希望在启动时挂载它们,则这种方法更加合适。
首先在”/etc/udev/rules.d/”目录中创建一个新的规则文件,例如”usb_auto_mount.rules”,内容如下:
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", ENV{ID_BUS}=="usb", \ SYMLINK+="usbdisks/%k", MODE:="0660", \ RUN+="/bin/ln -sf /media/usb/%k /media/usb-sticks/%k" ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", ENV{ID_BUS}=="usb", \ RUN+="/bin/rm /media/usb-sticks/%k"
说明如下:
- ACTION==”add”:添加新设备(如 USB)时会触发此规则
- KERNEL==”sd*”:匹配内核名称以“sd”开头的设备(通常为驱动器)
- ENV{DEVTYPE}==”partition”:确保仅针对分区设备
- ENV{ID_BUS}==”usb”:将此规则限制为 USB 设备
- SYMLINK+=”usbdisks/%k”:在 /dev/usbdisks/ 中为设备创建符号链接。%k 是内核分配的设备名称的占位符
- MODE:=”0660″:为用户和组(但不为其他人)设置读写权限
- RUN+=”/bin/ln -sf /media/usb/%k /media/usb-sticks/%k”:在 /media/usb-sticks/ 中创建指向 /media/usb/%k 的符号链接,驱动器将安装在此处
- ACTION==”remove”: 当 USB 驱动器拔出时触发此规则
- RUN+=”/bin/rm /media/usb-sticks/%k”: 当驱动器断开连接时删除符号链接
然后,重新加载 udev 规则,使用修改生效:
# udevadm control --reload-rules
之后,编辑 auto.master 文件,来指示 autofs 自动挂载 USB 存储。
在文件未尾添加如下内容:
/media/usb /etc/auto_mount.usb --timeout=60
最后,创建自动挂载的映射文件”/etc/auto_mount.usb”,内容如下:
#!/bin/bash fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${1}) if [ "${fstype}" = "vfat" ] ; then echo "-fstype=ntfs,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}" exit 0 fi exit 1
说明如下:
- fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${1}):此命令使用 blkid 命令获取 USB 驱动器的文件系统类型(例如 FAT32、NTFS)
- if [ “${fstype}” = “ntfs” ]:检查文件系统是否为 ntfs(Windows 使用的常见文件系统类型)
- echo “-fstype=ntfs,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}”: 使用特定选项挂载驱动器:fstype=vfat:将其挂载为 vfat 文件系统。sync:确保数据立即写入驱动器而不是被缓存。uid=0,gid=plugdev:将所有者设置为 root(uid 0),将组设置为 plugdev(USB 设备的公共组)。umask=007:设置文件和目录的权限,以便只有所有者和组可以访问它们
现在,USB 驱动器将在连接时自动安装在 /media/usb/ 中,并在 60 秒不活动后自动卸载。
3] 挂载外部磁盘的一点提示
- 使用 UUID:使用 fstab 时,始终优先使用 UUID 而不是 /dev/sdX 标识符,因为它们在重启后保持一致
- 检查文件系统支持:确保您的系统支持 USB 驱动器的文件系统(例如,为 NTFS 驱动器,则需要安装 ntfs-3g 软件包)
- 测试更改:始终在设置配置更改后对其进行测试,以确保驱动器正确安装。使用 journalctl 可以帮助诊断任何问题
自动挂载驱动器可以显著简化工作流程。这是我通过亲身经历意识到的。在 fstab 和 udev 之间选择的方法取决于特定的需求,无论是希望驱动器在启动时准备就绪还是仅在插入时准备就绪。
通过这些步骤,就可以确保外部存储始终可访问而无需其他操作。