111 lines
3.5 KiB
Markdown
111 lines
3.5 KiB
Markdown
# Linux - unmount a busy target safely
|
|
|
|
# Goal - removing target without data loss
|
|
|
|
Unplugging or `unmount -l` (lazy unmount) can cause data loss. I want to share a way o avoid data loss.
|
|
|
|
**Side note**: `unmount -l` will let you unmount the device, but as far as I know only 'hides' the mountpoint, and active processes can still write on said device.
|
|
|
|
#### The problem
|
|
|
|
`Error unmounting /dev/sdc1: target is busy`
|
|
|
|
So, there are now different ways to unmount the target safely.
|
|
|
|
**Side note**: the most common case is that you are still in a directory of said target. It happened way too often to me.
|
|
|
|
## Preparation
|
|
|
|
Those steps are not necessary, but help you troubleshoot.
|
|
|
|
#### Finding the mount point
|
|
|
|
We are going to use `df -h` to find the mount point of the busy target. It is often not necessary, but it can be helpful.
|
|
|
|
```bash
|
|
kuser@pleasejustwork:~$ df -h
|
|
[...]
|
|
/dev/sdc1 59G 25G 35G 42% /media/kuser/hdd-target
|
|
```
|
|
|
|
#### Check if the device is still actively in use
|
|
|
|
Additionally, you can check the activity of said device with [iostat](https://www.man7.org/linux/man-pages/man1/iostat.1.html).
|
|
|
|
```bash
|
|
kuser@pleasejustwork:~$ iostat 1 -p sdc
|
|
|
|
vg-cpu: %user %nice %system %iowait %steal %idle
|
|
1,14 0,00 0,63 2,66 0,00 95,56
|
|
|
|
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
|
|
sdc 13,00 0,00 7,50 0,00 0 7 0
|
|
sdc1 13,00 0,00 7,50 0,00 0 7 0
|
|
```
|
|
|
|
`iostat` is powerful, but in this case the most important columns here are `kB_read/s kB_wrtn/s`. If there is anything but `0,00`, the device is in use.
|
|
|
|
If there is any activity and you unplug or unmount the device forcefully, data loss will most likely occur.
|
|
|
|
## Finding the process
|
|
|
|
### Using 'fuser'
|
|
|
|
More information can be found in the [manual of 'fuser'](https://linux.die.net/man/1/fuser).
|
|
|
|
```bash
|
|
kuser@pleasejustwork:~$ fuser -vm /dev/sdc1
|
|
USER PID ACCESS COMMAND
|
|
/dev/sdc1: root kernel mount /media/kuser/hdd-target
|
|
kuser 43966 F.c.. kate
|
|
kuser 44842 ..c.. kate
|
|
```
|
|
|
|
I prefer 'fuser' since it is installed on most OS and does the job too.
|
|
|
|
### Using 'lsof'
|
|
|
|
More information can be found in the [manual of 'lsof' (list open files)](https://linux.die.net/man/8/lsof).
|
|
|
|
```bash
|
|
kuser@pleasejustwork:~$ lsof /dev/sdc1
|
|
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
|
|
kate 43966 kuser cwd DIR 8,33 32768 1 /media/kuser/hdd-target
|
|
kate 43966 kuser 24w REG 8,33 142 2176 /media/kuser/hdd-target/.busybusy.txt.kate-swp
|
|
```
|
|
|
|
or
|
|
|
|
```bash
|
|
kuser@pleasejustwork:~$ lsof /media/kuser/hdd-target
|
|
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
|
|
kate 43966 kuser cwd DIR 8,33 32768 1 /media/kuser/hdd-target
|
|
kate 43966 kuser 24w REG 8,33 142 2176 /media/kuser/hdd-target/.busybusy.txt.kate-swp
|
|
```
|
|
|
|
### Kill process / close program
|
|
|
|
Kill process by PID:
|
|
: `sudo kill -9 43966`
|
|
|
|
or simply close the program that is using the file in the GUI.
|
|
|
|
### Unmount
|
|
|
|
Try to unmount again.
|
|
|
|
|
|
|
|
## Some other methods
|
|
|
|
I have had no problems with those yet, but some notable mentions.
|
|
|
|
Some other things to look into:
|
|
: check the swap partition: `cat /proc/swaps`
|
|
: stop nfs-kernel-server
|
|
: stop samba/smb server
|
|
: check for symbolic links
|
|
|
|
There are more scenarios in which a target can be busy, but this should cover 95% of cases.
|
|
|
|
---
|