Sunday, July 27, 2014

Hacking the Pogoplug v4 (Series 4 and Mobile) with Linux (Debian or Arch)

This is a quick publish tutorial on hacking the Pogoplug V4 - Series 4 or Mobile - with Debian or Arch Linux ARM. Last updated 01/04/2016.

Major credit to @bodhi on Jeff Doozan's Forum (and Jeff himself) for the uBoot, Debian rootfs, instructions and support. Note that I re-hosted some of @bodhi's files for an easier install.

This tutorial assumes you're starting with a brand new, never modified Pogoplug Mobile or Series 4. However, if you have a previously modified Pogoplug V4, the uBoot instructions will work under Debian/ALARM if you want to upgrade your uBoot for SD Card booting and want to boot the default Pogoplug OS.

At the end of this tutorial your Pogoplug will be booting Debian (or ALARM) from a SD Card. Instructions for booting off a USB Hard/Flash Drive is also included.

My recommendation is to boot via SD Card to keep the USB port free for a USB Hard Drive, USB DAC (for MPD, Airplay and/or SqueezeLite), WebCam, Wi-Fi Adapter or printer.

WARNING: You can potentially brick your Pogoplug following this tutorial. Your warranty will be voided. Proceed at your own risk. I didn't think I needed to say this but I do - these instructions are for the Pogoplug V4. Flashing the uBoot below on any other model of the Pogoplug will result in a brick. 

If you made a mistake, bricked your Pogoplug or simply didn't understand what you got yourself into or want to start fresh, you're in luck! Here is a ~$13 solution.

Requirements:
Outline of Steps:
  1. Enable SSH access to Pogoplug
  2. uBoot Installation via SSH Console 
    • Kill Pogoplug Service and Download uBoot Flashing Utilities
    • Download and Flash New uBoot
    • Download and Flash Default uBoot Environment Parameters
    • Update uBoot Environment Parameters
  3. Setup Netconsole (optional but highly recommended)
  4. Boot default Pogoplug OS when USB/SD Card not attached
  5. Debian/ALARM Installation on SD Card (or USB Hard/Flash Drive)

Enable SSH Access to Pogoplug

There are two methods to enable SSH on your Pogoplug.

1) Official Method - Activate on my.pogoplug.com and then enable SSH

2) Backdoor Method (credit to GTVHacker.com)

Make sure your Pogoplug is connected to your network and has internet access.

Check your router or use a  network scanning tool (iNet Network Scanner on iPhone) to determine the IP Address of the Pogoplug. 

From a Linux computer (e.g. another Pogoplug running Debian/Alarm) run the below curl command.

curl -k "https://root:ceadmin@[PogoplugIPAddress]/sqdiag/HBPlug?action=command&command=dropbear%20start";

If the above curl command doesn't work, your Pogoplug may need to be updated. Leave it plugged in for a hour or two and then try the command again.

Note that the backdoor method is not persistent (SSH access not available after a reboot).


SSH/Putty into Pogoplug V4 and Perform Installation

Use Putty or your favorite SSH client to connect to your Pogoplug.

If you used the "Official Method" for activating and enabling SSH on your Pogoplug, then the username will be "root" and the password will be whatever you set (note that it's not the same password used to log into my.pogoplug.com).

For the "Backdoor Method", the username and password is root/ceadmin.

From here, everything is done via the SSH console. Here is a complete console installation log. Open it up and compare with what you're seeing on your ssh console screen as you're going through the tutorial.

Kill Pogoplug Service and Download uBoot Flashing Utilities

#stop my.pogoplug.com service
killall hbwd

#download firmware utilities

cd /tmp
wget http://download.qnology.com/pogoplug/v4/nanddump
wget http://download.qnology.com/pogoplug/v4/nandwrite
wget http://download.qnology.com/pogoplug/v4/flash_erase
wget http://download.qnology.com/pogoplug/v4/fw_printenv
wget http://download.qnology.com/pogoplug/v4/fw_setenv

#make execuable
chmod +x flash_erase fw_printenv fw_setenv nanddump nandwrite

#remount '/' as read/write
#by default the Pogoplug OS (internal flash) is read only
#skip if running from Debian/ALARM
mount -o remount,rw /

#setup fw_env.config
echo "/dev/mtd0 0xc0000 0x20000 0x20000">/etc/fw_env.config


Download and Flash new uBoot

#download uboot and md5
wget http://download.qnology.com/pogoplug/v4/uboot.2014.07-tld-1.pogo_v4.bodhi.tar
wget http://download.qnology.com/pogoplug/v4/uboot.2014.07-tld-1.pogo_v4.bodhi.tar.md5

#check md5sum
md5sum -c uboot.2014.07-tld-1.pogo_v4.bodhi.tar.md5

#extract uboot
tar -xf uboot.2014.07-tld-1.pogo_v4.bodhi.tar


#Erase and flash uboot on mtd0
#BE EXTRA CAREFUL WITH THE NEXT TWO COMMANDS. NO TYPOS! CUT AND PASTE.
/tmp/flash_erase /dev/mtd0 0 4
/tmp/nandwrite /dev/mtd0 /tmp/uboot.2014.07-tld-1.pogo_v4.mtd0.kwb



Download and Flash uBoot Environment Parameters

#download default uboot env settings and md5
wget http://download.qnology.com/pogoplug/v4/uboot.2014.07-tld-1.environment.img.bodhi.tar
wget http://download.qnology.com/pogoplug/v4/uboot.2014.07-tld-1.environment.img.bodhi.tar.md5

#check md5 sum
md5sum -c uboot.2014.07-tld-1.environment.img.bodhi.tar.md5

#extract uboot env settings
tar -xf uboot.2014.07-tld-1.environment.img.bodhi.tar

#Flash default uboot env setting
#BE EXTRA CAREFUL WITH THE NEXT TWO COMMANDS. NO TYPOS! CUT AND PASTE.
/tmp/flash_erase /dev/mtd0 0xc0000 1
/tmp/nandwrite -s 786432 /dev/mtd0 uboot.2014.07-tld-1.environment.img


Update uBoot Environment Parameters

#SET MACADDRESS
/tmp/fw_setenv ethaddr "$(cat /sys/class/net/eth0/address)"

#double check the MAC Address matches with 
#what is on the bottom of your Pogoplug
/tmp/fw_printenv ethaddr

#set archNumber and machid (for LED)
/tmp/fw_setenv arcNumber 3960
/tmp/fw_setenv machid F78

#set rootfs file system type
/tmp/fw_setenv usb_rootfstype ext3

#set to original mtd partition layout
/tmp/fw_setenv mtdparts 'mtdparts=orion_nand:2M(u-boot),3M(uImage),3M(uImage2),8M(failsafe),112M(root)'

#print out all uboot environment parameters
#make sure there are no errors
/tmp/fw_printenv


Setup Netconsole (Optional but highly recommended)

More info here - http://forum.doozan.com/read.php?3,14,14
Just run the below commands if you are not sure.

#Update IP Addresses as needed
/tmp/fw_setenv serverip 192.168.1.100

/tmp/fw_setenv ipaddr 192.168.1.10
/tmp/fw_setenv if_netconsole 'ping $serverip'
/tmp/fw_setenv start_netconsole 'setenv ncip $serverip; setenv bootdelay 10; setenv stdin nc; setenv stdout nc; setenv stderr nc; version;'
/tmp/fw_setenv preboot 'run if_netconsole start_netconsole'


Boot default Pogoplug OS when USB/SD Card not attached

Note that this section only works on a new unmodified Pogoplug. It assumes the command are all executed from within the default Pogoplug OS and not from Arch Linux or Debian.

If you previously installed the uBoot from archlinuxarm.org and/or already running ALARM or Debian, use these instructions instead - Pogoplug v4 - Add option to boot default Pogoplug OS when USB/SD Card is Not Attached.

To boot the default Pogoplug OS, we will need to chain load the original (dockstar) uboot which we'll download and store on the internal flash. The boot order will be USB, MMC/SD, SATA (Series 4 only) and then last, the original uBoot which will then load the default Pogoplug OS.

Don't forget that you'll need to activate the Pogoplug on my.pogoplug.com if you plan on SSHing into the default Pogoplug OS.

#remount '/' as read/write
mount -o remount,rw /

#download original uboot
cd /
wget http://download.doozan.com/uboot/files/uboot/uboot.mtd0.dockstar.original.kwb

#update boot order to include pogoplug OS
/tmp/fw_setenv bootcmd 'run bootcmd_usb; run bootcmd_mmc; run bootcmd_sata; run bootcmd_pogo; reset'

#chain load original uboot
/tmp/fw_setenv bootcmd_pogo 'if ubi part root 2048 && ubifsmount ubi:rootfs && ubifsload 0x800000 uboot.mtd0.dockstar.original.kwb ; then go 0x800200; fi'


Debian/ALARM Installation on SD Card (or USB Hard/Flash Drive)

Insert SD Card or USB Hard/Flash Drive. The commands below are for Debian on a SD Card. However, I've noted the difference for USB Hard/Flash Drive and Arch Linux.

#stop my.pogoplug.com service (just in case)
killall hbwd

#make device node for mmc/sd card
#skip command for usb install
mknod /tmp/mmcblk0 b 179 0

#Partition your SD Card
/sbin/fdisk /tmp/mmcblk0

#OR Partition your USB Flash/Hard Drive
#/sbin/fdisk /dev/sda

# Type in the following commands to erase
# and re-partition SD Card/USB Flash/Hard Drive
#(WARNING - FLASH/HARD DRIVE WILL BE COMPLETELY WIPED):
#
# p # list current partitions
# o # to delete all partitions
# n # new partition
# p # primary partition
# 1 (one) # first partition
# <enter> # default start block
# <enter> # default end block (to use the whole drive)
# If you're using a hard drive, create a small
# 4GB partition instead of using the whole drive,
# leaving the rest for a data partition
# +4G # create a 4GB partition
# w # write new partition to disk

#make device node for partition
#command not needed for USB install
mknod /tmp/mmcblk0p1 b 179 1

#download format utility
cd /tmp
wget http://archlinuxarm.org/os/pogoplug/mke2fs
chmod +x mke2fs

#format newly created partition
#ext3 with "rootfs" as label
/tmp/mke2fs -L rootfs -j /tmp/mmcblk0p1

#OR format USB Flash/Hard Drive
#/tmp/mke2fs -L rootfs -j /dev/sda1

#create mount point
mkdir /tmp/mnt


#mount SD Card
mount /tmp/mmcblk0p1 /tmp/mnt

#OR mount USB Flash/Hard Drive
#mount /dev/sda1 /tmp/mnt

#download Debian rootfs and md5
cd /tmp/mnt
wget http://download.qnology.com/pogoplug/v4/Debian-3.14.0-kirkwood-tld-1-rootfs-bodhi.tar.bz2.md5

#check md5
md5sum -c Debian-3.14.0-kirkwood-tld-1-rootfs-bodhi.tar.bz2.md5

#extract and delete

tar -xjf Debian-3.14.0-kirkwood-tld-1-rootfs-bodhi.tar.bz2
rm Debian-3.14.0-kirkwood-tld-1-rootfs-bodhi.tar.bz2
rm Debian-3.14.0-kirkwood-tld-1-rootfs-bodhi.tar.bz2.md5

#OR For Arch Linux ARM
#cd /tmp/mnt
#wget http://archlinuxarm.org/os/ArchLinuxARM-kirkwood-latest.tar.gz 
#tar -xzvf ArchLinuxARM-kirkwood-latest.tar.gz
#rm ArchLinuxARM-kirkwood-latest.tar.gz

#Make SD Card first boot device (optional)
#Default boot order is USB->MMC/SD->SATA->POGO_OS
/tmp/fw_setenv bootcmd 'run bootcmd_mmc; run bootcmd_usb; run bootcmd_sata; run bootcmd_pogo; reset'

#Sync and reboot, cross your fingers
sync
cd ..
umount /tmp/mnt
/sbin/reboot


At this point, your Pogoplug should boot back up into Debian or Arch Linux ARM. Note that the IP Address of your Pogoplug may have changed. Double check your router for the IP Address assigned to your Pogoplug or use a network scanning tool (iNet Network Scanner on iPhone) to determine the IP Address of the Pogoplug.

For Debian the default username and password is root/root. For Arch Linux ARM (ALARM) the username and password is alarm/alarm.

Initial Debian Setup

#Change password
passwd

#Generate New OpenSSH Keys
rm /etc/ssh/ssh_host*
ssh-keygen -A


#Initial update
apt-get update
apt-get upgrade


#Set hostname to DebianPlug or whatever you like
echo DebianPlug>/etc/hostname

#Set Time Zone
tzselect


Upgrade Debian to 3.18.5 kernel (optional)
Latest kernel and instructions here - http://forum.doozan.com/read.php?2,12096


#backup original kernel files
cd /boot
mkdir backup
mv *3.14* backup
mv uImage backup/uImage3.14
mv uInitrd backup/uInitrd3.14

#download from bodhi's dropbox
wget --no-check-certificate https://www.dropbox.com/s/n7utrgwky1b2rg9/linux-3.18.5-kirkwood-tld-1-bodhi.tar.bz2

#check md5
echo "68c96df62427c69bc7599ff31859b9b4  linux-3.18.5-kirkwood-tld-1-bodhi.tar.bz2" |md5sum -c

#extract
tar -xvjf linux-3.18.5-kirkwood-tld-1-bodhi.tar.bz2
tar -xvf  linux-dtb-3.18.5-kirkwood-tld-1.tar

#install kernel and headers
dpkg -i linux-image-3.18.5-kirkwood-tld-1_1_armel.deb
dpkg -i linux-headers-3.18.5-kirkwood-tld-1_1_armel.deb

#generate new uImage and uInitrd with fdt file. No need to modify uboot env
cp -a zImage-3.18.5-kirkwood-tld-1  zImage.fdt
cat dts/kirkwood-pogoplug_v4.dtb  >> zImage.fdt
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n Linux-3.18.5-kirkwood-tld-1 -d zImage.fdt uImage
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initramfs-3.18.5-kirkwood-tld-1 -d initrd.img-3.18.5-kirkwood-tld-1 uInitrd
rm zImage.fdt


#clean up
rm linux-3.18.5-kirkwood-tld-1-bodhi.tar.bz2
rm linux-dtb-3.18.5-kirkwood-tld-1.tar

#reboot and verify
uname -a



Install SAMBA for a simple NAS (Network Attached Storage) - Debian

Plug in your USB Hard Drive and partition and format the drive as ext3.

mkdir -p /media/usb/share
mount /dev/sda1 /media/usb/share

apt-get install samba
cd /etc/samba
mv smb.conf smb.conf.bak

#download example smb.conf for public share
#no authentication require, everyone has
#read/write access to / (root$) and usb (/media/usb/share)
wget --no-check-certificate https://dl.dropboxusercontent.com/u/42238/pogoplug/debian/smb.conf
/etc/init.d/samba restart


#For automount after reboot use /etc/fstab
echo "/dev/sda1 /media/usb ext3 rw,noatime,nofail 0 0" >> /etc/fstab


Debian Pogoplug Tutorials:

Troubleshooting

On the Series 4, only the top USB port is bootable. The blue USB 3.0 ports on the back of the Series 4 are not bootable.

Not all SD cards and USB flash drive are equal. If you're having issues booting into ALARM or Debian, try using a different SD card or USB flash drive.

Double check that you're SD Card is not in the "locked" (read only) position.

Cannot SSH back into the Pogoplug - double check the IP Address assigned to your Pogoplug. After booting Debian/ALARM, chances are your router will assign the Pogoplug a different IP Address. Check your router or use a network scanning tool to help figure out what IP Address was assigned to your Pogoplug.

Use Netconsole to see what's going on. Hopefully you followed my recommendation and setup netconsole.

Reinstallation - If you need to setup a new SD Card or USB Flash Drive, what you need to do is use a Linux computer or boot a Live Linux CD to partition, format (please make sure to use ext3 and not ext4), download and extract the rootfs to your SD Card or USB Flash Drive. Here is a basic outline of the steps from the ArchLinuxArm.org website. Note for Debian, you'll want to use the link to the tarball in this tutorial.

Note that it's fairly difficult or nearly impossible to truly brick the Pogoplug v4 because it supports UART booting using a serial connection. More info here - http://forum.doozan.com/read.php?3,7852,7852. Use bodhi's kwboot found here.


Miscellaneous Links and Reference

Self Promotion

Three Pogoplugs gave their lives bringing you this tutorial and countless hours. If you would like to show your support for this blog, please check out my AirEnabler or buy me a cup of coffee (link above). Thank you for your support.