AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 466338
Accepted
Michael Macha
Michael Macha
Asked: 2018-09-02 19:28:21 +0800 CST2018-09-02 19:28:21 +0800 CST 2018-09-02 19:28:21 +0800 CST

矮人要塞安装的奇怪问题

  • 772

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

随后立即终止程序。我试图删除,甚至清除并重新安装矮人堡垒,只是为了得到相同的结果。它运行得非常好,恰好一次,尽管我一直盯着这个错误,但我无法理解它。

这不是业务关键或其他任何事情,从技术上讲,我什至不是玩家;但我真的很想知道为什么程序现在失败了,以及我以什么方式破坏了它。不加检查就太神秘了。谢谢你的时间。

linux-mint python
  • 1 1 个回答
  • 1059 Views

1 个回答

  • Voted
  1. Best Answer
    Zeta
    2018-09-03T00:44:22+08:002018-09-03T00:44:22+08:00

    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。该包装器在 中创建了一个二级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它可能仍处于安装状态,但处于不良状态。

    我如何解决它?

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

    killall -s KILL Dwarf_Fortress
    

    然后确保没有剩余的unionfsDF 安装:

    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 
    

    最后,但最重要的是,删除.unionfs-fusein $XDG_DATA_HOME/dwarf-fortress/run/。我没有XDG_DATA_HOME设置,所以我必须使用$HOME. 检查env之前不小心删除了错误的目录!

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

    而已。请注意,Bay 12 Gamesdf_linux的版本没有遇到这个问题,因为它既不使用 Python 包装器,也不使用 Unionfs。

    话虽如此,该问题已在 2019 年得到解决,并已发送至bullseye. 不幸的是,它没有固定在 中0.44.12-1,因此buster可能仍会受到影响。

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

    首先,我看了一下file $(which 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显示退出矮人要塞后有一个unmount pending,并mount | grep unionfs确认了在/tmp. 我摆脱了整个$XDG_DATA_HOME/dwarf-fortress目录,它又工作了。使用strace -ff -e trace=execve dwarf-fortress,我能够确认unionfs安装并找到.unionfs-fuse目录。

    • 5

相关问题

  • 从文件中删除间隙模式[关闭]

  • Linux Mint 内核损坏

  • 列表理解中集合的 Python add() 函数

  • 如何在 unix 中获取应用程序的默认版本

  • Synaptic 包管理器文件设置

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve