티스토리 툴바


XFS는 SGI에서 개발한 저널링 파일 시스템이다.  자세한 XFS 자랑거리(?)는 http://oss.sgi.com/projects/xfs 에서 참조할 수 있다.  (항상 그렇지만 나는 홈페이지들이 내세우는 자랑거리를 100% 믿지 않는다 ㅋㅋ)

어쨌든, 여기서 XFS의 방대한 기능과 동작원리에 대해서 논할 것은 아니고 (모르기 때문... -_-) XFS의 특이기능(?)이라고 할만한 realtime sub-volume을 사용하는 방법에 대해 알게된 내용을 잊어먹기 전에 적어 놓는 것 뿐이다..

XFS의 realtime sub-volume은 앞서 걸어놓은 링크에서도 확인되지만, 오직 data를 저장하기 위한 분리된 공간이며 realtime sub-volume의 공간은 realtime allocator에 의해 B+ tree 방식에 의해 관리된다.  그리고, realtime sub-volume은 media streaming application에 적합하다고 한다 (왜 -_-?).

어쨌거나, 이러한 XFS의 realtime sub-volume에 standard I/O로는 write가 되지 않고, 특별한 방법(?)을 거쳐야 한다.  이에 대한 내용은 http://oss.sgi.com/projects/xfs/papers/getting_started_with_xfs.pdf 에서도 찾아볼 수 있고, xfsprogs (XFS를 지원하기 위한 userspace application들의 모임에 대한 총칭?)의 source code에서도 찾아볼 수 있다.  여기서는 코드를 먼저 보고 소스를 보는 쪽으로 하겠다.  (문서보다는 코드가 좋다... -_-)

xfsprogs에는 xfs_io라는 application이 있는데, 이 application을 사용하면 realtime sub-volume에 write가 가능하다.

# xfs_io -fR /var/testfile -c 'pwrite -b 1m 0 16g'

위의 명령으로는 block size가 1M인 16GB짜리 file을 offset 0을 시작점으로 하여 생성하는 것이다.  -f는 생성, -R은 realtime을 사용하는 것을 의미, -c 이후는 command line이다.  만약 XFS partition을 생성할 때 realtime sub-volume을 지정해주지 않았다면, 이 명령은 당연히 실패할 것이다.  이 명령을 기준으로 xfsprogs의 source code를 훑어내다보면 xfsprogs/io/에서 (v3.1.4 기준) 힌트를 찾을 수 있다.

init.c에서 


case 'R':
flags |= IO_REALTIME;


를 찾아낼 수 있고, IO_REALTIME을 사용하는 open.c에서 다음과 같은 코드를 찾을 수 있다.


if (!(flags & IO_READONLY) && (flags & IO_REALTIME)) {
      struct fsxattr attr;  

      if (xfsctl(path, fd, XFS_IOC_FSGETXATTR, &attr) < 0) {
          perror("XFS_IOC_FSGETXATTR");
          close(fd);
          return -1;
      }  
      if (!(attr.fsx_xflags & XFS_XFLAG_REALTIME)) {
          attr.fsx_xflags |= XFS_XFLAG_REALTIME;
          if (xfsctl(path, fd, XFS_IOC_FSSETXATTR, &attr) < 0) {

              perror("XFS_IOC_FSSETXATTR");
              close(fd);
              return -1;
          }
    }  
}


결국 핵심은 bold 처리된 부분이다.  xfsctl(3)을 사용하지 않으면 realtime sub-volume에 write할 수 없는 것이다. 문서에서도 동일한 내용을 찾아볼 수 있다.

XFS의 구조에 대해 분석을 해봐야겠다는 욕구가 생긴다... 한번 해볼까.. 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 강군님

기능상에 아무런 차이가 없을 것 같지만, 혹시나 해서 찾아보고 있는데 결과는 마찬가지다.


round bracket : 주로 archive에 포함된 object들을 대체할 때 사용된다.

curly bracket : round bracket의 용도가 주로 저쪽으로 사용되니 일반적인 macro를 사용할 때 (CC로 컴파일러를 지정한다던지) 사용된다

nothing: $@ $< 등은 사용가능하지만 어디까지나 내부변수를 사용하는데 사용되도록 적극 권장된다.


몇개 링크를 찾았는데... 링크걸긴 귀찮고.. 구글링해서 얻은 정보.. 왤케 만사가 귀찮노.. -.-;

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 강군님