Unofficial Guide: How to add more storage

Unofficial Guide: How to add more storage

:information_source: Important Disclaimer
This guide is experimental and should not be used unless you know exactly what you are doing and are prepared to take on the risks of potentially losing important data.

If you want to add external storage to your Umbrel or other device running umbrelOS in a way that persists between reboots and doesn’t require any scripts, etc. Then this is the guide for you, until full support for external storage devices is added in umbrelOS.

Prerequisites

:white_check_mark: The commands in this section are safe to use and only provide you with information.

  1. First you need to connect the drive you want to use, to your Umbrel.

    • If you are using a connection method that is not hot-pluggabale (eg SATA / NVMe / PCIe or anything that isn’t USB) then you may need to reboot the Umbrel for the kernel to detect it.
  2. Next, check to see if the drive has been auto-mounted already by running the following in the umbrelOS Terminal:

    sudo df -h
    

    You will probably get something like this; as expected - your drive is not yet mounted.

    Filesystem      Size  Used Avail Use% Mounted on
    udev            3.9G     0  3.9G   0% /dev
    tmpfs           794M  3.0M  791M   1% /run
    /dev/sda3       9.6G  3.7G  5.5G  41% /
    tmpfs           3.9G     0  3.9G   0% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    /dev/sda4        43G   13G   29G  31% /data
    /dev/sda1       200M   46M  154M  23% /boot/efi
    
  3. Next, check to see if the drive has been detected:

    sudo lsblk
    

    In my case, the external drive would be sdb.

    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
    sda      8:0    0   64G  0 disk
    |-sda1   8:1    0  200M  0 part /mnt/root/boot/efi
    |                               /boot/efi
    |-sda2   8:2    0  9.8G  0 part
    |-sda3   8:3    0  9.8G  0 part /mnt/root
    |                               /
    `-sda4   8:4    0 44.1G  0 part /mnt/root/var/log
                                    /var/log
                                    /mnt/root/var/lib/systemd/timesync
                                    /var/lib/systemd/timesync
                                    /mnt/root/var/lib/docker
                                    /var/lib/docker
                                    /mnt/root/home
                                    /home
                                    /mnt/root/data
                                    /data
    sdb      8:16   0   64G  0 disk
    sr0     11:0    1  2.3G  0 rom
    
  4. Next, check if your drive has a block identifier. If your drive has this it means that it has been formatted / has data on it already and is ready to use.

    sudo blkid
    

    Below, in my example, we can see the identifiers for various devices but there is nothing that begins with /dev/sdbX, where X is a number. This means the drive is not ready to use and must be prepared.

    If you do see your drive there, but do not see a TYPE, UUID or PARTUUID attribute, then the drive still needs to be prepared.

    If you see all three attributes (or more) then you don’t need to prepare your drive. At this stage, take a note of the TYPE, UUID and PARTUUID unless you wish to destroy all the data on it and wipe it to start from a clean slate.

    /dev/sr0: BLOCK_SIZE="2048" UUID="2024-05-22-12-14-21-00" LABEL="UMBRELINSTALLER" TYPE="iso9660" PTTYPE="PMBR"
    /dev/sda4: UUID="589f7922-80c3-4f0d-986b-73a36b8e177e" BLOCK_SIZE="1024" TYPE="ext4" PARTLABEL="primary" PARTUUID="d1d36e34-2753-4dc7-96eb-3c9b5584e867"
    /dev/sda2: UUID="d895003e-19b9-466a-a223-f9aeaa078ad5" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="2fe5a278-9b55-4266-8220-6665aa96940b"
    /dev/sda3: UUID="3f6a0c6f-363f-4945-95e2-527250f91a26" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="f5e6d27c-4a25-447b-8e08-a9d2e738345a"
    /dev/sda1: SEC_TYPE="msdos" LABEL_FATBOOT="ESP" LABEL="ESP" UUID="FB30-6DF7" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="ESP" PARTUUID="14a31e9d-a8d7-4da0-9eb2-f268dd9d7ad9"
    

Mounting your drive

If you’ve done Step 4 of Prerequisites and have a PARTUUID available then you’re ready to mount your drive. Otherwise, skip to the next section Preparing your drive and come back once you’ve prepared your drive.

:information_source: The commands in this section will modify the system configuration in a way that may affect system stability / ability to boot. You may want to backup important data and test the configuration before using it on your main device.

  1. Create a mount point somewhere on the filesystem of your Umbrel. This can be in the /mnt folder or even in the /home/umbrel/ directory. For my example I’m using the /mnt folder like so:

    sudo mkdir -p /mnt/harddrive1
    
  2. Next, create an entry in the /etc/fstab file to define the mount point for the system. You will need to know the PARTUUID of the partition on the drive you want to mount.

    echo "/dev/disk/by-partuuid/<PARTUUID>    /mnt/harddrive1    auto    rw,user,auto    0    0" | sudo tee --append /etc/fstab
    
  3. Once you’ve added this information to the fstab. Tell the system to mount the filesystem immediately and inform systemd of the change:

    sudo mount /mnt/harddrive1
    sudo systemctl daemon-reload
    
  4. And that’s that! If you reboot, the drive should auto mount at the point you specified in the fstab.

    :exclamation: If you update umbrelOS, you will need to repeat the steps in this section again as the OTA update will clear these custom configs.

    :closed_lock_with_key: Permission denied errors when accessing the mount point
    You may get permission errors when accessing the mount directory and its contents as a non-root user. If this is the case run the following to fix it:

    sudo chmod -R 0711 /mnt/harddrive1
    sudo chown umbrel /mnt/harddrive1
    

    This will set the appropriate access permissions on all items and give ownership of the mount point to the umbrel user.

Preparing your drive (only if necessary)

:warning: The commands in this section might be dangerous to use and can cause data loss and/or corruption of umbrelOS if used incorrectly. For this section, /dev/sdX is used instead of /dev/sdb. Remember to substitute the correct device path when executing the commands in the terminal.

  1. Firstly, install fdisk and gdisk packages on umbrelOS.

    sudo apt install fdisk gdisk
    
  2. Next, erase the drive you want to mount.

    sudo wipefs -a /dev/sdX
    

    :rotating_light: This command will DESTROY the parition table on the disk, making all data on it inaccessible!

  3. Next, you want to create a new parition table. Most users will want to use a GPT-based disk. You can do this by using the gdisk utility we installed before:

    echo -e "o\ny\nn\n1\n\n\n\nw\ny" | sudo gdisk /dev/sdX
    

    :information_source: Information about this command
    gdisk is an interactive command line program that works by letting the user make selections by pressing specific keys on their keyboard to carry out actions on the disk. The echo command simulates this input to quickly achieve the same result in one command. Here’s what we’re doing:

    • o This command in gdisk starts the creation of a new empty GUID partition table (GPT).
    • y This confirms the operation (assumes “yes” to the prompt).
    • n This command creates a new partition.
    • 1 This specifies that it’s the first partition.
    • \n This represents newlines, which simulate pressing Enter to confirm default values.
    • w This command writes the changes to disk.
    • y This confirms the write operation.

    If you want to use an MBR-based disk you can use fdisk instead.

    echo -e "o\nn\np\n1\n\n\nw" | sudo fdisk /dev/sdX
    

    :information_source: Information about this command
    fdisk is a very similar program to gdisk but it is meant to be used for MBR-based disks. The command structure is similar:

    • o This command initialises a new empty partition table on the specified disk (/dev/sdX in this case).
    • n This command creates a new partition.
    • p This command selects the primary partition type.
    • 1 Specifies that this is the first partition.
    • \n Represents newlines, which simulate pressing Enter to confirm default values.
    • w This command writes the changes to disk.
  4. Next, you’ll want to create a filesystem on the first parition on the disk. Because umbrelOS is Linux based, I’m going to use ext4 but you can use any filesystem that is supported.

    sudo mkfs.ext4 /dev/sdX1
    

    :information_source: Make sure you create the filesystem on the first partition path /dev/sdX1 and not the device path/dev/sdX.

  5. Verify the drive has been correctly prepared by running blkid again.

    sudo blkid
    

    You should see something like shown below. Make a note of the UUID, TYPE and PARTUUID.

    ...
    /dev/sdX1: UUID="3aab1b5c-4a28-43f4-b26e-51cac719560a" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f64b920e-01"
    ...
    
  6. Proceed with mounting the drive.

5 Likes

You might want to verify that all of this isnt overwritten when a person updates.

This does get overwritten unfortunately so that’s why after each update the steps must be repeated to set up the mount until the feature is supported natively in umbrelOS.

1 Like

I followed these steps, but my Umbrel Home has been stuck on the restart screen for 12 hours and counting.

Help.

I didn’t have any luck either. Got the drives to auto mount but could never get them to be able to be accessed by Plex, getting the access to the docker container never worked.

I just gave up and am just about to ditch umbrel as whats the point of running a home server where your storage is limited to one drive. I’ve been holding out waiting for an update or communication but theres nothing.

1 Like

Hey @focused

I totally understand your frustration re this. External storage support is certainly on the way and we are working on it. That being said, I can’t offer a timeline or say when exactly it will be released.

If you would like some guidance on setting up your auto-mounted drive with a particular app, please don’t hesitate to reach out to us, or ask the community (including the team directly).

We will help you where possible and hopefully get Plex or any other app working with the custom setup you have.

1 Like

I followed the steps and it’s finally working :tada:

Notes:

  • Even if my drive was formated to ext4 and had a PARTUUID, my first attempt failed. It was better after formating the drive with fdisk and gdisk

  • I created and mounted my drive inside umbrel/data/storage/ (complete path: umbrel/data/storage/drive1) so it’s next to the downloads folder. Installed apps like File Browser can access more easily the new mounted location

  • I applied another set of permissions at step 4.: sudo chmod -R 775 umbrel/data/storage/drive1/ (not sure it is necessary but I had some issue allowing umbrel user with chown command)

  • I edited the docker-compose.yml file of plex with (please see the full tutorial, it will be more comprehensive):

    • sudo nano ~/umbrel/app-data/plex/docker-compose.yml
    • Locate the volume entry for the app’s configuration and data, and add a new volume mapping for the external drive: volumes: - ${UMBREL_ROOT}/data/storage/drive1:/drive1
  • Don’t forget to restart your apps to take the new mounted location into account

3 Likes

That worked with Jellyfin, thank you!

However, I still haven’t been able to do the same for Bitcoin. The Bitcoin Docker Compose file doesn’t include a volume parameter for the blocks. Does anyone have a solution for this?

I don’t use Bitcoin but if the Docker Compose file doesn’t include a volume parameter for blocks, I suppose that you would have to edit the Bitcoin app code source to handle external storage which is really not ideal.

  • How does the Bitcoin app store its data ?
  • Does it support external storage path ?

I’ve gone through these steps and could use some help. I copied some files to 2 folders on an external drive. I mounted to a folder in ~/umbrel/data/storage/ because this is where the downloads folder is in the File Browser app and I want to be able to browse the contents of the drive in the GUI. The issue is that as far as I can tell the drive is mounted to the folder I created, but I don’t see any of the folders or files on that drive in the mount folder, either in terminal of in the File Browser app.

When I use the sudo df -h command I do see the mount path for that drive. I also see multiple paths for that drive with the sudo lsblk command, including the path I specified.

Any ideas? This is way too complicated. Why can’t we just have all external drives automatically mount like in Windows or MacOS? It would make using this so much easier.

Update. If I put fstab back to how it was and use the command sudo mount /dev/sdb2 ~/umbrel/data/storage/Plex then I can see my folders and files that are on the external drive in terminal. However, they don’t appear in File Browser or in Plex.

I’m considering using the Umbrel for a combined Bitcoin full node, Plex server, and homebridge server. Not being able to easily configure external drives makes the Umbrel not very useful for things like a Plex server. I’m not really understanding why there’s a Plex server app if working with external drives is so difficult. Same goes for Jellyfin and other media apps.

Still trying to get this to work. The external drive that I’m connecting is formatted as ExFAT. I originally used the command echo "/dev/disk/by-partuuid/de43612a-6adc-48e6-b7b8-4c2efa68b097 ~/umbrel/data/storage/Plex auto rw,user,auto 0 0" | sudo tee --append /etc/fstab , following the directions above, but that didn’t work. So then I tried using the command echo "/dev/disk/by-partuuid/de43612a-6adc-48e6-b7b8-4c2efa68b097 ~/umbrel/data/storage/Plex exfat rw,user,auto 0 0" | sudo tee --append /etc/fstab, replacing auto with exfat, but that didn’t work either. Still, the contents of the drive don’t appear in the Plex folder even with the command sudo mount /dev/sdb2 ~/umbrel/data/storage/Plex. Could anyone help with this?

I finally got it working with some help from ChatGPT. In the process of getting this to work I installed an NVME drive into my mini PC. After partitioning and creating the filesystem on the drive, here are the commands I used:

Backup fstab:
sudo cp /etc/fstab /etc/fstab.bak

Create the folder where I want access to the files in File Browser:
sudo mkdir -p /home/umbrel/umbrel/data/storage/NVME

Update fstab:
echo "UUID=<UUID, not PARTUUID> /home/umbrel/umbrel/data/storage/NVME ext4 defaults 0 2" | sudo tee -a /etc/fstab

Test the fstab modification:
sudo mount -a

Confirm it worked:
df -h

I then went and did the same for the external Plex drive.

Now I just need to figure out how to make Bitcoin Core use the NVME drive and Plex to use the external drive…

Maybe this can help: HOW-TO Using 2 SDDs in umbrellos (in a simple and practical way)

That did help. Thank you. I got as far as the drives mounted to the folders. But couldn’t really get anything working past that. I think I’ll wait and see what happens with the new Files feature from 1.4 beta.

So I managed to get it working with the new Files feature. I added these lines to /etc/fstab:

UUID=6792-FAFF /home/umbrel/umbrel/home/Downloads/Plex/ exfat defaults,nofail,x-systemd.device-timeout=10 0 0
UUID=EFBE-307C /home/umbrel/umbrel/home/NVME exfat defaults,nofail 0 0
/home/umbrel/umbrel/home/NVME/Bitcoin_Node/bitcoin /home/umbrel/umbrel/app-data/bitcoin none bind 0 0

This let me get Plex to recognize the Plex files in the Downloads folder in the Files app. The Downloads folder appears as “downloads” in Plex for some reason.

This issue I’ve run into is Bitcoin Node not installing. When I click Install it starts, but immediately stops. It did add folders and files to the correct folder, so the installation did start, but then aborted.

ChatGPT solved it for me. For anyone else trying to do this, here is the updated /etc/fstab entries. This needed to be done a certain way because the drive is exfat.

UUID=EFBE-307C /home/umbrel/umbrel/home/NVME exfat defaults,uid=1000,gid=1000,fmask=0022,dmask=0022,nofail 0 0
/home/umbrel/umbrel/home/NVME/Bitcoin_Node/bitcoin /home/umbrel/umbrel/app-data/bitcoin none bind,defaults,uid=1000,gid=1000 0 0

Guide: Adding More Storage to Your Umbrel

This guide will help you add a new storage drive to your Umbrel and move your apps to use this new storage. No programming or Linux experience required!

Prerequisites

  • A new storage drive (USB, SSD, or HDD)
  • Your Umbrel device
  • Access to the Umbrel web interface

Step 1: Connect Your Drive

  1. Connect your storage drive to your Umbrel device
  2. Wait about 30 seconds for the drive to be recognized

Step 2: Format and Mount the Drive

Copy and paste these commands one at a time into your Umbrel terminal. Press Enter after each command:

bash

CopyInsert

# Check your drive name (look for sdb, sdc, etc. - it will be the size of your new drive)
sudo lsblk

# Create mount point
sudo mkdir -p /home/umbrel/umbrel/home/Storage

# Add drive to system
echo "/dev/disk/by-partuuid/$(sudo blkid -s PARTUUID -o value /dev/sdb1)    /home/umbrel/umbrel/home/Storage    ext4    rw,user,auto    0    0" | sudo tee --append /etc/fstab

# Mount the drive
sudo mount /home/umbrel/umbrel/home/Storage

# Set permissions
sudo chown -R umbrel:umbrel /home/umbrel/umbrel/home/Storage
sudo chmod -R 0755 /home/umbrel/umbrel/home/Storage

You should now see a “Storage” folder in your Umbrel Files tab.

Step 3: Move Apps to New Storage

Copy and paste these commands one at a time:

bash

CopyInsert

# Create Apps directory
sudo mkdir -p /home/umbrel/umbrel/home/Storage/Apps

# Move each app (copy and run one line at a time)
cd /home/umbrel/umbrel/app-data

# For each app folder you see, run these commands, replacing APP_NAME with the actual app name:
sudo rsync -av APP_NAME/ /home/umbrel/umbrel/home/Storage/Apps/APP_NAME/
sudo mv APP_NAME APP_NAME.bak
sudo ln -s /home/umbrel/umbrel/home/Storage/Apps/APP_NAME APP_NAME

Example for moving “bitcoin-knots”:

bash

CopyInsert

sudo rsync -av bitcoin-knots/ /home/umbrel/umbrel/home/Storage/Apps/bitcoin-knots/
sudo mv bitcoin-knots bitcoin-knots.bak
sudo ln -s /home/umbrel/umbrel/home/Storage/Apps/bitcoin-knots bitcoin-knots

Step 4: Fix Permissions and Restart

After moving all apps, run these final commands:

bash

CopyInsert

# Fix permissions
sudo chown -R umbrel:umbrel /home/umbrel/umbrel/home/Storage/Apps
sudo chmod -R 755 /home/umbrel/umbrel/home/Storage/Apps

# Restart Umbrel
sudo systemctl restart umbrel

Important Notes

  1. Your apps will keep all their data and settings
  2. The old app data is backed up with .bak at the end of the folder name
  3. After confirming everything works, you can delete the .bak folders
  4. If you update Umbrel, you might need to redo Step 3 and 4

Troubleshooting

If an app stops working:

  1. Go to Umbrel web interface
  2. Stop the app
  3. Start the app again

If problems persist:

  1. Check the Storage folder is visible in Files tab
  2. Make sure all permissions are set (run Step 4 again)
  3. Restart your Umbrel device

Need Help?

  • Visit the Umbrel community forum
  • Check the Umbrel subreddit
  • Join the Umbrel Telegram group

Remember: Take your time with each step, and don’t delete any .bak folders until you’re sure everything is working correctly!

3 Likes

Not meant to correct you but I think you forgot the formatting part? Nice guide! Very simple.

Thank you for this clearer & concise guide :heart_decoration:

I updated my umbrelOS to 1.4.0 yesterday and noticed it messed up additional storage and even internal Umbrel internal storage for some apps.

Plex has lost track of the additional storage. To solve this, I followed the first steps:

# Check your drive name (look for sdb, sdc, etc. - it will be the size of your new drive)
# My drive is named 'Untitled' ¯\_(ツ)_/¯
sudo lsblk

# Create mount point
sudo mkdir -p /home/umbrel/umbrel/home/blue-storage

# Add drive to system
echo "/dev/disk/by-partuuid/$(sudo blkid -s PARTUUID -o value /dev/sdb1)    /home/umbrel/umbrel/home/blue-storage    ext4    rw,user,auto    0    0" | sudo tee --append /etc/fstab

# Bind the system mount point location to my newly created location
sudo mount --bind /home/umbrel/umbrel/external/Untitled /home/umbrel/umbrel/home/blue-storage

# If you want this bind mount to persist across reboots, you can add an entry to /etc/fstab
echo "/home/umbrel/umbrel/external/Untitled /home/umbrel/umbrel/home/blue-storage none bind 0 0" | sudo tee -a /etc/fstab

Restarted Plex and now my external storage is correctly recognized :tada:


Some additional context:

  • Maybe I should not have unplugged my additional external storage drive before the system update to 1.4.0?
  • Some apps has lost track of the system Downloads folder: For example the File Browser app does not see the Downloads folder anymore (well, we have the new integrated Umbrel’s Files in backup)
  • I noticed that the permissions of the mounted storage by the system (Umbrel 1.4.0) is drwx--x--x (751 in octal) • So if you try to add the mount point to Plex’s docker-composer.yml, it won’t be able to access it as is
  • Since I bound the storage to /home/blue-storage, the permission changed to drwxrwxr-x (775 in octal)