私のビルドスクリプトの中には、スクリプトが終了したときにマウントを残さずにマウントを保護するメカニズムとしてマウントネームスペースを使用していました。 名前空間の最後のプロセスが終了すると、非共有マウントポイントは暗黙的にマウント解除されます。。
私のスクリプトには通常、次のセクションが含まれています。
#!/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環境。したがって、スクリプトが実行されると、unshare --mount ...
次のエラーで失敗します。
unshare: cannot change root filesystem propagation: Invalid argument
残念ながら、私はこの制限やそれを解決する方法をよく理解していません。コマンドラインでchrootを試みると、このエラーを再現できません。 Jenkinsプラグインがこの問題を引き起こす原因が何であるかわかりません。
最も重要なのは、これらのマウントポイントが終了時に削除されることです。毎回間違いなく。
ベストアンサー1
ABのコメントに基づいて解決策を見つけました。
ABは次のように書きました。
lxc mount と
unshare --mount bash
。unshare --mount
これが何を意味するのかわかりませんが、これが原因や回避策(パイプラインにバインドマウントを追加する)を見つけるのに役立つことを願っています。
これに基づいて、これがうまくいかないことがわかりました。
unshare --mount bash -c 'echo hello'
しかし、これはうまくいきます:
mount --bind --make-private / /mnt
chroot /mnt unshare --mount bash -c 'echo hello'
umount /mnt