마사키군의 다락방

끄적끄적할게 있을때 끄적거려 보관해두는 다락방

라즈베리 파이에 samba 설치해서 내부 공용 저장소로 쓰기

라즈베리 파이를 구입하면 누구나 한번쯤은 해보는 듯한 느낌이 드는(…) 외장 하드를 연결해서 samba로 내부 공용 저장소로 사용하기. 사실 설정 자체는 저번주 즈음에 다 했던거 같은데, 일단 이걸 정리해놔야 내가 다음에 하려는걸 했다가 실수로 날려먹어도 다시 설정할 수 있겠지(…) 싶어서 정리해둔다.

samba라는 것은 윈도우 운영체제에서 자원 공유시에 사용하는 프로토콜인 Server Message Block을 윈도우 운영체제 이외에서도 사용할 수 있도록 만들어진 프로그램이다. 자세한건 위키백과의 삼바 (소프트웨어) 항목이라도 참고하도록 하자 (…)

언제나 그렇듯이 명령어들에는 sudo를 따로 넣지 않았으니, 실행해보고는 권한 오류가 발생한다면 알아서(…) 첫머리에 sudo를 넣자.

준비 작업

가장 먼저 당연히 samba를 설치해야 하겠지만, 그 외에 NTFS-3G를 설치해야 한다. 리눅스에도 기본적으로 NTFS 파일 시스템을 사용할 수 있는 모듈이 있고, 그 모듈이 읽기만 지원하고 쓰기는 지원하지 않는다…는 이야기를 들었지만 딱히 사용해보지 않아서 잘 모르겠다. NTFS-3G는 NTFS 파일 시스템에 대해 읽기/쓰기를 동시에 지원하는 모듈이지만, 속도 부분에서 성능 이슈가 있다. 이건 아래쪽에서 짧게 다시 언급.

설마 그럴리는 없겠지만, 만약 외장하드로 FAT32 등 FAT 계통을 사용한다면 이 글 아래쪽의 뽀나스(…)를 참고하자.

아래 명령어로 NTFS-3G와 samba를 설치한다.

이후에는 사용자를 생성한다. 이 사용자는 외부에서 samba로 공유된 공유 폴더에 접근할 때 사용하는 사용자가 될 것이다. 여기서는 사용자 이름을 storage로 지정하려고 한다.

-m 옵션은 사용자 생성 후 홈 디렉토리를 생성해준다.

-G 옵션은 생성된 사용자를 특정 그룹에 소속되도록 하는데, 여기서는 users 그룹에 넣었다.

이렇게 생성된 사용자는 아직 패스워드가 없는 상태이므로 아래 명령어를 입력해서 패스워드를 생성해준다.

저장소 연결 및 공유할 폴더 생성

여기까지 진행되었으면 준비는 끝났으니 외장 하드를 라즈베리 파이 USB에 연결하… …면 될 것 같은데, 실제로는 라즈베리 파이의 USB 포트의 전력랑이 모자라서 인식이 안될수가 있다. 이럴때는 라즈베리파이 모델 B+ 에서 외장형 하드디스크(외장하드) 사용하기라는 글을 참고해서 전력량의 제한을 없애거나, 속편하게 외장 전원을 사용하는 USB 허브를 사용하자. 나는 그냥 남는 실은 소문을 듣고 라즈베리파이 살때 같이 샀던 USB 허브를 썼다.

여하튼 연결이 되었다면 장치 이름도 확인할 겸, 제대로 연결되었는지 확인해보자.

fdisk -l 명령어로 파티션 목록을 조회

fdisk -l 명령어로 파티션 목록을 조회

fdisk -l 명령어를 쓴다고 해서 파티션을 초기화한다거나 하는건 아니니 안심하자 정작 내가 MS-DOS때 생각이 나서 쫄았다는게 함정 .

위 결과 화면은 두개의 섹션으로 이루어져 있는데, /dev/mmcblk0p?는 라즈비안이 들어있는 SD 카드를 가리킨다. 당연히 이건 건드리지 않을거고, /dev/sda1이 연결된 USB 외장 하드이다. 즉, 장치 이름이 /dev/sda1이다.

장치 이름이 확인되었으면, 이 장치를 마운트할 마운트 포지션을 만들어야 한다. 마운트 포지션이라고 하니 괜히 단어가 거창하지만, 간단하게 말해서 외장 하드가 연결될 디렉토리 정도로 생각하면 되겠다. 여기서는 /media 디렉토리 아래에 USBHDD001 디렉토리를 만들어서, 이 디렉토리에 마운트를 시키려고 한다.

마운트 포지션을 만들었다면 이제 마운트를 하기 전… …에, 처음에 만든 사용자의 UID를 먼저 확인하자.

cat /etc/passwd

cat /etc/passwd

이건 현재 시스템에 생성되어 있는 유저 목록인데, 가장 마지막줄에  처음에 만든 storage 사용자가 있는게 보인다. :을 기준으로 세번째 항목, 즉 1001이 사용자 storage의 UID이다. 각 필드들의 의미가 궁금하다면 리눅스 /etc/passwd 와 /etc/shadow 필드 설명이라는 글을 참고하자.

UID까지 확인했다면, 외장 하드를 이번에 만든 디렉토리에 마운트하자.

뭔가 옵션이 좀 길고, 다른 사이트에서 보는것과 옵션이 다르기도 한데(…) 옵션은 아래와 같다.

  • -t ntfs-3g
    • 장치의 파일 시스템을 가리킨다. 사실 라즈비안이나 우분투는 NTFS-3G를 설치하면 자동으로 NTFS가 NTFS-3G의 심볼릭 링크가 되기 때문에, 이렇게 하지 말고 -t auto 로 지정해도 상관은 없다.
  • -o uid=1001,umask=000,noatime
    • -o 뒤에 붙는 것들은 마운트시의 옵션들이다. 즉, uid=1001이랑 umask=000, noatime 모두 부가적인 옵션들이다.
    • uid=1001
      • 장치를 특정 사용자의 소유로 마운트한다. 여기서는 위에서 확인한 storage 유저의 UID를 입력했으므로, storage의 소유로 마운트되게 된다. 사실 이 옵션은 없어도 상관없기는 한데, 자세한건 아래에서 다시 언급한다.
    • umask=000
      • 새로 생성될 파일과 디렉토리의 퍼미션 값을 mask 형태로 지정한다. 즉, 000으로 지정한 경우 (777-000)=777, 새로 생성될 파일과 디렉토리의 퍼미션을 777으로 지정한다.
    • noatime
      • 이 옵션은 성능이랑 관계가 있는데, 자세한건 mount 옵션비교 atime, noatime, relatime라는 글을 참고하자. 간단하게만 설명하자면, 파일 액세스시에는 액세스 타임을 기록하지 않고, 디스크에 쓰기 오퍼레이션이 발생했을 때만 시각을 기록한다.

설명이 길었는데, 위와 같이 마운트했다면 외장 하드를 쓸 수 있도록 마운트 된 상태일 것이다. 이대로 외장하드 전체를 공유해도 되겠지만, 나는 외장 하드의 각 디렉토리 별로 따로 목적을 부여해서 사용할 생각이 있기 때문에 공용 디렉토리를 하나 만들기로 했다. 이 부분은 각자 알아서-_- 하면 될거다.

samba 설정

여기까지 진행됬다면, 외장하드도 연결됬고, 공유할 공용 디렉토리도 만들었으니 바로 samba 설정을 하면 되겠다.

먼저, samba의 환경설정 파일인 smb.conf 파일을 삭제 후 다시 신규 생성하자. 기본 환경 파일에는 있는 내용이 많아서 헷갈리기도 하고, 현 시점에서 필요없는 내용(프린터 공유 등)도 있고 해서 굳이 원래 내용을 수정하는 것 보다는 지우고 새로 만드는 편이 깨끗하다고 생각했다.

아래 명령어는 smb.conf 파일을 삭제하지는 않고 파일이름만 바꾸고, 해당 파일을 새로 생성한다.

그러면 새로 생성된 smb.conf 파일을 편집기로 수정하자.

가장 먼저 파일 맨 위에 아래 내용을 작성한다.

여기까지는 samba의 전체 환경이 된다.

아, 그리고 나는 map to guest 옵션의 의미를 아무리 봐도 모르겠는데-_- 아시는 분이 알려주시면 수정해두도록 하겠다 ;;; 그러나 이런 불친절하고 내용도 없는 블로그에 와서 굳이 댓글까지 다는 사람은 없는데…

그리고 그 아래줄부터는 개별 공유 폴더를 설정한다. 위 내용을 그대로 따라왔다면 아래와 똑같이 작성하면 될 것이지만, 조금씩 다르게 진행했다면 개인에 맞춰서 수정하면 될거다.

역시 여기까지 진행되었다면 파일을 저장 후 닫고, 설정 파일이 올바르게 작성되었는지 확인하기 위해 아래 명령어를 입력해보자.

위 명령어 입력했을때, smb.conf 파일에 별다른 오류가 없다면 아래와 비슷하게 출력될 것이다(내 경우에는 위 설정이랑도 약간 다른 부분이 있기 때문에, 결과화면이 약간 다를수도 있겠다).

testparm

testparm

만약 smb.conf 파일에 오류가 있다면 환경설정의 어느 부분에 오류가 있는지를 알려준다. 만약 smb.conf 파일에 오류가 있다면 samba가 구동되지 않을수도 있기 때문에, smb.conf 파일을 수정했다면 한번씩은 termparm을 돌려보자.

여하튼 여기까지 진행했으면 이번엔 samba 유저의 패스워드를 변경해줘야 한다. 여기까지 죽 진행했다면 “뭥미?!” 할 수도 있겠지만-_- 시스템에 만든 유저와 samba 유저는 별개로 지정해야 한다. 이유는 알 수 없지만… 여하튼… 여하튼 아래 명령어로 samba 유저의 패스워드를 변경한다. 내 경우에는 맨 처음에 생성해준 시스템 패스워드와 동일하게 만들었다.

당연히 storage는 맨 처음에 만든 사용자 이름이다. -a 옵션은 정확히는 기억이 안나는데, 아마 강제로 패스워드를 변경하게 하는 옵션이었던거 같다. 예를 들어서 위 명령어에 -a 옵션을 빼고 입력하고서 패스워드 입력시 그냥 엔터를 치면 오류가 나는데, -a 옵션을 주면 깔끔하게 패스워드를 없애준다(?!).

사실 이 문제에 대해서는 passwd 파일과 smbpasswd 파일을 동기화시켜주는 스크립트를 짜라느니, smb.conf 파일에 설정을 해 두면 굳이 smbpasswd를 쓰지 않아도 된다느니 하는 이야기들이 있었지만, 해보지는 않아서 잘 모르겠다.

여하튼 여기까지 진행했다면 이제 samba를 재시작해보자.

여기까지 진행됬다면, 동일 네트워크 상에서 접속 및 데이터 액세스가 원할하게 진행되는지 확인해보면 되겠다.

탐색기를 실행해서 samba로 공유한 폴더를 확인해보기

탐색기를 실행해서 samba로 공유한 폴더를 확인해보기

정상적으로 설정됬다면 윈도우 탐색기에 smb.conf 파일에 설정한 server string 이름으로 컴퓨터가 나타난다. 아니면 Win+R을 눌러서 실행창에 “\\{라즈베리파이 IP}”를 입력해서 접속할 수도 있다. 맥에서는 바탕화면에서 Cmk+K 또는 파인더를 띄운 뒤 이동 > 서버에 연결을 선택해서. “smb://{라즈베리파이 IP}”를 입력한 뒤 연결 버튼을 클릭하자.

해당 컴퓨터로 접속해서 공유 폴더로 접근하려 하면 계정을 묻는데, 처음에 만들어준 사용자 이름과 나중에 지정해준 samba 패스워드를 입력해주면 되겠다. 그리고 해당 폴더에 파일 복사나 폴더 만들기 등이 제대로 되는지 확인해보면 되겠다.

영구적 마운트 설정하기

여기까지 진행했다면 별 문제없이 내부 네트웍에서 공용 저장소로 사용할 수 있지만, 라즈베리 파이를 재시작하면 다시 mount 명령어를 입력해서 새로 마운트시켜줘야 한다는 불편함이 있다. 이럴때는 영구적 마운트를 설정해두면, 라즈베리 파이를 재시작해도 자동으로 해당 장치를 마운트해주므로 편리하다.

영구적 마운트를 설정하기 위해서는 /etc/fstab 파일을 수정해야 한다. 언제나 그렇듯이 수정하기 위해서는 관리자 권한이 필요하다.

위 파일을 열어서 맨 아래줄에 아래와 같은 줄을 삽입한다.

각 항목은 탭으로 구별한다. 즉, 각 항목 사이에서 탭 키를 눌러서 공간을 벌려준다.

탭 기준으로 각 항목은 아래의 의미이다.

  • /dev/sda1
    • 마운트하려는 장치의 장치 명
  • /media/USBHDD001
    • 장치가 마운트될 마운트 포지션
  • ntfs-3g
    • 해당 장치의 파일 시스템. 마운트 명령에서 -t 옵션을 지정해줬던걸 그대로 쓰면 된다.
  • default,uid=1001,umask=000,noatime
    • 마운트 옵션. -o 옵션에서 지정해줬던걸 그대로 쓰면 된다. default는 사실 지정 안해줘도 되는데, 가장 기본적인 권한 옵션이다.
  • 0
    • 덤프 옵션으로, 0으로 지정하면 덤프 불가능하게 설정한다.
  • 0
    • 무결성 검사 옵션으로, 마찬가지로 0으로 지정하면 무결성 검사를 하지 않는다.

여기까지 설정하고 라즈베리 파이를 재시작해보면, 여전히 /media/USBHDD001 디렉토리에 외장 하드가 마운트되어 있는 것을 확인할 수 있다.

samba 데몬 자체는 시스템이 시작될 때마다 자동으로 구동되므로, 딱히 설정할 것은 없다.

뽀나스 (…)

외장하드가 FAT32인 경우

설마 요즘 시대에 그럴리는 없겠지만(…) 외장하드가 NTFS가 아니라 FAT32 등 FAT 계열일 경우, 아래와 같은 문제가 발생한다.

  • 공유된 폴더에 권한이 올바르게 부여되지 않아 접속이 불가하거나, 접속이 되더라도 데이터를 저장할 수 없다.
  • 권한을 올바르게 부여한다 하더라도, 한글 등 2바이트 문자가 들어간 파일이나 폴더를 생성할 수 없다.

첫번째 문제의 경우, FAT 계통은 파일 시스템 차원에서 유저의 권한을 지원하지 않기 때문에 발생하는 것 같다. 이 사태를 해결하기 위해서는 아예 마운트할때, samba 유저를 소유자로 지정해서 마운트하는게 가장 속편하다. 위에서 마운트할때 -o uid=1001로 소유자를 지정해준 이유가 이것으로, 이 문제 때문에 이것저것 실험하다 보니 아예 습관이 되어서 본문에도 지정해줬다 (…)

두번째 문제의 경우, 비슷하게 FAT 계통은 캐릭터셋을 지정해주지 않으면 데이터가 ANSI로 처리되기 때문인 것 같다. 이건 마운트하면서 iocharset으로 유니코드를 지정해주면 해결된다.

위 해결책을 모두 적용한 마운트 명령어는 아래와 같다.

그러니 우리는 FAT32를 멀리하고 걍 NTFS를 쓰는것이 낫습니다.

NTFS-3G의 성능 이슈

사실 NTFS-3G에는 성능적인 이슈가 있다. 작은 파일을 액세스할때는 크게 문제가 되지 않지만, 용량이 큰 파일을 액세스할때는 속도가 많이 느려진다는 것이다. 참고 페이지는 아래와 같다. 사실, 둘 다 같은 내용의 페이지다.

간단히 정리하면, NTFS-3G는 FUSE라는 파일 시스템 인터페이스를 이용하는데, FUSE는 일반 커널 드라이버가 아닌 사용자 영역 드라이버로 동작하기 때문에 일반 커널 드라이보다 속도가 느리다는 이야기. 2011년도에 작성된 글이라 지금도 해당되는 이야기인지는 잘 모르겠다. 하지만 NTFS-3G가 FUSE를 쓴다는 이야기는 지금도 해당되는 이야기인 것 같다.

일단 관련 글들을 찾아보면, 당시 글들의 경우 NTFS-3G를 계속 사용하다가 결국 ext4 등 리눅스 파일시스템으로 넘어가고 말았다는 글들이 좀 있었다.

웹 환경에서 samba 설정하기

웹 환경에서 samba를 설정해줄 수 있는 swat이라는게 있다. 아래 명령어로 swat을 설치할 수 있다.

그런데 swat의 경우, 접속자에게 root 권한을 부여해줘야 하는데 이 부분에서 잘 안되서 포기했다. 사실은 간단하게 root의 패스워드를 지정해주고 해당 패스워드로 접속하면 되지 않나 싶기도 했지만, 딱히 root의 패스워드를 지정해줄 생각이 없었기 때문에 그냥 포기했다.

접속자 확인 방법

라즈베리 파이에 설정해 둔 공유 폴더에 접속한 사용자를 조회해보기 위해서는 smbstatus 명령어를 사용하면 된다.

출처 및 참고 웹사이트

, , ,

4 thoughts on “라즈베리 파이에 samba 설치해서 내부 공용 저장소로 쓰기

  • snsn 말해보세요:

    타 기기가 삼바에 접근할 때, 로그인에 실패한 사용자들을 어떻게 취급할 것인지에 대한 설정이다. bad user 는 guest 를 허용한다는 뜻이다. never 면 로그인 실패 사용자들 접근 원천 봉쇄. 기타 몇가지 선택사항이 더 있다 라고 다른블로그 검색중에 발견하였습니다 ㅎㅎ 참고하세요~!

    • 마사키군 말해보세요:

      이크, 제가 댓댓글이 너무 늦었네요^^;;; 저 대신 검색해주시고 대단히 고맙습니다 ( __)
      말씀하신 내용은 저도 당시에 봤었는데, 내용이 잘 이해가 가질 않더라구요. 물론 그 항목 하나만 놓고 보면 별로 어려울 것 없는 별다른것도 없는 내용이기는 한데, 이게 다른 옵션이랑 합쳐지면 또 어떻게 되는건지도 모르겠고(제가 본문에 적었는지 모르겠는데, 공유 항목에도 guest 허용/비허용 옵션이 있습니다), 왜 bad user라는 값이 guest를 허용하는 값-_-이 되는건지도 모르겠고(값에도 뭔가 의미가 있어서 부여했을꺼 같은데 bad user는 뭔가 좀…) 여튼 너무 애매하게 느껴져서 “잘 모르겠다”라고 적었네요. 여튼 관심 가져주셔서 고맙습니다 🙂

  • 별가 말해보세요:

    ntfs 포멧형식으로하면 파일에 권한부여가 안된다고하는데
    제가 vsftp로 서버를 구축했습니다. fat형식으로 포멧을하는게 나을까요??

    • 마사키군 말해보세요:

      벌써 한달 전의 댓글이네요, 요즘 블로그에 신경을 잘 쓰지 못해서… 죄송합니다;
      권한 부여가 안되는건 아마 NTFS 계열이 아니라 FAT 계열일 것으로 생각됩니다. 왜냐하면 FAT 계열은 권한이라는 개념 자체가 없거든요; 권한까지 생각하신다면 하드디스크는 NTFS 형태로 만드시는게 좋을거 같아요.

snsn에 답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다