系统相关
首页 > 系统相关> > linux-mint – Dwarf Fortress安装的奇怪问题

linux-mint – Dwarf Fortress安装的奇怪问题

作者:互联网

这就是事情.我正在运行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:

#!/bin/sh
set -eu

echo Killing currently running Dwarf Fortress instances
killall -q -9 Dwarf_Fortress || true

echo Removing old Dwarf Fortress unionfs mounts and mount points
find /tmp/ -maxdepth 1 -name "dwarf-fortress*" \
  -printf "  Found %f\n" \
  \( -exec fusermount -u {} \; -o -true \) \
  -exec rmdir {} \;


UNIONFSDIR=${XDG_DATA_HOME:-"${HOME:?}/.local/share/"}dwarf-fortress/run/.unionfs-fuse
if [ -d "$UNIONFSDIR" ]; then
  echo Removing old .unionfs-fuse directory
  rm -r "$UNIONFSDIR"
fi
echo Done. Run dwarf-fortress and praise Armok!

为什么会这样?

Ubuntu提供的dwarf-fortress包使用Python包装器/usr/games / dwarf-fortress.该包装器在$XDG_DATA_HOME / .local / share / dwarf-fortress / run / .unionfs-fuse中创建一个辅助数据层次结构,它作为unionfs(8)与其他一些目录一起安装.

这使您可以将您的mod放在$XDG_DATA_HOME / .local / share / dwarf-fortress目录中,这样您就不需要更改/usr/share / games / dwarf-fortress的内容了,这太棒了!但是,必须小心处理unionfs并正确清理.当您使用C-c退出游戏时,Python脚本无法执行此操作.

因此,unionfs可能仍然挂载,但状态不佳.

我如何解决它?

首先,确保游戏完全关闭:

killall -s KILL Dwarf_Fortress

然后确保没有剩余的unionfs DF mount:

mount | grep -a -e dwarf -e unionfs
unionfs on /tmp/dwarf-fortresswvlaptrarun type fuse.unionfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
unionfs on /tmp/dwarf-fortress4ylv2t19run type fuse.unionfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

如您所见,我的系统目前有两个.由于两者都被打破了,让我们用fusermount -u摆脱它们:

fusermount -u /tmp/dwarf-fortresswvlaptrarun 
fusermount -u /tmp/dwarf-fortress4ylv2t19run 

最后,但最重要的是,删除$XDG_DATA_HOME / dwarf-fortress / run /中的.unionfs-fuse.我没有设置XDG_DATA_HOME,所以我必须使用$HOME.在您意外删除错误的目录之前检查env!

rm -r $HOME/.local/share/dwarf-fortress/run/.unionfs-fuse

而已.请注意,Bay 12 Games中的df_linux版本不会遇到此问题,因为它既不使用Python包装也不使用Unionfs.

总的来说,我认为这个问题值得一个bug报告,因为故障排除很麻烦.矮人堡垒包装应该提供一个处理这种情况的清洁选项.如果可能,请提交错误报告on the Debian upstream.

你是怎么想出这个解决方案的?

首先,我看了一下文件$(dwarf-fortress),它告诉我这是一个Python脚本:

$file $(which dwarf-fortress)
/usr/games/dwarf-fortress: Python script, ASCII text executable

然后我用任何编辑器检查了脚本并找到了

def get_user_run_dir():
    old_run_dir = xdg.BaseDirectory.save_data_path('dwarf-fortress')
    new_run_dir = os.path.join(old_run_dir, 'run')

    ...

def run_df_in_unionfs(user_run_dir, data_dirs, args):
    mnt_dirs = user_run_dir + "=rw:" + ':'.join(data_dirs)
    with tempfile.TemporaryDirectory(suffix='run', prefix='dwarf-fortress') as tmp_dir:
        cmd = ['unionfs', '-o', 'cow,relaxed_permissions', mnt_dirs, tmp_dir]
        subprocess.run(cmd).check_returncode()
        try:
            run_df(tmp_dir, args)
        finally:
            subprocess.run(['fusermount', '-u', tmp_dir]).check_returncode()

这表明至少有一些东西可以在xdg.BaseDirectory中找到,它是$HOME / .local / share(除非另有设置).同时,fusermount -u显示我们退出Dwarf Fortress后有一个unmount挂起,并挂载| grep unionfs确认了/ tmp中的活动挂载.我摆脱了整个$XDG_DATA_HOME / dwarf-fortress目录,它再次起作用.使用strace -ff -e trace = execve dwarf-fortress,我能够确认unionfs挂载并找到.unionfs-fuse目录.

标签:python,error-handling,configuration,linux-mint
来源: https://codeday.me/bug/20190813/1646646.html