Atuin ZFS下卡顿问题解决

Atuin ZFS下卡顿问题解决

💡 原文中文,约4100字,阅读约需10分钟。
📝

内容提要

最近使用fish + atuin组合时发现卡顿问题,搜索发现是atuin离线模式使用SQLite存储history记录在ZFS中存在问题。解决方式是创建Zvolumes datasets并格式化成ext4,然后挂载。开机自动加载需要修改/etc/fstab文件。

🔎

延伸解读

问题定位:ZFS 与 SQLite 的兼容性

文章指出,卡顿并非 fish 或 atuin 本身缺陷,而是 atuin 离线模式使用 SQLite 存储历史记录,而 SQLite 在 ZFS 上存在兼容性问题。这一组合(ZFS + atuin + SQLite)用户较少,因此问题不易复现。作者通过搜索 atuin lag 找到 GitHub issue,确认了根源。这提醒我们,当终端出现非必现卡顿时,可优先排查新引入的存储层组合。

解决方案:Zvol 加 ext4 绕过兼容问题

作者采用的方案是创建一个 Zvol(ZFS 卷),将其格式化为 ext4,然后挂载到 atuin 的数据目录。这样 SQLite 实际运行在 ext4 上,避开了 ZFS 的兼容性问题。步骤包括:用 zfs create -V 创建卷、用 mkfs.ext4 格式化、挂载并迁移原有数据。相比修改 atuin 源码或等待上游修复,此方法更易操作,且作者实测后系统恢复流畅。

持久化挂载与操作注意事项

临时挂载重启后会失效,因此需要将挂载信息写入 /etc/fstab 实现开机自动加载。作者强调:修改前备份 /etc/fstab,避免系统无法启动;使用 blkid 查询 UUID 并正确填入;只添加最后一行,不要改动其他已有条目。此外,ZFS 中 dataset 和 zpool 是不同层级的概念,操作时需注意命令区别,防止误操作。

❓

Q&A

为什么 fish 和 atuin 一起用会卡顿?

因为 atuin 离线模式使用 SQLite 存储历史记录,而 SQLite 在 ZFS 文件系统上存在兼容性问题,导致偶尔卡顿。

怎么解决 atuin 在 ZFS 下的卡顿问题?

创建一个 Zvolumes dataset,格式化为 ext4,然后挂载到 atuin 的数据目录,并修改 /etc/fstab 实现开机自动挂载。

如何创建并格式化 Zvolumes dataset 给 atuin 用?

使用命令:sudo zfs create -V 500MB rpool/atuin,然后 sudo mkfs.ext4 /dev/zvol/rpool/atuin。

怎么让 atuin 的 ext4 卷开机自动挂载?

先备份 /etc/fstab,然后查询 UUID(sudo blkid /dev/zd0),在 /etc/fstab 最后一行添加:UUID=你的UUID /home/用户名/.local/share/atuin ext4 defaults 0 0。

更换为 ext4 后卡顿问题真的解决了吗?

是的,换成 ext4 后系统运行流畅,不再出现卡顿。

操作 ZFS 时需要注意什么?

注意 zfs 操作的是 datasets,zpool 操作的是存储池,不要搞混命令。

🏷️

标签

➡️

继续阅读