TL; DR: Use o script a seguir para limpar o $XDG_DATA_HOME
/ $HOME
das sobras e desmembrar o% anteriorunionfs
:
#!/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!
Por que isso acontece?
O pacote dwarf-fortress
fornecido pelo Ubuntu usa um wrapper /usr/games/dwarf-fortress
do Python. Esse wrapper cria uma hierarquia data
secundária em $XDG_DATA_HOME/.local/share/dwarf-fortress/run/.unionfs-fuse
, que é montada como unionfs(8)
junto com alguns outros diretórios.
Isso permite que você coloque seus mods no diretório $XDG_DATA_HOME/.local/share/dwarf-fortress
, assim você não precisa alterar o conteúdo de /usr/share/games/dwarf-fortress
, o que é ótimo! No entanto, um unionfs
deve ser manuseado com cuidado e limpo corretamente. O script Python falhou quando você usou C-c para sair do jogo.
Portanto, o unionfs
provavelmente ainda está montado, mas em um estado ruim.
Como faço para corrigir isso?
Então, primeiro de tudo, certifique-se de que o jogo esteja completamente fechado:killall -s KILL Dwarf_Fortress
Em seguida, certifique-se de que não há restos 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)
Como você pode ver, existem atualmente dois no meu sistema. Como ambos estão quebrados, vamos nos livrar deles com fusermount -u
:
fusermount -u /tmp/dwarf-fortresswvlaptrarun
fusermount -u /tmp/dwarf-fortress4ylv2t19run
Por último, mas o mais importante, remova o .unionfs-fuse
em $XDG_DATA_HOME/dwarf-fortress/run/
. Eu não tenho XDG_DATA_HOME
set, então eu tenho que usar $HOME
. Verifique env
antes de excluir acidentalmente o diretório errado!
rm -r $HOME/.local/share/dwarf-fortress/run/.unionfs-fuse
É isso. Note que a versão df_linux
de Bay 12 Games não se depara com esses problemas, já que não usa um wrapper do Python nem um Unionfs.
Em geral, acho que esta questão vale um relatório de erros, pois a solução de problemas é um incômodo. O wrapper dwarf-fortress
deve fornecer uma opção -clean
que manipule este caso. Se possível, por favor arquive um relatório de bug no repositório Debian .
Como surgiu essa solução?
Primeiro de tudo, eu dei uma olhada no file $(which dwarf-fortress)
, que me disse que é um script Python:
$ file $(which dwarf-fortress)
/usr/games/dwarf-fortress: Python script, ASCII text executable
Em seguida, verifiquei o script com qualquer editor e encontrei
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()
que mostrou que havia pelo menos algo a ser encontrado em xdg.BaseDirectory
, que é $HOME/.local/share
(a menos que definido de outra forma). Ao mesmo tempo, fusermount -u
mostra que há uma desmontagem pendente depois que deixamos o Dwarf Fortress, e mount | grep unionfs
confirmou as montagens ativas em /tmp
. Eu me livrei do diretório $XDG_DATA_HOME/dwarf-fortress
inteiro, e funcionou novamente. Com strace -ff -e trace=execve dwarf-fortress
, consegui confirmar as unionfs
montagens e encontrei o diretório .unionfs-fuse
.