Мой домашний каталог находится в / z / home / $ USER
, а не в / home / $ ПОЛЬЗОВАТЕЛЬ
, так что я могу разместить его на ZFS.
Это безмерно расстраивает Snap-пакеты. Когда я пытаюсь запустить их, они говорят:
Извините, домашние каталоги за пределами / home в настоящее время не поддерживаются. Подробнее см. https://forum.snapcraft.io/t/11209 .
Когда я перехожу по этому URL-адресу, я получаю обходной путь, но не описанный достаточно подробно, чтобы его можно было реализовать:
Snapd в настоящее время не поддерживает выполнение снимков, если домашний каталог пользователя находится за пределами / home.Это обсуждается здесь , здесь .
Обходной путь - привязать монтируемый домашний каталог вне / home к / home.
Связанный поток вырождается в обсуждение того, каким должен быть дизайн для правильной поддержки произвольных домашних каталогов , и мне не сразу понятно, как реализовать описанный обходной путь. Я попытался связать монтирование / z / home / $ USER
, чтобы он также отображался в / home / $ USER
, и сказал Snap, что это мой домашний каталог, но мой пакет Snap я хочу to run по-прежнему настаивает на том, что мой домашний каталог плохой, и отказывается запускаться:
$ sudo mkdir /home/$USER
$ sudo chown ${USER}:${USER} /home/$USER
$ sudo mount --bind /z/home/$USER /home/$USER
$ HOME=/home/$USER any-snap-package
Sorry, home directories outside of /home are not currently supported.
See https://forum.snapcraft.io/t/11209 for details.
Как именно можно реализовать обходной путь, описанный Майклом Фогтом в связанной ветке форума Snapcraft? Или обходной путь на самом деле не работает?
Похоже, что snap
получает информацию о том, где находится ваш домашний каталог, прямо из /etc/passwd
, а не из какого-либо другого источника. Один обходной путь, который мне удалось получить, в основном работает, включает использование контейнера Docker для замены /etc/passwd
с точки зрения snap
на тот, который говорит мой домашний каталог это /home/$USER
.
Я уверен, что есть более легкий способ сделать это (может быть, просто chroot?), который сведет на нет необходимость некоторых из других обходных путей, которые мне понадобились, чтобы получить привязку
. ] для работы внутри контейнера, и я не пробовал это с minetest
, но вот скрипт, который я собрал, который запускает teatime
Snap без необходимости перемещать мой домашний каталог . По сути, он запускает контейнер с snapd
внутри, со всеми местами, в которых snapd
хранит состояние, смонтированное извне, но инициализируется базовым состоянием только что установленного snapd
(именно для этого ему нужен local-persist
драйвер тома Docker).Затем он запускает snap
в контейнере, как и вы, со всеми подключенными X11 и DBUS, так что teatime
может показывать свои окна и уведомления на рабочем столе.
#!/usr/bin/env bash
# teatime.sh: Run the teatime snap in a Docker container
# Requires local-persist driver installed in Docker: https://github.com/MatchbookLab/local-persist
# Installs it if not available.
set -ex
IMAGE_NAME="snapdock"
CONTAINER_NAME="snaphost"
STORAGE_ROOT="/var/lib/snapdock"
PASSWD_FILE="$HOME/etc/passwd.docker"
if [[ ! -f "${PASSWD_FILE}" ]] ; then
# The /etc/passwd that claims we have a normal home directory doesn't exist.
# We need to make it.
mkdir -p "$(dirname "${PASSWD_FILE}")"
cat "/etc/passwd" | sed "s_${HOME}_/home/${USER}_g" > "${PASSWD_FILE}"
fi
if ! (docker images "${IMAGE_NAME}" | grep "${IMAGE_NAME}" >/dev/null) ; then
# There's no image ready. We need to make one
WORKDIR="$(mktemp -d)"
cd "${WORKDIR}"
cat >Dockerfile <<EOF
FROM ubuntu:18.04
# Based on https://github.com/ogra1/snapd-docker/blob/master/build.sh
ENV container docker
ENV PATH "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
RUN DEBIAN_FRONTEND=noninteractive apt-get -q -y update && \
DEBIAN_FRONTEND=noninteractive apt-get -q -y upgrade && \
DEBIAN_FRONTEND=noninteractive apt-get -q -y install \
fuse \
snapd \
snap-confine \
squashfuse \
sudo && \
apt-get clean && \
dpkg-divert --local --rename --add /sbin/udevadm && \
ln -s /bin/true /sbin/udevadm
VOLUME ["/sys/fs/cgroup"]
STOPSIGNAL SIGRTMIN+3
CMD ["/sbin/init"]
EOF
docker build . -t "${IMAGE_NAME}"
cd -
rm -Rf "${WORKDIR}"
fi
if ! which docker-volume-local-persist >/dev/null ; then
# We need the local-persist driver installed into Docker.
WORKDIR="$(mktemp -d)"
cd "${WORKDIR}"
curl -fsSL "https://raw.githubusercontent.com/MatchbookLab/local-persist/45c5c344d5dfd358c28d7148be48302d20456fac/scripts/install.sh" >install.sh
chmod +x install.sh
cat install.sh
sudo install.sh
cd -
rm -Rf "${WORKDIR}"
fi
if ! (docker ps --filter "name=${CONTAINER_NAME}" | grep "${CONTAINER_NAME}" >/dev/null) ; then
# Container is not running. Start it.
if [[ ! -e "${STORAGE_ROOT}" ]] ; then
# Make sure we have the directories to mount
mkdir -p "${STORAGE_ROOT}/lib"
mkdir -p "${STORAGE_ROOT}/cache"
mkdir -p "${STORAGE_ROOT}/systemd"
mkdir -p "${STORAGE_ROOT}/snap"
sudo chown -R root:root "${STORAGE_ROOT}"
fi
# Start the container
docker run --rm --network=host --cap-add SYS_ADMIN --security-opt apparmor:unconfined --security-opt seccomp:unconfined --volume="$(echo ~:/home/${USER})" --volume="${PASSWD_FILE}:/etc/passwd:ro" --volume="/etc/group:/etc/group:ro" --volume="/etc/shadow:/etc/shadow:ro" --volume="/etc/sudoers.d:/etc/sudoers.d:ro" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --volume="/sys/fs/cgroup:/sys/fs/cgroup:ro" --volume="/lib/modules:/lib/modules:ro" --device=/dev/fuse --tmpfs /run --tmpfs /run/lock --volume="/run/user/$(id -u):/run/user/$(id -u):rw" --tmpfs /tmp --volume="${STORAGE_ROOT}/lib/:/var/lib/snapd:rw" --volume="${STORAGE_ROOT}/cache/:/var/cache/snapd:rw" --mount "type=volume,volume-driver=local-persist,src=installed-snaps-systemd,target=/etc/systemd/system,volume-opt=mountpoint=${STORAGE_ROOT}/systemd" --mount "type=volume,volume-driver=local-persist,src=installed-snaps-snap,target=/snap,volume-opt=mountpoint=${STORAGE_ROOT}/snap" -it --name="${CONTAINER_NAME}" -d "${IMAGE_NAME}" >/dev/null
# Wait for it to come up
sleep 5
fi
# Make sure the snap is installed
docker exec snaphost snap install teatime
# Try and fail to run it as root to avoid complaints about not being able to capture mountpoints when we run it as us.
docker exec snaphost teatime || true
# Run it as us with X11 and Dbus set up
docker exec -d --user="$(id -u ${USER})" --env="DISPLAY" --env="DBUS_SESSION_BUS_ADDRESS" snaphost teatime