이 블로그는 Web 환경을 이용한 원격 제어 기술에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Raspberry Pi와 Raspberry Pi Pico, ATmega128 보드, Arduino Mega 보드(ATmega2560), WiFi 모듈을 사용 합니다.

raspberry-usb-disk-network

Raspberry Pi External disk and sharing
Raspberry Pi - External disk 와 Network 환경에서 파일 전송과 관리(SSH, SFTP, FTP, SAMBA)


  • File system 개요
    • 파일 시스템(file system)은 ?
      • 파일 시스템(file system)은 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제를 가리키는 말이다.
      • 파일 시스템은 일반적으로 크기가 일정한 블록들의 배열(섹터라고도 불리며 통상 512바이트, 1키비바이트, 2키비바이트 같은 2를 제곱수만큼의 크기를 갖는다)에 접근할 수 있는 자료 보관 장치 위에 생성되어 이러한 배열들을 조직함으로 파일이나 디렉터리를 만들며 어느 부분이 파일이고 어느 부분이 공백인지를 구분하기 위하여 각 배열에 표시를 해 둔다.
      • 자료를 ‘클러스터’ 또는 ‘블록’이라고 불리는 일정한 단위(이것은 각 디스크 배열들에 대한 식별할 수 있는 번호를 제공하는데 통상 1부터 64까지가 쓰인다)에 새겨 넣는데 이것이 바로 파일 하나가 필요로 하는 디스크의 최소 공간이다.
    • 파일 시스템(file system)의 종류
      • 윈도우(Windows) 파일 시스템으로 주로 사용되는 시스템
        • FAT12: MS-DOS 초기부터 주로 쓰임, 플로피 디스크에서 사용
        • FAT16: 32메가바이트 이상의 하드 디스크를 지원하기 위해 MS-DOS 3.0과 함께 나왔으며 윈도우 95까지 주로 이용되었다. 최대 2기가바이트 파티션을 지원한다.
        • FAT32(File Allocation Table 32)
          • FAT32 오래되고 많이 사용되는 파일 시스템
          • 지원하는 드라이브 최대 용량 : 32GB
          • 파일 하나당 저장할 수 있는 최대 크기 : 4GB
          • 안정성이 좋다.
          • 다양한 OS, 기기에 대한 호환성이 좋다.
        • exFAT(Extended File Allocation Table)
          • exFAT는 NTFS의 호환성 문제를 극복하기 위하여 개발된 방식. FAT64라고도 한다.
          • 지원하는 드라이브 최대 용량 : 사실상 제한 없음
          • 파일 하나당 저장할 수 있는 최대 크기 : 사실상 제한 없음
          • 안정성이 떨어짐. Raspberry Pi 가 동작 중(USB 등을 사용하는 중)에 전원 케이블을 뽑는 경우 파일 소실 가능성 존재.
        • NTFS(New Technology File System)
          • NTFS는 FAT32의 약점을 보완하기 위해 개발된 파일 시스템
          • 지원하는 드라이브 최대 용량 : 256TB
          • 파일 하나당 저장할 수 있는 최대 크기 : 16TB
          • 윈도우에서는 최적화되어 있으나 Apple의 MAC OS, Google의 Android, Linux와 같은 기기에서는 사용에 제한이 있다. Raspberry Pi에서는 기본적으로 Read 동작만 가능하기 때문에 Read/Write 가 가능하도록하기 위하여는 별도로 드라이버를 설치(아래 "저장장치(디스크) 추가(Mounting)하기"를 참고요)하여야 한다.
      • 리눅스 파일 시스템으로 주로 사용되는 시스템
        • ext: ext(extended file system, 확장 파일 시스템)는 리눅스용 파일 시스템 가운데 하나로, 오늘날 많은 리눅스 배포판에서 주 파일 시스템으로 쓰이고 있다.
        • ext2: 호환성이 좋으며 안정성과 속도가 좋다. 리눅스 파일시스템의 대부분의 기능을 제공한다.
        • ext3: 최대 파일 크기: 16GB - 2TB한다. 최대 볼륨 크기: 2TB - 16TB, ext2에서 자료 삭제 및 손실 없이 ext3로 변경할 수 있다. 저널링 기능이 있다.
        • ext4: ext3의 성능을 향상시키고, 하위 호환성이 있는 확장 버전으로서 최대 파일 크기는 16TB(4k 블록 기준), 최대 볼륨 크기: 1EB엑사바이트
      • 애플(Apple) 파일 시스템으로 주로 사용되는 시스템
        • HFS(Hierarchical File System): Apple이 개발해서 Mac OS로 사용(1985년 9월 17일)된 파일 시스템. 최대 파일 개수 65,536개, 파일 용량 2GB, 파티션 용량 2TB
        • HFS+: HFS를 개선(1998년 1월 19일)한 시스템. 최대 파일 개수는 4,294,967,295개, 파일 및 파티션 용량은 8EB이다. Windows 컴퓨터에서는 HFS+를 읽거나 쓸 수 없다. Boot Camp에 설치된 Windows에서는 HFS+ 드라이버가 설치되나, 읽기만 가능하고 쓰기는 불가능하다.
        • APFS(Apple File System): HFS+를 대체하는 Apple의 차기 파일 시스템(2016년 WWDC에서 공개됨)이다. APFS는 암호화를 염두에 두고 설계되었고, 플래시 기반 저장장치에 최적화된 파일 시스템이다.

  • 저장장치(디스크) 추가(Mounting)하기
    • 디스크 선택하기
      • 표준 외장 하드 드라이브(HD), SSD 또는 USB 플래시를 사용할 수 있다.

      • 표준 외장 하드 드라이브
        • 저장 용량(4TB 정도)이 가장 크다.
        • Byte 당 가격(약 35.25원/1GB)이 가장 싸다.
        • SSD에 비교하여 속도(읽기 동작 시 150MB/s 정도)가 느리다.
        • 별도의 전원을 필요로 한다.
        • 물리적인 충격에 대한 안전성은 SSD에 비교하여 부족할 수 있으나 정전기와 고온에는 SSD 보다 안전성이 높다.
      • SSD
        • 저장 용량(500GB - 1TB)이 크다.
        • Byte 당 가격(약 190원/1GB)으로 하드 드라이브 보다 비싸다.
        • 하드 드라이브(HD)에 비교하여 속도(읽기 동작 시 USB 3.1: 500MB/s - 1000MB/s 정도)가 빠르다.
      • USB 메모리
        • 저장 용량(128GB - 500GB)
        • Byte 당 가격(약 130원/1GB)으로 SSD 보다 싸다.
        • SSD에 비교하여 속도(하드 드라이브(HD) USB 3.0: 150MB/s 정도)가 느리다.
        • SSD에 비교하여 작기 때문에 휴대하기 좋다.

        위에서 비교한 성능과 가격은(2021념 1월 기준) 제품에 따라 차이가 많기 때문에 참고용으로만 사용 바람.

        현재는 Raspberry Pi의 외장 드라이브로 USB 메모리(USB 3.0)를 사용하는 것도 권장할 만함.


      대부분의 경우 USB를 Raspberry Pi의 USB 포트에 삽입하면 자동으로 /media/pi/<USB-LABEL>에 마운트되기 때문에 Linux OS에 익숙하지 않은 사람은 아래 디스크 파티션과 포맷(Formatting) 부분을 생략하여도 USB 사용에는 문제가 없음.

    • 디스크 파티션(Partition)
      • 드라이브 식별하기
      • 드라이브를 식별하는 가장 쉬운 방법은 한 번에 하나씩 연결하면서 lsblk 명령으로 확인하는 것 이다. Linux 명령 lsblk는 모든 대용량 저장 장치를 나열한다.

        lsblk 명령으로 모든 대용량 저장 장치를 나열한 예

        위에서 mmcblk0 드라이브는 Raspberry Pi에 내장된 SD 카드이기 때문에 이 드라이브는 변경하면 않된다.

        위 예에서 USB는 sda 디스크에 sda1 이름으로 파티션되어 있고, /media/pi/usb로 마운트되어 있다.

      • 파티션 생성하기
        • 아래 예는 fdisk 도구를 사용하여 기존 파티션을 지우고 새 파티션을 만드는 예이다.

          새 파티션을 만드는 것은 디스크의 용량이 충분히 커서 여러개의 파티션으로 나누어 사용(Windows 시스템에서 하나의 디스크를 C: , D: 로 나누어 사용하는 경우에 해당함)하고자 하는 경우에만 필요하다.

        • fdisk 명령을 사용한 파티션 생성 예
          • 다음 명령을 사용하여 fdisk를 실행한다.
          • $ sudo fdisk /dev/sda

            아래 예와 같이 fdisk 명령을 실행하면 "Welcome to ... " 메세지가 출력되고 이어서 새 명령을 입력 받기 위한 "Command (m for help): " 메세지가 출력된다.

            아래 예는 fdisk 명령 메세지에서 입력할 수 있는 명령을 확인하기 위하여 Help 명령(m)을 입력한 예로 아래 Help 메세지를 참고하여 fdisk를 실행한다.

            
            pi@raspberrypi:~ $ sudo fdisk /dev/sda
            
            Welcome to fdisk (util-linux 2.29.2).
            Changes will remain in memory only, until you decide to write them.
            Be careful before using the write command.
            
            Command (m for help): m
            
            Help:
            
              DOS (MBR)
               a   toggle a bootable flag
               b   edit nested BSD disklabel
               c   toggle the dos compatibility flag
            
              Generic
               d   delete a partition
               F   list free unpartitioned space
               l   list known partition types
               n   add a new partition
               p   print the partition table
               t   change a partition type
               v   verify the partition table
               i   print information about a partition
            
              Misc
               m   print this menu
               u   change display/entry units
               x   extra functionality (experts only)
            
              Script
               I   load disk layout from sfdisk script file
               O   dump disk layout to sfdisk script file
            
              Save & Exit
               w   write table to disk and exit
               q   quit without saving changes
            
              Create a new label
               g   create a new empty GPT partition table
               G   create a new empty SGI (IRIX) partition table
               o   create a new empty DOS partition table
               s   create a new empty Sun partition table
            
            Command (m for help):
                      

            아래 예에서 회색 배경에 검은색 문자는 fdisk 명령의 메세지, 적색 문자는 입력 명령이다.

          • 아래와 같이 o 명령을 사용하여 새(비어 있는) DOS partition table을 생성한다.
          • Command (m for help): o

            Created a new DOS disklabel with disk identifier 0x7508d343.

            위 예에서 o 명령은 위 Help 메세지의 "Create a new label"에 있는 명령으로 새(비어 있는)DOS partition table을 생성하는 명령이다.

          • 아래 예는 기본값(default)을 이용하여 단일 파티션을 만드는 예 이다. (default) 값이 주어진 경에 이 값을 사용하는 경우는 별도의 명령 없이 Enter 키를 누른다.
          • Command (m for help): n

            Partition type

                p primary (0 primary, 0 extended, 4 free)

                e extended (container for logical partitions) Select (default p):

            Select (default p):


            Using default response p.

            Partition number (1-4, default 1):

            First sector (2048-60088319, default 2048)

            Last sector, +sectors or +size{K,M,G,T,P} (2048-60088319, default 60088319):


            Created a new partition 1 of type 'Linux' and of size 28.7 GiB.


            Command (m for help):

          • 마지막으로 w 명령을 사용하여 변경 사항을 저장한다.
          • Command (m for help): w

            The partition table has been altered.

            Calling ioctl() to re-read partition table.

            Syncing disks.


            pi@nodezero:~ $

    • 디스크 포맷 하기(Formatting)
      • 포맷팅(Formatting)은 디스크 파티션(Partition)을 사용할 수 있는 상태로 초기화(새로운 파일 시스템을 만들 거나 기존 파일 시스템을 다른 파일 시스템으로 변경한다.)하는 것을 말한다. 파티션을 포맷하면 파티션의 모든 내용이 삭제되기 때문에 주의를 요한다.된다.

      • 다음 명령을 사용하여 새 파티션이 생성되었는지 확인할 수 있다.
      • $ sudo fdisk -l /dev/sda

        새 파티션이 생성되었는지 확인하는 예

        위 예에서 Device name: /dev/sda1 으로 새 파티션이 생성되었음을 알 수 있다. 이 Device name은 아래 포맷 명령에서 사용된다.

      • 포맷 명령의 형태는 다음과 같다.
        • $ sudo mkfs.FILETYPE OPTION DEVICE

        • FILETYPE: 자주 사용되는 FILETYPE은 아래와 같다.
          • Linux: EXT3, EXT4
          • Windows: NTFS, FAT32
          • Apple: APFS, HFS+
        • DEVICE: 위 "새 파티션이 생성되었는지 확인하는 예"에서 확인한 Device name(예: /dev/sda1)을 사용한다.
        • 다음 명령은 새 파티션(예: /dev/sda1)을 File type ext4로 포맷하고, 고유 한 레이블(이 예에서는 레이블을 usb로 함)을 부여하는 예 이다.
        • $ sudo mkfs.ext4 -L usb /dev/sda1

        • 다음 명령은 새 파티션(예: /dev/sda1)을 File type ntfs로 포맷하고, 고유 한 레이블(이 예에서는 레이블을 usb로 함)을 부여하고 Fast option(-f)을 사용하여 포맷하는 예 이다.
        • $ sudo mkfs.ntfs -f -L usb /dev/sda1

          주: 저장장치(Device)가 현재 마운트되어 있는 경우에는 Unmounting 후 포맷하여야 한다. Unmounting 명령 예: sudo umount /media/pi/usb

          주: 포맷한 다음 장치를 사용하기 위하여는 아래 "저장장치(디스크) 추가(Mounting)하기"를 참고하여 Mounting을 하여야 한다.

          주: File type은 Linux에서만 사용하는 경우에는 ext4, Windows와 Linux에서 공용으로 사용하는 경우에는 ntfs을 추천한다.

          주: USB를 Windows PC와 Raspberry Pi에서 공용으로 사용 경우에는 Windows PC에서 ntfs으로 포맷한 다음 Raspberry Pi에서 사용할 수도 있다. 이 경우 USB를 Raspberry Pi에 삽입하면 자동으로 /media/pi/<HARD-DRIVE-LABEL> 위치에 마운트되기 때문에 Raspberry Pi에서 별도로 동일한 이름(/media/pi/<HARD-DRIVE-LABEL>)으로 Mounting을 하면 안된다. Raspberry Pi에서 별도로 동일한 이름의 폴더를 만들어 마운트하면 USB를 Raspberry Pi에 삽입할 때 자동으로 마운트된 장치와 서로 다른 장치로 인식된다.

    • 저장장치(디스크) 추가(Mounting)하기
      • 외장 하드 디스크, SSD 또는 USB 메모리(스틱)을 Raspberry Pi의 USB 포트에 연결하고 파일 시스템을 마운트하여 저장된 데이터에 액세스 할 수 있다.

        기본적으로 Raspberry Pi는 /media/pi/<HARD-DRIVE-LABEL> 위치(이 예에서는 <HARD-DRIVE-LABEL>을 usb로 하였음)에 FAT, NTFS 및 HFS+와 같이 널리 사용되는 파일 시스템을 자동으로 마운트한다.

        항상 선택한 특정 위치에 마운트되도록 저장 장치를 설정하려면 수동으로 마운트하여야 한다. 그러나 USB 메모리와 같이 Raspberry Pi의 전원이 인가된 상태에서 삽입 또는 제거하는 장치는 파일 시스템을 자동으로 마운트하는 기능과 수동 마운트 설정이 충돌할 우려가 있기 때문에 가능한 자동으로 마운트하는 것을 본인은 권장한다.

      • 저장장치(디스크) 추가(Mounting)하기
        • 저장 장치를 Raspberry Pi의 USB 포트에 연결한다.
        • 다음 명령을 사용하여 Pi의 모든 디스크 파티션을 나열한다.
        • sudo lsblk -o UUID,NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,MODEL

          Raspberry Pi는 마운트 포인트 / 와 /boot를 사용한다. 다른 연결된 저장 장치와 함께 추가한 저장 장치가이 목록에 표시된다.

        • FSTYPE 열에는 파일 시스템 유형이 포함된다. 저장 장치가 exFAT 파일 시스템을 사용하는 경우 아래 명령으로 exFAT 드라이버를 설치한다.
        • sudo apt update

          sudo apt install exfat-fuse

        • 저장 장치가 NTFS 파일 시스템을 사용하는 경우 Raspberry Pi OS는 읽기 전용 액세스 권한만 있기 때문에 장치에 쓰기를 하려면 아레 명령으로 ntfs-3g 드라이버를 설치하여야 한다.
        • sudo apt update

          sudo apt install ntfs-3g

        • 다음 명령을 실행하여 디스크 파티션 정보(위치)를 가져온다.
        • sudo blkid

          예: 파티션 이름 -> /dev/sda1 , UUID -> 72F0A91BF0A8E697 , Type -> ntfs 등의 정보가 출력된다.

        • 저장 장치의 탑재 지점이 될 대상 폴더를 만든다. 마운트 지점 이름(Mount point name)을 /mnt/usb(mnt 폴더에 이름을 usb)로 하는 경우 명령 예는 아래와 같다. 마운트 지점 이름은 원하는 이름으로 지정할 수 있다.
        • sudo mkdir /mnt/usb

        • 아래 명령의 예와 같이 폴더와 파일의 권한을 변경한다.
        • sudo chown -R pi:pi /mnt/usb

        • 아래와 예와 같은 명령으로 생성 한 마운트 지점에 저장 장치를 마운트한다.
        • sudo mount /dev/sda1 /mnt/usb

          주: USB 메모리 등을 이용하는 경우, 장치를 삽입하면 자동으로 /media/pi/<HARD-DRIVE-LABEL> 위치에 마운트되기 때문에 위 명령을 실행하면 Error 가 발생한다. 위 명령으로 다른 위치에 USB 메모리 등을 마운트 하는 경우 먼저 아래 명령으로 Unmounting을 실행하여야 한다.

          sudo umount /media/pi/<HARD-DRIVE-LABEL>

        • 대상 폴더의 내용을 나열(Listing)하여 저장 장치가 성공적으로 마운트되었는지 확인한다.
        • ls /mnt/usb

      • Automatic mounting 설정
        • /etc/fstab 파일을 수정하여 Raspberry Pi가 시작될 때 저장 장치가 자동으로 마운트 될 위치를 설정할 수 있다. fstab 파일에서 디스크 파티션은 파티션 이름 또는 UUID (Universally Unique Identifier)로 식별된다.

        • 아래 명령으로 디스크 파티션 정보(파티션 이름, Label, UUID, Type 등)를 가져온다.
        • sudo blkid

        • 목록에서 디스크 파티션을 찾고 파티션 이름 또는 UUID, 파일 Type을 기록해 둔다. 예: 파티션 이름 -> /dev/sda1 , UUID -> 72F0A91BF0A8E697 , Type -> ext4
        • nano와 같은 명령 줄 편집기를 사용하여 fstab 파일을 열고 아래 예와 같이 편집한다.
        • /dev/sda1 /mnt/usb fstype auto defaults,users 0 1

          위에서 fstype는 파일 시스템 유형으로 위에서 찾은 파일 시스템 유형(FSTYPE)이다 예 : ext4 or ntfs 등

          이제 fstab에 장치가 자동으로 마운트되도록 설정 하였기 때문에 저장 장치를 연결하고 Raspberry Pi를 시작하면 장치가 자동으로 마운트 된다.

          주의: /etc/fstab 파일은 부팅 시 필요한 설정을 저장하고 있는 중요한 파일로 잘못 설정된 경우 시스템이 정상적으로 부팅되지 않을 수 있기 때문에 주의를 요한다.

      • 저장 장치 Unmounting
        • Raspberry Pi를 종료한 후에는 안전하게 장치를 분리할 수 있다. 만약 Raspberry Pi를 종료하지 않은 상태에서 분리하는 경우에는 아래 명령을 실행하여 수동으로 분리하여야 한다.
        • sudo umount /mnt/usb

        • 'target is busy'라는 오류가 발생하면 저장 장치가 마운트 해제되지 않았음을 의미한다. 오류가 표시되지 않으면 이제 안전하게 장치를 분리 할 수 있다.
        • 'target is busy'라는 오류가 발생한 경우의 처리
          • 'target is busy' 메시지는 저장 장치에 프로그램에서 사용중인 파일이 있음을 의미한다. 다음 절차에 따라 파일을 닫고 umount 명령을 다시 실행하여야 한다.

          • 저장 장치에 있는 모든 열린 파일을 닫는다.
          • 터미널이 열려있는 경우 마운트 된 폴더 나 하위 폴더에 터미널이 있지 않은지 확인한다.
          • 그래도 저장 장치를 마운트 해제 할 수없는 경우 lsof 도구를 사용하여 장치에서 파일이 열려있는 프로그램을 확인할 수 있다. 먼저 apt를 사용하여 lsof를 설치해야 한다.
          • 아래 명령을 사용하여 lsof를 설치한다.
          • sudo apt update

            sudo apt install lsof

          • 아래 명령으로 열린 파일을 확인한다.
          • lsof /mnt/usb

    • Filesystem 안전하게 사용하기
      • 항상 "sudo shutdown -h 0" 또는 "sudo halt -h"로 종료하는 것이 좋다. Raspberry Pi 가 동작 중에 전원 케이블을 뽑는 것은 나쁜 습관이다.
      • 드라이브를 일시적으로 만 사용하는 경우 USB 케이블을 빼기 전에 "sudo umount /mnt/usb" 명령(/media/pi/usb에 마운트된 경우에는 "sudo umount /media/pi/usb")을 실행하거나 시스템을 먼저 종료하는 것이 안전하다.
      • 전원이 차단되거나 실수로 전원이 꺼진 경우 다음과 같이 파일 시스템을 복구 할 수 있다.
      • 
        $ sudo umount /mnt/usb
        $ sudo fsck /dev/sda1
        fsck from util-linux 2.29.2
        e2fsck 1.43.4 (31-Jan-2017)
        usb: clean, 12/1880480 files, 162084/7510784 blocks
              

  • Network 환경에서 파일 전송과 관리
    • SFTP(SSH File Transfer Protocol)
      • SFTP(SSH File Transfer Protocol, or Secure File Transfer Protocol)는 Raspberry Pi에 기본으로 설치되어 있는 파일 전송과 관리를 위한 Tool 이다.
      • Raspberry Pi에서 SSH 프로토콜을 이용 할 수 있도록 설정 하면 SFTP Server가 활성화되어 SFTP를 이용한 파일 전송과 관리가 가능하게 된다.
      • 데스크탑(GUI 환경) 또는 터미널(PuTTY 이용)에서 SSH를 활성화(아래 자료를 참고요) 할 수 있다.
      • 참고자료: 원격 접속(SSH, VNC) 설정 하기

      • SFTP Server가 활성화되면 Windows와 Linux 환경에서 SFTP client(WinSCP, FileZilla 등)를 사용하여 용이하게 SSH를 통한 파일 액세스, 파일 전송 및 파일 관리를 할 수 있다.
      • 주: SFTP Server에 접속하기 위하여는 SSH를 보안키가 필요한다. SSH를 사용하기 위한 보안키 설정은 "PuTTY에서 SSH를 사용하여 원격접속하기"

        를 참고 바람.
      • WinSCP를 이용한 원격 파일 관리는 "WinSCP를 이용한 원격 파일 관리"를 참고 바람.
      • FileZilla를 이용한 원격 파일 관리
      • FileZilla 클라이언트(Client)는 FTP, SFTP, FTPS (FTP over TLS)를 지원하는 GNU(General Public License) 조건에 따라 무료로 배포되는 오픈 소스 소프트웨어이다. FileZilla는 클라이언트(Client)와 서버(Server)를 함께 지원한다.

        FileZilla Client 실행 예

      • FileZilla 설치하기
      • FileZilla Client를 사용하여 원격 컴퓨터에서 Raspberry Pi에 연결하기
        • 위 "FileZilla Client 실행 예"를 참고하여
        • 호스트(H): Raspberry Pi IP Address(예: 192.168.0.18)와
        • 사용자명(U): Raspberry Pi 사용자(예: pi),
        • 비밀번호(W): Raspberry Pi 비밀번호,
        • 포트(p): 포트 번호(SFTP Server의 기본 포트 번호는 22)를 입력한다.
        • 위와 같이 설정하고 "빠른 연결(Q)"를 클릭하면 Raspberry Pi에 연결된다.

        주: FileZilla Client는 Windows OS, Linux에 설치(휴대폰에 설치하는 앱도 있지만 아직 안전적이지 않음)할 수 있기 때문에 다양한 환경에서 Raspberry Pi의 파일과 폴더를 관리할 수 있다.

    • FTP(File Transfer Protocol)
      • FTP는 오래된 기술이지만 여전히 많은 시스템과 하드웨어 장치에서 사용된다. 일부 IP 카메라와 Media player 등에서 FTP 서버에 데이터를 저장하고 사용한다. 가능한 SFTP를 사용하는 것이 좋지만 기기가 FTP 만 지원하는 경우가 있기 때문에 여기서 FTP 서버 설치에 대하여 설명한다.

      • FTP 서버 설치하기
        • 여기서는 비교적 안정적이며 빠른고 보편적으로 많이 사용하는 Linux용 FTP 서버인 vsftpd를 설치한다.

        • 아래 명령을 사용하여 vsftpd를 설치한다.
        • $ sudo apt update

          $ sudo apt-get install vsftpd

        • 아래와 같이 nano 편집기를 사용하여 vsftpd configuration file(vsftpd.conf)을 편집한다.
        • 
          $ sudo nano /etc/vsftpd.conf
          anonymous_enable=NO
          local_enable=YES
          write_enable=YES
          local_umask=022
          chroot_local_user=YES
          user_sub_token=$USER
          local_root=/home/$USER/ftp
          allow_writeable_chroot=YES
                

          주: 위에서 user_sub_token(vsftpd.conf의 STRING OPTIONS)은 가상 사용자와 함께 사용할 때 유용하다. 템플릿을 기반으로 각 가상 사용자에 대한 홈 디렉터리를 자동으로 생성하는 데 사용된다. 예를 위와 같이 설정한 경우 접속한 사용자가 pi인 경우($USER 값은 pi 가 됨) 홈 디렉토리는 /home/pi/ftp 가 된다.

        • 아래와 예와 같이 Pi 사용자를위한 FTP 디렉토리 생성한다.
        • $ mkdir /home/pi/ftp

        • 아래와 예와 같이 ftp 디렉토리에 대한 권한을 변경한다.
        • $ chmod 750 /home/pi/ftp

        • 아래와 예와 같이 ftp 디렉토리의 소유자를 변경한다.
        • $ sudo chown -R pi: /home/pi/ftp

        • 아래와 예와 같이 vsftpd 서비스를 다시 시작하여 변경 사항을 적용한다.
        • $ sudo service vsftpd restart

      • 원격 컴퓨터에서 FTP Server에 접속하기
        • FTP Client(이 예에서는 WinSCP 사용)로부터 FTP Server에 접속하여 서버가 정상으로 동작하는지 확인한다.
        • WinSCP 사용하여 FTP Server에 접속하는 예

          • 위 그림을 참고하여 아래와 같이 서버에 접속한다.
          • 파일 프로토콜(F): 파일 프로토콜을 FPT로 선택하고,
          • 호스트(H): Raspberry Pi IP Address(예: 192.168.0.18)와
          • 포트(p): 포트 번호(FTP Server의 기본 포트 번호는 21)를 입력한다.
          • 사용자명(U): Raspberry Pi 사용자(예: pi),
          • 비밀번호(W): Raspberry Pi 비밀번호,
          • 위와 같이 설정하고 "로그인" 버튼을 클릭하면 Raspberry Pi에 연결된다.

        주: Linux OS가 설치된 컴퓨터에서는 FileZilla Client를 사용하여도 좋다.

  • 디스크 공유하기
    • 네트워크에서 디스크를 공유하는 대표적인 프로토콜은 NFS(Network File System), AFS(Andrew File System) 및 SMB(Server Message Block) 세 가지이다. 사용하는 컴퓨터의 OS와 Network 환경에 따라 적당한 프로토콜을 선택한다.

      Raspberry Pi(Linux OS를 사용) 또는 Linux OS를 사용하는 다른 컴퓨터의 디스크를 사용하려는 경우애는 NFS를 사용하는 것이 좋다.

      Windows의 네트워크 디스크를 사용하려는 경우에는 SMB를 사용하는 것이 좋다.

      주: Samba의 보안 문제 때문에 Windows 10 최신 버전에서는 SMB를 사용을 제한한다. 그러나 VLC media player, IP Camera 등은 Samba 프로토콜를 지원하기 때문에 아직도 Samba 서버는 유용하다.

      Mac을 사용하고 있고 거기에서 디스크 만 사용하려는 경우 AFS를 사용하는 것이 좋다.

      여러 플랫폼에서 디스크에 액세스하려는 경우 SMB가 상호 운용성을 위하여 좋은의 선택이다.

    • SMBA를 사용하여 디스크 공유하기
      • 아래 명령을 사용하여 Samba 서버 소프트웨어를 설치한다.
      • sudo apt-get install samba samba-common-bin

      • Samba 서버 설정하기
        • /etc/samba/smb.conf 파일에 아래 내용을 첨부한다.
        • 
          [share]
          Comment = Shared Folder
          path = /media/pi/usb
          writeable = yes
          create mask = 0777
          directory mask = 0777
          public = yes
          guest ok = yes
                  
          • path: 공유하려는 Raspberry Pi의 디렉터리 경로이다.
          • writeable: 이 옵션을 "예"로 설정하면 폴더에 쓰기가 가능하다.
          • create mask 와 directory mask: 이 옵션은 파일과 폴더에 대한 최대 권한을 정의한다. 이것을 0777로 설정하면 사용자가 읽고, 쓰고, 실행할 수 있다.
          • public: 이것이 "no"로 설정되면 Pi는 공유 폴더에 대한 액세스 권한을 부여하기 위해 유효한 사용자가 필요하다.
          • guest ok: 위 설정은 누구나(사용자 or 게스트로) 로그인하여 공유한 파일을 읽고, 쓰고, 실행할 수 있다. 만약 게스트 사용자를 허용하지 않으려면 Guest ok = yes 줄을 생략한다.
          • 위 "저장장치(디스크) 추가(Mounting)하기"를 실행하지 않은 경우에는 Raspberry Pi가 자동으로 인식하여 추가하기 때문에 Path를 /media/pi/<HARD-DRIVE-LABEL> 로 설정하여야 한다.

        • 아래 명령으로 Samba 사용자를 포함한 모든 사람이 읽고 쓸 수 있도록 /media/pi/<HARD-DRIVE-LABEL>(/media/pi/usb) 디렉토리의 권한을 변경한다.
        • sudo chmod 1777 /media/pi/usb

        • 필요한 경우 아래 명령으로 Samba 사용자의 비밀번호를 설정한다.
        • sudo smbpasswd -a pi

        • 아래 명령으로 Samba 서비스를 다시 시작한다.
        • sudo systemctl restart smbd

      • Windows에서 Samba 디스크 마운트하기
      • Samba의 보안 문제 때문에 Windows 10 최신 버전( 1709 및 Windows Server 2019)부터는 SMBv1 프로토콜이 비활성화 되기 때문에 Windows 10에서는 Samba 사용하지 않는 것을 권장한다.

        • 파일 탐색기 창을 열고 왼쪽 창(패널)에서 "네트워크"를 클릭하면 Raspberry Pi를 포함한 로컬 네트워크 환경을 볼 수 있다.
        • 주: 윈도우10에서는 보안상의 이유로 기본 설정이 SMB 프로토콜을 사용할 수 없도록 되어 있기 떄문에 필요한 경우 설정을 변경하여야 한다.

          주: 윈도우10의 방화벽(or V3) 네트워크 규칙에 Raspberry Pi의 IP Address(예: 192.168.0.15)를 추가하여야 한다.

        • Raspberry Pi 아이콘을 두 번 클릭하여 서버에 연결한다.
        • Windows에서 Samba 디스크 자동으로 마운트하기
          • Windows 파일 탐색기를 사용하여 공유 드라이브로 이동 한 다음, "공유" 아이콘을 마우스 오른쪽 버튼으로 클릭하고 "네트워크 드라이브 매핑"을 선택한다.
          • "로그인 시 다시 연결"이 선택되어 있는지 확인하고 "마침"버튼을 클릭한다.
          • 왼쪽 패널에 새 드라이브가 표시 되는지 확인한다. "내 PC"를 클릭하면 "네트워크" 아래에 새 드라이브가 표시되어야한다. 이제 Windows에 로그인 할 때마다 SMB 공유 볼륨이 자동으로 마운트된다.


  • External disk 와 Network 환경에서 파일 전송과 관리 관련 페이지 보기