Singularity で VTune をインストールする際の回避策
要旨
Singularity で oneAPI VTune をインストールする際は回避策が必要。
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 2022.1.2 と CUDA 11.6.0 の両方を使えるような Singularity .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-and-cpp-classic-2022.0.2
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 スクリプトで呼ばれていました。
LINK_NAME="latest"
TARGET="2022.1.0"
INSTALL_DIR=/opt/intel
# 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
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 Overflow の Sr. 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)
Discussion