$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
$ uname -r
5.15.0-125-generic
Estou tentando trabalhar com o coq theorem proof assistant instalado com snap usando Emacs e proof general. Infelizmente, recebi um erro. Depois de investigar com strace, descobri que o erro é causado pela futex
chamada de sistema "permissão negada" quando o programa tenta processar um arquivo no /tmp
diretório:
$ strace coqdep /tmp/ProofGeneral-coqofYWUP.v
trying to imitate what proof general does and got the following:
--- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=123729, si_uid=1000} ---
rt_sigreturn({mask=[]}) = 22
getpid() = 123729
tgkill(123729, 123751, SIGURG) = 0
getpid() = 123729
tgkill(123729, 123750, SIGURG) = 0
futex(0x55610de9d158, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x55610de9d250, FUTEX_WAIT_PRIVATE, 0, {tv_sec=0, tv_nsec=100000}) = 0
getpid() = 123729
tgkill(123729, 123751, SIGURG) = 0
getpid() = 123729
tgkill(123729, 123750, SIGURG) = 0
futex(0x55610de9d158, FUTEX_WAKE_PRIVATE, 1) = 1
getpid() = 123729
tgkill(123729, 123751, SIGURG) = 0
futex(0x55610de9d158, FUTEX_WAKE_PRIVATE, 1) = 1
epoll_pwait(4, [], 128, 0, NULL, 0) = 0
futex(0xc000100948, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x55610de9d250, FUTEX_WAIT_PRIVATE, 0, {tv_sec=0, tv_nsec=100000}) = 0
close(3) = 0
futex(0x55610de9bc28, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
epoll_pwait(4, [{EPOLLOUT, {u32=1967093352, u64=140516117149288}}], 128, 0, NULL, 0) = 1
epoll_pwait(4, [{EPOLLOUT, {u32=1967093352, u64=140516117149288}}], 128, -1, NULL, 0) = 1
epoll_pwait(4, [], 128, 0, NULL, 191668) = 0
futex(0x55610de9bc28, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
epoll_pwait(4, [{EPOLLIN|EPOLLOUT, {u32=1967093592, u64=140516117149528}}], 128, 0, NULL, 0) = 1
epoll_pwait(4, [{EPOLLOUT, {u32=1967093352, u64=140516117149288}}], 128, -1, NULL, 0) = 1
epoll_pwait(4, [], 128, 0, NULL, 191668) = 0
epoll_pwait(4, [{EPOLLIN|EPOLLOUT, {u32=1967093352, u64=140516117149288}}], 128, -1, NULL, 0) = 1
recvmsg(3, {msg_name={sa_family=AF_UNIX, sun_path="/run/user/1000/bus"}, msg_namelen=112->21, msg_iov=[{iov_base="l\2\1\1'\0\0\0l\4\0\0-\0\0\0", iov_len=16}], msg_iovlen=1, msg_controllen=0, msg_flags=MSG_CMSG_CLOEXEC}, MSG_CMSG_CLOEXEC) = 16
recvmsg(3, {msg_name={sa_family=AF_UNIX, sun_path="/run/user/1000/bus"}, msg_namelen=112->21, msg_iov=[{iov_base="\5\1u\0\2\0\0\0\6\1s\0\6\0\0\0:1.155\0\0\10\1g\0\1o\0\0"..., iov_len=48}], msg_iovlen=1, msg_controllen=0, msg_flags=MSG_CMSG_CLOEXEC}, MSG_CMSG_CLOEXEC) = 48
recvmsg(3, {msg_name={sa_family=AF_UNIX, sun_path="/run/user/1000/bus"}, msg_namelen=112->21, msg_iov=[{iov_base="\"\0\0\0/org/freedesktop/systemd1/jo"..., iov_len=39}], msg_iovlen=1, msg_controllen=0, msg_flags=MSG_CMSG_CLOEXEC}, MSG_CMSG_CLOEXEC) = 39
futex(0xc000100948, FUTEX_WAKE_PRIVATE, 1) = 1
recvmsg(3, {msg_namelen=112}, MSG_CMSG_CLOEXEC) = -1 EAGAIN (Resource temporarily unavailable)
openat(AT_FDCWD, "/proc/123729/cgroup", O_RDONLY|O_CLOEXEC) = 8
epoll_ctl(4, EPOLL_CTL_ADD, 8, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=1967093592, u64=140516117149528}}) = -1 EPERM (Operation not permitted)
read(8, "13:cpuset:/\n12:rdma:/\n11:memory:"..., 4096) = 547
close(8) = 0
write(6, "\0", 1) = 1
futex(0x55610de9bc28, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
epoll_pwait(4, [], 128, 0, NULL, 0) = 0
epoll_pwait(4, <unfinished ...>) = ?
*** Error: /tmp/ProofGeneral-coqofYWUP.v: No such file or directory
+++ exited with 1 +++
Infelizmente, não sou qualificado o suficiente para entender o que causa permissão negada para a chamada do sistema. Eu até fiz as permissões 777 para este arquivo, não ajudou.
Depois que copiei o arquivo para meu diretório home, ele começou a funcionar:
$ cp /tmp/ProofGeneral-coqofYWUP.v ~/aaa.v
$ coqdep ~/aaa.v
home/usr345/aaa.vo /home/usr345/aaa.glob /home/usr345/aaa.v.beautified /home/usr345/aaa.required_vo: /home/usr345/aaa.v
/home/usr345/aaa.vio: /home/usr345/aaa.v
snap
restringir o uso de ambiente confinado quando usar o aplicativo, o que/tmp
pode causar problemas até mesmo com o seuchmod 777
, você pode simplesmente usar o diretório snap copiando o arquivo como esteVocê também pode simplesmente usar um ambiente de pacote não confinado
Parece que é impossível permitir acesso ao
/tmp
diretório paracoq-prover
snap. Porque os autores do pacote não adicionaramsystem-files
interface nele. Quando tentei habilitá-lo, deu um erro:Para corrigir o problema, altere o nome do diretório temporário para um subdiretório do seu diretório inicial nas configurações do Emacs: