[완료] FUSE 및 가상디스크 만들기(마운트)

snswin의 이미지

데스크탑 윈도우에서는 가상 디스크 드라이버를 만들수 있도록
개발자에게 노출되어 있는 것으로 알고 있습니다.
즉, 커널소스를 공개하지 않는 MS입장에서는 가상 디스크를
개발자가 만들수 있도록 노출하는 것이 어떻게 보면 당연하다고
생각이 듭니다.

"가상 디스크"라는 용어는 "실제로 존재하지는 않지만,
존재하는 것처럼 디스크 서비스(읽기/쓰기 등)를 제공하는
가상장치" 라고 사용하고 있습니다.
용어가 부적절하면 지적 바랍니다.
NFS를 사용하여 mount하는 볼륨의 경우 가상 디스크라고
할수도 있습니다.

제가 하고 싶은 것은, 파일 open/read/write/close를 가로채서
다른 행동을 하고 싶다는 것입니다.

리눅스에서는 FUSE 가 이런 일을 쉽게 해줄수 있습니다
그러나 그 FUSE는 커널에 일정 부분소스를 추가하고,
마운트 라이브러리를 별도로 제공(따져보면, fusermount를 사용하는
것이지만)하고, 사용자 인터페이스를 작성 할 수 있습니다.

여기서, 궁금한 것이 있습니다.
1. FUSE가 왜 커널소스에 추가가되어야 하나요?
insmode 같은 것을 통해서 register_filesystem하면 될것 같은데,
kernel과는 별도로 모듈을 설치하지 않나요? FUSE 소스를 좀더봐야
이답을 얻을수는 있겠지만, 먼저 알려주시면 제가 방향을 잡기 위한 시간을
벌 수 있을 것입니다.

2. 가상 디스크 라는 메카니즘이 리눅스에는 없나요?
단, xen은 논외 대상으로 했으면 합니다.
mount는 실제 물리적인 블럭디바이스가 있어야 가능합니다.
iso mount는 예외로 보면 되죠?
fusermount는 물리장치가 없어도 mount가 가능합니다.
FUSE가 fusermount를 사용하여, 결국에는 개발자가 핸들러 부분만
쉽게 코딩하여 원하는 서비스를 할수 있도록 되어 있습니다.
가상 디스크 라는 메카니즘이 있었다면 굳이 FUSE라는 것이 있을 필요
없겠다는 생각도 들고요. 가상 장치(디스크)를 시스템에 등록을하고
그 장치에 대한 출력 부분만 구현해줄 수 있는 심플한 형태를 찾고 있습니다.

제가 오해 하고 있는 부분이 있다면 지적해 주시기 바랍니다.
저도 정확한 것을 알고 있지 못하고 있기 때문에, 질문도 상당히 체계가
없어보입니다. 가르침을 바랍니다 ^^

익명 사용자의 이미지

man losetup해서 나오는 내용의 일부인데, 이걸 보고 드는 생각을 말씀해 주시면 좀 더 좋은 논의가 될거 같습니다.

EXAMPLE
       If you are using the loadable module you must have the module loaded first with the command
 
              # insmod loop.o
 
       Maybe also encryption modules are needed.
 
              # insmod des.o # insmod cryptoloop.o
 
       The following commands can be used as an example of using the loop device.
 
              # dd if=/dev/zero of=/file bs=1k count=100
              # losetup -e des /dev/loop0 /file
              Password:
              Init (up to 16 hex digits):
              # mkfs -t ext2 /dev/loop0 100
              # mount -t ext2 /dev/loop0 /mnt
               ...
              # umount /dev/loop0
              # losetup -d /dev/loop0
 
       If you are using the loadable module you may remove the module with the command
 
              # rmmod loop

iso mount가 예외는 아닙니다. 내부적으로 위와 같은 과정을 거칩니다.

여기서 문제는 커널이 ext2나 iso9660 같은 걸 이해할 수 있어야 한다는 점입니다.
fuse는 커널이 이걸 이해할 필요가 없습니다.

snswin의 이미지

아~~ 그렇군요.
ISO가 예외가 아니고, losetup 기반으로 가능하다는 것을 이제야 알았습니다.

답변 감사합니다.

위의 장황한 질문을 다시 한번 정리하자면
제 시나리오는 다음과 같습니다.
새로운 파일 시스템을 등록하면, 커널에서 그 등록된 파일 시스템 이름/핸들러를
기억하고 있다가...
파일시스템에 대한 시스콜이 있으면 VFS로 내려와서
등록된 파일시스템과 마운트 포인트를 알고 있기 때문에,
뒤져 보면 VFS가 이 시스콜을 어디로 넘겨야 되는지 알기 때문에,
굳이 커널이 ext2/iso9660 같은 것을 미리 알고 있어야 될 필요가 있는가?
각 파일시스템 모듈들이 올라갈때 자신의 파일시스템을 등록만 하면 되는것 아닌가요?

즉, 새로운 파일시스템을 구현하기 위해서는 커널에 반드시 코드가 들어가야 하는
이유를 모르겠습니다 ^^

인스톨러블(필요할때 작동하는) 드라이버와 같이
하나의 파일시스템도.. 그런식으로 처리되지 않는 이유를 모르겠습니다 ^^
(-> 그렇게 처리 되어 있는데 제가 몰라서 이런말씀을 드릴가능성도 있습니다 ^^)

-------------------------------------------
진실을 모르는 것은 어둡고 깊은 산에 혼자 있는 것과 같다.
어둡고 깊은산에 혼자 있어도 두렵지 않다면, 나는 이미 진실을 알고 있는 것이다.

익명 사용자의 이미지

말씀하신 내용을 구현한 것이 FUSE입니다.
인스톨러블 드라이버가 작용하는데는 커널에서 그렇게 되도록 하부 작업을 이미 해 주었기 때문이듯이, 커널에 FUSE를 포함시킨다(내장이든 모듈로서든)는 말은 이런 하부 작업을 해 준다는 말입니다.

fuseiso, fuseiso9660, fuseext2, fusesmb 등 모두 fuse를 기반으로 한 user space filesystem 구현이라고 볼 수 있습니다. 실예로 이런 것이 가능합니다.

$ fuseext2 -o ro /dev/sdb1 ./000

파일시스템 코드를 user space에 두느냐 kernel space에 두는 것이 좋은가 하는 논의는
microkernel, monolithic kernel 논의와도 연관되어 있습니다.

snswin의 이미지

네. 답변내용을 잘 알겠습니다.
제가 궁금해했던 많은 것들이 명확해진것 같습니다.

감사합니다 ^^

-------------------------------------------
진실을 모르는 것은 어둡고 깊은 산에 혼자 있는 것과 같다.
어둡고 깊은산에 혼자 있어도 두렵지 않다면, 나는 이미 진실을 알고 있는 것이다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.