How to use "Instance Store Volumes" storage in Amazon EC2?

28,170

Solution 1

The use of instance-local storage that is not persistent when an instance is stopped is pretty simple: It's a very large chunk of space useful for transient things. They're the perfect target for mounting to /tmp, and is extremely useful if your server handles very large files transiently.

For example, if you were building a group of instances to do voice-to-text translation of uploaded video-files, instance-local storage would be just the thing you want to put the in-process files on. It may be there for a few hours while the file is processed, but once it's done it can be deleted and another one taken up. You don't need EBS for that, and it's a lot cheaper to run that kind of storage out of instance-local rather than EBS.

Instance-local storage is meant to be used as scratch-space for running processing, not long-term storage. If your workload doesn't use scratch-space for anything, or what it needs is so small as to not be significant, then it isn't a good fit for you.

Solution 2

If it's not already mounted under e.g. /mnt and if it doesn't have a filesystem created already then do:

  1. Check the device name

    sudo fdisk -l

  2. Make directory to where you want to mount the volume

    sudo mkdir /mnt

  3. Create filesystem on your volume (make sure you choose the correct volume because this creates a new file system on the volume)

    sudo mkfs.ext4 /dev/xvdj

  4. Mount volume

    sudo mount -t ext4 /dev/xvdj /mnt

  5. If you want to preserve the mount after e.g. a restart, open /etc/fstab and add the mount to it

    echo "/dev/xvdj /mnt auto noatime 0 0" | sudo tee -a /etc/fstab

  6. Make sure nothing is wrong with fstab by mounting all

    mount -a

Solution 3

I created a script for Ubuntu that can be run at boot and after a start/stop cycle since in the world of AWS those are two very different things. When you reboot you still have the same ephemeral disk and all you have to do is mount (/etc/fstab should handle this automatically) but when an instance is stopped and then restarted you get a new unformatted ephemeral disk which needs more love to get ready for use. As long as you have the /etc/fstab entry correct you can run this at any time and it will mount/format the device as needed. it will take a parameter of the mount point but if not provided it will assume /mnt You can call the script mount_ephemeral.sh and run as root in a startup service.

#!/bin/sh
set -e
mountPoint=${1:-'/mnt'}
rawDevice=$(grep "\s$mountPoint\s" /etc/fstab |cut -f1)
#echo checking $mountPoint on $rawDevice
[ "$rawDevice" = "" ] && { echo -e "$mountPoint not in /etc/fstab"; exit 1; }
mountpoint -q $mountPoint
[  "$?" = "0" ] && { echo -e "$mountPoint mounted"; exit; }
hasFS=$(blkid |grep $rawDevice)
[ ! "$hasFS" = "" ] && { echo -e "$mountPoint has FS:$hasFS"; mount $mountPoint; exit; }
echo initializing $mountPoint on $rawDevice
mkdir -p $mountPoint
mkfs.ext4 $rawDevice
mount $mountPoint
chmod 777 $mountPoint
exit 0
Share:
28,170
rahulg
Author by

rahulg

Updated on September 18, 2022

Comments

  • rahulg
    rahulg over 1 year

    According to AWS I got 850 GB storage with the Medium EC2 server. But when i create an Amazon Linux AMI, I am unable to use the 850 GB provided.

    While creating it does show in Storage Device Configuration in Instance Store Volumes that its device will be located at /dev/sdb , but when I start the VM , I just find /dev/sda1.

    Can you please help me in mounting this storage? Thank You

    Also, when Amazon claims that instance storage is not safe for long term use and should prefer using EBS, then what is the point of those 850 GB?

    Thanks

  • Eric Hammond
    Eric Hammond over 11 years
    Ephemeral storage or instance-store DOES persist across reboots of an instance! It does not persist across a stop/start, nor a termination, nor some instance hardware failures. Here's an article I wrote on the difference between reboot and stop/start: alestic.com/2011/09/ec2-reboot-stop-start
  • Eric Hammond
    Eric Hammond over 11 years
    Depending on the instance type, you first need to attach the instance store volumes to the instance by using the block-device-mapping options. If you don't do this, you may not even see the devices under /dev
  • Peter V. Mørch
    Peter V. Mørch over 9 years
    @EricHammond's comment was really the answer to my quest - I didn't see them anywhere - even in fdisk -l
  • volker238
    volker238 over 7 years
    If you don't see the device try using lsblk.
  • MikeB
    MikeB over 5 years
    These instructions mount the volume for me, but trying to write a new file to the volume gives "access denied". I can't sort out what's wrong with the permissions. Any ideas?
  • RichVel
    RichVel about 5 years
    lsblk -f is the best way to find disk volumes - any volumes that are mounted will be shown with the mount path, and it shows the labels for volumes (recommended to use UUIDs or labels when mounting filesystems on Linux).
  • RichVel
    RichVel about 5 years
    I prefer not to use /mnt as a mount point for volumes, because the convention is that /mnt/foo is used for each volume. If you have to mount another volume at some point as say /mnt/bar, that would mean that unmounting /mnt volume can't be done while /mnt/bar is mounted. The grep is dangerous if you are using /mnt and there are mount points such as /mnt/foo, since /mnt could match several lines - so the script might in some cases mount or mkfs the wrong disk.
  • DanJGer
    DanJGer about 5 years
    It won't find other similar mounts since it has to match exactly. The issue is that the whitespace used in your fstab needs to match the quoted value in the grep. I've updated to use \b but YMMV. The /mnt is just a default you can change yourself and is only an example. Additionally, you can pass in a parameter to the script and it will use that mount point instead. I am going to add in the set -e so that any failure terminates the whole script
  • DanJGer
    DanJGer about 5 years
    correction: changed from \b to \s