OpenPogo (Pogoplug Adventures)
The main reason I want to install NFS server is sharing media with WDTV. I installed transmission in pogoplug for downloading, and the unofficial WDTV firmware has NFS module which is tested fast enough for HD streaming. If I can setup NFS server in pogoplug, I don't need to plug in/out the hard driver to WDTV any more. Thanks for the info, I'll give it a try.

Dear dplaycc, let me know if it works and whether you had to make any changes. It might be interesting if you posted a brief tutorial on connecting WDTV to the Pogoplug.

nmon

nmon is a nifty little system monitor that uses the ncurses library to display its output in your terminal window. I natively compiled version 14e for the Pogoplug. It depends on libncurses.so.5 so you better install ncurses via ipkg.

Here it is: nmon. Put it in /opt/bin and make sure it is executable.

coreutils-uptime problem

I found that coreutils-uptime (and therefore /opt/bin/uptime) does not work correctly. I am referring to coreutils-8.4-1.ipk. Funny thing is that the original /usr/bin/uptime works fine. So simply remove the symbolic link /opt/bin/uptime  or rename it.

Plugbox

Yes, I know about Plugbox. I have it running on one of my Pink Pogoplug v2’s. It’s great, and I can only recommend everybody to give it a try. You do need to reflash your boot loader but that is a minor thing given Jeff Doozan’s excellent work. Archlinux is a wonderful distro and opens up a world of new applications for your plug. I was able to connect one of those cheap MiniDV spy cameras and use it as a webcam. You can easily add USB wireless adapters (I use a zonet 2546) and any other USB device, like a CD/DVD player or a USB audio device.

And it is still possible to revert back to the old my.pogoplug.com functionality by just removing the disk or memory stick that holds the plugbox kernel (/boot/uImage).

I actually installed a native build environment (gcc and friends) and build my own kernel and modules. This turned out to give me support for the Pogoplug’s front side LED and also gave me much better support for my USB wireless adapter (the stock kernel’s module gave me memory allocation problems and occasionally hung the system).

Running an NFS Server

In a previous blog we talked about setting up an nfs mount. This time we do the reverse: we use the Pogoplug as an nfs server so that other hosts can connect to it and mount its file systems across the network. There are many good nfs tutorials on the web. See for instance:

http://nfs.sourceforge.net/nfs-howto/
http://www.linuxconfig.org/HowTo_configure_NFS
http://www.troubleshooters.com/linux/nfs.htm

Please consult those if you run into problems. Here we merely show how to get the necessary software on the plug and how to do a quick configuration to get it running. We shall see that pretty much everything works out of the (ipkg) box.

First you need to install the nfs server:

pogoplug:~# ipkg install nfs-server
Installing nfs-server (2.2beta47-4) to root…
Downloading http://openpogo.com/repo/nfs-server_2.2beta47-4_arm.ipk
Installing portmap (4-5) to root…
Downloading http://openpogo.com/repo/portmap_4-5_arm.ipk
Configuring nfs-server
Configuring portmap
Successfully terminated.

pogoplug:~#

As you can see it depends on what’s called the portmapper. Both portmap  and the nfs-server set up a startup script in /opt/etc/init.d. The portmapper is started as part of the install; the nfs-server is not, because we first need to configure it by supplying a /opt/etc/exports file. To verify that our portmapper is running, we enter the following command on a linux host machine called “turf”, where the Pogoplug is known under the hostname “zonet”:

[geert@turf ~]$ rpcinfo -p zonet
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
[geert@turf ~]$

Now let’s prepare a useful /opt/etc/exports file (use whatever text editor you prefer):

/                    192.168.0.0/255.255.255.0(ro,sync,no_root_squash)
/tmp/.cemnt/mnt_sda1 192.168.0.0/255.255.255.0(rw,sync,no_root_squash)
/tmp/mnt_opt         192.168.0.0/255.255.255.0(rw,sync,no_root_squash)

I learned that /24 cannot be used as an abbreviation for 255.255.255.0.
Also, some options will cause the nfs daemon to abort. Be warned when fiddling with the contents of exports.
Next we start the nfs server daemon:

pogoplug:~# /opt/etc/init.d/S56nfsd

To verify, again (1) issue the rpcinfo command on the remote host, (2) check the running processes on the Pogoplug with ps, and (3) use showmount on the host to list the exported file systems.

[geert@turf ~]$ rpcinfo -p zonet
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100003    2   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100005    1   udp    618  mountd
    100005    2   udp    618  mountd
    100005    1   tcp    621  mountd
    100005    2   tcp    621  mountd
[geert@turf ~]$

pogoplug:~# ps w

18151 1          1856 S   /opt/sbin/portmap
18247 root       2460 S   /opt/sbin/rpc.nfsd -f /opt/etc/exports
18249 root       2424 R   /opt/sbin/rpc.mountd -f /opt/etc/exports
18579 root       3400 R   ps w
pogoplug:~#

[geert@turf ~]$ showmount  -e zonet
Export list for zonet:
/tmp/mnt_opt         192.168.0.0/255.255.255.0
/tmp/.cemnt/mnt_sda1 192.168.0.0/255.255.255.0
/                    192.168.0.0/255.255.255.0
[geert@turf ~]$

That’s all! We are done. Any client machine on the 192.168.0.0 subnet can now mount the exported file systems, using e.g.:

[geert@turf ~]$ sudo mount zonet:/ mnt/pogoplug
[geert@turf ~]$ sudo mount zonet:/tmp/mnt_opt mnt/pogoplug/tmp/mnt_opt

And you unmount them again in the reverse order:

[geert@turf ~]$ sudo umount zonet:/tmp/mnt_opt
[geert@turf ~]$ sudo umount zonet:/

I prefer to use the automounter that mounts the file systems under  /net/zonet in my case.

PS. I encountered some strange behavior with respect to the /tmp/.cemnt/mnt_sda1 export. It would mount all right, but cd into the mountpoint would never show any files. I resolved the problem by creating a different mountpoint for /dev/sda1 on the Pogoplug. What I did was:

pogoplug:~# mount -o rw,remount /
pogoplug:~# mkdir /mnt/disk
pogoplug:~# mount -o ro,remount /
pogoplug:~# mount /dev/sda1 /mnt/disk

Of course I updated /opt/etc/exports to reflect the change:

#/tmp/.cemnt/mnt_sda1 192.168.0.0/255.255.255.0(rw,sync,no_root_squash)
/mnt/disk             192.168.0.0/255.255.255.0(rw,sync,no_root_squash)

and restarted the nfs daemon:

pogoplug:~# /opt/etc/init.d/S56nfsd

Now mounting zonet:/mnt/disk on a client works fine.
If anyone figures out what went wrong with /tmp/.cemnt/mnt_sda1 let me know.

Hi, I'm planning to install NFS server into my pogoplug so I can use it as my media center to share with other computers and also WDTV. Could you please send me the instruction on how to configure it?

Many thanks.

Dear dplaycc,

I am curious to learn how you think to go about installing an nfs server? There is no kernel module for it, and ipkg does not list (a good) one. Anyway, assuming that you have the necessary daemons running (portmap, nfsd, etc.) then all you need to do is export some directories. Here is a good source on how to do all that: http://nfs.sourceforge.net/nfs-howto/ar01s03.html

Good luck!

Wireless Adapter

The official wireless adapter of the Pogoplug looks like a nice white USB stick. Once initialized, you will notice that it uses the kernel module called rt3070sta.ko. This hints at a device manufactured by Ralink. This company provides excellent Linux support and it should be easy for anybody to build this driver from source.

Knowing the chipset of the wireless adapter, also means that we can look for alternatives. I found a cheap ($8 when on sale) Zonet ZEW2545 USB Wireless adapter which has USB ID 148f:3070 “Ralink Technology, Corp. RT2870 Wireless Adapter”, hence a chipset similar to the Pogoplug wireless device. I tried it and indeed it works well!

If you need to activate it by hand, use:

# /sbin/udhcpc -i ra0 -R -b -p /var/udhcpc_ra0.pid

I am curious to learn of other (cheap) wireless adapters that work with the Pogoplug.

Using scp and ssh from the Pogoplug

A standard Pogoplug will have dropbear installed. This is the stripped-down version of [open]sshd, the secure shell daemon. Unfortunately, the ssh client is not provided, but scp is. However, whenever you try to use scp from /usr/bin it will tell you that /usr/bin/dbclient is missing. Also, there is no ssh program. All this is easily remedied by ipkg install openssh. If you want to go for a simpler solution, then pick up this dbclient program and put it in /usr/bin. Don’t forget to first make / writable with mount -o rw,remount /.

You might as well then create the symbolic link for ssh in /usr/bin:

ln -s dbclient ssh.

Now you have scp and ssh capabilities without the need of full /opt support.

By the way, if you want to use scp from another machine into the pogoplug, or you’d like to sshfs-mount the Pogoplug filesystem, then you need an sftp-server. This program is available as part of openssh and there’s an ipk package for it; simply follow these steps:

# ipkg install openssh-sftp-server
# mount -o rw,remount /
# mkdir /usr/libexec
# cp /opt/libexec/sftp-server /usr/libexec/
(Check that the file is executable for all, chmod a+x sftp-server)
# mount -o ro,remount /

Update on 1/4/2011: scp might not work for a regular user; it’s fine for root. This is due to wrong permissions of /dev/tty. Try chmod go+rw /dev/tty (after remounting / writable, of course). Also, dbclient might complain about missing libz.so. That was my mistake; I uploaded a fresh dbclient.

SSHFS

I think networking is the greatest invention in computers.
Having machines talk to each other lies at the heart of the success of the Internet. The plug already does a good job: it supports several communication protocols right out of the box. But what I find missing is the ability to securely mount a file system of another machine on a directory of the Pogoplug. I am talking about sshfs. This wonderful and simple program makes any remote directory appear as a local directory. Moreover you don’t have to be root to do the mount. I use sshfs to access a NAS device that I have set up with family in France. Once the mount is up, I can use all the usual file system commands to copy, move and delete files and directories on the remote machine. Note that the communication of data goes through an ssh tunnel; this means that it is encrypted. The access to the remote host is authenticated with your password of the account you have on the remote host. It is even possible to create a ssh key pair and use that instead of a password.

Unfortunately there is no optware ipkg package for sshfs. So how did I get it? I decided to build it natively. This means you need a compiler and related software on your plug. Too much work you say? Well, the good thing is that now that I have the binary files I can share them with you. I started with installing the full optware development package optware-devel. This takes about 250MB of storage in your /opt area. I got an error half way through when a new version of wget got installed (wget-ssl). The new wget requires the library libidn which is not present and for some reason not automatically loaded as a dependency. Since wget is used by ipkg to do the downloading, the install of optware-devel grinds to a halt. Now what? I simply renamed /opt/bin/wget and resorted to the true and trusted /usr/bin/wget of busybox. Restarting the optware-devel caused it to run to completion without anymore hickups. (To be able to use /opt/bin/wget I installed libidn also.)

Now we have a complete C/C++ software development system ready on the Pogoplug. We have make and compilers, a linker, a library archiver, etc.
sshfs needs libfuse, so let’s first build that.
I downloaded the fuse-2.8.5.tar.gz source code and did the following:
(Google where you can find it and use wget to download.)

# mkdir /opt/src
# mv fuse-2.8.5.tar.gz /opt/src
# cd /opt/src
# tar xvzf fuse-2.8.5.tar.gz
# cd fuse-2.8.5
# ./configure —prefix=/opt
# make
# mount -o rw,remount /
# make install
# mount -o ro,remount /

fuse wants to install some files in the usually read-only root file system, hence the remounts.

sshfs also needs glib. Let’s install it:
# ipkg install glib

I downloaded the source package sshfs-fuse-2.2.tar.gz and build that in the same way as fuse:

# mv sshfs-fuse-2.2.tar.gz /opt/src
# cd /opt/src
# tar xvzf sshfs-fuse-2.2.tar.gz
# cd sshfs-fuse-2.2
# ./configure —prefix=/opt
# make
# make install

And that’s all. Type sshfs and see if it runs. It should do this:

# sshfs
missing host
see `sshfs -h’ for usage

If you have man installed, you can read the manual page with man sshfs. Now for the ultimate test. Make sure you have a host machine that runs a sshd daemon and also has sftp-server installed (standard on most Linux distros). Assume that host has ip address 192.168.1.5 and has hostname nslu2 and  that your account has name geert and password “password”. First create a mountpoint on the Pogoplug, for instance:

# cd /tmp
# mkdir nslu2

To mount your home directory on the nslu2 you would do:

# sshfs geert@192.168.1.5: nslu2
geert@192.168.1.5’s password: password
# cd nslu2
# ls

The last ls should now show you all your files in your home directory on nslu2. To unmount, use the command:

# fusermount -u /tmp/nslu2

I have bundled up all necessary binary files using the command:

tar cvzf /tmp/sshfs-2.2-pogo.tar.gz \
/opt/bin/sshfs \
/opt/share/man/man1/sshfs.1 \
/opt/bin/fusermount \
/opt/lib/libfuse.so.2.8.5 \
/opt/lib/libfuse.so.2 \
/opt/lib/libfuse.so \
/opt/lib/libgthread-2.0.so.0.2000.4 \
/opt/lib/libgthread-2.0.so.0 \
/opt/lib/libgthread-2.0.so \
/opt/lib/libglib-2.0.so.0.2000.4 \
/opt/lib/libglib-2.0.so.0 \
/opt/lib/libglib-2.0.so

You can find the tar file here

Power supply trouble

I am so happy with my Pogoplug that I bought a second one. After powering up I noticed a faint “electronics” smell, as if some plastic was getting hot. Still the device felt mildly warm to the touch and it was working properly. Putting my ear close to the plug I heard a faint buzzing sound, but only when a 2.5” USB external disk was attached. Clearly drawing some current (>500mA) had some effect on the power supply.

This lasted until one evening when it simply went dead: no lights, no whirring attached USB disk. Darn! Luckily I had experience opening up the plug and separating the power supply. A visual inspection showed no signs of burn. Wiggling some of the components I noticed that one of the 2 big capacitors was a bit loose; indeed one of its leads was no longer soldered to the underside of the board. I scratched some of the “paint” of the board to reveal copper and applied some solder to the lead. That was all. The power supply is back up again and this time it’s not making any noises and I believe the smell has receded as well.