試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Linux 2.6.23で、sandboxのエラーによりカーネルモジュールをビルドするパッケージがインストールできない問題を回避

Linux 2.6.23に上げたところ、NVIDIAドライバなど、カーネルモジュールを含むパッケージをビルドすると、カーネルソースツリー内にファイルを書き込もうとして*1、下のようなエラーが出るようになった。

(ビルド完了)
>>> Source compiled.
--------------------------- ACCESS VIOLATION SUMMARY ---------------------------
LOG FILE = "/var/log/sandbox/sandbox-x11-drivers_-_nvidia-drivers-100.14.19-15230.log"

open_wr:   /usr/src/linux-2.6.23-gentoo/null.gcda
open_wr:   /usr/src/linux-2.6.23-gentoo/null.gcda
open_wr:   /usr/src/linux-2.6.23-gentoo/null.gcda
open_wr:   /usr/src/linux-2.6.23-gentoo/null.gcda
open_wr:   /usr/src/linux-2.6.23-gentoo/null.gcda
open_wr:   /usr/src/linux-2.6.23-gentoo/null.gcda
--------------------------------------------------------------------------------

これを回避する2つの方法をメモ。

  1. そのままカーネルをビルドする場合
  2. カーネルソースツリーのトップディレクトリにあるMakefileの書き換えによる対処

そのままカーネルをビルドする場合

モジュールパッケージのビルド時に「FEATURES="-sandbox -usersandbox"」を指定。モジュールのパッケージビルド中、一時的にsandboxを外したところで恐らく害はない。

$ sudo bash -c 'FEATURES="ccache -sandbox -usersandbox" emerge -avO [パッケージ名...]'

カーネルソースツリーのトップディレクトリにあるMakefileの書き換えによる対処

/usr/src/linux/Makefileに対して、下の4行をコメントアウトするだけで、sandboxを無効にすることなく、この問題を回避できる。

--- linux-2.6.23-gentoo/Makefile.orig
+++ linux-2.6.23-gentoo/Makefile
@@ -515,10 +515,10 @@
 CFLAGS += $(call cc-option,-Wno-pointer-sign,)
 
 # Use --build-id when available.
-LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
-			      $(call ld-option, -Wl$(comma)--build-id,))
-LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID)
-LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID)
+#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
+#			      $(call ld-option, -Wl$(comma)--build-id,))
+#LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID)
+#LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID)
 
 # Default kernel image to build when no specific target is given.
 # KBUILD_IMAGE may be overruled on the command line or

関連URL:

*1:Portageでは、デフォルトでは、パッケージの展開/ビルド/インストールイメージの作成という流れを一時ディレクトリ(デフォルトでは/var/tmp/portage/以下)の中だけで行い、sandboxというツールがその外に対する書き込みを禁止している