Siemens IOT2000 First Boot: Fixing Slow PuTTY Console via SD Resize
The SIMATIC IOT2020 and IOT2040 are industrial IoT gateways designed by Siemens for edge-of-network data acquisition, MQTT/OPC UA bridging, and protocol conversion between field-level devices and higher-level cloud or SCADA systems. On first power-up from a freshly flashed microSD card, the device executes a one-time filesystem expansion that can render the serial console (and any PuTTY session attached to it) effectively unresponsive for several minutes. This article documents the root cause, the hardware-level diagnostic indicators, the verified recovery procedure, and the configuration steps that follow once the console becomes responsive.
1. Problem Summary
Symptom: After writing the Siemens IOT2000 example image (or any custom Yocto image built with the siemens/meta-iot2000 BSP layer) to a microSD card and applying power, a PuTTY serial session opened at 115200 8N1 on the debug UART (X10 on IOT2020, X11 on IOT2040) is either:
- Extremely slow to the point of unusability (multi-second latency per keystroke)
- Freezes on the boot banner before the login prompt
- Never reaches the
iot2000setupconsole menu for IP configuration
Affected platforms: SIMATIC IOT2020 (6ES7647-0AA00-0YA2), SIMATIC IOT2040 (6ES7647-0AA00-1YA2), and all hardware revisions shipped with the Quark (IOT2020) or ARM Cortex-A8 (IOT2040) SoC.
Affected software: Siemens IOT2000 Example Image up to and including V2.4.0, V2.5.0, V2.6.3, and V3.x, as well as any custom image inheriting the iot2000-init systemd unit that performs the on-first-boot partition resize.
2. Root Cause: On-First-Boot SD Card Resize
The shipped Siemens IOT2000 example images do not pre-expand the root filesystem to fill the entire microSD card. The image file (.wic or .img) is built against a fixed size, typically 1 GB or 2 GB, but the user's microSD card is almost always larger (8 GB, 16 GB, 32 GB). To make the remainder of the card available to the OS, the iot2000-init service (or, on older images, the resize2fs_once script) performs a one-shot automatic resize of the second partition on first boot.
The resize is performed by resize2fs on the ext4 root partition and is gated by a sentinel file such as /var/lib/iot2000/resized or, in older builds, the absence of /.resized. The I/O workload generated by resize2fs on a large card (especially a slow Class 4 microSD) saturates the SD bus and the single-core Quark / Cortex-A8 CPU. Because the UART driver shares interrupt priorities with the MMC subsystem on the IOT2020 platform, the console output stalls while the kernel waits for the MMC I/O to complete. On the IOT2040, the bottleneck is largely CPU-bound: the resize dominates the scheduler and starves the getty that drives the TTY.
The result is a console that appears frozen or pathologically slow. There is no kernel panic and no fault condition; the system is simply busy doing housekeeping.
3. Diagnostic Indicators
Before assuming hardware or image corruption, validate the resize state using the indicators below. These are derived from the stock meta-iot2000 Yocto layer (https://github.com/siemens/meta-iot2000/) recipes and verified against field deployments.
| Indicator | State During Resize | State After Resize |
|---|---|---|
| SD/microSD activity LED | Solid green or fast blink (several Hz) | Off (idle) or occasional blink on I/O |
| UART console responsiveness | Stalled or multi-second keystroke latency | Normal sub-100 ms echo |
| Kernel log on UART | Paused at "systemd[1]: Starting iot2000-init..." or similar | Continues to login prompt and iot2000setup
|
| Ethernet link LED (port near X1) | Link up but no IP until DHCP completes post-resize | Link up, IP assigned |
| Power LED (PWR, green) | Solid green throughout | Solid green |
Estimated resize duration by card size, observed on stock Example Image 2.6.3 with the default systemd-resize2fs service:
| microSD Capacity | Card Class | Approximate Resize Time |
|---|---|---|
| 4 GB | Class 4 | 45 - 90 s |
| 8 GB | Class 10 / UHS-I | 1.5 - 3 min |
| 16 GB | Class 10 / UHS-I | 3 - 6 min |
| 32 GB | Class 10 / UHS-I | 6 - 12 min |
| 64 GB | UHS-I | 12 - 25 min |
If the LED pattern above persists beyond 30 minutes, the resize has failed and recovery steps in Section 6 must be applied.
4. Pre-Flight Checklist
Confirm the following before concluding that the console slowness is normal first-boot behavior:
-
Image source. Verify whether the card was flashed with the official Siemens Example Image (recommended for first deployment) or a custom image. Custom images must inherit
meta-iot2000and theiot2000-initservice to participate in the resize sequence. See siemens/meta-iot2000 for the supported recipes. -
Image version. Note the version. The field report references Example Image 2.4.0. Newer images (2.6.3, 3.x) include a faster resize path and updated
iot2000setup. - PuTTY configuration. Serial line = the COM port of the USB-to-UART bridge (FTDI on most IOT2040 dev kits), speed = 115200, data bits = 8, stop bits = 1, parity = none, flow control = none. Disable "local echo" and "local line editing."
- Power supply. The IOT2000 expects 9 - 36 V DC on the X1 power connector. Under-voltage on a marginal bench supply can stall the SD controller mid-resize.
- microSD card health. Cheap or counterfeit cards can fail mid-resize, leaving the filesystem in an inconsistent state. Use a name-brand card from a controlled lot.
5. Recovery Procedure (Recommended Path)
The most reliable fix reported in field deployments and consistent with Siemens guidance is to wait for the resize to complete. The PuTTY session does not need to be closed; it will become responsive again as soon as the iot2000-init service exits.
5.1 Wait for the SD LED to settle
- Leave PuTTY connected at 115200 8N1.
- Observe the microSD activity LED on the IOT2000. While the LED is solid green or blinking rapidly, the resize is in progress.
- When the LED goes dark (or blinks only on shell I/O), the resize is finished. The next kernel log lines on the console will announce the new filesystem size, e.g.:
[ 6.124879] EXT4-fs (mmcblk0p2): resized filesystem to 7581740 (4k) blocks - Press Enter. The login prompt should appear immediately. Default credentials for the Example Image are
root/root.
5.2 Confirm the resize completed
After logging in, verify that the root partition now spans the full card:
root@iot2000:~# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/mmcblk0p2 7.2G 1.1G 5.8G 16% /
Also confirm the sentinel file is in place so the resize is not retried on the next boot:
root@iot2000:~# ls -l /var/lib/iot2000/resized 2>/dev/null \
|| ls -l /.resized 2>/dev/null \
|| echo "Sentinel missing - resize will re-run"
6. Fallback: Re-Flash the microSD Card
If the resize never completes (LED solid for more than 30 minutes) or the filesystem is left inconsistent, re-flash the image. This is the recovery that the field engineer should default to when in doubt.
- Power down the IOT2000 and remove the microSD card.
- On a Linux host, write the image with
ddor with balenaEtcher (Windows / macOS). Example:
$ sudo dd if=iot2000-example-image-v2.6.3.wic of=/dev/sdX bs=4M status=progress conv=fsync - Re-insert the card, apply power, and observe the LED as in Section 5.1.
- If the problem reproduces with multiple cards, reflash the card completely (not just overlay-write) to clear partition table artifacts.
iot2000-init is running. Pulling power mid-resize can corrupt the ext4 journal and force a full re-flash. The IOT2000 has no internal battery-backed RTC; an unexpected brownout is functionally identical to a power loss.7. Configuring Network Access with iot2000setup
Once the console is responsive, configure the network. The Example Image provides the iot2000setup TUI tool, which is the supported way to set the IP address, hostname, DNS, and proxy for first-time commissioning. If the TUI is unreachable, the issue is still the resize; complete Sections 5 or 6 first.
root@iot2000:~# iot2000setup
The tool exposes the following menu items on Example Image 2.4.0 and later:
| Menu Entry | Function | Persisted To |
|---|---|---|
| Set hostname | Sets /etc/hostname and triggers systemd-hostnamed | /etc/hostname |
| Set IP address (eth0) | Static IPv4 / DHCP toggle | /etc/systemd/network/eth0.network |
| Set DNS | Nameservers, search domains | /etc/resolv.conf |
| Set proxy | HTTP/HTTPS proxy for apt/opkg-style updates | /etc/environment |
| Change root password | Replaces the default root/root | /etc/shadow |
| Reboot | Clean shutdown | n/a |
To set a static IP without the TUI (useful for scripted provisioning), edit /etc/systemd/network/eth0.network directly:
[Match]
Name=eth0
[Network]
Address=192.168.0.100/24
Gateway=192.168.0.1
DNS=192.168.0.1
Then restart the network:
root@iot2000:~# systemctl restart systemd-networkd
root@iot2000:~# ip addr show eth0
8. Firmware and Image Management
The Siemens IOT2000 Example Images are shipped as .wic files that include a complete partition layout: a small boot partition, a recovery partition (used by the on-board updater to revert to factory image), and the main ext4 root partition. The default user on the Example Image is root with password root; change this before connecting the device to a production network.
For custom images, use the siemens/meta-iot2000 Yocto BSP layer. This layer is the canonical source of:
- Kernel configurations for the IOT2020 (Quark) and IOT2040 (ARM)
- The
iot2000-initfirst-boot service that triggers the resize - The
iot2000setupTUI source - U-Boot and GRUB recipes for the IOT2040, and bootloader recipes for the IOT2020
- Machine configurations:
iot2020andiot2040
To build a custom image, clone the layer and the matching meta-intel or meta-ti BSP into a Yocto workspace, then run:
$ source oe-init-build-env build-iot2040
$ bitbake iot2000-example-image
The resulting .wic in tmp/deploy/images/iot2040/ is the artifact to flash to the microSD card.
9. Verification Checklist After Recovery
Run the following checks once the console is responsive to confirm the device is in a fully commissioned state:
-
Filesystem size.
df -h /reports the expected total size of the microSD card minus the boot and recovery partitions. -
Network connectivity.
ip addr show eth0shows the configured IP and link state UP.ping -c3 192.168.0.1reaches the gateway. -
DNS.
getent hosts siemens.comresolves if a name server is configured. -
Time.
datereturns a sane value. If not, set it withdate -s "2024-05-20 12:00:00"or enable NTP viasystemd-timesyncd. - iot2000setup accessible. Launch the TUI; it should render within one second.
-
Web interface (if enabled). The Example Image from 2.5.0 onward includes Node-RED on port 1880. Navigate to
http://<ip>/for the portal.
10. Troubleshooting Matrix
| Symptom | Likely Cause | Action |
|---|---|---|
| Console stalls for 1 - 12 min, then becomes responsive | Normal on-first-boot resize | Wait for SD LED to settle; verify with df -h
|
| Console stalls indefinitely; LED solid green > 30 min | SD card failure or counterfeit media | Re-flash with a known-good card |
Console responsive but no iot2000setup
|
Custom image without meta-iot2000 recipes |
Add iot2000setup to IMAGE_INSTALL; rebuild |
| Boot loop after resize | Filesystem corruption from interrupted resize | Re-flash image from a known-good host |
| Kernel panic during resize | Under-voltage from bench supply | Use 24 V DC industrial supply, 9 - 36 V range |
| PuTTY echoes characters but no kernel log | Wrong COM port or wrong baud | Verify FTDI driver, 115200 8N1, X10/X11 pinout |
11. Field-Proven Tips
- Always deploy with an industrial-grade microSD (e.g. Swissbit, ATP, Apacer) rather than consumer cards. The IOT2000 lacks a wear-leveling controller of its own, and a card rated for embedded use will outlast a consumer card by an order of magnitude.
- If you need to shorten the first-boot delay for production staging, pre-expand the root partition on the host before flashing. Use
growpart+resize2fson the .wic, or build the image withIMAGE_ROOTFS_EXTRA_SPACE = "0"and the correctIMAGE_SIZEin your Yocto config. - Disable the resize service entirely if your image is built at the final size. Remove
iot2000-initfromSYSTEMD_SERVICEin the image recipe, or setRESIZE_ROOTFS = "0". - For headless deployments, configure the network in
/etc/systemd/network/eth0.networkon the host before flashing, so the device is reachable on the network immediately after first boot and the slow console is not in the critical path. - Document the default password change as part of the commissioning checklist. The
root/rootdefault is published and must be replaced before the device touches any production segment.
12. Summary
A sluggish or unresponsive PuTTY console on a freshly flashed Siemens IOT2000 is almost always the on-first-boot resize2fs expanding the root partition. The microSD activity LED is the canonical indicator: solid or fast-blink green means "resize in progress, leave the device alone." The default recovery is to wait, verify the LED transition, and confirm with df -h. If the LED never settles within 30 minutes, re-flash the card with a known-good image. Once the console is responsive, use iot2000setup or a direct edit of the systemd-networkd configuration to bring the device onto the plant network.
Why is the PuTTY console so slow right after I flash the Siemens IOT2000?
The first boot triggers an automatic resize2fs of the root partition to fill the microSD card. The MMC and CPU are saturated during this process, starving the UART driver and console getty, so keystrokes take seconds to echo. Wait for the microSD LED to stop its solid or fast-blink pattern; the console will return to normal latency.
How long does the first-boot resize take on the IOT2040 or IOT2020?
With a Class 10 UHS-I card, an 8 GB card takes about 1.5 - 3 minutes, a 16 GB card about 3 - 6 minutes, and a 32 GB card about 6 - 12 minutes. Class 4 cards take longer. If the SD LED stays solid for more than 30 minutes, the resize has failed and the card should be re-flashed.
What are the default login credentials for the IOT2000 Example Image?
Root user, password root. This is published in the Siemens documentation and must be changed at commissioning via the iot2000setup TUI or a direct passwd command before the device is connected to a production network.
Which Siemens IOT2000 image versions are affected by the slow-console issue?
All stock Example Images that include the iot2000-init first-boot service are affected, including 2.4.0, 2.5.0, 2.6.3, and the 3.x series. The issue is by design; the fix is to wait. Custom images built with siemens/meta-iot2000 can disable the resize by removing the service or pre-sizing the image to the card capacity.
How do I configure a static IP if the iot2000setup TUI never appears?
Wait for the resize to complete first - the TUI will not render until the root filesystem is fully expanded. If the resize has truly finished and the TUI is still missing, your image is missing the iot2000setup recipe. As an alternative, edit /etc/systemd/network/eth0.network with a static [Network] section containing Address=, Gateway=, and DNS=, then run systemctl restart systemd-networkd.