ADUFRAY

I recently set up Marco Arment’s Second Crack blogging platform on my RHEL 6 server. I had been using Wordpress for awhile, but got frustrated with its dynamic rendering strategy. I want a blogging engine that scales easily and plays nicely with nginx, not something that has to parse code and query databases just to get the content. Here’s how I did it.

Firstly, per Marco’s advice, I installed both the command-line interface to Dropbox and the inotifytools package from the EPEL repo. This allows me to write and edit blog posts from anywhere I have access to Dropbox and have my changes applied instantly. It’s really amazing to be able to edit blog posts in plaintext using Markdown syntax from my iPad mini. I cannot understate this.

I’m very minimalist when it comes to installing packages on my server. I generally start with the absolute Minimal distribution and only install packages as needed. There is no reason for a webserver to have Xorg, after all. This methodology presented a problem with Dropbox at first. The Dropbox for Linux page only lists packages for Ubuntu and Fedora (with an option to build from source). These packages, however, are for the desktop interface of Dropbox — which is not needed. Instead, I found a link to a simple dropbox.py utility which keeps everything in sync and only requires Python 2.6. Best of all, the installer and corresponding daemon run as an unprivileged user. Simply download the script and run the install command:

$ python dropbox.py start -i

After it finishes the download and install, it should prompt you to visit a URL to link the system to your Dropbox account. The installer will download the necessary libraries and runtime data into ~/.dropbox-dist/ and put the configuration stuff into ~/.dropbox/. By default it will create ~/Dropbox/ to hold the items you want synced. The only caveat to the Dropbox install is that the process will need to be relaunched after each reboot: python ~/dropbox.py start

Installing Second Crack is basically as straight-forward as he lays it out in the included README.md. Just pull down the repository, make the changes to the configuration file (blog name, URL, etc.), configure the crontab, and start designing your template (that’s where I spent the vast amount of my time).

By default, Second Crack will install a simple .htaccess file to perform the slug line URL redirects. Unfortunately, .htaccess files don’t translate directly to nginx, but in this case the needed configuration is incredibly easy:

index index.html
location ~ ^/blog/. {
    default_type text/html;
    try_files $uri $uri.html;
}

To stop Second Crack from automatically reinstalling the .htaccess file, simply comment out the line in {SECOND_CRACK}/engine/Updater.php, line 438 — but it really doesn’t matter:

//if (! file_exists(self::$dest_path . '/.htaccess')) copy(dirname(__FILE__) . '/default.htaccess', self::$dest_path . '/.htaccess'); 

If you’ve more or less followed along, you should be pretty much good-to-go. For going mobile, I literally searched the App Store for “text editor dropbox” and bought the first one: PlainText by Hog Bay Software. There are several things I absolutely love about this app:

Happy blogging!

Setup

The process is fairly straight forward, but there are some requirements:

  1. A TFTP server with some specific files. These should all be in the root of the TFTP directory.
    1. The latest version of the SheevaPlug U-Boot binary.
    2. The latest version of the Debian installer image (uImage and uInitrd).
    3. The latest version of the Linux kernel (optimized for SheevaPlug; uImage and Modules).
  2. A 2+ GB USB thumb drive.
  3. Terminal emulation software (GNU screen, PuTTY, minicom, HyperTerm) [Note: Mac OS X’s version of screen seems to have issues with the debian installer, so I used PuTTY in a VM.]

There’s a lot of interrupting the initial boot process, which requires fairly fast attachment of your terminal. If you’re using a VM environment, make sure you tell it to remember your “Attach to Host or VM?” preference, otherwise you’ll miss the interrupt prompt.

Upgrade U-Boot

  1. Reset the SheevaPlug
  2. Interrupt the boot process

    1. “Hit any key to stop autoboot:”
  3. Document the MAC address

    Marvell>> print ethaddr
    ethaddr=FF:FF:FF:FF:FF:FF
    
  4. Boot using TFTP

    Marvell>> setenv ipaddr x.x.x.x
    Marvell>> setenv serverip y.y.y.y
    Marvell>> tftpboot 0x0800000 u-boot.kwb
    Marvell>> nand erase 0x0 0x60000
    Marvell>> nand write 0x0800000 0x0 0x60000
    Marvell>> reset
    
  5. Fix the MAC address by interrupting the boot process (the new U-Boot loses the setting).

    Marvell>> setenv ethaddr FF:FF:FF:FF:FF:FF
    Marvell>> saveenv
    Marvell>> reset
    

Burn the new kernel

Marvell>> setenv ipaddr x.x.x.x
Marvell>> setenv serverip y.y.y.y
Marvell>> tftpboot 0x2000000 sheeva-3.4.7-uImage
Marvell>> iminfo
Marvell>> nand erase 0x100000 0x400000
Marvell>> nand write 0x2000000 0x100000 0x400000
Marvell>> setenv mainlineLinux yes
Marvell>> setenv arcNumber 2097
Marvell>> saveenv

Install Debian

For this section, I recommend using PuTTy on a Windows VM. Or at least something other than GNU Screen on Mac OS X. It doesn’t play nice with the Debian installer character set for some reason. You can try using SynchTERM on Mac OS X, but it still isn’t quite right and it becomes very easy to check the wrong boxes.

Marvell>> setenv ipaddr x.x.x.x
Marvell>> setenv serverip y.y.y.y
Marvell>> tftpboot 0x0400000 uImage
Marvell>> tftpboot 0x0800000 uInitrd
Marvell>> setenv bootargs console=ttyS0,115200 base-installer/initramfs-tools/driver-policy=most
Marvell>> bootm 0x0400000 0x0800000

Once in the installer, answer the defaults to all the questions, set a root password, etc. When you get to the disk partitioning, it should not detect any disks and will ask to configure iSCSI.

  1. Plug in a USB pen drive
  2. Use [TAB] to select Go Back
  3. Select “Disk Partitioning” again
  4. The USB drive is now detected
  5. Use default partitioning (everything in /)
  6. Be careful selecting packages. I only select the SSH server and NOT Standard System Utilities — otherwise you’ll fill the SheevaPlug
  7. Once finished, interrupt boot process and boot from USB:

    Marvell>> setenv bootargs_console console=ttyS0,115200
    Marvell>> setenv bootcmd_usb 'usb start; ext2load usb 0:1 0x0800000 /uInitrd; ext2load usb 0:1 0x400000 /uImage'
    Marvell>> setenv bootcmd 'setenv bootargs $(bootargs\_console); run bootcmd\_usb; bootm 0x400000 0x0800000'
    Marvell>> boot
    
  8. Set up UBIFS (so much faster than JFFS2; 2+ minute boot down to 20 seconds)

    # apt-get install mtd-utils
    # ubiformat /dev/mtd2 -s 512
    # ubiattach /dev/ubi_ctrl -m 2
    # ubimkvol /dev/ubi0 -N rootfs -m
    # mount -t ubifs ubi0:rootfs /mnt
    
  9. Clone the USB root to the internal flash (UBIFS)

    # mkdir /tmp/rootfs
    # mount -o bind / /tmp/rootfs/
    # cd /tmp/rootfs
    # sync
    # cp -a . /mnt/
    
  10. Fix the /mnt/etc/fstab file

    # cat << END > /mnt/etc/fstab
    /dev/root / ubifs defaults,noatime,rw 0 0
    tmpfs /var/run tmpfs size=1M,rw,nosuid,mode=0755 0 0
    tmpfs /var/lock tmpfs size=1M,rw,noexec,nosuid,nodev,mode=1777 0 0
    tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0
    END
    
  11. Reboot — interrupt boot cycle, unplug USB

  12. Reconfigure the boot command

    Marvell>> setenv bootargs 'console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs'
    Marvell>> saveenv
    Marvell>> reset
    
  13. Install some packages

    # apt-get install sudo
    

Resources: