具体来说,是在Linux系统上运行Aria2下载文件到NTFS格式磁盘时,报错17:fallocate failed. cause: Operation not supported。
省流:挂载方式调成ntfs3内核级驱动(如果Linux内核版本在5.15以上)。
起因
之前刚把Aria2的崩溃不重启问题解决好,反手又给我一个大逼兜:下什么文件都提示Error17:fallocate failed. cause: Operation not supported.
关于Fallocate预分配
这里的fallocate指的是Aria2下载文件时的文件预分配方式。通过文件预分配,Aria2可以提高文件写入效率,减少磁盘碎片。
Aria2主要具有三种预分配方式,falloc,trunc与prealloc。从语义上分析这三者压根儿不像是在同一选项里的东西,只有falloc指的是一种预分配方式,trunc是调整文件大小的操作(似乎也能用来预分配空间?),而prealloc指的是预分配这件事本身。但是存在即合理,这些问题就先抛开不谈。
文件的预分配方式可以在aria2.conf里调(默认位于/etc/aria2),将上述三个选项(包括none)填入file-allocation后面就行。
预分配所需时间: none < falloc ? trunc < prealloc
其中falloc和trunc需要文件系统和内核支持。
根据网上的建议,NTFS建议使用falloc;EXT3/4因为文件系统特性支持,建议trunc;MAC会自动分配,需要注释此项。
网上筛了一圈,好像是Linux下NTFS文件系统的挂载不支持Fallocate预分配导致的。但是我使用的是Ubuntu,平常开SMB访问也都没有问题,咋就突然说不行了?
反正没什么损失,就试试看切换一下。
修改过程
据搜索,有两种驱动可以选择,一是ntfs-3g,社区自研的用户级NTFS驱动。二是ntfs3,在Linux5.15版本内核中新加入的内核级NTFS驱动,理论上来讲无论是兼容性、速度还是可玩性都是ntfs3较好的。由于我使用的是Ubuntu Server 24.04.1,内核版本是6.8.0,因此可以直接使用ntfs3来挂载硬盘。检查内核版本命令如下:
uname -r
因为我不大喜欢老是挂载来卸载去的,上手就直接改/etc/fstab然后重启看看。
sudo vim /etc/fstab
我的电脑上只挂了一块NTFS的盘,所以很好辨认是哪块盘:
# /disks/hdb1 was on /dev/sdb2 during curtin installation
/dev/disk/by-uuid/FA98F86794F828B1 /disks/hdb1 ntfs defaults 0 1
左边的by-uuid指的是使用硬件的uuid挂载,能够避免换顺序导致挂载失败或错位。
我就瞅这个ntfs,大半天也没想出来Ubuntu搞什么幺蛾子整出来原生NTFS挂载的。搜了半天,很可能是Ubuntu自带一个ntfs-3g,然后改名成ntfs了。
开改!按i进入编辑模式,光标移动到ntfs后面,输入3。最终结果如下:
/dev/disk/by-uuid/FA98F86794F828B1 /disks/hdb1 ntfs3 defaults 0 1
Esc,冒号wq以保存并退出,输入sudo reboot now重启。
重启之后,看一下挂载,一切正常:
df -h
上AriaNG下一个文件试试,也能正常下了。