Linux System에서 Hotplug를 이용하여 USB를 마운트 시킬 때...

kleeck의 이미지


안녕하세요

Embedded Linux System에서 hotplug를 이용하여 USB를 마운트 시켜주는 스크립트를 작성 중에 있습니다.

다름이 아니라.. USB를 꼽거나 빼면은 /sys/driver/kernel/hotplug 에서 지정하는 /sbin/hotplug 스크립트를 실행을 하게 되어 있는데요

저한테는 /sbin/hotplug라는 스크립트 파일이 존재하지 않아서 직접 만들어주고자 합니다.

강제로 하드코딩으로 하여 마운트를 하였을 때는 자동으로 마운트를 하였지만 USB Port가 여러 개를 가지고 있을 때는 /dev/sda, /dev/sdb 이런식으로

잡히기 때문에 하드코딩으로는 하면 않되구요 무엇인가 동적으로 표현을 해야 하는데요

그래서 질문을 드립니다.

usb를 꼽거나 뺐을 경우 어떠한 이벤트를 통하여서 마운트를 하던가 언마운트를 하던가 해야 할텐데요

이걸 구분하는 무언가 있나요?

예를 들면 add/remove 시그널이 들어온다던가? 뭐 이런

그렇다면은 add 일 경우에는 마운트 시켜주고 remove일 경우에는 언마운트 시켜줘야 하거든요

답변 부탁드립니다.

bushi의 이미지

그 방식에선 환경변수로 전달됩니다.
ACTION, SUBSYSTEM, DEVTYPE, DEVNAME, MAJOR, MINOR, DEVPATH 등등.

kleeck의 이미지


네 USB를 이용하였을 경우 HOTPLUG로 이벤트가 전달되는 방식은 ACTION, SUBSYSTEM, 등 맞습니다.

USB를 강제로 뺏을시 umount를 실행시켜주면은

umount: cant`t umount /dev/sdb : Invalid argument 뜨면서

비정상적으로 디바이스가 종류되니 다음에 할당 받을 때 dev/sdb로 할당받지 못하고 sdc로 할당을 받아 버립니다.

아궁 ㅜ.ㅜ

bushi의 이미지

그건 hotplug 할애비가 와도 어쩌지 못하는데요.
빠져버린 다음에야 빠졌다는 걸 알 수 있으니 어쩌겠습니까.

그 시나리오에 대한 대응을 꼭 커널내에서만 끝장 보시겠다면,
http://www.compunauta.com/forums/linux/instalarlinux/supermount_en.html
정도의 접근을 추천합니다만,
어지간하면... umount 전에 어플을 죽여버리던가... 어플에게 신호를 보내서 사용 중이던 파일 닫고, 그쪽으로 디렉토리 이동한 놈은 원복시키던가 하시길 적극 권장합니다.

소개드린 supermount 는 가짜 파일 시스템을 만들어 inode/dnode 콜백등등을 모조리 후킹하는 방식으로 mount/umount 자체를 속입니다.
USB 처럼 device 자체가 빠져버리는 경우에도 그대로 써먹기는 어렵지만,
잘 고친다면... 제한된 시나리오 안에서 동작시키는 것이 불가능하지는 않다고 생각합니다.

FUSE 를 이용하면 유저 모드에서도 supermount 개념의 가짜 파일시스템을 운용하는 것이 가능하지만,
실제로 구현된 것이 있는 지는 찾아보지 않았습니다.
(생각같아선... 예제로 제공되는 놈을 조금만 손보면 될 것 같은데 말입니다)

kleeck의 이미지


에휴..

부쉬님 죄송합니다. 간단한 문제였습니다. opendir을 호출하여 디렉토리를 열었는데 closedir를 해주지 않아서

umount도 않되었던 것이었더군요.. 아휴..

일단은 해결은 했습니다. 감사합니다.

bushi의 이미지

opendir 은 물론이고, 마운트 된 곳의 어떤 파일을 열고 있다던가, 마운트 된 곳 어디론가 chdir을 했다던가 등등...

read/write 도중에 장치가 빠지면서 I/O 에러가 발생했는데 파일을 close 하지 않고 뛰쳐나오도록 예외처리를 한 경우엔 욕 나옵니다.
미리 약속된 신호 보내고 1초 기다렸다 무조건 fuser로 죽여버릴테니,
살고 싶으면 알아서 정리하고 닫을 거 닫으라고 말해주면 확실합니다만,
이게 또 이렇게 냉정하게 돌아서버리면 감정에 스크래치 나는거라... 가짜 파일시스템으로 세상을 속이는 수 밖에.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.