리눅스 네트워크의 이해를 읽고서
커널 컴포터는트를 이해하기 위해 주어딘 루틴들이 어떤 동작을 수행하는지 아는 것 외에도 어떤 때 해당 루틴이 어떤 경로로 호출되는지 알아야 한다. 서브시스템의 초기화는 커널이 자신의 모델에 따라 동작시키는 기본적인 작업이다. 이 서브시스템을 학습하는 것은 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 디바이스 드라이버의 내림
핫 플러그 네트워크 장치의 제거
네트워크 장치는 net_device 스트럭처에 의해 정의된다. 대부분 네트워크 장치는 커널에서 dev라는 이름을 갖기 때문이다.
모든 장치는 타입과 연속된 숫자로 이뤄진 이름을 지정 받는다. 예를 들어 이더넷 장치의 경우 eth0, eh1같은 이름을 가진다. 하나의 장치는 등록된 순서에 따라 이름을 지정받는다.
사용자 공간 설정 도구는 커널이 지정한 장치 이름을 참조하기 때문에 장치의 등록 순서는 중요하다.
등록 과정에 관한 한 가상 장치는 실제 장치와 동일하게 등록되고 활성화된다. 하지만 다음와 같은 점이 다르다.
본딩은 몇 개의 인터페이스를 묶어 하나처럼 보이게 하는 가상 장치다. 트래픽은 알고리즘에 따라 인터페이스에 분배되는데, 대개 라운드로빈을 사용한다.
리눅스는 802.1Q 포로토콜을 지원해서 가상 랜을 정의할 수 있다.