事情就是这样。我正在运行 Mint 19,安装相对较新。听了很多关于矮人要塞的炒作,安装了一次;然后,需要匆忙离开,用 Control-C 关闭它。从那时起,每次我尝试运行它时,我都会得到输出:
/tmp/dwarf-fortresss7j3cousrun/df: 6: /tmp/dwarf-fortresss7j3cousrun/df: ./libs/Dwarf_Fortress: not found
Traceback (most recent call last):
File "/usr/games/dwarf-fortress", line 93, in <module>
main()
File "/usr/games/dwarf-fortress", line 90, in main
run_df_in_unionfs_with_cleanup(user_run_dir, data_dirs, sys.argv)
File "/usr/games/dwarf-fortress", line 60, in run_df_in_unionfs_with_cleanup
run_df_in_unionfs(user_run_dir, data_dirs, args)
File "/usr/games/dwarf-fortress", line 54, in run_df_in_unionfs
run_df(tmp_dir, args)
File "/usr/games/dwarf-fortress", line 46, in run_df
subprocess.run(cmd).check_returncode()
File "/usr/lib/python3.6/subprocess.py", line 369, in check_returncode self.stderr)
subprocess.CalledProcessError: Command '['/tmp/dwarf-fortresss7j3cousrun/df', '/usr/games/dwarf-fortress']'
returned non-zero exit status 127.
随后立即终止程序。我试图删除,甚至清除并重新安装矮人堡垒,只是为了得到相同的结果。它运行得非常好,恰好一次,尽管我一直盯着这个错误,但我无法理解它。
这不是业务关键或其他任何事情,从技术上讲,我什至不是玩家;但我真的很想知道为什么程序现在失败了,以及我以什么方式破坏了它。不加检查就太神秘了。谢谢你的时间。
TL;DR:使用以下脚本清除您的
$XDG_DATA_HOME
/$HOME
遗留物并卸载先前的unionfs
:为什么会这样?
Ubuntu 提供的
dwarf-fortress
包使用 Python 包装器/usr/games/dwarf-fortress
。该包装器在 中创建了一个二级data
层次结构,该层次结构与其他一些目录一起$XDG_DATA_HOME/.local/share/dwarf-fortress/run/.unionfs-fuse
安装。unionfs(8)
这使您可以将您的 mods 放在您的
$XDG_DATA_HOME/.local/share/dwarf-fortress
目录中,因此您不需要更改 的内容/usr/share/games/dwarf-fortress
,这很棒!但是,unionfs
必须小心处理并正确清理。C-c当您习惯退出游戏时,Python 脚本无法做到这一点。因此,
unionfs
它可能仍处于安装状态,但处于不良状态。我如何解决它?
所以首先,确保游戏完全关闭:
然后确保没有剩余的
unionfs
DF 安装:如您所见,我的系统上目前有两个。由于两者都坏了,让我们摆脱它们
fusermount -u
:最后,但最重要的是,删除
.unionfs-fuse
in$XDG_DATA_HOME/dwarf-fortress/run/
。我没有XDG_DATA_HOME
设置,所以我必须使用$HOME
. 检查env
之前不小心删除了错误的目录!而已。请注意,Bay 12 Games
df_linux
的版本没有遇到这个问题,因为它既不使用 Python 包装器,也不使用 Unionfs。话虽如此,该问题已在 2019 年得到解决,并已发送至
bullseye
. 不幸的是,它没有固定在 中0.44.12-1
,因此buster
可能仍会受到影响。你是怎么想出这个解决方案的?
首先,我看了一下
file $(which dwarf-fortress)
,它告诉我这是一个 Python 脚本:然后我用任何编辑器检查了脚本,发现
这表明至少有一些东西可以在 中找到
xdg.BaseDirectory
,这是$HOME/.local/share
(除非另有设置)。同时fusermount -u
显示退出矮人要塞后有一个unmount pending,并mount | grep unionfs
确认了在/tmp
. 我摆脱了整个$XDG_DATA_HOME/dwarf-fortress
目录,它又工作了。使用strace -ff -e trace=execve dwarf-fortress
,我能够确认unionfs
安装并找到.unionfs-fuse
目录。