Jump to content

CIFSD

This is a fully translated article. Click here for more information.
From DawoumWiki, the free Mathematics self-learning
CIFSD
Original author(s)Namjae Jeon
Developer(s)Namjae Jeon, Sergey Senozhatsky, Hyunchul Lee
Repositorygithub.com/cifsd-team
Written inC
Operating systemLinux
TypeNetwork Filesystem
LicenseGPLv2

CIFSD리눅스 커널(Linux kernel)에 대해 전 남재(Namjae Jeon)에 의해 생성된 오픈-소스 커널-내 CIFS/SMB 서버입니다. 초기 목표는 개선된 파일 I/O 성능을 제공하는 것이지만, 더 큰 목표는 커널 내부에서 개발과 유지 관리가 훨씬 쉽고 계층을 완전히 노출하는 몇 가지 새로운 기능을 갖추는 것입니다. 방향은 Samba가 커널 내부의 몇 가지 모듈로 이동하여 원격 직접 메모리 접근(Remote direct memory access, RDMA)과 같은 기능을 사용하여 실제 성능 향상을 가져오는 섹션에 기인할 수 있습니다.

Installation

기존 Samba (software)에 비해 꽤 나은 성능을 보이기 때문에, 좋은 대안으로 보이고, 설치해서 확인해 볼 필요가 있습니다.

어쨌든, 리눅스 커널 5.4부터 커널 모듈이 제공되지만, 보통의 데비안 등의 커널에서 5.19부터 이 옵션이 활성화되어 있을 것으로 기대됩니다. 다움 위키에서 제공하는 커널에서도 이 모듈은 컴파일되어 있습니다. 따라서, 사용자 공간의 도구를 설치해서 사용할 수 있습니다:

  • sudo apt install ksmbd-tools

Configurations

대체로 Samba (software)의 설정을 따르지만, 일부 설정 키워드가 다르거나 존재하지 않을 수 있습니다. 먼저, 필요한 설정 파일을 만듭니다:

  • sudo mkdir -p /etc/ksmbd
  • sudo cp /usr/share/doc/ksmbd-tools/examples/ksmbd.conf.example /etc/ksmbd/ksmbd.conf
  • sudo gvim /etc/ksmbd/ksmbd.conf

사용자와 암호를 만들고 서비스를 시작합니다:

  • sudo ksmbd.adduser -a user_id
  • sudo systemctl start ksmbd.service
  • sudo systemctl status ksmbd.service

방화벽 규칙을 만듭니다. 이전의 Samba (software)와 다르게, 다음을 실행되지 않습니다:

  • sudo ufw allow from 192.168.59.0/24 to any app Samba

대신, 포트를 직접 열 수 있습니다:

  • sudo ufw allow from 192.168.59.0/24 to any port 445

클라이언트에서 접근은 삼바와 동일하게 진행할 수 있으며, 호스트-아름으로도 접근이 가능합니다.

Features

Implemented

  • SMB1(CIFS), SMB2/3 protocols for basic file sharing
  • Compound requests
  • oplock/lease
  • Large MTU(Multi-credit)
  • NTLM/NTLMv2
  • Auto negotiation
  • HMAC-SHA256 Signing
  • Secure negotiate
  • Signing Update
  • Pre-authentication integrity(SMB 3.1.1, Windows 10)
  • SMB encryption (CCM, GCM)
  • SMB direct(RDMA)
  • WinACL (Security descriptor)
  • Kerberos
  • Directory lease
  • Multi-channel

Planned

  • Durable handle and v2
  • Persistent handles
  • Cluster Support
  • SCSI over SMB3

Architecture

성능 관련 작업의 부분집합은 커널-공간에 속하고 다른 부분-집합은 사용자-공간에서 성능과 실제로 관련되지 않은 작업에 속합니다. 따라서, 역사적으로 많은 버퍼 오버플로 문제와 위험한 보안 버그를 초래한 DCE/RPC 관리와 winreg과 사용자-계정 관리가 사용자 공간에서 ksmbd.mountd로 구현됩니다. 성능과 관련된 파일 작업 (열기/읽기/쓰기/닫기 등)은 커널 공간(ksmbd)에 있습니다. 이것은 역시 모든 파일 작업을 위해 VFS 인터페이스와 더 쉬운 통합을 허용합니다.

ksmbd (kernel daemon)

서버 데몬이 시작될 때, 그것은 초기화 시간에 포커 쓰레드 (ksmbd/0)를 시작하고 SMB 요청을 수신하기 위한 전용 포트 445를 엽니다. 새로운 클라이언트가 요청할 때마다, 포커 쓰레드는 클라이언트 연결을 수락하고 클라이언트와 서버 사이의 전용 통신 채널을 위해 새로운 쓰레드를 포크합니다. 그것은 클라이언트로부터 SMB 요청 (명령)을 병렬로 처리할 수 있을 뿐만 아니라 새로운 클라이언트에 대해 새로운 연결을 만드는 것을 허용합니다. 각 인스턴스는 연결된 클라이언트를 인식하기 위해 ksmbd/1~n으로 이름 짓습니다. SMB 요청 유형에 따라, 각각의 새로운 쓰레드는 명령을 통해 사용자 공간 (ksmbd.mountd)으로 전달하도록 결정할 수 있습니다. 현재 DCE/RPC 명령은 사용자 공간을 통해 처리되도록 식별됩니다.

리눅스 커널을 더 활용하기 위해, 그것은 기본 kworker 쓰레드의 핸들러에서 실행될 기본 작업-항목으로 명령을 처리하도록 선택되었습니다. 그것은 만약 부하가 증가하면 커널이 여분의 worker 쓰레드를 시작하고 그 반대의 경우도 마찬가지이고, 만약 부하가 감소하면 여분의 worker 쓰레드를 파괴하도록 핸들러의 멀티플렉싱을 허용합니다. 따라서, 클라이언트와의 연결이 설정된 후, 전용 ksmbd 임무가 SMB 명령의 수신과 구문 분석에 대한 완전한 소유권을 취합니다. 수신된 여러 클라이언트의 각 명령은 병렬로 작동합니다. 각 명령을 수신한 후, 각 명령에 대해 분리된 커널 작업-항목이 준비되며 커널 내부의 기본 kworker 쓰레드에 의해 처리되도록 대기합니다. 따라서, 각 SMB 작업-항목은 kworkers에 대기합니다. 이것은 로드 공유의 이점을 기본 커널에서 최적으로 관리하고 클라이언트 명령을 병렬로 처리하여 클라이언트 성능을 최적화할 수 있습니다.

ksmbd.mountd (user space daemon)

ksmbd.mountd는 ksmbd.adduser (사용자 공간에 대한 utils의 일부)를 사용하여 등록된 사용자 계정과 암호를 전송하는 사용자 공간 프로세스입니다. 나아가서, 그것은 smb.conf에서 커널에서 smb 내보내기 계층으로 구문 분석된 정보 매개변수를 공유할 수 있습니다. 실행 부분에 대해, 그것은 지속적으로 실행되고 netlink 소켓을 사용하여 커널 인터페이스에 연결되는 데몬을 가지며, 요청 (dcerpc와 winreg)을 기다립니다. 그것은 NetShareEnum와 NetServerGetInfo에서 파일 서버에 가장 중요한 RPC 호출 (최소 수십 개)과 서버가 구현해야 하는 다양한 DFS 관련 호출을 처리합니다. 완전한 DCE/RPC 응답은 사용자 공간에서 준비되고 클라이언트에 대한 관련된 커널 쓰레드로 전달됩니다.

See also

References

External links