Extending the Omega’s Available Memory
While the Omega2 comes with a decent 64MB of RAM, and the Omega2+ with 128MB, you might find yourself in a situation where this is simply not enough! This tutorial will walk you through how you can use USB Storage and a Swap File to extend the amount of memory available to your Omega.
What is a Swap File?
A Swap File is a special file on a disk drive or flash storage that is used by the operating system to store information not currently being used by the device’s RAM. This allows the system and programs to use more memory than just by using the physically available RAM memory.
Swap Files, therefore, implement virtual memory. This is also known as paging and is used in every modern desktop and mobile operating system to manage and optimize the use of memory.
For more information, check out the Wikipedia article on Paging.
The Setup Procedure
Let’s get to setting up our very own Swap File and extending the available memory on the Omega!
Step 1: Install Required Packages
First, we will install the swap-utils
and block-mount
packages that will allow us to create and use Swap Files:
opkg update
opkg install swap-utils block-mount
Step 2: USB Storage
Plug in a USB drive and make sure it’s mounted. By default, the Omega will automatically mount any USB storage devices.
If you’re curious about auto-mounting, see the USB Storage tutorial for details.
For the purposes of this tutorial, let’s assume the USB device was mounted to /tmp/mounts/USB-A1
.
Step 3: Create Swap File on the USB storage
Now we need to create the file on the USB drive that will be used as the Swap file using the dd
utility. This utility is meant to convert, copy, and write files. It is very powerful and writing to an unintended location can severely damage your system. It can potentially be very destructive if used incorrectly.
Be extremely careful when using dd
!
We will run the following dd
command:
dd if=/dev/zero of=/tmp/mounts/USB-A1/swap.page bs=1M count=256
This command will create a file on the USB drive that is 256MB with all of its bytes initialized to 0x00
. This is the file that will be used as the Swap File, so we will effectively be extending our RAM by 256MB.
Let’s go through each part of the command:
- The
if
argument specifies the source of the data, in this case/dev/zero
is a special system file that outputs as many0x00
bytes as requested. - The
of
argument tellsdd
where to create the new file. In our scenario, the USB drive was mounted at/tmp/mounts/USB-A1
and we want to make aswap.page
file on the top level of the drive. - The
bs
andcount
arguments will specify the size of the file that will be created:- The
bs
argument actually stands for Block Size, with a Block being the number of bytes that are read, written, or converted at one time. We are setting our Block size to 1 Million Bytes or 1 Megabyte (MB) - The
count
argument defines how many blocks are to be created. So we are creating 256 blocks that are 1MB each, therefore the file will be 256MB in total
- The
Step 4: Setup the Swap File
Now that the Swap File has been created, we need to tell Linux to setup this file as a swap area:
mkswap /tmp/mounts/USB-A1/swap.page
Running the free
command will show that nothing has changed yet:
root@Omega-1302:~# free
total used free shared buffers
Mem: 61152 42528 18624 96 11648
-/+ buffers: 30880 30272
Swap: 0 0 0
Step 5: Activate the Swap File
We’re finally ready to activate the Swap File and actually expand our available memory:
swapon /tmp/mounts/USB-A1/swap.page
Now, when we run free
again, we will see that the Swap row is populated:
root@Omega-1302:~# free
total used free shared buffers
Mem: 61152 42644 18508 96 11648
-/+ buffers: 30996 30156
Swap: 262140 0 262140
The units of the numbers displayed by the free
command are kilobytes. The total Swap size is 262140 kilobytes which is equivalent to 256MB, so we can confirm that the Swap File is active and being used as memory.
Note: When the Omega is rebooted, the USB Swap Page will no longer be used. Step 5 will have to be repeated after every boot unless some automatic method for activating the Swap Page is created…
Luckily for you, we’ve gone ahead and figured out how to do that!
Going Further
It’s a little problematic that the Swap File needs to be activated manually after every boot, so let’s automate this!
Automatically Mount the USB using Block + Fstab
In order to automatically activate the Swap File, we will need to set up automounting for your USB using a different method than the default tool on the Omega2. The file /etc/fstab
contains information on how to automate mounting partitions (like our USB drive).
Make sure your USB drive is plugged into the Omega. We will tell the Omega to detect the information for the drive and save it in our fstab
configuration with the following command:
block detect > /etc/config/fstab
Now the Omega has an fstab
entry in uci
for this specific USB drive. Let’s update the uci
entry so that it will mounted automatically.
First, let’s see the current configuration by running uci show fstab
. It will output something like the following:
fstab.@global[0]=global
fstab.@global[0].anon_swap='0'
fstab.@global[0].anon_mount='0'
fstab.@global[0].auto_swap='1'
fstab.@global[0].auto_mount='1'
fstab.@global[0].delay_root='5'
fstab.@global[0].check_fs='0'
fstab.@mount[0]=mount
fstab.@mount[0].target='/mnt/sda1' // we'll use this path for automounting
fstab.@mount[0].uuid='<UNIQUE IDENTIFIER>' // eg. '19BF-3A86'
fstab.@mount[0].enabled='0'
Now let’s enable the mount[0]
device:
uci set fstab.@mount[0].enabled='1'
uci commit fstab
Making Sure fstab
is Enabled
Just to be safe, let’s enable fstab
to run at boot:
/etc/init.d/fstab enable
block mount
The Omega now knows to mount your USB drive at /mnt/sda1
. Keep this handy for later, or just run uci show fstab
to see this information again.
Restarting fstab
If you need to change your fstab
configuration, the following command can be used to restart the process so the changes will take effect:
block umount;block mount
Activating the Swap File at Boot
Now that we’ve told the Omega to automount the USB drive, we need to tell it to activate the Swap File when it starts up. There’s a file called /etc/rc.local
where you can put terminal commands that will be run automatically after every boot. This is perfect for what we’re trying to do.
See the running commands on boot article for more info.
We need to add a snippet of code to tell the Omega to look for the swap.page
file we created earlier and activate it. From our example, the USB drive would be mounted at /mnt/sda1
. Add the following to your /etc/rc.local
file, where SWAP_FILE
is the full path where swap.page
will be:
### activate the swap file on an external USB drive
SWAP_FILE="/mnt/sda1/swap.page"
if [ -e "$SWAP_FILE" ]; then
swapon $SWAP_FILE
fi
Make sure this code is placed above the exit 0
line that already exists in the file!
After adding this code, reboot your Omega with the USB drive still plugged in. Run free
to confirm the Swap File is indeed being used:
root@Omega-1302:~# free
total used free shared buffers
Mem: 61152 42644 18508 96 11648
-/+ buffers: 30996 30156
Swap: 262140 0 262140
Summary
- Using a Swap File allows us to use other types of storage (USB, flash) to extend the amount of RAM available in our system.
- All modern desktop and mobile operating systems implement swap files in one way or another since storage is generally much cheaper than memory.
- This isn’t exactly equivalent to adding more RAM because memory is much, much faster than storage.
- For situations where memory usage becomes an issue, this method is incredibly useful.
Happy hacking!