一部のビルドスクリプトでは、スクリプトの終了時にこれらのマウントを残さずに安全にマウントするためのメカニズムとして、マウント名前空間を使用しています。 非共有マウントポイントは、その名前空間の最後のプロセスが終了すると、暗黙的にアンマウントされます 。
私のスクリプトには通常、次のようなスタンサが含まれています。
#!/bin/bash
self_ns=$(ls -lh /proc/self/ns/mnt)
init_ns=$(ls -lh /proc/$PPID/ns/mnt)
if [ "${self_ns#*mnt:}" = "${init_ns#*mnt:}" ] ; then
unshare --mount $0 "$@"
exit $?
fi
これはしばらくの間うまく機能していましたが、最近、jenkinsビルドサーバーで問題が発生しました。
ビルドスクリプト自体が jenkins chroot environment 内で実行されているという問題があると思います。したがって、スクリプトが実行されるとunshare --mount ...
、エラーで失敗します:
unshare: cannot change root filesystem propagation: Invalid argument
残念ながら、私はこの制限やそれを回避する方法を本当に理解していません。コマンドラインでchrootを試してみると、このエラーを再現できません。これを引き起こすためにjenkinsプラグインが何をしたのかわかりません。
最も重要なことは、これらのマウントポイントが終了時に毎回必ず削除されることです。
A.Bのコメントに基づいて、回避策を見つけました。
A.Bは書いた:
Lxcのrootfsディレクトリインストールと
unshare --mount bash
にchrootすると、同じエラーが発生します。最初にこのディレクトリを別の場所でマウント(--private)にバインドしてから、そこでchrootを実行すると、unshare --mount
が機能します。これが何を意味するのかわかりませんが、これが原因または回避策(パイプラインにバインドマウントを追加する)を見つけるのに役立つことを願っています。
これに基づいて、これは機能しないことがわかりました。
unshare --mount bash -c 'echo hello'
しかし、これは機能します:
mount --bind --make-private / /mnt
chroot /mnt unshare --mount bash -c 'echo hello'
umount /mnt