Странная проблема с установкой карликовой крепости

Простой способ переместить разделы диска или изменить их размер - использовать GParted. Это инструмент gnome, но его можно использовать на USB-накопителе, и он довольно безопасен.

http://gparted.org

После того, как вы загрузили и записали его на USB-ключ, вам просто нужно загрузиться с него, все остальное довольно интуитивно понятно (вы увидите весь свой диск и различные разделы, и щелкните по нему, чтобы измените размер или переместите его, см. ниже).

enter image description here

Если вы хотите переместить загрузочный раздел, я рекомендую вам сделать резервную копию заранее.

4
02.09.2018, 14:52
1 ответ

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!"

Почему это происходит?

Пакет dwarf-fortress, предоставляемый Ubuntu, использует оболочку Python /usr/games/dwarf-fortress. Эта оболочка создает вторичную иерархию dataв $XDG_DATA_HOME/.local/share/dwarf-fortress/run/.unionfs-fuse, которая монтируется как unionfs(8)вместе с некоторыми другими каталогами.

Это позволяет вам размещать свои моды в каталоге $XDG_DATA_HOME/.local/share/dwarf-fortress, поэтому вам не нужно менять содержимое каталога /usr/share/games/dwarf-fortress, и это здорово! Однако с unionfsследует обращаться осторожно и правильно очищать его. Сценарий Python не смог этого сделать, когда вы использовали C -c , чтобы выйти из игры.

Таким образом, unionfs, вероятно, все еще установлен, но в плохом состоянии.

Как это исправить?

Итак, прежде всего, убедитесь, что игра полностью закрыта:

killall -s KILL Dwarf_Fortress

Затем убедитесь, что ничего не осталось unionfsКрепление пеленгатора:

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-fuseв $XDG_DATA_HOME/dwarf-fortress/run/. У меня нет набора XDG_DATA_HOME, поэтому я должен использовать $HOME. Проверьте env, прежде чем случайно удалить не тот каталог!

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

Вот именно. Обратите внимание, что версия df_linuxот Bay 12 Games не сталкивается с этой проблемой, так как не использует ни 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показывает, что после того, как мы вышли из Dwarf Fortress, ожидается отключение от маунта, а mount | grep unionfsподтверждает наличие активных маунтов в /tmp. Я избавился от всего каталога $XDG_DATA_HOME/dwarf-fortress, и он снова заработал. С помощью strace -ff -e trace=execve dwarf-fortressя смог подтвердить монтирование unionfsи нашел каталог .unionfs-fuse.

5
27.01.2020, 20:54

Теги

Похожие вопросы