前言

Linux下的硬盘分区如果被识别到,就会被分配为一个块设备, 如/dev/sda. 同时为了区分每个分区,会分配给每个分区一个UUID 在使用calibre-web的时候,我想要将书籍单独放置在U盘里,因此开机自动挂载U盘的需求产生了

一、Linux UUID的作用及其意义

1. 真正的唯一标识符 UUID为系统中存储设备提供的唯一标识字符串。也不管这个设备是什么分区类型。当对设备添加了新的存储设备时,可能会使原先分配的块设备名被改变,而导致系统启动时找不到设备而失败,因此使用UUID可以避免这一麻烦。 2.设备名称并不总是不变的 自动分配的存储设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺序。例如在上一次启动时插入了U盘,而下次启动时又将U盘拔掉,就可能会导致设备名称分配不一致。

二、Linux UUID的获取方法

1. ls -l /dev/disk/by-uuid/

total 0
lrwxrwxrwx 1 root root 10 May  7 18:08 00bc0f1e-27a0-485a-acd6-af259133f6de -> ../../sda9
lrwxrwxrwx 1 root root 10 May  7 18:08 03da0d2b-fc6a-4fc1-9286-37172a93579a -> ../../sda6
lrwxrwxrwx 1 root root 10 May  7 18:08 1d7aaf68-93f7-40c7-b7b3-63815dafb8ca -> ../../sda4
lrwxrwxrwx 1 root root 10 May  7 18:08 2A21-FC67 -> ../../sda1
lrwxrwxrwx 1 root root 10 May  7 18:08 6c904ce8-5282-42d9-836d-8cee31b1de27 -> ../../sda7
lrwxrwxrwx 1 root root 10 May  7 18:08 8e216c06-1112-4182-b0ac-c408729b9dad -> ../../sda5
lrwxrwxrwx 1 root root 10 May  7 18:08 C2F4-7E4C -> ../../sda8
lrwxrwxrwx 1 root root 11 May  7 18:08 CC76-4B3D -> ../../sda10
lrwxrwxrwx 1 root root 10 May  7 18:08 FA92210F9220D245 -> ../../sda3

这种方法适用于当不知道块设备名称时,信息有些杂乱难以一下子找到自己想要的设备

2. blkid

# arch @ hf in ~ [18:33:42]
$ sudo blkid
[sudo] password for arch:
/dev/sda1: UUID="2A21-FC67" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="0985f7b4-1b4a-4a2c-af6a-48cbe377794c"
/dev/sda2: PARTLABEL="Microsoft reserved partition" PARTUUID="75f28ee8-7fec-4606-aef8-14e22520601b"
/dev/sda3: BLOCK_SIZE="512" UUID="FA92210F9220D245" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="102d3440-a960-446b-8cd5-589dbbb67a50"
/dev/sda4: UUID="1d7aaf68-93f7-40c7-b7b3-63815dafb8ca" BLOCK_SIZE="4096" TYPE="apfs" PARTLABEL="Basic data partition" PARTUUID="c1117a95-30e9-4c4d-bee2-bc2fb5c1a43e"
/dev/sda5: UUID="8e216c06-1112-4182-b0ac-c408729b9dad" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="04342343-a071-5c41-9b63-4506eaa07c4f"
/dev/sda6: UUID="03da0d2b-fc6a-4fc1-9286-37172a93579a" TYPE="swap" PARTUUID="3c6149e9-9680-844d-8495-049ad52bf764"
/dev/sda7: UUID="6c904ce8-5282-42d9-836d-8cee31b1de27" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="eac04f71-243b-2c4e-84aa-6db028be27cc"
/dev/sda8: UUID="C2F4-7E4C" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="214b9e68-69de-4a42-bd4f-be7dd18c93dc"
/dev/sda9: UUID="00bc0f1e-27a0-485a-acd6-af259133f6de" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Basic data partition" PARTUUID="823ca85a-7b64-4a04-800d-258ecb21c31c"
/dev/sda10: LABEL="M-dM-:M-$M-fM-^MM-\"M-eM-^HM-^FM-eM-^LM-:" UUID="CC76-4B3D" BLOCK_SIZE="512" TYPE="exfat" PARTLABEL="Basic data partition" PARTUUID="29dca548-39e4-49b3-b498-936e53bf4a65"

展示了块设备的类型,可能对我们有帮助

也可以对指定的块设备进行查询

sudo blkid /dev/sda1

三、自动挂载的问题

当我们需要自动挂载硬盘时,需要注意几个前提事项

首先需要确认内核是否支持NTFS,exfat文件系统,当然如果文件系统是Linux原生支持的,那么就无需担心了。

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。

                                                                          引自`Arch wiki`

如果需要读写NTFS,我们需要额外的软件进行支持,因为默认只支持读,而无法写入 安装ntfs-3g,ntfs-config

相较而言,可能exfat文件系统更为合适 安装exfat-utils

自动挂载

修改/etc/fstab文件

vim /etc/fstab
-------------------------------------------------
# <file system> <dir> <type> <options> <dump> <pass>
例如
UUID=CC76-4B3D /mnt/swap exfat defaults 0 0

/etc/fstab 文件包含了如下字段,通过空格或 Tab 分隔:

<file system>    <dir>    <type>    <options>    <dump>    <pass>
  • 要挂载的分区或存储设备.
  • 的挂载位置。
  • 要挂载设备或是分区的文件系统类型,支持许多种不同的文件系统:ext2, ext3, ext4, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swapauto。 设置成auto类型,mount 命令会猜测使用的文件系统类型,对 CDROM 和 DVD 等移动设备是非常有用的。
  • - 挂载时使用的参数,注意有些 参数是特定文件系统才有的。一些比较常用的参数有 (mount(8)): auto - 在启动时或键入了 mount -a 命令时自动挂载。

noauto - 只在你的命令下被挂载。

exec - 允许执行此分区的二进制文件。

noexec - 不允许执行此文件系统上的二进制文件。

ro - 以只读模式挂载文件系统。

rw - 以读写模式挂载文件系统。

user - 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexec, nosuid, nodev 参数。

users - 允许所有 users 组中的用户挂载文件系统.

nouser - 只能被 root 挂载。

owner - 允许设备所有者挂载.

sync - I/O 同步进行。

async - I/O 异步进行。

dev - 解析文件系统上的块特殊设备。

nodev - 不解析文件系统上的块特殊设备。

suid - 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。

nosuid - 禁止 suid 操作和设定 sgid 位。

noatime - 不更新文件系统上 inode 访问记录,可以提升性能(参见 atime 参数)。

nodiratime - 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。

relatime - 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。

flush - vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。

defaults - 使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rw, suid, dev, exec, auto, nouser, async.

  • dump 工具通过它决定何时作备份. dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份。 允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份。大部分的用户是没有安装 dump 的 ,对他们而言 应设为 0。
  • fsck 读取 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。