파일 시스템 ‘File Filesystem’ 공개 (2021)
(mgree.github.io)- ffs(file filesystem) 는 JSON, YAML, TOML 같은 반정형 데이터를 파일 시스템으로 마운트해 Unix 셸 도구로 탐색·편집하게 해주는 도구임
- Unix 셸은 문자열 처리 도구가 풍부하지만 기본 데이터 구조가 파일 시스템이라, 트리 형태 데이터 편집에는 잘 맞지 않음
ffs [file]은 파일을 마운트포인트에 연결하고, 언마운트 시 갱신된 결과를 stdout이나 지정한 출력 파일로 내보냄- 파일 쓰기와 디렉터리 생성이 JSON 키와 객체로 변환되며,
1,true,false, 빈 파일은 각각 숫자, 불리언, null 값으로 반영됨 - Linux는 FUSE, macOS는 macFUSE가 필요하고, Windows·FUSE 사용 불가 환경·검색 전용 작업·매우 큰 파일에는 맞지 않을 수 있음
반정형 데이터를 디렉터리처럼 다루기
- ffs는 file filesystem의 약자로, 반정형 데이터를 파일 시스템처럼 마운트해 익숙한 셸 도구로 작업하게 해줌
- 현재 지원 형식은 JSON, YAML, TOML이며, 더 많은 형식 지원이 예정돼 있음
- 자세한 사용법은
ffsmanpage에서 확인할 수 있음
마운트와 편집 흐름
- 기본 실행은
ffs [file]이며,file.blah를file마운트포인트에 마운트하고 최종 갱신본을 stdout으로 출력함 ffs -m MOUNT file로 명시적 마운트포인트를 지정하고,-o OUTPUT으로 출력 파일을 지정할 수 있음ffs -i file은 파일을 제자리에서 편집하며, 볼륨을 언마운트하면 결과가 다시file에 기록됨-
예제에서 보이는 변환 규칙
echo Mikey Indiana >object/name은 JSON의name값을 바꿈echo 1 >object/nose는 문자열이 아니라 숫자1로 반영됨mkdir object/pockets와 그 안의 파일들은 JSON 객체로 변환됨- 빈 파일
mistakes는 JSON에서null로 기록됨
설치 조건과 배포
- Linux에서는 FUSE가 필요함
- macOS에서는 macFUSE가 필요함
- 최신 개발 빌드는 Linux, macOS 단일 실행 파일로 제공됨
- 특정 릴리스는 release page에서 확인할 수 있고, 현재 버전은 0.1.2임
- source에서 빌드할 수도 있음
관련 자료와 비교 지점
- PLOS 2021 논문 “Files-as-Filesystems for POSIX Shell Data Processing”이 있음
- jq와 gron은 명령줄에서 JSON을 다루는 도구임
- ffs는 여러 형식을 지원하고, 익숙한 셸 도구로 편집할 수 있으며, 새 언어를 배울 필요가 없다는 점이 차별점임
- Windows 사용, FUSE 사용 불가, 검색만 필요한 작업, 매우 큰 파일은 ffs에 맞지 않을 수 있음
- 라이선스는 GPLv3임
댓글과 토론
Hacker News 의견들
-
이거 멋짐. 최근 libfuse를 Nim으로 감싼 뒤
hello파일시스템 예제를 포팅했고, 거의 같은 걸 만들어 봤음
내 버전은 데이터를 파이프로 넣고 마운트 지점을 지정해야 하며, 끝나면 결과를 표준 출력으로 씀. 그래서 파이프 체인 안에 끼워 넣을 수 있지만 출력도 직접 챙겨야 함
지금은 다른 것들도 파일시스템으로 만들 수 있을지 탐색 중임. Nimdow 창 관리자용 상태 표시줄도 만들었는데, 개별 파일에 내용을 쓰면 블록이 있는 바가 출력으로 생겨서 표시줄 내용을 쉽게 교체할 수 있음
또 만든 도구는 libvlc 기반 음악 플레이어임. 폴더를 주면 ID3 태그가 있는 미디어를 읽고by-artist,by-album같은 폴더를 구성함. 각 파일은-라는 이름이고 실제 파일의 전체 경로를 담음. 노래를 재생하려면 파일 하나를control/current로cat하고control/command에play를 쓰는 식임. 재생목록 기능과 명령이 더 있지만, 목표는 매우 스크립트하기 쉬운 음악 플레이어를 만드는 것임- 아이디어 하나: 코드 파일이나 프로젝트를 재귀적으로 마운트하는 것. tree-sitter 같은 걸로 클래스와 함수 정의를 추출해서, 실제 파일을 나타내는 디렉터리 안에 각각을 “파일”로 만들 수 있음
코드베이스 구조를 파악하고 싶으면 그냥tree를 실행하면 됨 :)
더 깊이 들어가면 import를 심볼릭 링크 등으로 해석할 수도 있을 것 같고, 흥미로운 가능성이 많음 - Nim 코드를 공유해 줄 수 있는지 궁금함. 한동안 FUSE로 뭔가 해보고 싶었고, 몇몇 프로젝트에서 Nim을 쓰고 있음
- 프로세스 정보를 파일시스템으로 쉽게 노출하는 내장 방식이 있으면 좋겠다는 생각이 듦
예를 들어 음악 플레이어의 현재 곡 이름을 얻으려고cat /proc/$pid/fs/current_track를 하거나, 브라우저의 열린 탭 목록을 보려고ls /proc/$pid/fs/tabs를 하는 식임. 어쩌면 HTML이나 포함된 이미지도 가져올 수 있을 것임
지금도 FUSE로 가능하긴 하지만 번거로워서 아무도 안 함
- 아이디어 하나: 코드 파일이나 프로젝트를 재귀적으로 마운트하는 것. tree-sitter 같은 걸로 클래스와 함수 정의를 추출해서, 실제 파일을 나타내는 디렉터리 안에 각각을 “파일”로 만들 수 있음
-
충분히 유용하니 운영체제 수준의 표준 기능이 되어야 한다고 봄
유닉스 계열 운영체제는 디스크 이미지를 마운트해서 내용을 둘러볼 수 있음. 그런데 파일 안의 파일을 탐색하면 유용한 형식은 훨씬 많음. 압축 아카이브가 대표적임
일부 파일 관리자가 이를 지원하지만, 애플리케이션 계층에 넣는 건 최적의 위치가 아니라고 봄. 파일 형식별 드라이버 같은 방식으로 구현할 수 있을 듯함- 정말 필요한 건 각 파일 형식마다 마운트 명령을 작성하는 방식과, 파일 형식을 감지해 적절히 디스패치하는 별도 명령임. 아마
file명령과 비슷할 것이고, 전부 사용자 공간에서 가능해야 함
지금 이를 막는 유일한 요인은 MacOS가 사용자 공간 파일시스템 API를 노출하지 않는다는 점임. Linux, Windows, BSD에서는 이미 가능함
Apple 개발자가 보고 있다면, 파일 제공자 확장으로는 부족함. FUSE에 해당하는 걸 달라. 존재한다는 건 알고 있음 - 이미 avfs가 있음. FUSE 파일시스템으로 이걸 해 줌. 사용법이 가장 직관적이진 않지만 작동하고 확장도 가능함
https://avf.sourceforge.net/ - 이건 reiserfsv4의 핵심 설계 기능이었지만 Linux는 결국 병합을 거부했음. 아마 아내 살해 사건도 도움이 되진 않았을 것임
- 진심으로 궁금한데, 이게 어떻게 유용한가? 실제로 쓸모 있을 만한 사용 사례가 잘 안 보임
- archivemount가 이미 그걸 한다고 생각했는데, 뭔가 놓치고 있는 건가?
어쨌든 그게 원하는 게 아니더라도 FUSE는 더 일반적인 메커니즘이라 원하는 일을 할 수 있게 해 줄 것 같고, 그 이상도 가능해 보임
- 정말 필요한 건 각 파일 형식마다 마운트 명령을 작성하는 방식과, 파일 형식을 감지해 적절히 디스패치하는 별도 명령임. 아마
-
git 커밋을 파일시스템으로 마운트할 수도 있음
https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-fold...
이전 글: https://news.ycombinator.com/item?id=38527866- 이제 어떤 리비전을 선택할지 정하는 거대한 규칙 더미만 있으면, 그 불경한 악마인 Rational ClearCase가 됨
-
제목을 보고 예전에 찾고 있었거나 직접 만들까 했던 것인 줄 알고 기대했음. 여기서 물어보면 좋을 것 같음
마운트된 동안에는 tmpfs처럼 메모리에서 동작하고, 언마운트할 때 디스크의 단일 파일로 직렬화하는 FUSE 파일시스템이 있을까?
가장 가까운 건 아카이브 파일을 마운트하는 FUSE 드라이버들이지만, 그러면 심볼릭 링크 같은 걸 얻기 어려움- 찾은 것 중 가장 가까운 건 https://github.com/guardianproject/libsqlfs임
libsqlfs는 SQLite 데이터베이스 위에 POSIX 스타일 파일시스템을 구현함. 단일 파일 안에서 자체 계층과 이름 공간을 가진 읽기/쓰기 파일시스템을 제공하고, 공유 라이브러리나 FUSE 모듈로 쓸 수 있음 - 순수 메모리 방식은 아니지만 https://github.com/jrwwallis/qcow2fuse 같은 게 가능할지도 모름
OSX의 DMG에 비하면 투박하지만, 관대하게 보면 비슷한 목적을 달성함
아니면 tmpfs를 감싸서 언마운트할 때 심볼릭 링크를 보존하는 tarball로 직렬화하도록 만들 수도 있음 - 왜 꼭 메모리에 있어야 하나?
이미 알고 있겠지만, 언마운트할 때만 버퍼를 플러시하면 데이터 손상으로 이어질 수 있는 현실적인 시나리오가 많음
그래도 풀려는 문제가 흥미로워 보임 - 꼭 FUSE여야 하나? 루프백으로 디스크 이미지를 마운트하면 안 되나?
- 정확히 그런 건 떠오르지 않지만, 어떤 이미지 파일을
/tmp로 복사해서 쓰다가 언마운트한 뒤 디스크로 옮기면 꽤 가까워질 것 같음
- 찾은 것 중 가장 가까운 건 https://github.com/guardianproject/libsqlfs임
-
Parts-of-file File System도 있음: https://www.usenix.org/conference/2005-usenix-annual-technic...
-
Omar Rizwan의 TabFS가 떠오름: <https://omar.website/tabfs/>
-
2003년에 이걸 해봤음. 놀랍게도 빠르고, 세밀한 잠금을 하기 쉬워짐
거대한 웹사이트 제작 도구용 웹 템플릿 언어에서 사용자별 데이터베이스로 썼음 -
제목을 봤을 때는 밈인 줄 알았음
그런데 정말 영리한 아이디어임. 개인적으로는 대부분의 데이터 처리를 더 고수준 언어에서 해서 직접 쓸 일은 잘 모르겠지만, 활용 사례를 찾을 사람들은 있을 것 같음
틀 밖에서 생각한 좋은 접근임 -
정말 좋아 보이고, 최대한 빨리 써봐야겠음
JSON 파일 안을 탐색하거나 검색하는 데 잘 쓸 수 있을 것 같음 -
이게 흥미롭다면 Solvent-Configr도 관심 가질 만함
https://aws.amazon.com/marketplace/pp/prodview-i3ym46leenag4
파일시스템 메커니즘으로 객체를 모델링해서, 파일시스템식 탐색을 지원하는 객체 기반 솔루션을 설계할 수 있음
데모: https://youtu.be/XgTgubZQPHw