ARM Board Notes and Experiences

Raspberry Pi

I originally got into Raspberry Pi to set up a Docker cluster environment — mainly because they were cheap and power-efficient. Bought 3 Raspberry Pi 2 boards for around 600+ yuan. Back then, running Docker on ARM was still a novel concept.

I used Raspberry Pi to build a Docker cluster environment, following the Hypriot blog.

CubieBoard

Getting Docker running on ARM was a major challenge back then — official support was poor, community documentation was sparse, and it required a lot of trial and error.

  • Installing Docker

    • Option: Hypriot (as of March 2017, version docker 1.11.1). Suitable for users who want to quickly get started with Docker on ARM, with relatively complete documentation.

      shell
      1
      
      $ apt-get install -y apt-transport-https
      • Add repository key
      shell
      1
      
      $ wget -q https://packagecloud.io/gpg.key -O - | sudo apt-key add -
      • Add repository
      shell
      1
      2
      
      $ echo 'deb https://packagecloud.io/Hypriot/Schatzkiste/debian/ jessie main' | sudo tee /etc/apt/sources.list.d/hypriot.list
      $ apt-get update
      • Install Hypriot
      shell
      1
      2
      
      $ apt-get install -y docker-hypriot
      $ systemctl enable docker
    • Option: Dockerproject (follows official updates, as of March 2017, version 17.03-ce). Suitable for users who need the latest Docker features and long-term maintenance.

      shell
      1
      2
      
      $ sudo apt-get update
      $ sudo apt-get install apt-transport-https ca-certificates
      • Add repository
      shell
      1
      
      $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

      Use the following command to add the APT source to source.list (replace <REPO> with the corresponding value from “Table 1: dockerproject mapping” below):

      shell
      1
      
      $ echo "<REPO>" | sudo tee /etc/apt/sources.list.d/docker.list
      • Install Docker-Engine
      shell
      1
      2
      
      $ apt-get update
      $ apt-get install -y docker-engine
  • Cubietruck (OS: armbian) Issues and Notes

    • External hard drive hanging issue and resolution: Reference: Arch hdparm

      Values 1-127 permit spin-down, 128-254 do not and 255 disables advanced power management altogether (if the drive supports it).

      Values 1 to 240 are in 5 second steps, values 241 to 251 are steps of 30 minutes,

      see the table below.

      Resolution:

      shell
      1
      
      # hdparm -B 127 /dev/sdx
    • Firewall/GFW bypass Used PogoPlug’s shadowsocks as an SS5 proxy, and used tsocks tool to update software.

    • Building Gogs with Docker: Used PogoPlug’s Dockerfile and build.sh from the official Git repository, adding proxy settings for deployment

      shell
      1
      2
      
      export http_proxy=http://192.168.208.88:8118
      export https_proxy=http://192.168.208.88:8118

      Modify the Dockerfile as follows:

      dockerfile
      1
      2
      3
      4
      5
      6
      
      RUN export http_proxy=http://192.168.208.88:8118 \
       && export https_proxy=http://192.168.208.88:8118 \
       && apk --no-cache --no-progress add curl \
       && curl -x 192.168.208.88:8118 -L https://github.com/tianon/gosu/releases/download/1.9/gosu-armhf -o /usr/sbin/gosu \
       && chmod +x /usr/sbin/gosu \
       && apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 openssh socat tzdata

PogoPlug

PogoPlug was actually a NAS box that was quite popular back in the day. It got phased out for various reasons, so I repurposed it as a proxy server — which is probably the origin of the “broken dog” nickname.

  • Install OpenWrt, deploy shadowsocks to provide SS5 proxy service

    • Open Luci, navigate to “System” - “Software” - “Configuration” tab, then comment out the following line in settings:
    shell
    1
    
    #option check_signature 1
    • Then add the software sources at the end:
    shell
    1
    2
    
    src/gz openwrt_dist http://openwrt-dist.sourceforge.net/packages/OpenWrt/base/oxnas
    src/gz openwrt_dist_luci http://openwrt-dist.sourceforge.net/packages/OpenWrt/luci
    • Update sources and install shadowsocks
  • Provide NFS service This was mainly for sharing files with other devices at home, such as mounting shared storage for the Raspberry Pi cluster.

Orange Pi

  • Orange Pi Zero (OS: armbian) Issues and Notes:

    • Used with the OrangePiNAS board, mainly for building a small home NAS to store documents and media files.

  • Orange Pi One (OS: dietpi) Issues and Notes:

    • Default en_GB locale causes frequent errors. Changed to zh_CN. The specific symptom was garbled text in some command-line tools and system logs.

Nano Pi

  • Nano Pi Neo (OS: armbian) Issues and Notes: The standout feature of the Nano Pi Neo is its incredibly small size — about thumb-sized — making it suitable for embedding into other devices.

  • Nano Pi M3 (OS: Kali Linux) Issues and Notes:

    • Kali Linux provides official image downloads: Kali Linux ARM Images Download

    • Expand SD card: Kali images don’t automatically utilize the remaining SD card space, so manual expansion is required.

      • Check the starting sector of the second partition, needed later
      shell
      1
      
      cat /sys/block/mmcblk0/mmcblk0p2/start
      • Launch fdisk disk management tool
      shell
      1
      
      fdisk /dev/mmcblk0
      • Delete partition
      shell
      1
      
      Command (m for help): d
      • Delete the second partition
      shell
      1
      
      Partition number (1,2, default 2): 2
      • Create a new partition
      shell
      1
      
      Command (m for help): n
      • Create primary partition
      shell
      1
      2
      3
      4
      
      Partition type
       p   primary (1 primary, 0 extended, 3 free)
       e   extended (container for logical partitions)
      Select (default p): p
      • Select partition 2
      shell
      1
      
      Partition number (2-4, default 2): 2
      • Enter the starting sector of the second partition
      shell
      1
      
      First sector (125001-31116287, default 126976): 125001
      • Enter the last sector, press Enter directly to use all remaining space

      • Write the partition table

      shell
      1
      
      Command (m for help): w
      • After rebooting, run the following command, otherwise the capacity will remain unchanged — resize the partition
      shell
      1
      
      resize2fs /dev/mmcblk0p2
      • Expansion complete. Use df -lh to verify the capacity has been expanded to the full available physical capacity of the SD card.

Appendix:

Table 1: dockerproject mapping

OS VersionREPO
Precise 12.04 (LTS)deb https://apt.dockerproject.org/repo ubuntu-precise main
Trusty 14.04 (LTS)deb https://apt.dockerproject.org/repo ubuntu-trusty main
Xenial 16.06 (LTS)deb https://apt.dockerproject.org/repo ubuntu-xenial main
Debian 7 Wheezydeb https://apt.dockerproject.org/repo debian-wheezy main
Debian 8 Jessiedeb https://apt.dockerproject.org/repo debian-jessie main
Debian Stretch/Siddeb https://apt.dockerproject.org/repo debian-stretch main