mkfs.fat Device or resource busy 에러 해결법

 리눅스에서 SD 카드를 포맷할 때 아래와 같이 "Device or resource busy"에러를 출력하며 포맷이 되지 않는 경우가 있다.


mkfs.fat: unable to open /dev/mmcblk0p1: Device or resource busy


해결법을 찾아보았다.


이 문제의 원인은 

1. 파티션 dev path 가 맞지 않거나, 

2. umount가 완전히 이루어 지지 않았거나, 

3. mbr파티션에 문제가 있어 발생한다고 한다. 


파티션에 문제가 있는 경우 fdisk를 사용하면 문제를 해결할 수 있다.


umount에 문제가 있는 경우,

umount할 때 -l 옵션이 사용되는 경우 umount 명령이 끝나도 커널 내부에서 리소스가 계속 사용될 가능성이 있다고 한다. 

# umount -l /mnt/mmc

umount2("/mnt/mmc",MNT_DETACH);


이런 경우 일정 시간 후 다시 시도하면 에러 없이 포맷이 되는 경우가 있다.

또, umount 가 되지 않을 때 "lsof" , "fuser" 명령어를 사용하여 어떤 프로세스가 mmc를 사용하고 있는지도 확인 가능하다.

* lsof에서 사용 내역이 없다고 나와도, fuser에서 나올수 있다. 

lsof, fuser 명령에서도 mmc를 사용하는 프로세스가 없는 경우에도 "Device or resource busy"에러가 발생할 경우, umount에 -lf 옵션을 두어 강제로 언마운트 후 SD 카드를 포맷하면 "Device or resource busy"에러가 나타나지 않을 확률이 높아진다.

# umount -lf /mnt/mmc

umount2("/mnt/mmc",MNT_DETACH | MNT_FORCE);


* fat32에서는 "-f","MNT_FORCE"를 지원하지 않는다. (https://man7.org/linux/man-pages/man2/umount.2.html)


이렇게 해도 "Device or resource busy"에러가 발생할 경우 mkfs.fat에 --mbr=a 옵션을 추가해서 시도해 볼 수도 있다.  하지만 이런 경우 파티션에 문제가 있을 확률이 많으므로 fdisk를 사용하여 파티션을 새로 만든 후 포맷하는 것이 좋을 것 같다.




댓글

이 블로그의 인기 게시물

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

python winsound를 이용한 윈도우 환경에서 소리 재생 예제

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

base64 인코딩 디코딩 예제 c 소스

Eigen 라이브러리 matrix 사용법