Назад | Перейти на главную страницу

Как дождаться завершения автообновления snapd?

В Google Compute Engine у ​​меня есть сценарий запуска, который использует gsutil и gcloud, которые являются частью google-cloud-sdk оснастка, которая предустановлена ​​на ubuntu-minimal-1804-lts общественный имидж, который является базовым изображением для изображения, которое я использую. Но когда я запускал сценарий запуска сегодня, он терпел неудачу 4 раза из 8, потому что snapd решил выполнить автоматическое обновление одновременно с startup-script запущен.

Как в сценарии запуска дождаться завершения автообновления привязки?

Вот команды, которые я выполнил, чтобы определить, что snapd обновлялся одновременно с моим сценарием запуска:

$ snap changes --abs-time
ID   Status  Spawn                 Ready                 Summary
3    Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Auto-refresh snaps "core", "google-cloud-sdk"

$ snap tasks 3 --abs-time
Status  Spawn                 Ready                 Summary
…
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:45Z  Ensure prerequisites for "google-cloud-sdk" are available
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:46Z  Download snap "google-cloud-sdk" (82) from channel "stable/ubuntu-18.04"
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:47Z  Fetch and check assertions for snap "google-cloud-sdk" (82)
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:48Z  Mount snap "google-cloud-sdk" (82)
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:48Z  Run pre-refresh hook of "google-cloud-sdk" snap if present
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:48Z  Stop snap "google-cloud-sdk" services
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:48Z  Remove aliases for snap "google-cloud-sdk"
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:48Z  Make current revision for snap "google-cloud-sdk" unavailable
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Copy snap "google-cloud-sdk" data
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Setup snap "google-cloud-sdk" (82) security profiles
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Make snap "google-cloud-sdk" (82) available to the system
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Automatically connect eligible plugs and slots of snap "google-cloud-sdk"
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Set automatic aliases for snap "google-cloud-sdk"
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Setup snap "google-cloud-sdk" aliases
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Run post-refresh hook of "google-cloud-sdk" snap if present
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Start snap "google-cloud-sdk" (82) services
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Clean up "google-cloud-sdk" (82) install
Done    2019-05-16T18:08:34Z  2019-05-16T18:08:49Z  Run configure hook of "google-cloud-sdk" snap if present

$ journalctl -u google-startup-scripts
…
May 16 18:08:39 my-instance startup-script[1469]: INFO startup-script-url: + gsutil cp gs://my-bucket/app.tar.gz /opt/my-bucket/app.tar.gz
May 16 18:08:41 my-instance startup-script[1469]: INFO startup-script-url: /snap/google-cloud-sdk/41/usr/bin/python2: relocation error: /lib/x86_64-linux-gnu/libnss_dns.so.2: symbol 
__resolv_context_get, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference

В другом случае gsutil не удалось с другим сообщением:

ERROR: (gsutil) /snap/google-cloud-sdk/41/usr/bin/python2: command not found

Я столкнулся с той же проблемой, и булавка также указала причину для автоматического обновления! В моем случае жду snap refresh занимает слишком много времени, а количество рабочих мест по-прежнему доступно для одного человека, поэтому я просто уменьшено допустимое окно обновления к более спокойной части рабочей недели.

Например, попробуйте:

# Allows snap refreshes on Monday at 10AM and also on Friday at 3PM
sudo snap set system refresh.timer=mon,10:00,,fri,15:00

Я закончил бегать snap changes пока все не было Done поместив это в начало моего сценария запуска:

# Returns 0 if snapd is not updating google-cloud-sdk
# (nothing has happened, or all changes are Done, Hold, Error)
# Returns 1 if snapd is updating google-cloud-sdk
# (there is at least one chnage that is Doing, Abort, Undo, or Undoing)
# Echos the offending line
# https://serverfault.com/questions/967674/how-to-wait-for-snapd-auto-refresh-to-complete
function isSnapIdle {
  # For the format of snap changes, see:
  # see https://github.com/snapcore/snapd/blob/8ae45c207f3c488f0ab0dc3615661df9b0854b20/overlord/state/change.go
  # and https://github.com/snapcore/snapd/blob/8ae45c207f3c488f0ab0dc3615661df9b0854b20/cmd/snap/cmd_changes.go#L124
  local line
  local changes
  if changes=$(snap changes google-cloud-sdk); then
    :
  else
    # When snap is upgrading itself, snap changes can fail
    echo "snap changes gave error $? $changes"
    return 2
  fi
  while read line; do
    local state=$(echo "$line" | awk '{print $2}')
    if [ "$state" = Do ] || [ "$state" = Doing ] || [ "$state" = Abort ] || [ "$state" = Undo ] || [ "$state" = Undoing ]; then
      echo "$line"
      return 1
    fi
  done < <(echo "$changes" | tail -n +2)
  return 0
}
function waitUntilSnapIdle {
  local lastSnapChange=
  local snapChange
  while ! snapChange=$(isSnapIdle); do
    if [ "$snapChange" != "$lastSnapChange" ]; then
      echo >&2 "Waiting for snapd to finish installing: $snapChange"
    fi
    lastSnapChange="$snapChange"
    sleep 1
  done
  echo >&2 "Snapd does not appear to be installing google-cloud-sdk"
}

waitUntilSnapIdle

Я пытался воспроизвести вашу проблему, создав экземпляр с изображением ubuntu-minimal-1804-lts, как вы указываете

gcloud compute instances create \
--image-family ubuntu-minimal-1804-lts \
--image-project ubuntu-os-cloud \
--machine-type n1-standard-1 \
--boot-disk-size=15 \
--boot-disk-type=pd-ssd \
--zone=europe-west1-c \
--tags=allow-incoming-ssh \
--metadata=startup-script-url="gs://testinggrounds/startup.sh" \
ubuntu-test

а затем перезагрузите его несколько раз

for i in {1..7}; \
do \
gcloud compute instances reset ubuntu-test --zone europe-west1-c; \
sleep 120s; \
done

но мне не удалось решить эту проблему, о которой вы говорите.

Пытаясь найти ошибку, я обнаружил этот поток, в котором пользователь, сообщающий о проблеме, представляет очень похожую проблему, которая мощь будь таким же, как ты нашел. Как сообщила разработчик, проблема должна быть исправлена. Вы можете проверить, если дата для вашего образа Ubuntu 18.04 до даты открытия этой темы, которой я поделился? Может быть, используя новое изображение ваша проблема решена.

Я видел, что вы сказали, что это внезапно появилось не так давно, так что наверное не версия, но проверить не помешает.

Если бы это было не так, я бы предложил просто отложить выполнение сценария запуска или попробуйте заставить его работать после других служб snapd.

[Unit]
Description=Google Compute Engine Startup Scripts
After=local-fs.target network-online.target network.target rsyslog.service
After=google-instance-setup.service google-network-daemon.service
After=cloud-final.service multi-user.target
After=snapd.seeded.service
After=snapd.service
Wants=local-fs.target network-online.target network.target cloud-final.service
Wants=snapd.seeded.service

[Service]
ExecStartPre=/bin/sleep 20
ExecStart=/usr/bin/google_metadata_script_runner --script-type startup
KillMode=process
Type=oneshot
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

[Install]
WantedBy=multi-user.target

Этот файл находится по адресу /lib/systemd/system/google-startup-scripts.service. Я добавил After=snapd.service и ExecStartPre=/bin/sleep 20 чтобы попытаться отложить выполнение услуги. Ваш файл должен выглядеть точно так же, как приведенный выше, без моих дополнений.

Если это по-прежнему не работает, вы можете попробовать добавить другие службы привязки с помощью After= директиве, так как в папке служб systemd есть еще несколько:

$ ls /lib/systemd/system/ | grep snap

snapd.autoimport.service
snapd.core-fixup.service
snapd.failure.service
snapd.seeded.service
snapd.service
snapd.snap-repair.service
snapd.snap-repair.timer
snapd.socket
snapd.system-shutdown.service

Надеюсь, поможет!