Ubuntu 16.04サーバーのVMイメージは、約12時間ごとに「apt-daily.service」を起動しているようです。このサービスは、利用可能なパッケージのリストの更新、必要に応じて無人アップグレードの実行など、さまざまなAPT関連のタスクを実行します。
このサービスは、仮想マシン「スナップショット」から起動するとトリガーされます。まもなく、(おそらく)systemdは、タイマーがずっと前にオフになっていなければならないことをすぐに悟ったからです。
ただし、実行中のAPTはapt
保持しているため、他のプロセスは実行されません/var/lib/dpkg
。
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
Ansibleがシステム設定を完了するまで(通常はパッケージのインストールを含む)、この自動APT操作を無効にする必要があります。https://github.com/gc3-uzh-ch/elasticluster/issues/304詳細と背景をご覧ください。
「ユーザーデータ」スクリプトを介して「無人アップグレード」機能を無効にするためにさまざまなオプションを試しましたが、cloud-init
これまですべて失敗しました。
1. システム操作の無効化
systemd操作はapt-daily.service
によってトリガーされますapt-daily.timer
。次のコマンドのいずれかまたは両方を無効にするためにさまざまな組み合わせを試しましたが、apt-daily.service
VMがSSH接続を受け入れる準備ができたらすぐに起動します。
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. 構成オプションの無効化APT::Periodic::Enable
スクリプトは/usr/lib/apt/apt.systemd.daily
一部のAPT構成変数を読み込みます。この設定はAPT::Periodic::Enable
機能を完全に無効にします(行331〜337)。次のスクリプトを使用して無効にしてみました。
#!/bin/bash
# cannot use /etc/apt/apt.conf.d/10periodic as suggested in
# /usr/lib/apt/apt.systemd.daily, as Ubuntu distributes the
# unattended upgrades stuff with priority 20 and 50 ...
# so override everything with a 99xxx file
cat > /etc/apt/apt.conf.d/99elasticluster <<__EOF
APT::Periodic::Enable "0";
// undo what's in 20auto-upgrade
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
__EOF
ただし、コマンドライン(以下を参照)からAPT::Periodic::Enable
値を取得したにもかかわらず、プログラムは引き続き実行されます。0
unattended-upgrades
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3./usr/lib/apt/apt.systemd.daily
完全削除
次のcloud-init
スクリプトは、無人アップグレードスクリプトを完全に削除します。
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
それにもかかわらず、タスクはまだ実行中であり、プロセステーブルで見ることができます!コマンドラインから検索すると、ファイルは存在しません。
ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
cloud-init
SSHコマンドラインとともに、スクリプトとルートシステムプロセスが別々のファイルシステムとプロセススペースで実行されているようです。
質問
私は明らかなものを見逃していますか?それとも私が知らないネームスペース魔法が進んでいるのでしょうか?
最も重要なのは:スクリプトapt-daily.service
でどのようにcloud-init
無効にするのですか?
ベストアンサー1
はい、明らかに何かが落ちました。
Systemdはサービスの同時起動に関するものなので、cloud-init
スクリプトの実行同時にトリガーされますapt-daily.service
。cloud-init
ユーザーが指定したペイロードが実行されると、
apt-get update
すでに実行中です。そのため、試み2と3は、名前空間の魔法のためではなく、システムに遅すぎるためにapt.systemd.daily
変更を受け入れることができなかったために失敗しました。
これは基本的に方法がないことを意味します。防止
apt.systemd.daily
実行を防ぎます。開始した後にのみ終了してください。
この "userdata"スクリプトは次のパスを使用します。
#!/bin/bash
systemctl stop apt-daily.service
systemctl kill --kill-who=all apt-daily.service
# wait until `apt-get updated` has been killed
while ! (systemctl list-units --all apt-daily.service | egrep -q '(dead|failed)')
do
sleep 1;
done
# now proceed with own APT tasks
apt install -y python
SSHログインは可能ですが、動作しない時間がまだありますが、apt-get
Ubuntu 16.04クラウドイメージで動作する他のソリューションは想像できません.