How to auto-mount from command line?

Solution 1:

You can use:

udisksctl mount -b device_name

where device_name is the name of a storage device and should look something like /dev/sdb1.

Using lsblk or sudo fdisk -l command you can find out all storage devices attached to your system.

Solution 2:

gio mount

gvfs is now listed as deprecated (2018) and you are advised to use 'gio' which is Gnome In Out and part of Glib. See Wikipedia.

For example, to auto-mount a second drive partition; create a bash script with executable permission to run at start-up with the following command:

gio mount -d /dev/sda2

If you are owner of the partition (see chown) you won't need sudo.

To mount an ISO file located for example on ~/ISOs:

gio mount "archive://file%3A%2F%2F%2Fhome%2Fpablo%2FISOs%2Fubuntu-18.04-desktop-amd64.iso"

You could URL encode the path with Python 3 and realpath (to concatenate to archive://:

python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\"))" "file://$(realpath ubuntu-18.04-desktop-amd64.iso)"

This will mount on /run/user/$(id -u)/gvfs/ .

As an alternative gnome-disk-image-mounter will moount on /media/$USER/.

To unmount use gio mount -u /run/user/$(id -u)/gvfs/archive* (or /media/$USER/, depending the way you mounted).

udisksctl

Listing available devices:

udisksctl status

Mounting is done via:

udisksctl mount -b /dev/sdf

or

udisksctl mount -p block_devices/sdf

Unmounting is done via:

udisksctl unmount -b /dev/sdf

or

udisksctl unmount -p block_devices/sdf

The object-path can be found out by doing:

udisksctl dump

Object of type org.freedesktop.UDisks2.Block seem to be valid as object-patch, the /org/freedesktop/UDisks2/ prefix has to be cut from the path for udisksctl to accept them.

gvfs-mount

Listing available devices can be done with:

gvfs-mount --list

Mounting them can be done with:

gvfs-mount -d /dev/sdf

Unmounting is possible via:

gvfs-mount --unmount /media/user/01234567890

One remaining problem is that I have no idea how to use the gvfs-mount --list output in a mount command, as --list won't show block device names and trying to use the device names it prints in a mount will result in:

Error mounting location: volume doesn't implement mount

Conclusion

While both gvfs-mount and udisksctl will work for the tasks, their interface is impractical as they don't provide human readable status of the disks available, just an overly verbose info dump.

Solution 3:

A simple solution that works as required (mounts to /media/{user}/{diskid}) except that it can not list devices but needs to be given the exact, case sensitive, volume label as argument $1

To mount:

DEVICE=$(findfs LABEL=$1) && udisksctl mount -b $DEVICE

To unmount:

DEVICE=$(findfs LABEL=$1) && udisksctl unmount -b $DEVICE

Solution 4:

I wrote this Bash script to work around this problem, but be aware that I'm a scripting newbie. All suggestions welcome! Usage and description follow below the script.

#!/bin/bash
# umanage.sh
# 2014-05-05

BASEPATH="/media/$(whoami)/"
RESULTS=$(udisksctl dump | grep IdLabel | grep -c -i "$1")

case "$RESULTS" in

0 )     echo "Nothing found."
        ;;

1 )     DEVICELABEL=$(udisksctl dump | grep IdLabel | grep -i "$1" | cut -d ":" -f 2 | sed 's/^[ \t]*//')
        DEVICE=$(udisksctl dump | grep -i "IdLabel: \+$DEVICELABEL" -B 12 | grep " Device:" | cut -d ":" -f 2 | sed 's/^[ \t]*//')
        DEVICEPATH="$BASEPATH""$DEVICELABEL"

        if [[ -z $(mount | grep "$DEVICE") ]]
        then
                echo "Found unmounted $DEVICE partition."
                echo "Do you want to mount it in $DEVICEPATH?"
                select yn in "Mount" "Ignore"
                do
                        case $yn in
                        Mount )         udisksctl mount -b "$DEVICE"
                                        break
                                        ;;
                        Ignore )        exit
                                        ;;
                        esac
                done
        else
                echo "Found $DEVICE partition, currently mounted in $DEVICEPATH."
                echo "Do you want to unmount it?"
                select yn in "Unmount" "Ignore"
                do
                        case $yn in
                        Unmount )       udisksctl unmount -b "$DEVICE"
                                        break
                                        ;;
                        Ignore )        exit
                                        ;;
                        esac
                done
        fi
        ;;

* )     if [ $# -eq 0 ]
        then
                echo "No argument supplied"
        else
                echo "$RESULTS possible results. You may be looking for:"
                echo
                udisksctl dump | grep IdLabel | grep -i "$1" | cut -d ":" -f 2 | sed 's/^[ \t]*//' | sed '/^$/d'
                echo
                echo "Please refine your search."
        fi
        ;;

esac

Usage:

  • save the script as umanage.sh
  • make it executable: chmod +x umanage.sh
  • run it: ./umanage.sh YourDeviceLabel

The script accepts as an argument the label of the partition you want to mount and looks in the udisksctl dump for corresponding entries.

If a partition is found and it's not mounted, device name and path are shown and you're offered to mount the partition. The script searches for partial labels too, and it won't care about upper or lower case (useful when you don't remember the exact label).

./umanage.sh PASSPORT
Found unmounted /dev/sdf1 partition.
Do you want to mount it in /media/pixel/My Passport?
1) Mount
2) Ignore
#? 

If a partition is found and it's already mounted, you're offered to unmount it:

./umanage.sh passp
Found /dev/sdf1 partition, currently mounted in /media/open/My Passport.
Do you want to unmount it?
1) Unmount
2) Ignore
#?

If your argument matches more than a result, the script shows you the matching partition labels and asks you to refine the search:

./umanage.sh SS
2 possible results. You may be looking for:

SSD-9GB
My Passport

Please refine your search.

Solution 5:

Just ran into the issue myself, and found the following solution:

udisksctl mount -b /dev/disk/by-labels/$LABEL

It will ask for the user password, even if it's you and you're already logged in.