Skip to content

Instantly share code, notes, and snippets.

@eklex
Last active July 12, 2025 09:40
Show Gist options
  • Save eklex/c5fac345de5be9d9bc420510617c86b5 to your computer and use it in GitHub Desktop.
Save eklex/c5fac345de5be9d9bc420510617c86b5 to your computer and use it in GitHub Desktop.
udev rule for Home Assistant OS (hassio) to mount USB drives into the Supervisor Media directory
#
# udev rule
# Mount USB drive to the media directory using the partition name as mount point
#
# Description:
# Created for Home Assistant OS, this rule mounts any USB drives
# into the Hassio media directory (/mnt/data/supervisor/media).
# When a USB drive is connected to the board, the rule creates one directory
# per partition under the media directory. The newly created partition is named
# as the partition name. If the partition does not have a name, then the following
# name format is used: "usb-{block-name}" where the block name is sd[a-z][0-9].
#
# Note 1:
# The rule name is always prefixed with a number. In this case, the rule uses 80.
# This represents the order of the rule when multiple rules exists in udev.
# Low numbers run first, high numbers run last. However, low numbers do not have all
# the facilities than high numbers may have.
# For this rule to run properly, use numbers equal or greater than 80.
#
# Note 2:
# This rule will skip mounting the 'CONFIG' USB key.
# https://github.com/home-assistant/operating-system/blob/dev/Documentation/configuration.md
#
# Note 3:
# This rule will mount the OS partitions if the OS is sorted on a USB drive (i.e. USB booting).
# To prevent this issue from happening, update the rule to skip the booting USB drive.
# See the CAUTION message below.
#
# Source of inspiration:
# https://www.axllent.org/docs/auto-mounting-usb-storage/
#
# Useful links:
# https://wiki.archlinux.org/index.php/Udev
#
# udev commands:
# - Restart udev to reload new rules:
# udevadm control --reload-rules
# - List device attributes of sdb1:
# udevadm info --attribute-walk --name=/dev/sdb1
# - List environment variables of sdb1:
# udevadm info /dev/sdb1
# - Trigger add/remove event for sdb1:
# udevadm trigger --verbose --action=add --sysname-match=sdb1
# udevadm trigger --verbose --action=remove --sysname-match=sdb1
#
# Filter on block devices, exit otherwise
# CAUTION: Change to 'sd[b-z][0-9]' if booting from a USB drive (e.g.: sda)
KERNEL!="sd[a-z][0-9]", GOTO="abort_rule"
# Skip none USB devices (e.g.: internal SATA drive)
ENV{ID_PATH}!="*-usb-*", GOTO="abort_rule"
# Import the partition info into the environment variables
IMPORT{program}="/usr/sbin/blkid -o udev -p %N"
# Exit if partition is not a filesystem
ENV{ID_FS_USAGE}!="filesystem", GOTO="abort_rule"
# Exit if this is the 'CONFIG' USB key
ENV{ID_FS_LABEL}=="CONFIG", GOTO="abort_rule"
# Get the partition name if present, otherwise create one
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="usb-%k"
# Determine the mount point
ENV{mount_point}="/mnt/data/supervisor/media/%E{dir_name}"
# Mount the device on 'add' action (a.k.a. plug the USB drive)
ACTION=="add", RUN{program}+="/usr/bin/mkdir -p %E{mount_point}", RUN{program}+="/usr/bin/systemd-mount --no-block --automount=no --collect $devnode %E{mount_point}"
# Umount the device on 'remove' action (a.k.a unplug or eject the USB drive)
ACTION=="remove", ENV{dir_name}!="", RUN{program}+="/usr/bin/systemd-umount %E{mount_point}", RUN{program}+="/usr/bin/rmdir %E{mount_point}"
# Exit
LABEL="abort_rule"
@sumnerma
Copy link

@jane-t Did you ever get your issue sorted? I'm having the same problem

@IngoEF
Copy link

IngoEF commented Jan 7, 2024

Hi,
this might have been a well usable solution, but for me it's not working (Raspberry3, HASSIO version 11.3 docker edition)
After creating the rule in /lib/udev/rules.d and trying the udevadm commands in CLI I was informed this way: zsh: command not found: udevadm. Additionally, the added file disappeared after the next reboot
What is going wrong here?

In the meantime here is some more which might be a solution but I didn't get it working.

@krzakx
Copy link

krzakx commented Oct 15, 2024

@jane-t Did you ever get your issue sorted? I'm having the same problem

so there are three of us....
I did check and when root into HAOS by ssh -p 2222 -> ls /mnt/data/supervisor/media/USBSTICK gaves me content however I do not see that content from Media dashboard in HomeAssistant.

Anybody would have any idea for that?

@microraptor
Copy link

I made an updated fork of this gist and the gist from zeehio:
https://gist.github.com/microraptor/be170ea642abeb937fc030175ae89c0c

It adds:

  • An option to mount only partitions with a specific label
  • An option to mount NTFS read/write as implemented by zeehio (uncomment that line only, if modinfo ntfs3 does not return an error)
  • 'hassos-data' partition won't be mounted
  • Some minor documentation

@apparle
Copy link

apparle commented Jul 12, 2025

I have Home Assistant OS running on a Proxmox VM and I wanted to add a second VirtIO disk for Frigate to use.
This really does give the best of both worlds - if you want to keep the fully managed Home Assistant OS (and retain supported installation status!) but you want to mount a second disk.
...
3. fdisk /dev/vdb (mine appeared as vdb. To verify, do fdisk --list and look for your new disk)

@jb773 I'm trying to do exactly what you did, and attempting to follow your instructions. But I don't see a /dev/vdb showing up in fdisk -l
Since these instructions are relatively old I'm curious -- is your set up still working? Are these instructions still valid and I'm messed up something in my VM set up, or has something changed about HAOS VM itself?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment