본문 바로가기

Projects/Server

ftp와 samba mount를 이용한 리눅스 기반의 분산 파일 스토리지 구축

제목이 우선 그럴듯 합니다 ㅋㅋ 저의 작명센스에 감복하여 주십시오... ㅎㅎ;;

제목 그대로 삼바를 이용해서 리눅스에서 윈도우즈의 스토리지에 읽고 쓸 수 있도록하고,
ftp서비스를 이용해 리눅스 사용자가 자신의 계정에 업로드를 할 때
리눅스 스토리지에 저장되는 것이 아닌, 삼바로 마운트한 윈도우즈 스토리지에 저장하는 시스템을 구축한 것입니다.

리눅스에 그냥 파일을 저장하면 되는데 왜 이러한 시스템을 구축했느냐...
그러한 이유는 다음과 같습니다.

1. 윈도우즈에서 파일을 관리하기 위함입니다.
사람들은 윈도우즈에서 파일을 많이 다룹니다. 따라서 윈도우즈의 파일 형식과 인코딩된 파일이름을 많이 사용하게 됩니다. 그런데 리눅스에서는 한글이나 기타 2바이트 문자들에 대한 인코딩 문제로 심하게는 파일을 인식하지 못하는 문제를 일으키기도 합니다.
 파일을 윈도우즈 스토리지에 저장하므로써, 파일들을 융통성있게 공유할 수 있습니다. 물론 리눅스에서 이러한 일들이 불가능한 것은 아닙니다. 그러나 공동 작업이 많이 이루어지는 윈도우즈 환경에서 편리하고 강력한 네트워크 폴더공유를 이용해, 각자의  ftp공간을 공유할 수 있도록 한다면, 협업 시스템을 위한 공동 작업장 형식의 스토리지 개념이 생성될 수 있습니다. 즉, ftp 공간과 네트워크 공유 공간이 나뉘어진 개념이 아닌 통합된 스토리지 개념이 되므로, 하나로 관리함으로써 더욱 편리해집니다.


2. 서비스 분리
파일을 저장하는 녀석과 파일을 제공하는 녀석은 따로 두고 싶은 마음에서 시도하게 되었습니다. 우리가 보통 대용량 하드디스크를 구입해서 일정 크기로 두 개의 파티션으로 나누고, 하나에는 운영체제를 비롯한 프로그램을 설치하고, 하나에는 일반 문서들이나 음악, 동영상 파일들을 저장하게 됩니다.
그처럼 마치 파티션을 두 개로 나눈듯한 분산 시스템을 구현해보고자 한 것입니다. 또한 웹서비스에서 사용되는 파일업로드와는 구분되게 파일서버 본연의 임무에 충실하게 만들고자 하였습니다. 따라서 대용량 파일 저장에 대한 리눅스서버의 부담을 덜어줄 수 있습니다.

이렇게 구성된 스토리지 서비스를 사용자가 ftp로 접속하게 되면, 다음과 같은 구조의 저장공간을 보게 됩니다.

사용자 루트--+--www
                   |
                   +--ftp

www디렉토리에는 사용자가 http 웹서비스로 보여줄 리소스들(html 파일이나 그림 파일등등)을 저장하는 곳입니다. 그리고 ftp가 바로 윈도우즈 공유폴더와 마운트한 디렉토리입니다.

여기서 사용자 루트를 통채로 마운트해서 www에 저장될 파일들을 윈도우즈 스토리지에 저장하면 안되느냐 의문이 들수 있으실텐데요... 그렇게 하지 않은 이유는 밑에 설명하겠습니다.(미리 말씀 드리자면 리눅스 권한 문제때문)

1.
우선 리눅스가 삼바를 통해 접속 가능하도록 윈도우즈의 계정을 하나 만들어줍니다.
(예를 들면 ftp // 123456 으로 만들었습니다.)
그리고 쓰기가 가능하도록 공유폴더를 하나 추가합니다.
그런데 여기서 폴더를 계정별로 쓰기가능하도록 지정할 수 있습니다.
windows xp의 경우 그런 기능이 숨겨져 있습니다.
폴더옵션을 열어서 보기의 고급설정에 보시면
모든 사용자에게 동일한 폴더 공유 권한을 지정의 체크를 해제하시면
계정별로 권한을 줄 수 있습니다.
ftp 사용자가 공유폴더에 쓰기 가능하도록 지정해줍니다.

2.
그리고 리눅스로 와서 mount 명령으로 윈도우즈 공유 폴더를 마운트 합니다.
우선 윈도우즈 공유폴더를 마운트할 디렉토리를 mkdir 명령으로 만들어 줘야겠죠..

그리고 여기서 ftp에 접속할 사용자의 uid와 gid를 알아두어야 합니다.
uid와 gid는 계정의 id 번호와 사용자가 속한 그룹의 id 번호입니다.
확인은 사용자,그룹 관리 툴을 사용해서 확인하실 수 있으며
/etc/passwd 파일을 열어서 볼 수 있습니다.

uid와 gid 그리고 umask=000을 해주는 이유는
그냥 마운트를 하게 되면 root 계정만 윈도우즈 공유폴더에 삼바를 통해 쓰기가 가능하고,
ftp를 통해 접속하게 되는 사용자는 윈도우즈 공유폴더에 쓰기가 불가능 합니다.
따라서 uid와 gid에 쓰기를 허용하고자 하는 사용자의 정보를 넣어 주는 것입니다.

예를 들어 리눅스의 soulfree(uid:501, gid:501)라는 계정이 ftp에 접속해서 윈도우즈 공유폴더(soulfree_ftp)에 파일 쓰기가 가능하도록 하고자 한다면,

mount -t smbfs -o username=ftp,password=123456,uid=501,gid=501,umask=000 //windows/soulfree_ftp ./ftp

파란색 부분은 윈도우즈에 접속하기 위한 윈도우즈 계정 정보입니다.
핑크색 부분은 마운트한 윈도우즈 공유폴더에 쓰기가 가능한 사용자를 지정해주는 부분입니다.
초록색 부분은 윈도우즈 공유폴더 위치입니다.
회색 부분은 윈도우즈 공유폴더를 리눅스 상에서 마운트시킬 리눅스 폴더입니다.

3.
ftp 서버를 실행합니다..
그리고 이제 ftp 클라이언트로 soulfree라는 계정으로 접속을 하면
마운트 시킨 ftp 디렉토리에 업로드가 가능합니다.
윈도우즈에서 공유폴더에 보면 soulfree 클라이언트가 업로드한 파일이 저장되어 있음을 확인 할 수 있습니다.

※ 그런데 왜 www의 파일들은 이런 방식을 사용하지 않았나?
리눅스 home 디렉토리에는 사용자들 이름으로 사용자 저장공간이 있습니다.
저는 각 사용자의 www 디렉토리에 http 리소스를 저장하도록 하였고, 아파치가 그것을 참조하여, 가상호스트로 작동하도록 하였습니다.
따라서 www내용을 윈도우즈에 저장하기위해서는, 윈도우즈에서 개인별로 www라는 이름의 공유폴더를 만들어 주어야하고, 그렇게 되면 공유폴더가 너무 많아 집니다.
사실 ftp 공유폴더도 개인당 하나씩 공유폴더가 생기는거라 공유폴더가 너무 많아지는 문제가 생깁니다.

그때문에 home 디렉토리 전체를 마운트하는 방법을 시도해봤습니다.
그러나 home 디렉토리 전체를 마운트함에 따라 특정 리눅스 명령어가 home 디렉토리에 쓰기가 제한되는 문제가 발생하더군요.
또한 ftp를 이용해 업로드 도중 접속을 끊었을 경우 I/O 교착상태가 발생해서 시스템이 마비되는 것을 경험했습니다.

그래서 soulfree라는 특정 계정의 공유폴더를 만들고 그것을 사용자 디렉토리에 마운트 하는 방법을 사용했습니다.
이 역시 read는 성공적이었으며, ftp 업로드도 문제없었습니다.
그러나 http 서비스를 이용한 업로드의 경우, 쓰기 권한이 없어 업로드가 되지 않는 문제가 생겼고,
제로보드의 경우, 마운트한 윈도우즈 폴더의 권한을,
chmod 등의 명령을 통한 리눅스 방식으로 설정할 방도를 제가 알지 못해서
사용하지 못하겠다는 결론에 도달했습니다.

그래서 ftp 전용 폴더를 만들게 된 것입니다...

문제점
사실 장점과 제 욕구에만 충실하기 위한 작업이었습니다.
그러나 이러한 작업을 자동화 하는 등의 해결해야할 문제점이 많이 남아 있습니다.

1.사용자 생성시 윈도우즈 공유폴더 추가 문제
쉘 스크립트로 자동화하여 사용할 시 문제입니다.
리눅스 사용자 추가시, 윈도우즈 공유폴더도 사용자 전용으로 자동으로 만들어 주어야합니다.
리눅스에서 윈도우즈에 폴더를 만드는 것 까지는 가능합니다. 그러나 리눅스에서 윈도우즈 폴더를 마운트 포인트로 만드는 것은 불가능합니다.

무슨 이야기인가 하면,
리눅스의 마운트 포인트로는 공유폴더로 지정한 그 위치만 가능하지,
공유폴더의 하위 폴더는 마운트 포인트로 지정할 수 없다는 것입니다.

따라서 윈도우즈 폴더를 자동 생성시키더라도, 공유 폴더 지정을 일일이 손으로 해주어야 합니다.

2. 기존 리눅스 ftp 저장소에 쓰기 문제
IT 공학 공부를 해오고 잠시 일도 해본 경험에서,,
사람들은 개발자들의 요구를 그리 귀기울이지 않습니다.
윈도우즈 공유폴더를 마운트한 ftp디렉토리를 따로 만들어 두었다고해서
반드시 그 디렉토리에 업로드 하지만은 않을 것입니다.
따라서 리눅스 스토리지에 저장한 파일들을 자동으로 ftp 디렉토리에 이동하도록 하는 방법이 있어야 할 것 같습니다.

3. 공유폴더의 숫자...
윈도우즈의 공유폴더는 탐색기에서 모두 나타나게 됩니다. 물론 접근은 안되지만 목록이 보이는 것 조차도 신경쓰이는 일이 아닐 수 없습니다. 이러한 서비스를 사용하는 사람이 얼마나 되는지 등의 정보를 알 수 있기 때문이죠.
그리고 공유폴더가 너무 많아지면 관리하는데 한계가 나타나게 될 것입니다.

너무 두서없이 끄적이고 기술적인 코드는 한줄이 고작이네요^^;;
그러나 나름 이기종간의 분산 파일 스토리지 공간을 이용해, 협업시스템에 적용하고자하는 패러다임을 구현했다고 생각됩니다.