2013년 12월 2일 월요일

[Linux] 리눅스에서 NTFS 파일시스템 읽고 쓰기

작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2003.11.09(일)

리눅스 커널에는 실험적으로 NTFS 파일시스템에 쓸 수 있도록 하고 있으나 혹시 발생할
수도 있는 문제 때문에 사용하는 이들은 많치 않을거라 생각된다.
이런 걱정을 할 필요없이 커널에서 지원하는 쓰기 모듈을 이용하지 않고 색다른 방법으로
NTFS을 다루는 방법(10월 공개적으로 발표된 툴)이 나왔다.
Jan Kratochvil씨가 만든 Captive 프로그램은 윈도우즈 NT(XP) 커널 에뮬레이션을 통해 NTFS
파일시스템을 리눅스에서 자유자재로 읽고 쓸 수 있도록 하고 있다. 에뮬레이션하는 것이라
XP에 설치된 ntoskrnl.exe와 ntfs.sys 파일이 반드시 필요하다.

1. Captive 설치 (redhat기준이나 별반 차이 없을 것이다.)

* Captive 홈페이지 : http://www.jankratochvil.net/project/captive/

Redhat 8과 9, Mandrake 9.x, Suse 9.0, Debian 등 여러 배포본별 패키지와 소스를 제공한다.

1) Captive 설치전에 NTFS 프로젝트( http://linux-ntfs.sourceforge.net/downloads.html #downloads )
홈에서 ntfsprogs (현재 ntfsprogs-1.8.0beta2-1.i386.rpm )을 받아 설치한다.

2) Captive 홈페이지에서 다음을 받아 설치한다.

captive-1.0.2-0.i386.rpm (397.6KB)
captive-lufs-1.0.2-0.i386.rpm (22.5KB)
captive-install-1.0.2-0.i386.rpm (57.3KB)
lufs-0.9.6-1captive6.i386.rpm (1.6MB)
gnome-vfs-httpcaptive-2.3.8captive2-0.i386.rpm (36.6KB)
ntfsprogs-gnomevfs-1.0.2-0.i386.rpm (11.8KB)

---------------------------------------------------------
# rpm -ivh *.rpm
---------------------------------------------------------

LUFS(Linux Userland File System)을 사용하기 때문에 위에서 보는 것처럼 lufs 패키지(lufs.o
커널 모듈이 포함되어 있음)이 필요하다.
참고로 LUFS는 FTP나 SSH, 그누텔라 등을 마운트해서 로컬 파일처럼 사용할 수 있도록 해준다.

3) captive-install-acquire 을 실행하면 창 하나가 뜰 것이다.

NTFS 파일시스템까지 뒤져가면서 ntfs.sys와 ntoskrnl.exe을 찾는다. 그러나 저의 경우
ntoskrnl.exe 파일이 분명히 존재하는데 뭐가 문제인지 찾지 못했다. 그래서 captive가 driver
를 저장해두는 /var/lib/captive 디렉토리에 직접 복사해 넣었다.

이제 설치는 끝났다.
captive 사용자가 생성되어 있고
/etc/fstab는 captive-install rpm 설치할 때 인식한 파티션 정보가 추가되어 있을 것이다.

---------------------------------------------------------
  /dev/hdb2 /mnt/captive-hdb_download captive-ntfs defaults,noauto 0 0
  /dev/hda1 /mnt/captive-c_linux   captive-ntfs defaults,noauto 0 0
---------------------------------------------------------

마운트 포인터로 표시된 hdb_download, c_linux는 Captive가 인식한 HDD의 볼륨명이다.
물론 /mnt 아래에도 마운트할 디렉토리가 이미 생성되어 있다.

2. NTFS 파일시스템 다루기

/etc/fstab에 이미 설정되어 있으므로 간단히 \\\'mount /dev/디바이스명\\\' 해도 읽고 쓸 수
있는 형태로 마운트된다. 처음 마운트할 때는 컴파일 과정이 필요하므로 시간이 걸릴 것이다.
( mount -t captive-ntfs /dev/hdb2 /mnt/마운트할_디렉토리명 )

---------------------------------------------------------
# mount /dev/hdb2
Captive NTFS v1.0.2. Check new version: http://www.jankratochvil.net/
# cd /mnt/captive-hdb_download
# cp ~/ntfs_rw.txt .
# ls -l
합계 1
  drwx------  1 root   root      0 7월 13 12:01 ?????? <-- 한글 파일명
  drwx------  1 root   root      0 7월 12 17:16 System Volume Information
  drwx------  1 root   root      0 9월 27 11:47 WUTemp
  ... 중략 ...
  -rw-------  1 root   root     6122 11월 9 22:57 ntfs_rw.txt
# mount
... 중략 ...
/dev/hdb2 on /mnt/captive-hdb_download type captive-ntfs (owner=0,fs=captivefs,mntent.mnt
fsname=/dev/hdb2,mntent.mnt_type=captive-ntfs,dir_cache_entries=0,image=/dev/hdb2,noauto,
aptive_options=--disk;--rw;--load-module=/var/lib/captive/ntoskrnl.exe;--filesystem=/var/
ib/captive/ntfs.sys;--sandbox-server=/usr/sbin/captive-sandbox-server;--bug-pathname=/var
lib/captive/bug-%FT%T.captivebug.xml.gz;--syslog;--rw,server_socket=/tmp/lufsd812572323,s
rver_pid=19268)
---------------------------------------------------------

* captive-ntfs : 마운트 타입
* --rw : 읽기 쓰기 형태로
* --load-module=/var/lib/captive/ntoskrnl.exe
* --sandbox-server=/usr/sbin/captive-sandbox-server : NTFS 액세스하도록 해주는 wrapper
마운트하게되면 항상 sandbox server 프로세스가 띄워져 있다.
* --bug-pathname=/var/lib/captive/bug-%FT%T.captivebug.xml.gz
버그러포팅이 저장되는 경로. 상당히 큰 파일이다.

3. 문제점을 하나씩 살펴보자.

그러나 이 것 또한 여러 문제점이 있다.
문제점에 비하면 쉽게 읽고 쓸 수 있다는게 더 매력적이지만.

1) 이미 알려진 문제로 한글을 포함한 여러 언어의 파일명을 표시하지 못한다. 위의 목록
에서도 ??? 로 표시된 것을 확인할 수 있다. (옵션 사용해도 의미 없음)

2) 아직은 윈도우즈 XP 드라이버만 호환성을 갖는다. 앞으로 윈도우즈 2000, NT 4.0, 2003
서버 드라이버도 호환을 갖도록 할 계획이라고 한다.
이 말이 XP 드라이버를 이용하여 윈도우즈 2000의 NTFS 파일시스템을 액세스 할 수 없다는
의미는 아닌 것 같다.

3) NTFS 파일시스템 액세스할 때 시스템 로드를 많이 잡아 먹는 경우가 종종 생긴다.

---------------------------------------------------------
   PID USER   PRI NI SIZE RSS SHARE STAT %CPU %MEM  TIME CPU COMMAND
  19271 captive  20  0 10776 10M 2500 R  71.5 2.8  0:06  0 captive-sandbox
  19268 root   16  0 13968 13M 4632 S  22.3 3.6  0:01  0 lufsd
---------------------------------------------------------

4) 제 시스템만의 문제인지는 모르겠으나
2개의 NTFS 파티션 중에 하나의 파티션(/dev/hda1)은 쓰기를 할 수 없었다.
써진 것 처럼 보이는데, 언마운트하고 다시 마운트해서 살펴보면 좀 전에 썼던 파일이 없었다.
발생한 에러 로그는 /var/log/messages에 남는데, 다음과 같은 에러 메시지를 볼 수 있었다.

---------------------------------------------------------
Nov 9 22:42:35 truefeel Captive[8019]: Filesystem crash broke dirty object: /kkkk
---------------------------------------------------------

5) 큰 파일 복사할 때 너무 오랜 시간이 걸린다.
성능이 1GHz CPU: read 1.5MB/s, write 500KB/s, 20MB of RAM 과 같이 개선되었다고 하나
실제로는 10MB 파일 1개 복사(write)하는데 1분 이상 걸렸다.

4. 참고 자료

* Captive 홈페이지
http://www.jankratochvil.net/project/captive/
* Linux-NTFS Project
( 참고로 커널 커파일이 귀찮은 사용자를 위해 NTFS 모듈을 별도로 제공한다. )
http://linux-ntfs.sourceforge.net/
* LUFS 홈페이지
http://lufs.sourceforge.net/lufs/

댓글 없음:

댓글 쓰기