Powering on a N9 with a broken power key

2025-09-02


The N9 I have here has a broken power key, meaning it doesn't react to power button presses to turn on. Connecting a USB cable does bring up the device to a point where it charges (internally, it actually boots up the Linux kernel, but stays UI-wise in the fittingly named ACT_DEAD mode).

Connecting a USB cable to a PC brings up USB networking, and allows me to SSH into the device (you probably have to set this up first, possibly after a reflash and in that case definitely before turning off the device).

If USB networking DOES come up, your host PC should have the manual IP address 192.168.2.14 (with netmask of /24) configured. You should then be able to SSH into your N9 (even in actdead mode) using the IP address 192.168.2.15 (username user, the default N9 user).

To query what caused the device to boot up, use:

# /sbin/getbootstate 2>/dev/null
ACT_DEAD

Notably, getbootstate is part of DSME, which is still maintained and used in Sailfish OS. Although it's been some time, the Git history of the file shows that nothing much has changed since 2011.

Now, where does it access the getbootstate binary?

# grep -r getbootstate /etc/
/etc/init.conf:mandatorybinary /sbin/getbootstate
/etc/init/ttyS0.conf:   [ "x$(getbootstate 2>/dev/null)" = "xFLASH" ] && exit 99
/etc/init/dsme.conf:        boot_state=`getbootstate  2>/dev/null`
/etc/init/dsme.conf:        export BOOTSTATE=`getbootstate -f 2>/dev/null`
/etc/init/rc-default.conf:  BOOTSTATE=`getbootstate 2>/dev/null`
/etc/init/flash-check.conf:    if [ "x$(getbootstate 2>/dev/null)" = "xFLASH" ]; then

This brings up - among other things - dsme, going further:

# cat /var/lib/dsme/saved_state
ACT_DEAD

Now, if this content is modified:

# echo -n USER > /var/lib/dsme/saved_state

Then the tool reports:

# /sbin/getbootstate
getbootstate: User requested reboot (saved_state=USER, bootreason=sw_rst)
USER

And finally using this incantation, you can boot the N9:

# /sbin/reboot

However, when just using a USB charger, you might get:

# /sbin/getbootstate
getbootstate: User attached charger
ACT_DEAD

The next step requires an open mode kernel to not get into MALF state and require a reflash. Use disclaimer-cal remove View-openmode for the best experience, which is also a nice search term to find open mode kernel downloads and flashing instructions.

With an open mode kernel running, create a simple shell script like this:

#!/bin/sh
echo -n USER

Move the original one out of the way for safekeeping, place the shell script above into /sbin/getbootstate and make it executable:

mv /sbin/getbootstate /sbin/getbootstate.orig
# ... put the above shell script into /sbin/getbootstate ...
chmod +x /sbin/getbootstate

How to power it off? Open the Terminal app, become root using devel-su and then use /sbin/poweroff (note that /sbin/ is not in your $PATH, so you need to specify the full path).

Additional links:

Thomas Perl · 2025-09-02