NSLU2-Linux
view · edit · print · history

This article pertains to:


This article demonstrates the steps involved in installing and configuring a basic SlugOS system.

Prerequisites

  • A functional NSLU2
  • A working flash memory stick, or powered external disk drive
  • A suitable system from which you can install the firmware, and login to the NSLU2 using an appropriate SSH client.
  • A functional internet connection, for package feeds

Prepare the NSLU2

Before you begin, note the existing network settings for the NSLU2. SlugOS will attempt to preserve as many of those settings as possible. If you are currently running Linksys firmware, or Unslung firmware, that would include the network settings. If you are currently running an older SlugOS release, that set of preserved settings may include the root password as well.

For this example, we will be installing from an Unslung version. In order to avoid the "I lost my Slug!" syndrome (where your NSLU2 appears to boot up without error, but you cannot connect to it on the network), we have assigned a fixed IP address to the NSLU2, and we've also ensured that we have the correct DNS servers, and gateway configured in the Linksys Admin Web GUI.

Flash the Firmware

Begin by following the standard procedure to flash SlugOS 5.3-beta.

Remove all USB devices connected to the NSLU2, and plug it into a wired network.

Use the reset-button method to enter upgrade mode (see UseTheResetButtonToEnterUpgradeMode), then use your favorite tool on the host system to download and install the firmware (see UpSlug2 or SercommFirmwareUpdater).

Note: the examples in this article will use the big-endian ("BE") firmware images, but the process is the same with the little-endian ("LE") images.

When your firmware flash is complete, the NSLU2 will reboot automatically, you'll see the LEDs blinking and flashing, and finally you'll hear three beeps (actually the letter "K" in Morse code, a common abbreviation for "Ok"), which announce that the device has completed the boot process.

Initial Login

At this point, our slug is running SlugOS 5.3-beta. Of course, it's not particularly useful unless we can talk to it. So the first thing to do is to gain access to be able to login and begin setting it up.

Start by making sure you can see it on the network: use the "ping" command on your host computer to make sure the NSLU2 is answering on the network. If you don't get a response, you'll have to begin troubleshooting to figure out what IP address your NSLU2 is using on the network (which is why it's not a bad idea to start with a functioning Unslung or Linksys firmware image where you have assigned a fixed IP address using the Linksys Web GUI.)

If you can ping it, the next step is to login using your ssh client. (If you're using a linux host, that would be the "ssh" command; if you are on Windows, I'd recommend the PuTTY client (google will help you find and download it)). When you connect, you'll be prompted to enter the login id and password -- the login id is "root", and the password is either "opeNSLUg", or it is whatever password you had set on the previous installation of firmware (SlugOS will attempt to preserve the password if it can). In the terminal session below, bold text indicates user input (note that the password is not normally echoed to the screen):

login as: root
root@192.168.1.77's password: opeNSLUg
Host name:           frankenslug
Domain name:         LOST
Host MAC:
Network boot method: static
Host IP address:     192.168.1.77
Use 'turnup init' to reset the configuration
Use 'turnup preserve' to save the configuration permanently
Use 'turnup restore' to restore a previously saved configuration
Use 'turnup disk|nfs -i <device> options to initialise a non-flash root
Use 'turnup help' for more information
root@frankenslug:~#

Network Setup

The first thing to do is to finish the network setup. The "turnup init" command is intended to step us through gathering and setting the appropriate configuration information, and is much easier than editing all the Linux config files manually (although, if you wish, you may do that manually as well).

Network Setup: Static IP

In this case (below), the only thing that I needed to change was the domain name (which was set to the Windows domain name by the Linksys firmware originally, and my Windows domain is not the same as the domain I want for the NSLU2. The rest of the settings from the Linksys firmware are fine.

root@frankenslug:~# turnup init
Please enter a new password for 'root'.
The password must be non-empty for ssh login to succeed!
Changing password for root
Enter the new password (minimum of 5, maximum of 8 characters)
Please use a combination of upper and lower case letters and numbers.
Enter new password: t$d9Pz!s
Re-enter new password: t$d9Pz!s
Password changed.
Host name [frankenslug]: 
Domain name [LOST]: mwester.net
Boot protocol (dhcp|static) [static]: 
IP address [192.168.1.77]:
IP netmask [255.255.255.0]:
IP gateway [192.168.1.1]:
First DNS server [192.168.1.1]:
Second DNS server []:
Third DNS server []:
turnup init: you must reboot for the changes to take effect
 You may want to run 'turnup preserve' to save these settings,
 after making any additional configuration changes which you
 require.
root@frankenslug:~#

Network Setup: Dynamic (DHCP)

A dynamic or DHCP network setup works very nicely as well; the difference is that the NSLU2 must query the network, and wait for a response from a DHCP server in order to get its network configuration. If you have such a DHCP server on your network (many home routers or firewalls will provide this service automatically), you can choose to use this -- it's much easier.

The only problem is a "chicken and egg" problem -- in order to figure out what IP address the NSLU2 was given when it booted, you need to be able to connect to it -- which requires that you know the IP address it was given when it booted! This is the reason why a static IP address is recommended, in general.

However, if your router or DHCP server can tell you what IP address it assigned to the NSLU2, then the problem is neatly solved, and you can feel free to use a dynamic network configuration. Here's the output of a dynamic configuration. In this case, few of the network settings needed to be set, as the information is expected to be provided by the DHCP server:

root@frankenslug:~# turnup init
Please enter a new password for 'root'.
The password must be non-empty for ssh login to succeed!
Changing password for root
Enter the new password (minimum of 5, maximum of 8 characters)
Please use a combination of upper and lower case letters and numbers.
Enter new password: t$d9Pz!s
Re-enter new password: t$d9Pz!s
Password changed.
Host name [frankenslug]: 
Domain name [LOST]: mwester.net
Boot protocol (dhcp|static) [dhcp]: 
turnup init: you must reboot for the changes to take effect
 You may want to run 'turnup preserve' to save these settings,
 after making any additional configuration changes which you
 require.
root@frankenslug:~#

Looking Around

Let's take a peek at what we have.

Storage

First, the df command will tell us about the storage space we have on the device:

root@frankenslug:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 6400      5456       944  85% /
/dev/root                 6400      5456       944  85% /dev/.static/dev
udev                      2048        28      2020   1% /dev
tmpfs                    15120        20     15100   0% /var/volatile
tmpfs                    15120         0     15120   0% /dev/shm
root@frankenslug:~#

We have a total of about 6.4 MBytes of space we can use (that's small!), with less than 1 MByte of it available to use. You probably should know that the flash filesystem is a bit different from a normal disk device or memory stick -- specifically, the way erase blocks work makes it possible for a filesystem to actually get too full for you to be able to delete files! This means that unless you are very careful, it is extremely unwise to try to do much with the system in this state. We need to add more storage -- we'll "turnup" to the external flash memory stick, or disk drive shortly -- once we've done that, we'll have plenty of space.

The "/var/volatile" entry is notable -- this is a very fast, but very small (and expensive) storage area. Many of the directories in /var, as well as the /tmp directory will be redirected (by use of symbolic links) to this in-memory filesystem. You need to be aware that anything you place in /tmp or in /var/tmp will actually be stored in the NSLU2's memory -- which is blazingly fast for a filesystem, but it comes out of the already-small memory the device has to begin with. Use that space with caution!

Kernel Messages

Important (and some not-so-important) information is logged to the system console by the Linux kernel. Since the NSLU2 doesn't have a console, we normally can't read these. Use the "dmesg" command to dump out the stored contents of this log. The command below uses the "dmesg" command and the "tail" command to print only the last 10 lines of that kernel message log:

root@frankenslug:~# dmesg | tail -10
ohci_hcd 0000:00:01.1: OHCI Host Controller
ohci_hcd 0000:00:01.1: new USB bus registered, assigned bus number 3
ohci_hcd 0000:00:01.1: irq 27, io mem 0x48001000
usb usb3: configuration #1 chosen from 1 choice
hub 3-0:1.0: USB hub found
hub 3-0:1.0: 2 ports detected
firmware: requesting NPE-B
NPE-B: firmware functionality 0x0, revision 0x2:1
eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0xC1E1
root@frankenslug:~#

Preparing the External Storage

The examples below show the use of a 1 GByte USB memory stick; you can use an external powered disk drive just as well. Start by partitioning and formatting the memory stick or disk as a normal Windows `FAT or FAT32 disk -- and it's worth copying some data onto it a few times, just to make sure that it appears to work ok.

Now plug that memory stick into the USB port on the NSLU2 -- it doesn't matter which one (there is no distinction between the USB ports on SlugOS or any modern Linux kernel). Note that the DISK 1 and DISK 2 LEDs will not blink or illuminate -- for reasons far too complex to go into here, it's not a simple thing to make it work that way with modern Linux kernels. You might see the `LED on your memory stick or disk drive blink a few times, however.

Use the "dmesg" command to see how the Linux kernel responded to the device appearing in the USB port:

root@frankenslug:~# dmesg | tail -20
eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0xC1E1
usb 1-2: new high speed USB device using ehci_hcd and address 2
usb 1-2: configuration #1 chosen from 1 choice
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 2
usb-storage: waiting for device to settle before scanning
scsi 0:0:0:0: Direct-Access LEXAR JUMPDRIVE SECURE 3000 PQ: 0 ANSI: 0 CCS
sd 0:0:0:0: [sda] 1981440 512-byte hardware sectors (1014 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 43 00 00 00
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] 1981440 512-byte hardware sectors (1014 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 43 00 00 00
sd 0:0:0:0: [sda] Assuming drive cache: write through
 sda: sda1
sd 0:0:0:0: [sda] Attached SCSI removable disk
usb-storage: device scan complete
FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem
will be case sensitive!
root@frankenslug:~#

The log shows us that the device was indeed detected and identified correctly, it was assigned the device name of "sda" (SCSI Disk "a"), it has a single partition ("sda1"), and a FAT-formatted filesystem was automatically detected on that partition.

Use the "df" command:

root@frankenslug:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 6400      5460       940  85% /
/dev/root                 6400      5460       940  85% /dev/.static/dev
udev                      2048        36      2012   2% /dev
tmpfs                    15120        20     15100   0% /var/volatile
tmpfs                    15120         0     15120   0% /dev/shm
/dev/sda1               990416         0    990416   0% /media/sda1
root@frankenslug:~#

Note the appearance of /dev/sda1 in the list -- the new storage (990 MBytes, after formatting) is available to us in the /media/sda1 directory.

Now, that's a good thing -- if all we wanted to do was to read or write some data to or from that memory stick. But in fact, we want to use it to boot from, so that we have space to install additional software. We can't do that if it's mounted in /media, and we can't do that if it's a FAT or an NTFS filesystem, so we need to make a few changes.

Writing the New Filesystem

We need to write a clean Linux ext3-format filesystem on the external storage. The first thing to do, then, is to unmount (disconnect) the existing FAT or NTFS filesystem from /media/sda1. Use the "umount" (note that the command is "umount", not "unmount"!). Then use the "df" command once again to confirm that we are back to the original set of filesystems we had when we first booted, with no external storage at all:

root@frankenslug:~# umount /media/sda1
root@frankenslug:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 6400      5460       940  85% /
/dev/root                 6400      5460       940  85% /dev/.static/dev
udev                      2048        36      2012   2% /dev
tmpfs                    15120        20     15100   0% /var/volatile
tmpfs                    15120         0     15120   0% /dev/shm
root@frankenslug:~#

Now we are ready to write a new filesystem on the external storage. This will erase all data on the external storage device specified - use caution! The specific numbers will vary based on each device; they are automatically computed based on the nature and size of the external storage device you have:

root@frankenslug:~# mkfs.ext3 /dev/sda1
mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
123904 inodes, 247672 blocks
12383 blocks (5.00%) reserved for the super user
First data block=0
8 block groups
32768 blocks per group, 32768 fragments per group
15488 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
root@frankenslug:~#

Copying and Switching to the External Storage (Turnup)

Now we have our external storage device ready to use. We just need to copy all the data that's currently on the internal flash memory inside the NSLU2 over to the newly-prepared external storage, and instruct the NSLU2 to switch over to using that external storage. The "turnup" command is used for this.

There are two major variants we need to consider: "turnup disk" and "turnup memstick". The first option is intended for use with hard disk drives. It most closely approximates a standard desktop Linux environment. The second variant is intended for flash-memory sticks, and sacrifices a few seldom-used Linux features in order to minimize the number of write operations performed to the external USB memory stick.

The "-i" option to the turnup command is used to tell turnup to copy everything it needs in order to make the target device suitable for use -- we need that because there's nothing on the memory stick yet.

There are some other options, but we're not likely to need them. The only one that you may find useful would be the "-s" option, which tells SlugOS how long to wait for the disk or memory stick to become ready at boot time -- some very slow disks may require more than the default 10 seconds that SlugOS gives them.

In our case, we're doing a standard turnup operation to an external USB memory stick:

root@frankenslug:~# turnup memstick -i /dev/sda1
/sbin/turnup: umounting any existing mount of /dev/mtdblock4
turnup: copying root file system
17156 blocks
done
rootdir=/tmp/rootfs.1031
table='/tmp/flashdisk.1031/etc/device_table'
root@frankenslug:~#

Checking for Successful Turnup

Ok, we're done -- time to reboot!

root@frankenslug:~# reboot
Broadcast message from root (pts/0) (Sun Mar  8 22:16:28 2009):
root@frankenslug:~#
The system is going down for reboot NOW!

Your ssh session will be disconnected, and you'll see the NSLU2 LEDs blink as it begins the reboot sequence.

Eventually, you'll hear the triple-beeps indicating a successful boot. Use your ssh client as before to connect to the NSLU2, and then use the "df" command to see what's happened:

login as: root
root@192.168.1.77's password:~# N3m34tl
root@frankenslug:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 6400      5460       940  85% /initrd
/dev/sda1               975096     27944    897620   3% /
/dev/sda1               975096     27944    897620   3% /dev/.static/dev
udev                      2048        36      2012   2% /dev
tmpfs                    15120        24     15096   0% /var/volatile
tmpfs                    15120         0     15120   0% /dev/shm
root@frankenslug:~#

Note the changes -- specifically, note that the "/" partion (our rootfs) is associated with /dev/sda1 (which was the external device). And also, note that the available disk space is far higher -- we now have 975 MBytes available to us.

Our turnup operation was successful -- we can now proceed to install some software!

Adding a Swapfile

SlugOS requires swap space -- even if it doesn't ever use it. This sounds strange, and you may also find much advice to the contrary. But the fact is that recent Linux kernel changes have made the kernel's Out-Of-Memory Killer much more aggressive. Without going into the gory details, if you do not have swap space available, you may very likely find that applications will be effectively limited to using only half of the already-limited amount of memory on the NSLU2 -- and if they attempt to violate that restriction, they will simply be terminated (with no message at all to indicate what happened).

There's an easy way to address this situation -- we don't have to create an actual disk partition for swap space at all. The following steps create a small file on the root file system that we can use for swap space and updates the fstab so that we will continue to use that swap file at each subsequent boot. The final command in the sequence (the "free" command) shows us our memory statistics, and the last line of output shows us that we do indeed now have 32 MBytes (32320 1K blocks) available, with none of it actually used. (You can use the "free" command at any time to confirm that your swap file is active, and see if any of it has actually been used or not.)

root@frankenslug:~# dd if=/dev/zero of=/swapfile bs=1M count=32
32+0 records in
32+0 records out
33554432 bytes (34 MB) copied, 25.8536 seconds, 1.3 MB/s
root@frankenslug:/# mkswap /swapfile
Setting up swapspace version 1, size = 33550 kB
root@frankenslug:/# cp /etc/fstab /etc/fstab.backup
root@frankenslug:/# echo '/swapfile swap swap defaults 0 0' >>/etc/fstab
root@frankenslug:/# cat /etc/fstab
/dev/sda1       /       ext3    noatime 1  1
sysfs           /sys            sysfs   defaults        0  0
proc            /proc           proc    defaults        0  0
tmpfs           /var/volatile   tmpfs   mode=0755       0  0
tmpfs           /dev/shm        tmpfs   mode=0777       0  0
usbfs           /proc/bus/usb   usbfs   defaults        0  0
/swapfile       swap            swap    defaults        0  0
root@frankenslug:/# swapon -a
root@frankenslug:/# free
             total       used       free     shared    buffers     cached
Mem:         30240      27696       2544          0       1484      19624
-/+ buffers/cache:       6588      23652
Swap:        32320          0      32320
root@frankenslug:/#

Note: If swapon results in error, "Swapon failed: Invalid argument" the filesystem may not support swap. This seems to be the case for nfs.

Updating the Feeds

The first thing we need to do is make sure that our slug can reach the internet -- we want to be able to use the opkg utility to update the list of available packages for us to install. So let's ping www.nslu2-linux.org. Use <ctrl-c> to interrupt when you have "pinged" enough:

root@frankenslug:~# ping www.nslu2-linux.org
PING www.nslu2-linux.org (140.211.169.169): 56 data bytes
64 bytes from 140.211.169.169: seq=0 ttl=51 time=80.187 ms
64 bytes from 140.211.169.169: seq=1 ttl=51 time=78.198 ms
64 bytes from 140.211.169.169: seq=2 ttl=51 time=79.098 ms
^C
--- www.nslu2-linux.org ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 78.198/79.161/80.187 ms
root@frankenslug:~#

Now use the "opkg" command to update the list of available packages:

root@frankenslug:~# opkg update
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/Packages.gz
Inflating http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/Packages.gz
Updated list of available packages in /usr/lib/opkg/lists/cross
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/native/5.3-beta/Packages.gz
Inflating http://ipkg.nslu2-linux.org/feeds/slugosbe/native/5.3-beta/Packages.gz
Updated list of available packages in /usr/lib/opkg/lists/native
root@frankenslug:~#

Installing and Setting the Timezone

One of SlugOS' distinguishing characteristics is small size. This means that some of the utilities provided are stripped down, and may lack some functionality, and some utilities are simply not provided in the base image. There's only so much that can be done with 5 MBytes of total space!

Use opkg to install additional software, including the full-featured versions of the stripped-down utilities that are pre-installed.

For an example, we'll start by teaching our NSLU2 about local time. Note from the "date" command that your slug tells time in UTC -- it has no concept of timezones, because timezone data is large, and not strictly necessary for a minimal system. But we have loads of external storage now that we've done the turnup, so let's install the timezones:

root@frankenslug:~# opkg install tzdata
Installing tzdata (2007k-r4) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/tzdata_2007k-r4_armv5teb.ipk
Configuring tzdata
root@frankenslug:~#

Ok, that was easy. But now we need to tell it what timezone we're in -- but we have no fancy Web GUI, or window-based configuration tool to do that!

A little googling about reveals that the fancy GUI tools are nothing more than a front end that creates a symbolic link in the /etc directory that points to the correct timezone file. The following command should do the job for us:

root@frankenslug:~# ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
ln: /etc/localtime: File exists
root@frankenslug:~# rm /etc/localtime
root@frankenslug:~# ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
root@frankenslug:~#

What happened there? In a nutshell, installing the timezone database also installed a default timezone for us. The first attempt to create the link failed because Linux didn't want to let us overwrite the default timezone file with the link. The simple solution in this case was to delete that default timezone, and then create the link.

Now we need to logout, and log in again, and this time when we check our date:

root@frankenslug:~# date
Sun Mar  8 17:44:52 CDT 2009
root@frankenslug:~#

Much better.

Installing the SPS (Standard Package Set)

The Standard Package Set is a semi-official set of packages that all standard SlugOS installs should try to have installed, at a minimum. By using this standard set of basic packages, the typical user will find that they'll have an easier time in general -- they'll have some choices among text editors, they'll have the standard bash shell available, and most of the common commands will be the standard full versions documented in all the standard Linux documents.

Here's what the installation sequence for that set looks like:

root@frankenslug:~# opkg -force-overwrite install joe nano \
bash file gawk util-linux procps coreutils
Installing gawk (3.1.4-r3) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/
gawk_3.1.4-r3_armv5teb.ipk
Installing gawk-common (3.1.4-r3) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/
gawk-common_3.1.4-r3_armv5teb.ipk
Installing file (4.21-r0) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/
file_4.21-r0_armv5teb.ipk
Installing joe (3.1-r1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/
joe_3.1-r1_armv5teb.ipk
package ncurses suggests installing ncurses-terminfo
Installing ncurses (5.4-r16) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/
ncurses_5.4-r16_armv5teb.ipk
Installing bash (3.2-r7) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/
bash_3.2-r7_armv5teb.ipk
Installing nano (2.0.7-r0) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/
nano_2.0.7-r0_armv5teb.ipk
Installing procps (3.2.7-r7) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/
procps_3.2.7-r7_armv5teb.ipk
Installing coreutils (5.3.0-r4) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/slugosbe/cross/5.3-beta/
coreutils_5.3.0-r4_armv5teb.ipk
Configuring bash
Configuring coreutils
update-alternatives: Linking //usr/bin/basename to basename.coreutils
update-alternatives: Linking //usr/bin/cksum to cksum.coreutils
update-alternatives: Linking //usr/bin/comm to comm.coreutils
update-alternatives: Linking //usr/bin/csplit to csplit.coreutils
update-alternatives: Linking //usr/bin/cut to cut.coreutils
update-alternatives: Linking //usr/bin/dir to dir.coreutils
update-alternatives: Linking //usr/bin/dircolors to dircolors.coreutils
update-alternatives: Linking //usr/bin/dirname to dirname.coreutils
update-alternatives: Linking //usr/bin/du to du.coreutils
update-alternatives: Linking //usr/bin/env to env.coreutils
update-alternatives: Linking //usr/bin/expand to expand.coreutils
update-alternatives: Linking //usr/bin/expr to expr.coreutils
update-alternatives: Linking //usr/bin/factor to factor.coreutils
update-alternatives: Linking //usr/bin/fmt to fmt.coreutils
update-alternatives: Linking //usr/bin/fold to fold.coreutils
update-alternatives: Linking //usr/bin/groups to groups.coreutils
update-alternatives: Linking //usr/bin/head to head.coreutils
update-alternatives: Linking //usr/bin/hostid to hostid.coreutils
update-alternatives: Linking //usr/bin/id to id.coreutils
update-alternatives: Linking //usr/bin/install to install.coreutils
update-alternatives: Linking //usr/bin/join to join.coreutils
update-alternatives: Linking //usr/bin/link to link.coreutils
update-alternatives: Linking //usr/bin/logname to logname.coreutils
update-alternatives: Linking //usr/bin/md5sum to md5sum.coreutils
update-alternatives: Linking //usr/bin/mkfifo to mkfifo.coreutils
update-alternatives: Linking //usr/bin/nl to nl.coreutils
update-alternatives: Linking //usr/bin/nohup to nohup.coreutils
update-alternatives: Linking //usr/bin/od to od.coreutils
update-alternatives: Linking //usr/bin/paste to paste.coreutils
update-alternatives: Linking //usr/bin/pathchk to pathchk.coreutils
update-alternatives: Linking //usr/bin/pinky to pinky.coreutils
update-alternatives: Linking //usr/bin/pr to pr.coreutils
update-alternatives: Linking //usr/bin/printenv to printenv.coreutils
update-alternatives: Linking //usr/bin/printf to printf.coreutils
update-alternatives: Linking //usr/bin/ptx to ptx.coreutils
update-alternatives: Linking //usr/bin/readlink to readlink.coreutils
update-alternatives: Linking //usr/bin/seq to seq.coreutils
update-alternatives: Linking //usr/bin/sha1sum to sha1sum.coreutils
update-alternatives: Linking //usr/bin/shred to shred.coreutils
update-alternatives: Linking //usr/bin/sort to sort.coreutils
update-alternatives: Linking //usr/bin/split to split.coreutils
update-alternatives: Linking //usr/bin/stat to stat.coreutils
update-alternatives: Linking //usr/bin/sum to sum.coreutils
update-alternatives: Linking //usr/bin/tac to tac.coreutils
update-alternatives: Linking //usr/bin/tail to tail.coreutils
update-alternatives: Linking //usr/bin/tee to tee.coreutils
update-alternatives: Linking //usr/bin/test to test.coreutils
update-alternatives: Linking //usr/bin/tr to tr.coreutils
update-alternatives: Linking //usr/bin/tsort to tsort.coreutils
update-alternatives: Linking //usr/bin/tty to tty.coreutils
update-alternatives: Linking //usr/bin/unexpand to unexpand.coreutils
update-alternatives: Linking //usr/bin/uniq to uniq.coreutils
update-alternatives: Linking //usr/bin/unlink to unlink.coreutils
update-alternatives: Linking //usr/bin/users to users.coreutils
update-alternatives: Linking //usr/bin/vdir to vdir.coreutils
update-alternatives: Linking //usr/bin/wc to wc.coreutils
update-alternatives: Linking //usr/bin/who to who.coreutils
update-alternatives: Linking //usr/bin/whoami to whoami.coreutils
update-alternatives: Linking //usr/bin/yes to yes.coreutils
update-alternatives: Linking //bin/cat to cat.coreutils
update-alternatives: Linking //bin/chgrp to chgrp.coreutils
update-alternatives: Linking //bin/chmod to chmod.coreutils
update-alternatives: Linking //bin/chown to chown.coreutils
update-alternatives: Linking //bin/cp to cp.coreutils
update-alternatives: Linking //bin/date to date.coreutils
update-alternatives: Linking //bin/dd to dd.coreutils
update-alternatives: Linking //bin/df to df.coreutils
update-alternatives: Linking //bin/echo to echo.coreutils
update-alternatives: Linking //bin/false to false.coreutils
update-alternatives: Linking //bin/kill to kill.coreutils
update-alternatives: Linking //bin/ln to ln.coreutils
update-alternatives: Linking //bin/ls to ls.coreutils
update-alternatives: Linking //bin/mkdir to mkdir.coreutils
update-alternatives: Linking //bin/mknod to mknod.coreutils
update-alternatives: Linking //bin/mv to mv.coreutils
update-alternatives: Linking //bin/nice to nice.coreutils
update-alternatives: Linking //bin/pwd to pwd.coreutils
update-alternatives: Linking //bin/rm to rm.coreutils
update-alternatives: Linking //bin/rmdir to rmdir.coreutils
update-alternatives: Linking //bin/sleep to sleep.coreutils
update-alternatives: Linking //bin/stty to stty.coreutils
update-alternatives: Linking //bin/sync to sync.coreutils
update-alternatives: Linking //bin/touch to touch.coreutils
update-alternatives: Linking //bin/true to true.coreutils
update-alternatives: Linking //bin/uname to uname.coreutils
update-alternatives: Linking //usr/sbin/chroot to chroot.coreutils
update-alternatives: Linking //usr/bin/uptime to ../../bin/busybox
update-alternatives: Linking //bin/hostname to busybox
update-alternatives: Linking //usr/bin/[ to lbracket.coreutils
Configuring file
Configuring gawk
update-alternatives: Linking //usr/bin/awk to gawk
Configuring gawk-common
Configuring joe
Configuring nano
Configuring ncurses
Configuring procps
 Adding system startup for /etc/init.d/procps.sh.
update-alternatives: Linking //usr/bin/top to top.procps
update-alternatives: Linking //usr/bin/uptime to uptime.procps
update-alternatives: Linking //bin/ps to ps.procps
update-alternatives: Linking //bin/kill to kill.coreutils
update-alternatives: Linking //usr/bin/free to free.procps
update-alternatives: Linking //sbin/sysctl to sysctl.procps
update-alternatives: Linking //usr/bin/pkill to pkill.procps
root@frankenslug:~# reboot
Broadcast message from root (pts/0) (Sun Mar  8 22:16:28 2009):
root@frankenslug:~#
The system is going down for reboot NOW!

Note the reboot at the end -- after installing coreutils or procps, it is always wise to reboot immediately. These packages, in particular, have a tendency to disrupt running processes, so it's best to just restart everything.

Installing the Optware Feeds (Optional)

Installing the Optware feeds is optional. On earlier SlugOS releases, the process to enable these feeds was fairly manual. With SlugOS 5.3-beta, a simple command is available to do all the necessary setup for you:

root@frankenslug:~# setup-optware.sh
Connecting to ipkg.nslu2-linux.org (140.211.169.169:80)
slugos5be-bootstrap_ 100% |*******************************|   214k --:--:-- ETA
Optware Bootstrap for slugos5be.
Extracting archive... please wait
bootstrap/
bootstrap/bootstrap.sh
bootstrap/ipkg-opt.ipk
1072+1 records in
1072+1 records out
219822 bytes (220 kB) copied, 0.299117 seconds, 735 kB/s
bootstrap/ipkg.sh
bootstrap/optware-bootstrap.ipk
bootstrap/wget.ipk
Creating temporary ipkg repository...
Installing optware-bootstrap package...
Unpacking optware-bootstrap.ipk...Done.
Configuring optware-bootstrap.ipk...Setting up ipkg arch-file
Done.
Installing ipkg...
Unpacking ipkg-opt.ipk...Done.
Configuring ipkg-opt.ipk...Done.

Note for SlugOS/LE users: to get the correct slugos5le feed, you first need to replace /sbin/setup-optware.sh with the file found at http://trac.nslu2-linux.org/optware/browser/trunk/sources/optware-bootstrap/slugos5be/setup-optware.sh

Once this is installed, you can use the "ipkg" command to install, upgrade, or de-install optware packages, while the "opkg" command would be used for the SlugOS feeds. Since "ipkg" uses /opt/bin/update-alternatives and "opkg" uses /usr/bin/update-alternatives, it's a good idea to setup PATH to have /opt/bin at the front for the shell session you want to use "ipkg".

view · edit · print · history · Last edited by riban.
Based on work by riban, mwester, BrianZhou, and fatwalrus.
Originally by mwester.
Page last modified on September 22, 2013, at 11:08 AM