Как вы * на самом деле * запускаете пакет Snap, если ваш домашний каталог находится не в / home?

Мой домашний каталог находится в / 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? Или обходной путь на самом деле не работает?

1
задан 2 February 2020 в 08:21

1 ответ

Похоже, что 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
0
ответ дан 22 April 2020 в 16:41

Другие вопросы по тегам:

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