78

What is the command line equivalent of the Nautilus feature called "Safely Remove Drive". Specifically, I am removing a USB flash drive.

H2ONaCl
  • 10,039

6 Answers6

81

The udisks command is most likely what you are looking for.

While sudo umount /dev/sdXY will work, udisks can do this without root level (sudo) permissions.

If you have a drive /dev/sdXY, mounted, where X is a letter representing your usb disk and Y is the partition number (usually 1), you can use the following commands to safely remove the drive:

udisks --unmount /dev/sdXY
udisks --detach /dev/sdX

For a practical example, if I have the partition /dev/sdb1 mounted, I would run this to unmount and detach it:

udisks --unmount /dev/sdb1
udisks --detach /dev/sdb

If your drive is not mounted, or was never mounted, simply use the second command:

udisks --detach /dev/sdb

I originally found this through this question: https://superuser.com/a/430470/176493.

Using udisks2:

In the newer ubuntu distributions (I'm unsure of when the switch occurred), udisks2 is installed instead of udisks.

Mirroring the commands above, to unmount and detach a disk with udisks2:

udisksctl unmount -b /dev/sdXY
udisksctl power-off -b /dev/sdX

Example if my drive is /dev/sdb1:

udisksctl unmount -b /dev/sdb1
udisksctl power-off -b /dev/sdb

Similarly to above, power-off can be used to detach the drive even if there are no partitions mounted, or no partition was ever mounted:

udisksctl power-off -b /dev/sdb
daboross
  • 2,203
28

The actual equivalent to Nautilus Mount/Unmount operation is gvfs-mount -m -d /dev/ice /some/directory and gvfs-mount -u /some/directory. This uses the same API that Nautilus uses, GIO virtual file system (gvfs), which provides different tools to use several services as mount points, such smb, NFS, FTP, block devices, etc.

To identify which device you need to unmount just use gvfs-mount -l which should be enough.

This solution has the peculiarity that it doesn't require for elevated permissions, since everything is managed by the umount/gvfsd/polkit services, which further resemblances the similarity with Nautilus behavior.

Braiam
  • 69,112
16

Once you know the device, possibly using the df info as in @rcpao answer, the best way to "eject" the disk is, imho, using the same command that the graphical interface is using:

udisksctl unmount --block-device /dev/sdc1

I have a script to do a backup to a disk that I know will mount under /media/romano/movlin, and after the backup I do:

sync
udisksctl unmount -b $(mount | grep movlin   | cut -d" "  -f1)

Here, mount | grep movlin | cut -d" " -f1 will extract the device that is mounted under the label "movlin", (would be /dev/sdc1 in that case), and then it unmounts it.

Rmano
  • 32,167
10
  1. 'ls -l /dev/disk/by-id/' to find the device names of your flash drive and its partitions.

    lrwxrwxrwx 1 root root  9 Sep 16 10:49 usb-PNY_USB_2.0_FD_AAC3170000000954-0:0 -> ../../sdk
    lrwxrwxrwx 1 root root 10 Sep 16 10:49 usb-PNY_USB_2.0_FD_AAC3170000000954-0:0-part1 -> ../../sdk1
    lrwxrwxrwx 1 root root 10 Sep 16 10:49 usb-PNY_USB_2.0_FD_AAC3170000000954-0:0-part2 -> ../../sdk2
    

    /dev/disk/by-id/usb-PNY_USB_2.0_FD_AAC3170000000954-0:0-part1 is a symlink to /dev/sdk1

  2. If your distribution does not have /dev/disk/by-id/, you can use 'df' to find the mount point of your flash drive.

    myuser@myhost:~$ df
    Filesystem                   1K-blocks       Used  Available Use% Mounted on
    /dev/mapper/ubuntu--vg-root 1916153032  658404668 1160390336  37% /
    none                                 4          0          4   0% /sys/fs/cgroup
    udev                          16438692          4   16438688   1% /dev
    tmpfs                          3289976       2156    3287820   1% /run
    none                              5120          0       5120   0% /run/lock
    none                          16449860      18768   16431092   1% /run/shm
    none                            102400         48     102352   1% /run/user
    /dev/sda1                       240972      98990     129541  44% /boot
    /dev/sdc1                     60915712      20992   60894720   1% /media/myuser/SD024-64GB
    /dev/sdk2                         1004        876        128  88% /media/myuser/UEFI_NTFS
    /dev/sdk1                      7970172    5798804    2171368  73% /media/myuser/NTFS
    

Thus /media/myuser/UEFI_NTFS -> /dev/sdk2 <- usb-PNY_USB_2.0_FD_AAC3170000000954-0:0-part2

At this point, see daboross's answer for unmount, power off, and detach commands using 'udisksctl' and 'udisks' with your discovered mount points and disk device name.

  1. 'udisksctl unmount -b' or 'umount' using either /dev/sdc1 or /media/myuser/SD024-64GB.

    myuser@myhost:~$ udisksctl unmount -b /dev/disk/by-id/usb-PNY_USB_2.0_FD_AAC3170000000954-0:0-part1
    Unmounted /dev/sdk1.
    myuser@myhost:~$ udisksctl unmount -b /dev/disk/by-id/usb-PNY_USB_2.0_FD_AAC3170000000954-0:0-part2
    Unmounted /dev/sdk2.
    

    or

    myuser@myhost:~$ sudo umount /dev/sdc1
    [sudo] password for myuser: 
    myuser@myhost:~$
    

    or

    myuser@myhost:~$ sudo umount /media/myuser/SD024-64GB
    [sudo] password for myuser: 
    myuser@myhost:~$
    
  2. You should be able to see the flash drive's eject icon disappear in nautilus as soon as umount finishes.

  3. 'udisksctl power-off -b /dev/sd{letter}{partition_number}' to turn off the disk.

    myuser@myhost:~$ udisksctl power-off -b /dev/disk/by-id/usb-PNY_USB_2.0_FD_AAC3170000000954-0:0
    

Notes:

  1. The device is typically of the format "/dev/sd{letter}{partition_number}" where {letter} is the disk, and {partition_number} is the partition number within that disk. Your disk may have more than one partitions mounted, so you will need to unmount all of the mounted partitions before the disk itself.
rcpa0
  • 604
6

eject from the eject package:

sudo eject /dev/sdX

appears to umount all partitions, and put the device in a state that you must remove and reattach it to remount.

0

You can use the seject command to safely eject USB drives on Linux command line.

It is a bash script that mimics the behavior of “Safely Remove USB Drive” in modern Linux Desktops. It unmounts all partitions, flushes write cache, and powers off the USB drive, using udisks2 under the hood.

It ensures data integrity by flushing the write cache, and confirming that no partitions remain mounted or in use, so the USB drive can be safely unplugged.

You can manually install it, or apt install the provided debian package.

It is a free and open source tool, available at:

https://github.com/rogeriooferraz/seject

(I'm the author of seject)