我正在尝试设计一个可以在内部运行 fusion 的 podmod 容器,例如使用sshfs
或运行一些应用程序映像。
但是我收到错误:
fusermount: mount failed: Operation not permitted
知道出了什么问题吗?我尝试使用--device fuse
并且主机正在运行最新的内核5.4.77
(运行 NixOs)
我的Dockerfile
:
FROM ubuntu:latest
# podman3 has docker-compose
# But this may be more efficient: https://podman.io/blogs/2018/12/03/podman-runlabel.html
# Nope, can't find how to use $HOME
RUN apt update -y && apt install -y mesa-utils clinfo intel-opencl-icd ocl-icd-opencl-dev inetutils-ping sshfs
RUN apt install -y libglu1-mesa libgomp1 wget curl libsm6 libxrender1 libxext6
RUN apt install -y libxi6 libxrender1 libxrandr2 libxcursor1 libxinerama1
RUN apt-get install -y -qq --no-install-recommends \
libglvnd0 \
libgl1 \
libglx0 \
libegl1 \
libxext6 \
libx11-6\
bash-completion\
fuse-overlayfs\
libfuse2\
libglib2.0-0
运行命令:
podman build -t myimage:latest -f Dockerfile
# TODO: check better solution than allowing everybody. +local?
xhost +
podman run -P -v /tmp/.X11-unix:/tmp/.X11-unix\
-v $HOME/.Xauthority:/root/.Xauthority\
--security-opt=label=disable\
-e DISPLAY=$DISPLAY\
--security-opt=seccomp=unconfined\
--device /dev/snd\
--device /dev/input\
--device /dev/dri\
--device /dev/fuse\
-v /dev/shm:/dev/shm\
--ipc=host\
--volume /etc/localtime:/etc/localtime:ro\
-v /home:/home\
-v /mnt:/mnt\
-v /nix:/nix\
-h $HOSTNAME\
--workdir=$PWD\
--rm -it myimage:latest
失败的命令和预期有效的命令:
$ sshfs -v me@myhost:~/ /tmp/host
fusermount: mount failed: Operation not permitted
第二个例子:
$ cd /tmp
$ wget https://github.com/littleweeb/Desktop/releases/download/v0.4.0_linux/LittleWeeb-0.4.0.303.AppImage
$ chmod +x LittleWeeb-0.4.0.303.AppImage
$ ./LittleWeeb-0.4.0.303.AppImage
fusermount: mount failed: Operation not permitted
容器内的一些健全性检查:
$ ls -al /dev/fuse
crw-rw-rw- 1 nobody nogroup 10, 229 Dec 18 10:28 /dev/fuse
我尝试了strace
sshfs,我看到的第一个错误是:
mount("me@myhost:~/", "/tmp/host", "fuse.sshfs", MS_NOSUID|MS_NODEV, "fd=3,rootmode=40000,user_id=0,gr"...) = -1 EPERM (Operation not permitted)
答案1
要使用fuse,用户需要有特权。有多种授予权限的选项:使用 setuid 或使用功能。我只尝试了 setuid 方式:二进制fusermount
文件必须是 setuid root:
chown root:root $(which fusermount3)
sudo chmod u+s $(which fusermount3)
ls -l $(which fusermount3)
-rws--x--x 1 root root 39416 Apr 24 11:50 /home/acolin/gpref/usr/bin/fusermount3
Gentoo Prefix 内安装的保险丝也会出现同样的问题。