Singularity で VTune をインストールする際の回避策

に公開

要旨

Singularity-CE/Apptainer で Intel oneAPI VTune をインストールする際は回避策が必要です。(2025/1/6 時点の vtune 2025.0.1-14 でも同様)
VTune パッケージのポストインストールスクリプトを騙して Sampling Drivers をビルド&インストールしないようにする必要があります。

# quick hack to prevent sep5 driver build at postinstall
mv /usr/bin/whoami /usr/bin/whoami.Orig && ln -s /usr/bin/false /usr/bin/whoami
apt-get install -yq intel-oneapi-vtune
mv -f /usr/bin/whoami.Orig /usr/bin/whoami

何をしようとしたのか

oneAPI 2025.0 を使えるような Singularity-CE .def ファイルを書いていました。 .def の oneAPI 部分を抜粋すると下記のような記述。

wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor > /usr/share/keyrings/oneapi-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" > /etc/apt/sources.list.d/oneAPI.list
apt-get update -yqq
apt-get install -yq intel-oneapi-compiler-dpcpp-cpp-2025.0  intel-oneapi-ipp-devel-2022.0 intel-oneapi-mkl-devel-2025.0
apt-get install -yq intel-oneapi-vtune

すると、singularity build 時に VTune パッケージの postinst で多数のエラーが出ました。

Please enter "root" NOTE:  super-user or "root" privileges are required in order to continue.
Please enter "root" NOTE:  super-user or "root" privileges are required in order to continue.
Please enter "root" NOTE:  super-user or "root" privileges are required in order to continue.
Please enter "root" NOTE:  super-user or "root" privileges are required in order to continue.
Please enter "root" NOTE:  super-user or "root" privileges are required in order to continue.
... ... ...

上記のエラーは /opt/intel/oneapi/vtune/latest/sepdk/src/boot-script で発生していました。
boot-script はビルドした Sampling Drivers をシステム起動時に読み込むように設定するスクリプトのようです。
boot-script は intel-oneapi-vtune パッケージの postinst スクリプトで呼ばれていました。

/var/lib/dpkg/info/intel-oneapi-vtune.postinst
# Copyright Intel Corporation.
#
# This software and the related documents are Intel copyrighted materials,
# and your use of them is governed by the express license under which they
# were provided to you ("License"). Unless the License provides otherwise,
# you may not use, modify, copy, publish, distribute, disclose or transmit
# this software or the related documents without Intel's prior written
# permission.
#
# This software and the related documents are provided as is, with no express
# or implied warranties, other than those that are expressly stated in the
# License.

LINK_NAME="latest"
TARGET="2025.0"
INSTALL_DIR=/opt/intel
INSTALL_SUBDIR=/oneapi

# always target the "latest" symlink to the current version even if a newer exists
# because we need it to be the latest installed, not the greatest version
cd "${INSTALL_DIR}//oneapi/vtune"
ln -sfT "${TARGET}" "${LINK_NAME}"

PRODUCT_INSTALL_DIR="${INSTALL_DIR}//oneapi/vtune/${TARGET}"

# build and install driver
if [ "$(whoami)" = "root" ]; then
    cd "${PRODUCT_INSTALL_DIR}/sepdk/src"
    ./build-driver --non-interactive
    ./rmmod-sep -s
    ./insmod-sep
    ./boot-script --install
fi

# Linking tool execution
MODE="link"
PRODUCT_NAME="vtune"
VERSION="latest"
TOOL_PATH="$INSTALL_DIR/$INSTALL_SUBDIR/.toolkit_linking_tool/latest/tlt"

# Check if toolkit linking tool exist
# If it does, execute it for the product
if [ -f "$TOOL_PATH" ]; then
    "$TOOL_PATH" "$MODE" "$PRODUCT_NAME" "$VERSION" >> "/tmp/$PRODUCT_NAME-$VERSION-$MODE-tlt.log" 2>&1
fi

exit 0

whoami で root かどうか(root権限があるかどうか)を判別して、Sampling Drivers をビルド&インストールしていますね。
Singularity で build するときには通常 singularity build --fakeroot を使うので root ユーザーと判定されて boot-script が動いていたのでした。

whoami による root 判定を回避する

intel-oneapi-vtune.postinst 内の if [ "$(whoami)" = "root" ]; then 部分をスキップできればエラーを回避できます。何か良い手がないかを探してみました。

まず最初に postinst 自体をスキップできないかを考えました。
調べたところ dpkg - Ignore apt-get postinstall scripts automatically が見つかりました。

apt-get download <package>
sudo dpkg --unpack <package>*.deb
sudo rm /var/lib/dpkg/info/<package>.postinst -f
sudo dpkg --configure <package>
sudo apt-get install -yf #To fix dependencies

のようにすれば良いとのこと。
apt install に何かオプションがあれば良いなと思っていたのですが、そうではありませんでした。この方法は煩雑過ぎると感じたので他の方法を探します。

[ "$(whoami)" = "root" ] で root 権限判定しているのを直して本家にパッチを投げようか、とも思ったのですが、shell - How to check if running as root in a bash script - Stack OverflowSr. Libre 氏の回答にも書いてあるように fakeroot を避けれるうまい判定方法が見つかりませんでした。それが fakeroot の目的だからしょうがないのですが。。。

しょうがないので whoami を入れ替えてスクリプトを騙すことを試みました。
ようするに [ "$(whoami)" = "root" ] が真にならなければよいので一時的に /usr/bin/whoami を /usr/bin/false に置き換えて apt-get install してみました。

# quick hack to prevent sep5 driver build at postinstall
mv /usr/bin/whoami /usr/bin/whoami.Orig && ln -s /usr/bin/false /usr/bin/whoami
apt-get install -yq intel-oneapi-vtune
mv -f /usr/bin/whoami.Orig /usr/bin/whoami

うわぁと感じてしまう無理やりな回避ですが、これはうまくいきました。
.def ファイル記述も2行増えるだけですので当面はこれで回避しようと思います。
まさかスクリプトも whoami が挿げ替えられているとは思わなかったでしょう。

(END OF DOCUMENT)

GitHubで編集を提案

Discussion