I've tracked down the blocking use of randomness in cloud-init's python module initialization. There are several nonblocking calls to getrandom(), which I believe should be fine; then a blocking call in the multiprocessing module.
# PYTHONHASHSEED=1 gdb --args /usr/bin/python3-dbg /usr/bin/cloud-init init GNU gdb (Ubuntu 8.0.1-0ubuntu1) 8.0.1 [...] (gdb) break getrandom Breakpoint 1 at 0x420b90 (gdb) python >import sys >sys.path.append('/usr/share/doc/python3.6/examples/gdb') >import libpython >end (gdb) run Starting program: /usr/bin/python3-dbg /usr/bin/cloud-init init [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Breakpoint 1, getrandom (buffer=buffer@entry=0x7fffffff8140, length=length@entry=2496, flags=flags@entry=1) at ../sysdeps/unix/sysv/linux/getrandom.c:30 [...] (gdb) cont 4 Will ignore next 3 crossings of breakpoint 1. Continuing. [...] -------+ ci-info: | Route | Destination | Gateway | Genmask | Interface | Flags | ci-info: +-------+---------------+---------------+-----------------+-----------+ -------+ ci-info: | 0 | 0.0.0.0 | 192.168.122.1 | 0.0.0.0 | ens3 | UG | ci-info: | 1 | 192.168.122.0 | 0.0.0.0 | 255.255.255.0 | ens3 | U | ci-info: | 2 | 192.168.122.1 | 0.0.0.0 | 255.255.255.255 | ens3 | UH | ci-info: +-------+---------------+---------------+-----------------+-----------+ -------+ /usr/lib/python3.6/logging/config.py:85: ResourceWarning: unclosed file <_io.Tex tIOWrapper name='/var/log/cloud-init.log' mode='a' encoding='UTF-8'> _install_loggers(cp, handlers, disable_existing_loggers) Breakpoint 1, getrandom (buffer=buffer@entry=0x7ffff21b7340, length=length@entry=32, flags=flags@entry=0) at ../sysdeps/unix/sysv/linux/getrandom.c:30 30 in ../sysdeps/unix/sysv/linux/getrandom.c (gdb) py-bt Traceback (most recent call first): 0x7ffff6b66b20 File "/usr/lib/python3.6/multiprocessing/process.py", line 307, in __init__ self._config = {'authkey': AuthenticationString(os.urandom(32)), File "/usr/lib/python3.6/multiprocessing/process.py", line 320, in <module> _current_process = _MainProcess() <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load <built-in method __import__ of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1017, in _handle_fromlist File "/usr/lib/python3.6/multiprocessing/context.py", line 5, in <module> from . import process <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load <built-in method __import__ of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1017, in _handle_fromlist File "/usr/lib/python3.6/multiprocessing/__init__.py", line 16, in <module> from . import context <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "/usr/lib/python3.6/concurrent/futures/process.py", line 53, in <module> import multiprocessing <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "/usr/lib/python3.6/concurrent/futures/__init__.py", line 17, in <module> from concurrent.futures.process import ProcessPoolExecutor <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "/usr/lib/python3.6/asyncio/base_events.py", line 17, in <module> import concurrent.futures <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "/usr/lib/python3.6/asyncio/__init__.py", line 21, in <module> from .base_events import * <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "/usr/lib/python3/dist-packages/jinja2/asyncsupport.py", line 13, in <module> import asyncio <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "/usr/lib/python3/dist-packages/jinja2/__init__.py", line 77, in _patch_async from jinja2.asyncsupport import patch_all File "/usr/lib/python3/dist-packages/jinja2/__init__.py", line 81, in <module> _patch_async() <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "/usr/lib/python3/dist-packages/cloudinit/templater.py", line 23, in <module> import jinja2 <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load <built-in method __import__ of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1017, in _handle_fromlist File "/usr/lib/python3/dist-packages/cloudinit/config/cc_update_etc_hosts.py", line 52, in <module> from cloudinit import templater <built-in method exec of module object at remote 0x7ffff6bb9cd8> File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 971, in _find_and_load 0x7ffff6bbf580 File "/usr/lib/python3/dist-packages/cloudinit/importer.py", line 15, in import_module __import__(module_name) File "/usr/lib/python3/dist-packages/cloudinit/importer.py", line 35, in find_module mod = import_module(full_path) File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 751, in _fixup_modules mod_name, ['', type_utils.obj_name(config)], ['handle']) File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 818, in run_section mostly_mods = self._fixup_modules(raw_mods) File "/usr/lib/python3/dist-packages/cloudinit/cmd/main.py", line 107, in run_module_section (which_ran, failures) = mods.run_section(full_section_name) File "/usr/lib/python3/dist-packages/cloudinit/cmd/main.py", line 416, in main_init return (init.datasource, run_module_section(mods, name, name)) File "/usr/lib/python3/dist-packages/cloudinit/cmd/main.py", line 638, in status_wrapper ret = functor(name, args) File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 2238, in log_time ret = func(*args, **kwargs) File "/usr/lib/python3/dist-packages/cloudinit/cmd/main.py", line 829, in main get_uptime=True, func=functor, args=(name, args)) File "/usr/bin/cloud-init", line 11, in <module> load_entry_point('cloud-init==17.1', 'console_scripts', 'cloud-init')() (gdb) We have the option to set the authkey to a different value post- initialization, but there's no way to avoid using entropy when importing this module. ** Also affects: python3.6 (Ubuntu) Importance: Undecided Status: New ** Changed in: python3.6 (Ubuntu) Status: New => Triaged ** Changed in: cloud-init (Ubuntu) Status: Incomplete => Triaged -- You received this bug notification because you are a member of Yahoo! Engineering Team, which is subscribed to cloud-init. https://bugs.launchpad.net/bugs/1727358 Title: cloud-init is slow to complete init on minimized images Status in cloud-init: Incomplete Status in cloud-init package in Ubuntu: Triaged Status in python3.6 package in Ubuntu: Triaged Bug description: http://paste.ubuntu.com/25816789/ for the full logs. cloud-init is very slow to complete its initialization steps. Specifically, the 'init' takes over 150 seconds. Cloud-init v. 17.1 running 'init-local' at Wed, 25 Oct 2017 13:22:07 +0000. Up 2.39 seconds. 2017-10-25 13:22:07,157 - util.py[WARNING]: did not find either path /sys/class/dmi/id or dmidecode command Cloud-init v. 17.1 running 'init' at Wed, 25 Oct 2017 13:22:16 +0000. Up 11.37 seconds. ci-info: ++++++++++++++++++++++++++++++++Net device info+++++++++++++++++++++++++++++++++ ci-info: +--------+-------+-----------------+---------------+-------+-------------------+ ci-info: | Device | Up | Address | Mask | Scope | Hw-Address | ci-info: +--------+-------+-----------------+---------------+-------+-------------------+ ci-info: | ens3: | True | 192.168.100.161 | 255.255.255.0 | . | 52:54:00:bb:ad:fb | ci-info: | ens3: | True | . | . | d | 52:54:00:bb:ad:fb | ci-info: | lo: | True | 127.0.0.1 | 255.0.0.0 | . | . | ci-info: | lo: | True | . | . | d | . | ci-info: | sit0: | False | . | . | . | . | ci-info: +--------+-------+-----------------+---------------+-------+-------------------+ ci-info: ++++++++++++++++++++++++++++++++Route IPv4 info++++++++++++++++++++++++++++++++ ci-info: +-------+---------------+---------------+-----------------+-----------+-------+ ci-info: | Route | Destination | Gateway | Genmask | Interface | Flags | ci-info: +-------+---------------+---------------+-----------------+-----------+-------+ ci-info: | 0 | 0.0.0.0 | 192.168.100.1 | 0.0.0.0 | ens3 | UG | ci-info: | 1 | 192.168.100.0 | 0.0.0.0 | 255.255.255.0 | ens3 | U | ci-info: | 2 | 192.168.100.1 | 0.0.0.0 | 255.255.255.255 | ens3 | UH | ci-info: +-------+---------------+---------------+-----------------+-----------+-------+ 2017-10-25 13:24:38,187 - util.py[WARNING]: Failed to resize filesystem (cmd=('resize2fs', '/dev/root')) 2017-10-25 13:24:38,193 - util.py[WARNING]: Running module resizefs (<module 'cloudinit.config.cc_resizefs' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_resizefs.py'>) failed Generating public/private rsa key pair. Your identification has been saved in /etc/ssh/ssh_host_rsa_key. Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub. The key fingerprint is: SHA256:LKNlCqqOgPB8KBKGfPhFO5Rs6fDMnAvVet/W9i4vLxY root@cloudimg The key's randomart image is: +---[RSA 2048]----+ | | | . + | | . O . | |o . % +. | |++.o %=.S | |+=ooo=+o. . .E | |* +.+. . o o. | |=. . . .=. | |+. . B= | +----[SHA256]-----+ Generating public/private dsa key pair. Your identification has been saved in /etc/ssh/ssh_host_dsa_key. Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub. The key fingerprint is: SHA256:dNWNyBHqTUCl820/vL0dEhOVDFYJzqr1WeuqV1PAmjk root@cloudimg The key's randomart image is: +---[DSA 1024]----+ | .oo=X==o| | =* *+.| | . = .B . | | . o =E.. .| | S .oo+o..| | o ..*+.| | . +.=o| | .o *| | .o..++| +----[SHA256]-----+ Generating public/private ecdsa key pair. Your identification has been saved in /etc/ssh/ssh_host_ecdsa_key. Your public key has been saved in /etc/ssh/ssh_host_ecdsa_key.pub. The key fingerprint is: SHA256:N3RTlPa7KU5ryq6kJAO8Tiq90ub4P1DGSofn6jFkM3k root@cloudimg The key's randomart image is: +---[ECDSA 256]---+ | .o. | | .o | | o . o. . | | +.* . . . .| | .*XE S o .| | oo++ . . . | | oo= o . . . o| |o.Oo. + o . .o.o | |oB=+.. . .o++o. | +----[SHA256]-----+ Generating public/private ed25519 key pair. Your identification has been saved in /etc/ssh/ssh_host_ed25519_key. Your public key has been saved in /etc/ssh/ssh_host_ed25519_key.pub. The key fingerprint is: SHA256:B6B/1SyUB/TFPfmU1ADIotnD+wjISO5L2JZkWe2lDUA root@cloudimg The key's randomart image is: +--[ED25519 256]--+ | .E . o++.o+++| | + ...++...++| | o o=o.o.+ .o| | .o oo=+o . .| | o+o .+ So. | | =o.o .... | |..= . o | | o. . . | | .. | +----[SHA256]-----+ sudo: unable to resolve host cloudimg: Resource temporarily unavailable Cloud-init v. 17.1 running 'modules:config' at Wed, 25 Oct 2017 13:24:39 +0000. Up 155.13 seconds. 2017-10-25 13:24:40,289 - util.py[WARNING]: Failed to run command to import ubuntu ssh ids 2017-10-25 13:24:40,291 - util.py[WARNING]: ssh-import-id failed for: ubuntu ['cyphermox'] 2017-10-25 13:24:40,292 - util.py[WARNING]: Running module ssh-import-id (<module 'cloudinit.config.cc_ssh_import_id' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_ssh_import_id.py'>) failed Cloud-init v. 17.1 running 'modules:final' at Wed, 25 Oct 2017 13:24:41 +0000. Up 156.51 seconds. ci-info: no authorized ssh keys fingerprints found for user ubuntu. Cloud-init v. 17.1 finished at Wed, 25 Oct 2017 13:24:41 +0000. Datasource DataSourceNoCloud [seed=/dev/vdb][dsmode=net]. Up 156.83 seconds This does not seem to be caused by ssh key generation (I tried to disable it, with no keytypes enabled there is still > 150 s delay), not does it seem to be related to the resizing operation. I suspect some other step requiring randomness to generate some kind of ID, but I don't know. To manage notifications about this bug go to: https://bugs.launchpad.net/cloud-init/+bug/1727358/+subscriptions -- Mailing list: https://launchpad.net/~yahoo-eng-team Post to : yahoo-eng-team@lists.launchpad.net Unsubscribe : https://launchpad.net/~yahoo-eng-team More help : https://help.launchpad.net/ListHelp