魔百盒刷了armbian后,变身一台微型服务器,但距离黑白NAS还有段距离,主要体现在存储设备的加载、管理方面。有关硬盘、优盘等的挂载(mount disk)已有不少文档介绍,但仅仅局限于单一存储设备的临时性挂载,本文介绍有关多硬盘(硬盘柜)的配置,作为一个引子,希望能帮助一些人在此基础上DIY NAS。生产、销售、推广成品NAS的无需紧张,好产品不愁卖。

背景

原先使用的4盘位硬盘笼早已插满,100Mb/s左右的4K影音应用对于HDD、SATA3、USB3.0而言完全可以满足,不存在瓶颈,唯一的问题是机顶盒普遍的百兆网口。以下为本例的配置环境,为避免远程磁盘访问产生的网络损耗,不使用docker,jellyfin为本地安装。

  • 平台:魔百盒m401a
  • 系统:Armbian 24.2.0(s905l3a bookworm 6.6.15)
  • 存储设备:4盘位硬盘笼,4块硬盘(总计14T)
  • 文件系统:NTFS
  • 数据:已有约10T电影
  • 影音管理:Jellyfin 10.8.13

磁盘挂载方法

一般情况下,我们可以通过修改 /etc/fstab 来自动挂载存储设备,也可以通过修改其他系统自启动脚本通过 mount 命令挂载。本文使用 fstab(filesystem table)。较高版本的linux内核(5.10+)都在内核模块中预置了 fat、ntfs 驱动,比如 ntfs-3g。因此,对于已格式化为 ntfs 格式的硬盘,可以直接使用 fdisk 命令查看存储设备。

fdisk -l

这样我们就可以在创建挂载点后,将4个磁盘注意挂载进系统。这里新建的挂载点( mkdir 新建的目录也是文件)对应于4个设备文件( linux下每个物理磁盘都会是一个设备文件)。

mkdir -p /media/sda1
mkdir -p /media/sdb1
mkdir -p /media/sdc1
mkdir -p /media/sdd1

因为内置驱动的缘故,挂载 fat 和 ntfs 文件系统一般不需要安装额外的软件。如果硬盘采用的是其他文件系统,则需要安装对应驱动,例如 exFAT 等类型的文件系统,需要额外安装 exfat-fuse 和 exfat-utils 软件包才能够正常挂载。挂载点创建后,可以使用以下命令挂载4个硬盘了。

mount -t ntfs /dev/sda1 /media/sda1
mount -t ntfs /dev/sdb1 /media/sdb1
mount -t ntfs /dev/sdc1 /media/sdc1
mount -t ntfs /dev/sdd1 /media/sdd1

这时就可以进入挂载点目录,查看磁盘上的媒体文件并进行相关操作了。

mounted

/etc/fstab文件的编辑

要实现开机自动挂载外部硬盘,就需要编辑/etc/fstab文件。故名思意,fstab就是filesystem table,这个文件描述系统中各种文件系统的信息,应用程序读取这个文件,然后根据其内容进行自动挂载的工作。作为系统配置文件,fstab通常都位于/etc目录下,它包括了所有分区和存储设备的信息,以及它们应该挂载到哪里,以什么样子的方式挂载。

/etc/fstab 就是一个文本文件,用vi、nano等都可以打开编辑,前提是具有root权限。在这个文件中,每个文件系统(包括分区或者设备)用一行来描述,在每一行中,用一或多个空格或TAB符号来分隔各个字段,文件中以*开头的行是注释信息。fstab文件中的记录的顺序也很重要,fsck、mount 或 umount 等程序在运行时会按此顺序进行读取、操作。

格式与参数介绍

以示例 /etc/fstab 的一行记录为例,一共包括6个字段/列。

fstab

  • 第1列:文件系统、设备/磁盘、分区标识,设备名称无需显式说明,其他需显式说明
  • 第2列:挂载点
  • 第3列:文件系统类型,可以是auto、vfat、reiserfs、ntfs、ext2/3/4、xfs、swap、udf、iso9660等
  • 第4列:设备或者分区所需要的挂载选项
  • 第5列:dump选项,判断文件系统是否需要备份,如果是0,dump就会被忽略
  • 第6列:fsck选项,判断文件系统通过什么顺序来扫描检查,根文件系统对应该字段的值应设为1,其他文件系统应设为2,如文件系统无需在启动时扫描检查,则设置该字段为0

对于第1列的标识,上图中所示的/dev/sda1为设备文件名,可以直接指定,无需添加引导标识,而UUID等均需要添加引导标识,具体选择见下一节。第4列的defaults为默认挂载参数,不同的文件系统类型略有区别,例如当第3列指定为ext4文件系统类型时,defaults默认参数包括了rw、suid、dev、exec、auto、nouser和async。auto、nofail、noatime、nodir等4像参数的含义如下:

  • auto – 在启动时或键入了 mount -a 命令时自动挂载,对应的 noauto 参数则为手动通过命令挂载。defaults包含了auto参数
  • nofail – 如果挂载点未成功挂载,忽略存在的错误或问题,继续启动。默认为fail,外置硬盘等非核心设备务必使用 nofail 参数,避免因为挂载失败导致系统无法启动
  • noatime – 不更新文件系统上 inode 访问记录,可以提升性能,noatime包含了nodiratime。Linux 在默认情况下使用 atime 参数,每次在磁盘上读取(或写入)数据时都会产生一个记录,这是为服务器设计的,其他应用场景意义不大
  • nodiratime – 不更新文件系统上的目录 inode 访问记录,可以提升性能

标识的选择

/etc/fstab文件每一行的第一列指定了唯一的文件系统、磁盘/设备、分区等,很显然,唯一性标识某个设备/磁盘/分区的方法有很多,不会重名的唯一设备名是上文中使用的方法。我们还可以使用UUID等显式引导符标识。以下仅补充列出UUID、LABEL、PARTITIONUUID等3种方式,更多方法可参见具体发行版的文档。

UUID

简单地使用 blkid 或 lsblk 获取硬盘UUID,以 lsblk 为例,可以看到硬盘笼中的4块硬盘sda1、sdb1、sdc1、sdd1。

lsblk -o  name,mountpoint,size,uuid

这样就可以通过“UUID=”显式引导符唯一指定某个外置磁盘了,很多已经在windows下格式化的磁盘UUID长度会有偏差(会很短),无需担心,直接使用就行。

UUID=cf125323b-8b23-4b02-a93b-ec0845a5f7615    /mnt/sdd1     ntfs    defaults,nofail,noatime  0 0

LABEL

使用 blkid 命令(这里的blk意为block,也就是linux下的块设备),同样可以获取UUID、LABEL、PARTUUID等信息。

这样就可以通过“LABEL=”显式引导符唯一指定某个外置磁盘。

LABEL=Film_4T  /mnt/sdd1  ntfs   defaults,nofail,noatime  0 0

PARTUUID

同理,通过“PARTUUID=”显式引导符唯一指定某个外置磁盘的某个分区。如果该磁盘只有一个分区,挂载的内容和上述标识方法是完全相同的。

PARTUUID=6...-...-8ae    /mnt/sdd1     ntfs    defaults,nofail,noatime  0 0

与其他标识方法不同的,通过PARTUUID标识挂载的分区并不具备完整的文件系统功能,对于外置单一用途的硬盘挂载,可结合noatime参数等降低开销、提高效率,建议使用。修改完/etc/fstab文件后,可以使用 mount -a 命令即时挂载生效。

mount -a

Jellyfin媒体库引用

挂载外置硬盘后,在jellyfin即可正常引用。当然,对于机顶盒“冒充”的NAS,如果jellyfin是容器化部署的,还需安装部署NFS或者Samba后,映射并配置好配置文件后,才能访问外置硬盘,所以,同样不建议使用容器化部署的jellyfin。元数据的更新等可以通过Samba服务在台式机上由Tinymanager来完成,jellyfin自身的元数据扫描刷新效果比较差,armbian上jellyfin可能出现的乱码问题请见「另文」。

media base

至此,在armbian下老E的4盘位硬盘柜就挂载完成了,并且媒体库正常导入,小盒子继续发挥余热24小时不中断运行。有关NFS或Samba的部署,后续再进行分享,或者自行使用 armbian-config 命令/脚本快速完成。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。