Ubuntu 16.04 マシンに WineHQ から Wine をインストールしましたが、次のエラーが発生します。
/opt/wine-stable/bin/wine: error while loading shared libraries: libwine.so.1: cannot create shared object descriptor: Operation not permitted.
答え1
短い答え – これを実行します:
sudo sysctl -w vm.mmap_min_addr=0
より長い答え:
アップグレード後、1日前にまったく同じエラーが発生しましたからUbuntu 16.04 から 18.04 (および WineHQ からの wine-staging の再インストール)。
これは、Wine (64 ビット システム上) 経由で 32 ビット Windows 実行可能ファイルを実行しようとした場合にのみ発生することがわかりました。
あまりにも多くのデバッグを行った後、次の場所で Wine notepad.exe を実行してみることでヒントを得ましたstrace
:
$ strace /usr/bin/wine notepad.exe
execve("/usr/bin/wine", ["/usr/bin/wine", "notepad.exe"], 0x7ffc266e8478 /* 55 vars */) = 0
strace: [ Process PID=19507 runs in 32 bit mode. ]
brk(NULL) = 0x7c423000
[ … 140 lines snipped … ]
openat(AT_FDCWD, "/opt/wine-staging/lib/libwine.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220d\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1832828, ...}) = 0
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 EPERM (Operation not permitted)
close(3) = 0
writev(2, [{iov_base="/opt/wine-staging/bin/wine", iov_len=26}, {iov_base=": ", iov_len=2}, {iov_base="error while loading shared libra"..., iov_len=36}, {iov_base=": ", iov_len=2}, {iov_base="libwine.so.1", iov_len=12}, {iov_base=": ", iov_len=2}, {iov_base="cannot create shared object desc"..., iov_len=38}, {iov_base=": ", iov_len=2}, {iov_base="Operation not permitted", iov_len=23}, {iov_base="\n", iov_len=1}], 10/opt/wine-staging/bin/wine: error while loading shared libraries: libwine.so.1: cannot create shared object descriptor: Operation not permitted
) = 144
exit_group(127) = ?
+++ exited with 127 +++
重要なのはmmap2
失敗だ。マンmmap2
ページ(その後マンmmap
ページ) では、8192 バイトの匿名ブロックをマップしようとしているだけのようで、ディスク上のファイルにリンクさえされていませんでした。これは非常に退屈で、失敗するはずのない類の行為のようでした。
sysctl
そこで、Ubuntu 16.04 → 18.04 へのアップグレードで何か変更された可能性があるかどうか、特に、 に影響を与える可能性のあるものmmap2
や だけであるものがないか、設定を調査してみようと思いましたmmap
。
次のような適切な候補を見つけました/etc/sysctl.d/10-zeropage.conf
:
# Protect the zero page of memory from userspace mmap to prevent kernel
# NULL-dereference attacks against potential future kernel security
# vulnerabilities. (Added in kernel 2.6.23.)
#
# While this default is built into the Ubuntu kernel, there is no way to
# restore the kernel default if the value is changed during runtime; for
# example via package removal (e.g. wine, dosemu). Therefore, this value
# is reset to the secure default each time the sysctl values are loaded.
vm.mmap_min_addr = 65536
これが有力な候補に思われた主な理由は、Wine について言及されていたからです。
その後、WineHQ Wiki でこのページを見つけました:プリローダー ページ ゼロの問題。
そのページには明示的に私たちが遭遇したエラーについて言及しただけでなく、疑わしいほど関連していると思われる他の多くの事柄についても言及されていました。
そこで、その「適切な回避策」の推奨事項を試してみたところ、sudo sysctl -w vm.mmap_min_addr=0
突然、再び Wine で Windows 32 ビット アプリを実行できるようになりました! :-)
注: WineHQ Wiki ページには、変更を永続的に行うための手順も記載されていますが、これを行うとシステムのセキュリティに影響が出る可能性があります。