로컬 LAN에서는 호스트끼리 MAC 주소로 통신하기 때문에 사람이 IP 주소로 통신하더라도 내부적으로 IP_addr=>MAC_addr로 변환해주는 ARP 프로토콜로 서로 인식하게 된다.
인터넷(외부)로 나가는 게이트웨이도 로컬 LAN에 속한다. =>내부에서 외부로 나가기 위해서는 게이트웨이를 통해야 하는데 내부 호트트들은 ARP를 통해서 게이트웨이의 MAC 주소도 알아 두어야 한다.
MAC 주소는 48bits의 hard cored된 물리적인 주소로써 변경이 불가하다.
IP 주소는 32bits의 softwared된 이론적인 주소이므로 언제든지 변경이 가능하다.
=>하지만 MAC 주소를 임의적으로 변경해서 사용하기도 한다.
Macchanger라는 도구를 사용해서 MAC 주소를 변경해주어도 된다.
=>보안적으로는 서버나 중요한 장치의 MAC 주소가 변경되지 않게 static으로 지정 해주어야 한다.
커널(kernel)
커널은 Linux 운영체제의 핵심인데 시스템 리소스를 하드웨어와 소프트웨어에게 할당하고 관리하는 역할을 한다. 사람의 뇌가 모든 신경과 근육 체계를 통제하듯이 커널은 운영체제에게 특정 기능을 수행하도록 지시하고, 하드웨어 장치 드라이버를 통해서 하드웨어와 대화하고, 소프트웨어에 리소스를 할당해서 소프트웨어를 작동시킨다.
여기서 Linux 커널의 기원과 커널 타입을 알아보고 Linux 시스템에 특정 커널을 추가하거나 제거하는 방법을 살펴보는데, 잘 이해하게 되면 자신만의 커스터마이즈(customized)된 새로운 커널을 생성할 수도 있다. "Linux는 Kernel이다"라고도 한다. 현재는 운영체제가 그래픽을 많이 사용하기 때문에 관련된 패키지도 많아서 3~4GB까지 커져 있는 상황이지만, 여러 커널들이 모여서 Linux라는 운영체제를 구성하기 때문에 이 커널을 사용자가 조정하면 1.4MB의 플로피디스크 한 장에 들어가는 Linux 운영체제도 가능하다. 예전에 텍스트 환경만 있었던 Linux는 일부 네트워크나 시스템 전문가들의 전유물인 것처럼 취급되었지만 마우스와 그래픽 X Window 환경으로 무장된 현재의 Linux는 일반 사용자들도 편리하게 이용할 수 있을 정도로 보편화되었다.
이 커널을 잘 이해하면 리눅스를 더욱 잘 알게 된다. 이번 장은 지루할 수도 있지만 Linux를 공부하려면 한 번쯤 들어보는 부분이고, 모듈 설계나 임베디드 시스템 등 업무에 따라서는 반드시 살펴보고 가야 할 수도 있다.
커널은 작은 이진(binary) 파일로써 /boot 디렉터리에 자리한다.
/boot 디렉터리에 원하는 커널 파일들을 넣어두면 부팅 시 프로세스를 통해서 해당 커널과 라이브러리(여러 프로그램에서 공통으로 수정없이 사용되는 스크립트 파일) 모듈로 시스템을 가동시킬 수 있다. 커널은 마이크로(Micro) 커널로도 불리는 모듈라(modular) 커널과 모노리씩(monolithic) 커널 두 가지로 나눌 수 있다.
커널종류 특성 설명
모듈라 (Modular)시스템이 실행되는 동안 커널이 참조하는 디렉터리에 소프트웨어 라이브러 리 이진파일인 모듈을 넣어두고 필요 시 로드/언로드해서 사용하는 방식. 모듈은 매우 작은 크기로 분할되어 있어서 시스템에 로드/언로드하는 시간이 빠르고 빌드와 유지가 간편하다. Linux의 디폴트 커널 방식이다.
그래픽, 멀티미디어, 그리고 오피스 프로그램 등 용량이 큰 프로그램을 실행할 때에는 이들과 관련된 라이브러리 모듈들을 모두 메모리에 한꺼번에 로드하고 실행시키면 시스 템에 부담이 될 수 있으므로 라이브러리 모듈을 외부 디렉터리에 두고 필요할 때마다 로드시켜서 사용한다. =>/lib/modules에 저장되어 있다.
모노리씩 (Monolithic)필요한 모듈을 그때 그때 일일이 로드해서 사용하지 않고 전체 커널을 한 번에 빌드 한 뒤 모든 모듈을 로드해서 사용하므로 실행 시 메모리에 부담은 조금 있지만 모듈라 타입보다 빠르게 시스템을 실행시킬 수 있다. 필요한 라이브러리를 그 때그때 로드 할 때도 있지만 대부분 내부에 모든 라이브러리를 가지고 있으므로 그런 경우는 많지 않다.
DNS나 DHCP 서비스와 같이 비교적 라이브러리 모듈이 많지 않은 프로그램을 실행할 때에는 이들과 관련된 라이브러리 모듈을 모두 메모리에 한꺼번에 로드 한 뒤 실행한 다.
컴파일(compile)은 보통 두 가지 개념으로 사용되는데
▪ Kernel compile : Hardware compile 리눅스 버전(커널)을 올리는 작업
▪ Software compile : 어느 소프트웨어를 디폴트로 설치하지 않고 다른 소프트웨어와 연계해서 환경설정을 해서 설치하는 방법 ex) APM
커널 업그레이드를 커널 컴파일로도 부른다. 여러 소스를 통해서 커널 소스를 쉽게 얻을 수 있고 다양한 방법으로 커널을 운용할 수 있기 때문에 원하는 커널을 사용 중인 시스템에 맞춰 리빌드해서 사용하면 시스템 효율이 좋아질 것이다.
새로운 커널을 빌드해서 오래된 커널과 공존시키거나 오래된 커널을 새 커널로 대체해서 시스템을 운영할 수 있지만 현재 운영 중에 있는 커널이 서비스에 필요한 모든 기능이 들어있고 잘 실행되고 있다면 구태여 새로운 커널로 리빌드할 필요는 없다. 하지만 시스템이 새로 설치한 하드웨어를 인식하지 못하거나 일부 기능을 확장시키고자 한다면 커널을 업그레이드해야 할 것이다. 현재 커널이 2.6.32라면 전체 커널을 3.0.1로 모두 올리지 않고 patch-2.6.32.tar.bz2 파일을 다운받아서 2.6.32에서 성능개선이 필요한 커널만 2.6.32로 업데이트해주는 것이 좋다. 시간과 네트워크 대역폭, 그리고 현재 서버 서비스가 실행되지 않고 전체적으로 성능이 저하되었다고 느끼면 새롭게 전체 커널을 3.0.1으로 업그레이드해야 할 것이다.
~.tar.gz로 끝나는 파일을 tarball source라고 부르며 Linux에 특화되어 있는 파일이다. =>tar로 파일을 묶고, gz로 압축했다.
커널 구성
커널 구성은 ~.config 파일로 설정되는데 이 파일을 만드는 방법은
CUI(Command User Interface) =>make config
TUI(Text User Interface) =>make menuconfig
GUI(Graphic User Interface) =>make xconfig 세 가지가 있다.
** Linux에서 명령어나 패키지(파일)에 X가 들어가면 Graphic을 의미한다.
=>X.org, X, X.86, ... startx
Linux에서 .파일, .디렉턱리는 숨김 속성이다.
앞에서 생성한 커널의 정보를 가지고 있는 .config 파일을 기반으로 해서 /usr/src/linux/ arch/i386/boot 디렉터리에 새 커널 이미지로 컴파일해서 bzImage를 만든다. 빌드하는데 약 30분 정도 걸리지만 과정을 보면서 내용을 살펴볼 수 있다. 꼭 필요한 커널만 넣었다면 빌드 시간이 많이 줄어들 것이다. 여기서 사용되는 명령어로
∎ make zImage는 커널 사이즈가 큰 경우 커널 이미지를 압축해서 컴파일하고,
∎ make bzImage는 zImage보다 더 큰 커널 이미지를 컴파일할 때 사용하며,
∎ make bzlilo는 make bzImage와 lilo 명령을 함께 수행할 때 사용하는데 make bzImage에 의해 생성된 커널 이미지를 /boot 디렉터리로 복사해서 GRUB 정보를 갱신시키는 명령어이다.
Linux