TIL - 2020.12.07 (월)

코드 굽는 제빵사·2020년 12월 7일
0

TIL

목록 보기
12/20

리눅스 네트워크의 이해를 읽고서

컴포넌트 초기화를 위한 커널 인프라스트럭처

커널 컴포터는트를 이해하기 위해 주어딘 루틴들이 어떤 동작을 수행하는지 아는 것 외에도 어떤 때 해당 루틴이 어떤 경로로 호출되는지 알아야 한다. 서브시스템의 초기화는 커널이 자신의 모델에 따라 동작시키는 기본적인 작업이다. 이 서브시스템을 학습하는 것은 NIC디바이스 드라이버를 비롯한 네트워크 스택이 초기화되는 것을 이해하는 데 도움이 된다.

부팅 시 커널 옵션

리눅스는 사용자가 부트 로더에 커널 설정 옵션을 전달할 수 있게 한다. 그리고 이것을 통해 커널에 옵션을 전달한다. parse_args의 내용을 자세히 알 필요는 없지만 커널 컴포넌트가 핸들러에 대한 키워드를 등록하는 방법과 핸들러를 호출하는 방법 자체는 흥미롭다.

키워드 등록

커널 컴포넌트는 키워드와 핸들러를 매크로로 등록 할 수 있다.

__setup(string, function_handler)

string은 키워드이고, function_handler는 핸들러다. 위 예는 부팅 시에 string을 포함하는 문자열이 들어오면 function_handler를 수행하라고 알려준다. string은 parse_args가 파싱할 수 있도록 =
문자로 끝나야만 한다. = 다음의 모든 문자는 function_handler의 입력 값으로 사용된다.

모듈 초기화 코드

커널 코드는 정적으로 주요 이미지에 링크되거나 필요할 때 모듈 형태로 로드된다. 모든 커널 컴포넌트가 모듈로 컴파일되기에 적당한 것은 아니다. 디바이스 드라이버와 기본 기능에 대한 확장은 커널이 모듈로서 컴파일하는 좋은 예다.

모든 모듈은 init_module과 cleanup_module이라는 2개의 특별한 함수를 제공한다. 첫 번째 함수는 모듈이 로드될 때 호출돼 모듈을 초기화한다. 두 번째 함수는 모듈을 제거 할 때 수행돼 해당 모듈에 할당된 자원을 회수하는데 사용된다.

장치 등록과 초기화

NIC가 사용되기 전에 net_device 데이터 스트럭처가 먼저 초기화되고 커널 네트워크 장치 데이터베이스에 등록, 설정, 활성화돼 있어야 한다. 등록과 해지를 활성화/비활성화와 혼동하면 안 된다. 개념상 이 두 가지는 다음과 같이 다르다.

  • 등록과 해지는 디바이스 드라이버 모듈의 로딩만 제외한다면 사용자에 의존적이지 않다.
    즉 크널이 조절한다. 등록만 된 장치는 아직 작동하지 않는다.
  • 활성화와 비활성화는 사용자의 개입이 필요하다. 장치가 커널에 등록되면 사용자는 사용자 명령어로 조회, 설정, 활성화가 가능하다.

장치 등록 순간

네트워크 장치의 등록은 다음과 같은 상황에서 이뤄진다.

NIC 디바이스 드라이버 로딩

  • NIC 드라이버가 커널에 포함되면 부팅 순간에 초기화되며, 모듈로 로딩된다면 작동 중에 초기화된다. 초기화가 발생하는 순간마다 모든 NIC는 등록된 드라이버에 의해 움직인다.

핫 플러그 네트워크 장치의 삽입

  • 사용자가 핫 플러그 NIC를 상입하면 커널은 드라이버를 호출하고 장치를 등록한다

장치 해지 순간

NIC 디바이스 드라이버의 내림

  • 이것은 장치가 모듈로 로드됐을 때만 가능하며, 커널에 포함됐을 때는 불가능하다.
    관리자가 NIC 디바이스 드라이버를 내리면 관련된 모든 NIC는 해지돼야 한다.

핫 플러그 네트워크 장치의 제거

  • 사용자가 핫 플러그를 지원하는 동장 중인 시스템에서 핫 플러그 네트워크 NIC를 제거하면 장치가 해지된다.

net_device 스트럭처의 할당

네트워크 장치는 net_device 스트럭처에 의해 정의된다. 대부분 네트워크 장치는 커널에서 dev라는 이름을 갖기 때문이다.

모든 장치는 타입과 연속된 숫자로 이뤄진 이름을 지정 받는다. 예를 들어 이더넷 장치의 경우 eth0, eh1같은 이름을 가진다. 하나의 장치는 등록된 순서에 따라 이름을 지정받는다.
사용자 공간 설정 도구는 커널이 지정한 장치 이름을 참조하기 때문에 장치의 등록 순서는 중요하다.

가상 장치

등록 과정에 관한 한 가상 장치는 실제 장치와 동일하게 등록되고 활성화된다. 하지만 다음와 같은 점이 다르다.

  • 가상 장치는 래퍼 대신 register_netdevice와 unregister_netdevice를 호출하고 자신들이 락을 관리한다. 가상 장치들은 실제 장치들보다 락을 좀 더 오래 소유할 필요가 있기 때문이다. 따라서 가상 장치는 다른 방법으로 보호할 수 있는 추가적인 코드들을 락을 통해 보호함으로써 락이 오용되거나 필요 이상으로 길어지게 할 수도 있다.
  • 실제 장치들은 사용자 명령으로 해제될 수 없고, 오직 비활성화만 가능하다. 실제 장치는 드라이버가 내려 올때 해제된다. 대조적으로 가상 장치들은 사용자 명령어로 생성되거나 해제된다. 하지만 가상 디바이스 드라이버가 기능을 지원해야만 가능하다.

본딩

본딩은 몇 개의 인터페이스를 묶어 하나처럼 보이게 하는 가상 장치다. 트래픽은 알고리즘에 따라 인터페이스에 분배되는데, 대개 라운드로빈을 사용한다.

VLAN 인터페이스

리눅스는 802.1Q 포로토콜을 지원해서 가상 랜을 정의할 수 있다.

0개의 댓글

관련 채용 정보