대용량 FTP 서버 구축을 위한 팁
소프트웨어와 RAID 와 FTP 미러링

    박진우 / Hitel : Reduck98
    하이텔 리눅스 동호회 시삽

     

 

    국내외 FTP 사이트를 사용하는 사용자들이라면 한 번쯤 자신의 FTP 서버를 구축하는 것에 대해 생각해 보았을 것입니다. 그러나 대용량의 하드 디스크를 사려면 자금 사정 때문에 포기하게 되죠. 특히 리눅스 사용자들이라면... 그러나 리눅스는 가난한 사용자들을 위한 대안을 내놓았습니다. 소프트 RAID를 사용하여 대 용량의 하드를 직접 만들어 보는 것입니다.

     

RAID란 무엇인가?

    RAID란 Redundant Array of Inexpensive Disks 의 약자로서, 필자의 짧은 영어 실력으로 해석하면 '비싸지 않은 디스크의 용량을 정렬한다'라는 뜻입니다. 쉽게 해석하면 '값싼 하드를 잘 정리해서 쓸 수 있게끔 만들어 준다' 라고 생각하면 되겠죠. 그런데 필자가 따로 가격을 알아보면 결코 값싼 도구가 아닙니다. 물론 하드웨어적 RAID를 말하는 것이죠. 국내 모 유닉스 판매업체에 RAID의 가격에 대해 물어보았더니 가격이 천만원대였습니다. 여하튼 RAID는 리눅스 사용자들에게는 고가의 물건이죠.

     

리눅스에서 구현하는 Software 적 RAID

    리눅스의 문서를 잘 보면 'Software-RAID'라는 문서가 있습니다. 잘 읽어보면 필자가 무엇을 하려는지 잘 알 것입니다. 여하튼 리눅스에서의 RAID 소프트웨어를 설치하는 것은 상당히 쉽습니다. 다만, 문제가 있다면 커널을 다시 컴파일해야 한다는 불행이 있기는 하지만...

    리눅스에서 구현 가능한 RAID는 RAID-0 와 RAID-1입니다. 물론, 버전이 올라가면 관리면에서 효율이 좋아지기는 하지만, 현재 리눅스의 소프트웨어 RAID는 불안정한 버전입니다. 그래서 중요한 정보를 넣으려고 계획했던 사용자들은 계획을 바꾸기를 추천합니다. 필자의 경험으로는 무정전 시스템(UPS)을 설치하는 것이 자료를 보호하는 최선책이라 생각합니다.(물론 이 부분은 다른 사용자들도 동감할 것입니다.)

     

소프트웨어 RAID 설치하기

    일단 소스를 구해 봅시다. 최신 소스는 국내 유명 FTP 사이트에서 구할 수 있습니다.

      국내 FTP 사이트의 예 ;
      ftp://ftp.kreonet.re.kr/pub/Linux/redhat/contrib/SRPMS/md-035-3.src.rpm
      ftp://ftp.dacom.co.kr/pub/Linux/redhat-contrib/SRPMS/md-035-3.src.rpm 

    만약 국내에서 tgz 형식의 파일을 원하시는 분은 다음의 사이트를 방문하기 바랍니다.

      ftp://ftp.scu.ac.kr/pub/misc/md/md035.tar.gz

    레드햇 리눅스의 경우는 이미 컴파일되어 패키지되어진 것도 FTP 사이트에 올라가 있으니 패키지를 구해 바로 설치해도 무방합니다. 단, 커널 컴파일에서 md 부분을 사용할 수 있게 해준다는 전제가 있지만...

    소스를 풀어보면 커널 부분에 들어갈 부분이 README 안에 상세히 적혀 있습니다. 그러나, 커널 2.대 부터는 md 부분이 기본으로 들어가 있습니다. 그러므로 커널에서 md-de-vice 부분만을 허용해 주면 문제는 해결됩니다. 일단, kernel 설정 부분에서 md-device 부분을 yes로 해줍시다. 커널을 제대로 컴파일했으면 /dev 부분에 md0, md1, md2, md3 라는 device가 새로 생길 것입니다. 커널이 다 만들어졌으면 다음으로 md를 제어할 프로그램을 기분 좋게 설치하면 되겠죠.

     

RAID switch ON !

    이제 여러분들은 RAID의 전원을 올릴 준비가 다 되었습니다. 아참! RAID를 돌릴 PC에 하드는 미리 달아두어야 한다는 사실을 알리지 않았군요(죄송 죄송^^;). 자 ~ 전원을 끄고 하드를 설치합시다. SCSI든지, IDE든지 일단 달 수 있는 한 최대로 장착합시다.(필자의 경우, Floppy disk 까지 다 떼어 버렸습니다.) 이제 하드를 다 설치했나요? 하드는 부팅시 모두 인식되어야 합니다. 안되면 잘 될 때까지 해보세요. 재미있습니다.(^^;)

    자, 이제 다음과 같이 하드가 설치되었다는 가정 아래에서 문제를 풀어봅시다.

      Hard disk : SCSI hard 4°³

    sda, sdb, sdc, sdd 가 되는군요. 아, 성급하게 fdisk 와 mkfs 로 요리하지 마세요. 나중에 다시 해야 하니까요. IDE 방식의 하드라면 hda, hdb, hdc, hdd 가 되니까, 위의 문자들을 바꾸어 생각하면 됩니다. 위의 문자(sdX)가 뜻하는 것이 무엇인지는 이미 알고 계시겠죠?(사용자들을 무시하는 발언이 아닙니다.) 자, cat을 사용하여 md 상태를 봅시다.

      cat /proc/mdstat

    그럼 다음의 글이 나올 것입니다.

      [ftpadmin@ftp /]$ cat /proc/mdstat
      Personalities : [1 linear] [2 raid]
      read_ahrad not set
      md0 : inactive
      md1 : inactive
      md2 : inactive
      md3 : inactive 

    이제 자료를 담을 각 하드를 fdisk로 요리합시다. 요리하는 방법은 간단합니다. 각 하드의 모든 용량을 하나의 파티션으로 만들어서 하드에 쓰고 나오는 것입니다. 다음으로는 RAID가 어떤 하드로 만들어지는지 설정 파일을 만듭시다. 만드는 명령어는 mdcreate입니다.

      /sbin/mdcreate -c16k raid0 /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

    mdcreate 에 대한 명령어 설명은 man 페이지에 잘 나와 있더군요. 간단하게 설명하면 다음과 같습니다.

    md0 에 sda1 과 sdb1, sdc1, sdd1을 chunk size 16 으로 줘라 간단하죠? 이제 /etc 에 가보면 mdtab이라는 파일이 새로 생성되어 있습니다. 이 파일은 fstab 과 비슷한 성격을 띄고 있죠. 자, 설정 파일 생성이 끝났으니 이제 묶어 볼까요?

      [ftpadmin@ftp /]$ /sbin/mdadd -a
      [ftpadmin@ftp /]$ /sbin/mdrun -ar

    여기까지 아무 에러없이 왔으면 거의 성공한 것입니다. /proc/mdstat 의 내용을 봅시다.

      [ftpadmin@ftp ftp]$ cat /proc/mdstat
      Personalities : [1 linear] [2 raid0]
      read_ahead 120 sectors
      md0 : active raid0 sda1 sdb1 sdc1 sdd1 16771712 blocks 8k chunks
      md1 : inactive
      md2 : inactive
      md3 : inactive  

    이제 fdisk 로 md0를 설정할 차례입니다. md0를 하나의 하드라 생각하시고 파티션을 설정하기 바랍니다. fdisk를 마쳤으면 이제 fsck로 file system을 만들어야겠죠?

      [ftpadmin@ftp /]$ mkfs -t ext2 /dev/md0

    이제 하드까지 format 했으니 마운트 할 일만 남았네요.

    저는 md0를 /home/ftp/pub에 마운트 할 것입니다.

      [ftpadmin@ftp /]$ mount /dev/md0 /home/ftp/pub

    이제 대용량의 하드가 생겼습니다. 이제 마음대로 넣으세요. 그런데 또 한가지 고민이 생기죠? 하드는 큰데 사람이 일일이 넣어준다고 생각해 보세요. 이런 단순 노동을 사람이 좋아하겠습니까? 단순 노동에 대한 부분도 컴퓨터에게 맡긴다면 참 좋겠죠? mirroring 프로그램도 아예 설치해서 사용해 봅시다.

     

mirroring 프로그램 설치하기

    mirroring 프로그램은 여러 가지가 있습니다. 그 중 손쉽게 구해서 사용할 수 있는 프로그램을 설명하겠습니다.

      mirror-2.8-6.i386.rpm
      mirror-2.8-6.noarch.rpm 

    이 프로그램은 아래의 사이트 주소에서 구할 수 있습니다. 그리고 필자가 약간 수정해서 만든 mirror 프로그램도 다음의 사이트에 올리겠습니다.

      ftp://monster.scu.ac.kr/pub/mirror/mirror_fixed.tgz

    이 mirroring 프로그램은 perl 스크립트로 짜여져 있기 때문에 perl이 기본으로 설치되어 있어야 합니다. 설치를 다 하셨습니까? 이제 텅텅 빈 하드를 꽉 채울 일만 남았군요.

    mirroring을 하다보면 네트워크가 끊겨서 파일을 받다가 중도에 멈추는 일이 있습니다. 이럴 때 마다 사람이 다시 실행시켜 주면 번거롭겠죠? 이때도 컴퓨터의 힘을 빌립시다.

    다음의 csh  스크립트를 봅시다.

      repeat 10 mirror -d msdownload-nuri.net&

    위의 스크립트는 msdownload-nuri.net 에 설정되어 있는대로 mirror 프로그램을 10번 실행하라는 스크립트입니다. 간단하죠? 아, mirror 설정하는 부분을 예제 파일로 모르겠다고요? 그럼 다음을 보시면 아시게 됩니다.

    msdownload-nuri.net 에 있는 파일 내용

      package = MS
                      comment = MS
                      site = ftp.nuri.net
                      remote_dir = /msdownload
                      local_dir = /home/ftp/pub/msdownload
                      update_log = /message/msdown

    package 의 MS는 마음대로 설정해 주시고요, site는 ftp 사이트의 주소를, remote_dir은 ftp 사이트내의 directory 경로명, local_dir은 자신의 FTP 사이트 내의 directory 경로명을, 마지막으로 update_log는 mirroring 한 결과를 보여주는 파일을 저장하는 이름을 설정하는 부분입니다. 만약 anonymous 로 들어가지 못하는 사이트가 있다면 다음의 항을 추가시켜 주세요.

      remote_user = USER
                  remote_password =USER_PASSWORD

    USER에 상대편 서버의 계정을 쓰고, USER_PASSWORD에 암호를 넣으면 됩니다.

    이렇게 파일을 만들고 난 뒤, 모아두면 좋겠죠?

    이제 프로그램을 돌릴 스크립트를 만들어봅시다. 필자는 csh를 사용했습니다.

    mirror.csh 이라는 이름의 스크립트 내용

    ################# mirroring program ##################

    # !/bin/csh
    repeat 10 mirror -d HLaTeX-nuri.net&
    sleep 2
    repeat 10 mirror -d msdownload-nuri.net& 
    sleep 2
    repeat 10 mirror -d slackware-nuri.net&  
    sleep 2 

    ###############################################

    이렇게 만들어 둔 뒤, corn 으로 한 달에 한 번씩 돌려주면 더 이상 손 갈 일이 없게 되죠.

    이제 마지막으로 RAID를 부팅시 ON 해주는 스크립트를 만들고 서버를 리부팅 해 봅시다. 레드햇을 기준으로, /etc/rc.d/rc3.d 에 SXXmdstart 이라는 파일을 만들겠습니다.

    XX는 번호를 부여해 주면 되는데요, 제일 높을 번호를 주세요. 한 98정도 주세요. 이 부분에 대한 설명은 하지 않겠습니다. 그러면 S98mdstart 라는 파일이 되겠죠 ^^.

    S98mdstart 파일 내용

    #!/bin/sh
    #
    #
    ####### RAID ####
    /sbin/mdadd -a
    /sbin/mdrun -ar
    /sbin/fsck.ext2 -a /dev/md0
    mount /dev/md0 /home/ftp/pub

    이렇게 하면 시스템 부팅때마다 하드를 체크해서 자동으로 마운트하게 해줍니다. 아참, 다음의 명령을 잊지 마세요.

    [ftpadmin@fp rc3.d]$ chmod a+rx S98mdstsrt

    실행 가능한 명령어로 바꾸어야 부팅때 실행이 되겠죠.

     

후기

    현재 위와 같은 방법으로 FTP server를 운영하는 site가 점점 늘고 있는 추세입니다. 필자도 위와 같은 방법으로 교내 ftp 서버를 구축하였는데, 별다른 탈없이 잘 돌고 있습니다. 아직 RAID-1 방식은 도전하지 않았지만, RAID-0 가 안정성이 더 크므로 RAID-1은 추천하고 싶지 않네요. 아참, memory는 클수록 좋습니다. 여러명이 붙어서 사용하면 무리가 가죠. 특히 IDE 방식의 하드를 사용하신 분이라면 걱정이 됩니다.(^_^;)

    이 글을 쓰는데 도움을 주신 이호선(ahmlhs@nmsvr.chosun.com ; 현 ftp.hpcnet.ne.kr(구 ftp.kreonet.re.kr) 관리자)님께 감사의 뜻을 전하면서 모니터의 스위치를 끄겠습니다.




▲ top

home으로...