FreeBSD 맞춤 커널 만들기
최준호 <cjh@openbird.com> 저.
OpenBIRD, Inc. <editors@openbird.com> 역.
커널이라는 것은 운영체제의 핵심 요소로, 커널 그 자체도 하나의 프로그램으로서 동작하지만, 하드웨어와 사용자 소프트웨어 사이의 인터페이스 역할을 한다. 커널은 시스템 콜을 통해 어플리케이션이 시스템을 다루고 제어할 수 있도록 해 주며, 프로세스, 가상 메모리, I/O, 파일시스템 등을 관장하여 여러 프로그램들이 충돌 없이 운영될 수 있도록 해 준다.
FreeBSD의 커널 시스템은 BSD 배포본의 그것에서부터 유래한다. 아마도 솔라리스 이전의 SunOS 4.x 시스템 이전 것이나, Digital UNIX/Tru64 UNIX등의 BSD에 기반한 상용 유닉스 시스템을 다루어 본 적이 있는 사람은 FreeBSD의 커널 구조에 친근감을 많이 느낄 것이다. 하지만 그 문법은 많이 바뀌어서 이전과는 같지 않으며, 또한 FreeBSD는 3.x 이후부터 커널 모듈 기능을 제공하여 현재는 상당수의 모듈을 커널의 재구축이나 리부팅 없이 올리고 내릴 수 있게 되었다.
FreeBSD의 메이저 버전을 특징짓는 구조도 바로 이 커널이다. 버전 1부터 시작하여 현재는 릴리즈 버전이 4.4이고 개발 버전이 5.x 이지만, 각 버전에 따라 커널 구조가 상당히 차이가 나는 것을 알 수 있다. 특히 각 하드웨어의 드라이버, 파일시스템 개량, SMP 등의 기능은 커널에 직접적으로 영향을 미치게 된다. 이러한 변경 사항을 몇가지 살펴보면 다음과 같다.
- 버전 3.0 이전
- SCSI 시스템에 CAM 드라이버 도입
- SMP 지원
- ELF형식의 바이너리 시스템
- Softupdate 기능 추가
- SCSI 시스템에 CAM 드라이버 도입
- 버전 3.1 이후 버전 3.x
- USB 장치 지원
- NTFS, CDROM의 Joliet 등의 파일시스템 추가
- 기가비트 이더넷 카드 지원
- 알파 시스템 포팅
- USB 장치 지원
- 버전 4
- VM 서브시스템의 대폭 개량
- NFS 파일시스템의 대폭 개량
- ATA/ATAPI 드라이버를 새 ata 드라이버로 교체
- IPv6 지원
- USB 장치 지원 강화
- PC 카드 지원 강화
- PCI 사운드 카드 지원
- kqueue 이벤트 핸들러 메카니즘
- VM 서브시스템의 대폭 개량
- 버전 5(개발중)
- TrustedBSD의 접근 제어 목록(ACL) 기능 도입
- SMPng: Giant Lock을 제거하고 보다 세부적인 락킹 도입
- KSE(kernel-scheduled entity) 기능 도입
- FFS의 스냅샷 기능
- 커널 디렉토리 구조 변경
- devfs 도입
- i386 별도 지원
- TrustedBSD의 접근 제어 목록(ACL) 기능 도입
새 장치와 커널 구조의 변경에 따라 커널 설정 파일의 구조도 달라지게 된다. 2.x, 3.x, 4.x, 5.x의 커널 설정 파일 구조는 서로 다르며, 갈수록 자동화되고 모듈화되는 경향이 있다.
RELENG_4의 커널
FreeBSD 4.x를 기준으로 커널에 대해 알아보기로 하자. 현재 커널은 표준적인 설치 방법으로는(make buildkernel 포함) 다음과 같은 레이아웃으로 설치된다.
- /kernel
- 표준 커널 이미지
- /kernel.GENERIC
- 설치시의 커널 이미지. 백업용으로 쓰기 위해 지우지 말자.
- /kernel.old
- 커널을 재구축한경우 이전 커널의 백업
- /modules
- 커널 모듈 디렉토리(kld)
- /modules.old
- 모듈을 재구축한경우 이전 모듈의 백업
부팅시의 커널 이름은 기본적으로 /kernel 이나, 부트 로더에서 kernel= 변수를 바꾸어서 이름을 바꿀 수 있다. 보통 유닉스 커널 이름은 시스템에 따라 많이 다른데, FreeBSD의 경우는 /kernel이고, NetBSD/OpenBSD의 경우는 /bsd, 리눅스의 경우는 /vmlinuz 등으로 시스템마다 다르다는 점을 주의해 두자.
모듈은 FreeBSD 4.x의 가장 큰 특징 중 하나로, kld(4)라는 커널 모듈 시스템을 사용한다. 이 시스템에 개발되기 이전에는 lkm(Loadable Kernel Modules)이라는 기법이 사용되었으나 제한점이 많았던 관계로 kld로 변경되게 되었다. kld의 인터페이스도 조금씩 변하고 있지만, kld로 파일시스템, 네트워킹, 장치 지원 등을 모두 커널 모듈의 형태로 만들 수 있다. 커널 모듈은 커널 옵션이 바뀌었거나, 새 버전으로 업그레이드하는 경우 반드시 커널과 버전을 맞추어야 한다. 물론 같은 메이저 버전 내에서는 API가 바뀌지 않으므로 4.1용의 모듈이 4.4에서 돌아갈 수 있겠지만, 서드파티가 만든 것이 아니라면 커널 버전에 맞추어 두도록 하자. 대부분의 모듈은 사용시에 자동적으로 포함되는데, 대표적인 것이 리눅스 에뮬레이터인 /modules/linux.ko와 cd9660.ko와 같은 파일시스템 모듈이다. 이러한 것들은 사용시 자동적으로 읽어들이게 된다. 미리 읽어들이고 싶은 것이 있다면 부팅시에 부트 로더가 읽어들이게 할 수 있다.
또한, 커널은 부팅 과정과도 밀접한 관련이 있다. 시스템이 부팅시에 부트 로더를 지나면서 가장 먼저 읽어들이는 파일이 커널이며, 커널은 시스템의 적절한 초기화와, 루트(/) 파일시스템을 마운트하고 /sbin/init 의 초기화 프로세스를 시작한다. (구체적인 커널의 최초 실행 파일은 kern.init_path에 정해진 순서를 따른다) 이 과정에서 사용자는 커널에 부트 로더 수준에서 두가지 방법으로 인수를 넘길 수 있다.
- 하드웨어 장치 설정 정보
- 부트 플래그
하드웨어 장치 설정 정보는 설치 프로그램에서 커널이 부팅하자마자 보았던 하드웨어 설정 편집기(UserConfig)에 넘기는 하드웨어 제어 정보이다. 이 정보는 커널이 UserConfig에 필요한 최소한의 하드웨어(텍스트 디스플레이, 키보드 등)을 제외한 나머지 하드웨어를 인식하기 위해 필요한 정보이다.
물론 이 정보는 화면 편집 방식 또는 명령행 방식 두가지로 가능하다. 이러한 정보는 시스템 부팅 후에, kget 명령으로 얻어낼 수 있다. 실제로 이 정보는 /boot/kernel.conf에 저장되며 다시 부팅할 때 부트로더에 의해 다시 읽어들이게 된다.
# kget /boot/kernel.conf
부트 플래그에는 여러가지 종류가 있으나(boot(8) 참조) 대표적인 것에는 다음을 들 수 있다.
- -a 루트 파일 시스템을 마운트하기 전에 물어본다
- -c UserConfig 하드웨어 설정 편집 모드로 들어간다.
- -s 단일 사용자 모드로 부팅한다.
이중 가장 많이 사용하는 것은 -c 와 -s 옵션일 것이다.
커널 소스
FreeBSD의 커널 소스는 소스 배포본의 ssys를 설치하였다면 /usr/src/sys 디렉토리에 존재한다. 관습적으로 이 디렉토리는 /sys 로 링크가 걸려 있으므로 /sys 라고 생각해도 큰 무리는 없을 것이다. 실제로 커널 소스는 어디에 있어도 상관이 없다.
간단하게 커널 소스 트리의 최상위 디렉토리 구조를 살펴보면 다음과 같다.
디렉토리 | 설명 |
---|---|
Makefile | 커널 빌드에 필요한 Makefile |
alpha/ | 알파 시스템 고유의 부분 |
boot/ | 부트 로더 |
cam/ | CAM SCSI 레이어 |
coda/ | Coda 파일시스템 |
compat/ | 다른 운영체제의 호환 레이어. 현재는 리눅스만 있다. |
compile/ | 커널 컴파일시의 작업 디렉토리 |
conf/ | 커널 설정 파일의 공통 파일 |
contrib/ | 커널 소스 중 기증된 부분 |
crypto/ | 암호화 관련 |
ddb/ | ddb 커널 디버거 |
dev/ | 여러가지 플랫폼 비의존적인 장치 드라이버 |
fs/ | 여러가지 파일시스템 |
gnu/ | GNU 라이센스를 적용받는 소스 |
i386/ | i386 시스템 고유의 부분 |
i4b/ | ISDN 4 BSD의 커널 부분 |
isa/ | ISA 버스 관련 드라이버 |
isofs/ | CD-ROM용 ISO-9660과 같은 ISO 파일시스템 |
kern/ | 시스템 비의존적인 커널의 핵심 부분 소스 |
libkern/ | 커널 내에서 많이 사용되는 함수 라이브러리 |
miscfs/ | 여러가지 기타 파일시스템 |
modules/ | 커널 모듈 빌드용 파일 |
msdosfs/ | FAT 파일시스템 |
net/ | 기본적인 네트워크 프로토콜 처리부 |
netatalk/ | netatalk 프로토콜 레이어 |
netatm/ | ATM 프로토콜 레이어 |
netgraph/ | 그래프 기반 커널 네트워킹 부시스템 |
netinet/ | TCP/IP 네트워킹 프로토콜 |
netinet6/ | IPv6 네트워킹 프로토콜 |
netipx/ | IPX 네트워킹 프로토콜 |
netkey/ | RFC2367 IP 보안을 위한 키 관리 레이어 |
netnatm/ | 네이티브 모드 ATM |
netncp/ | NCP 프로토콜 레이어 |
netns/ | Xerox ns 프로토콜 레이어 |
netsmb/ | SMB/CIFS 프로토콜 레이어 |
nfs/ | Sun NFS 파일시스템 |
ntfs/ | Windows NT의 NTFS 파일시스템 |
nwfs/ | NetWare 파일시스템 |
pc98/ | PC98 시스템 고유의 부분 |
pccard/ | PC-카드 지원 |
pci/ | PCI 버스 관련 드라이버 |
posix4/ | POSIX 1003.1B 리얼타임 확장 |
svr4/ | System V 에뮬레이터 |
sys/ | 커널 헤더 파일 |
ufs/ | UNIX 파일시스템. FFS, MFS등이 포함되어 있다. |
vm/ | 가상메모리(VM) |
표: RELENG_4의 최상위 커널 디렉토리 구조
FreeBSD 버전 4는 알파 버전의 릴리즈가 동시에 이루어지지만, FreeBSD는 처음에 i386에 중점을 두어 시작하였으므로 NetBSD나 OpenBSD만큼 시스템 공통적인 내용이 잘 정리되어 있지 않다. 이러한 점은 현재 개발 버전에서 많이 수정되었고, PowerPC, IA-64 등이 포팅 중이다.
커널 재구축 방법
FreeBSD 커널의 재구축 방법은 대략 다음과 같다.
- 커널 설정 파일의 편집
- 커널 빌드
- 커널 설치
각 단계별로 자세한 사항을 알아보자. 아래 커널 재구축 방법은 i386 기준이지만, 파일 경로명 등의 i386을 alpha로만 바꾸어도 alpha 아키텍처에서 그대로 적용할 수 있다.
1. 커널 설정 파일의 편집
FreeBSD의 커널 설정 파일은 하나의 큰 텍스트 파일이다. 커널 설정 파일의 위치는 일반적으로 각 플랫폼 디렉토리에 있다. i386의 경우는 /sys/i386/conf 디렉토리에서 찾을 수 있다. 커널 소스를 포함한 시스템을 기본적으로 설치한 후라면 다음과 같은 파일을 볼 수 있을 것이다.
- GENERIC
- 기본 커널 설정 파일. 기준이 된다.
- LINT
- 커널 설정의 모든 옵션을 설명하는 파일
GENERIC는 /kernel.GENERIC을 빌드하기 위해 사용된 커널 설정 파일이다. 따라서 정상적이라면 GENERIC 커널은 언제든 컴파일될 수 있어야 하며, LINT는 단지 커널 설정 파일에 적을 수 있는 모든 것들을 나열하고 있으므로 실제로 컴파일되는 커널이 아니다.
여러분의 시스템에 맞는 새 커널을 구축하겠다고 한다면, GENERIC 설정 파일에서 출발하여 LINT를 참고하여 여러가지 자신만의 설정을 하면 된다. 커널을 컴파일하기 위해서는 설정 파일의 이름이 있어야 하는데, 일단 GENERIC을 한 부 복사하여 시작하자. 커널 설정 파일의 이름은 반드시 지킬 필요는 없으나 영문 대문자로 자신의 호스트 이름을 사용하면 된다. 여기서는 MYHOST라고 하면
# cd /sys/i386/conf
# cp GENERIC MYHOST
이제 좋아하는 편집기로 MYHOST 커널 설정 파일을 편집하면 된다. 구체적인 내용에 대해서는 다음 장에서 자세히 다루므로 다음 장을 읽어 보자. 커널 설정 파일의 편집이 끝났다면 가장 처음의 준비는 잘 된 것이다.
참고로, 커널 설정 파일을 구성하는 여러가지 장치 명, 그에 따른 의존성, 옵션에 대한 상세한 내용을 알고 싶다면 /sys/sys/conf 디렉토리를 보기 바란다.
2. 커널 빌드
커널의 빌드에는 크게 두가지 방법이 있다.
- config를 사용하는 고전적인 방법
- /usr/src 트리의 kernel 관련 타겟을 사용하는 방법
이 중 첫번째 방법은 FreeBSD 3.x 까지 사용되었던 전통적인 방법이다. 하지만 커널 빌드 절차의 독립성과 모듈 등의 관계로 FreeBSD 4.x의 소스 트리에서는 /usr/src 트리에서 커널을 빌드하고 설치하는 일관성 있는 방법을 제공하므로 후자를 사용하는 것이 FreeBSD에서는 표준적이라는 면을 권하고 싶다.
config를 사용하는 고전적인 방법
FreeBSD 커널을(BSD 기반 시스템은 모두) 컴파일하기 위해서는 먼저 커널 설정 파일의 문법을 검사하고 /sys/compile 디렉토리에 헤더 파일이나 Makefile 등을 복사해 두는데, 이 때 쓰이는 명령이 config이다. 기본적으로는 다음과 같이 한다.
# cd /sys/i386/conf
# config MYHOST
Don't forget to do a "make depend"
Kernel build directory is ../../compile/MYHOST
config는 커널을 컴파일할 수 있도록 준비를 해 준다. 단순한 문법 검사 이외에 컴파일 디렉토리에 커널 빌드를 위한 Makefile 준비도 해 준다.
이제 config시에 나온 메시지에 따라 다음 디렉토리로 이동하여 make하면 된다.
# cd ../../compile/MYHOST
# make depend
이 다음에는 먼저 커널을, 그 다음에 커널 모듈을 순서대로 컴파일하면 된다.
# make kernel
# make modules
# make kernel-install
# make modules-install
아래의 두 install 타겟은 하나로 줄일 수 있다. 이 경우 설치되는 커널 이름은 KERNEL을 바꾸면 된다. 기본값은 kernel이다.
# make install KERNEL=MYKERNEL
여러분이 커널 설정 파일을 어떻게 변경하였는지 따라 많이 좌우되겠지만, 일반적으로 약간의 옵션을 추가한 정도라면 모듈까지 다시 빌드할 필요는 없는 경우가 많다.
/usr/src의 타겟을 이용하는 방법
이 방법은 위에서 설명한 모든 과정을 자동화해 준다. 먼저 커널 빌드는 다음과 같이 한다.
# cd /usr/src
# make KERNCONF=MYHOST buildkernel
이 방법에서 주의할 것은, 반드시 이전에 같은 버전의 소스에 대해서 최소한 make buildworld가 실행되어 있어야 한다는 것이다. 이것이 큰 단점으로 작용할 수도 있는데, 미리 buildworld를 할 수 없는 형편이라면 config를 사용하는 방법으로 커널을 빌드하도록 하자.
buildkernel은 KERNCONF 변수에 지정한 커널 설정 파일을(이 파일은 /sys/i386/conf/$KERNCONF에 존재해야 한다) 빌드해 주며, 모듈까지 같이 빌드한다. 따라서 시간이 상당히 오래 걸릴 수 있다는 점에 주의하기 바란다. 이 과정에서 커널만 빌드하고 모듈은 빌드하고 싶지 않다면 NO_MODULES=YES를 같이 옵션으로 주기 바란다.
# make NO_MODULES=YES KERNCONF=MYHOST buildkernel
물론 이 변수들은 기본적으로 적용하기 위해 /etc/make.conf에 적어두면 편리하다. 특히 KERNCONF는 꼭 지정해 두도록 하자.
/etc/make.conf:
KERNCONF=MYHOST
리눅스의 커널 빌드 과정과 약간 비교하자면, 리눅스의 커널 설정 파일은 일반적인 텍스트 파일로 표현할 수는 있지만 보통은 커널 소스 디렉토리에서 config, menuconfig, xconfig의 세가지 인터페이스를 사용하여 설정할 수 있다. FreeBSD는 그러한 설정 도구가 없고, vi 등의 보통 편집기로 설정 파일을 편집해 주면 된다. 또한 리눅스에서는 각 기능이 모듈로 사용될지 정적으로 커널 안에 들어갈지의 여부를 지정해 둘 수 있지만, FreeBSD에서는 그러한 설정이 없고 모든 기능이 모듈로 다시 컴파일된다. 가령 네트워크 카드 드라이버라면, 커널 설정 파일에서 지정하지 않은 네트워크 카드의 드라이버는 커널 본체(/kernel)에는 없겠지만 모듈로는 빌드가 되므로, 나중에 필요하면 커널을 다시 빌드하지 않아도 kldload 명령으로 로딩할 수 있다. 즉 FreeBSD에서는 커널에 정적으로 포함하고 싶은 기능만을 설정 파일에 적어준다고 생각하면 된다. 모듈은 그에 관계없이 언제나 모든 모듈이 빌드된다.
3. 커널 설치
커널 빌드가 무사히 완료되었으면 이제 설치해 보자. 빌드와 설치를 한번에 하고 싶다면 buildkernel/installkernel 타겟 대신 그냥 kernel 타겟을 이용해도 된다.
# make installkernel
이 타겟은 /kernel 커널 파일과 /modules 디렉토리의 각 모듈을 설치할 것이다. 이전 커널과 모듈은 각각 /kernel.old와 /modules.old/로 백업된다.
커널 설치 과정은 /kernel 파일의 변조를 막기 위해 시스템 변경 불능 플래그를 설정한다. 따라서 이렇게 설치된 커널은 일반 사용자 또는 root라도 위치를 바꾸거나 내용을 바꾸어 쓸 수 없다. 플래그는 FreeBSD의 FFS에 확장된 기능으로 일반적인 유닉스 파일 권한 이외에 변경 불가, 추가 전용 등의 부가적인 플래그를 설정할 수 있다. 자세한 설명은 chflags(1) 매뉴얼 페이지를 보기 바란다.
표준 ls 명령으로 파일에 할당된 플래그를 볼 수 있다. ls에 -o 옵션을 주면 된다.
# cd /
# ls -lo kernel
-r-xr-xr-x 1 root wheel schg 1867781 10/10 00:38 kernel
kernel 파일에 schg(system immutable) 플래그가 설정된 것을 알 수 있다.
하지만 이 플래그는 chflags명령으로 간단하게 해제할 수 있다,.
# chflags noschg /kernel
이제 커널 파일을 지우거나 바꿀 수 있다. 하지만 FreeBSD에는 시스템 보안 레벨이라는 것어서, 이 레벨이 1 이상이면 root 사용자라 할지라도 chflags 명령을 사용하여 /kernel의 schg 플래그를 끌 수 없다. 이렇게 해 두면 재부팅 후 싱글 유저 모드에서만 이러한 파일의 변경이 가능해지므로, 원격에서 해킹 등에 의해 시스템의 root 권한을 빼앗긴 경우라도 중요한 파일의 유지가 가능하다.
시스템 레벨을 올리려면 kern.securelevel sysctl 변수를 바꾸면 된다. 다만 이 값은 올릴수만 있지 내릴수는 없다. 값을 내리기 위해서는 리부팅해야 한다. 레벨을 1로 올리려면 다음과 같이 한다.
# sysctl kern.securelevel=1
부팅시에 시스템 레벨을 결정해 두려면 /etc/rc.conf에 다음과 같이 적어두면 된다. 설치 프로그램인 sysinstall의 Configure - Security 메뉴에서 동일한 것으로 제공하므로 이미 지정해 놓은 사용자도 있을 것이다.
kern_securelevel_enable="YES"
kern_securelevel="1"
기본값은 -1(비보호) 모드이다. 이 모드에서는 어떤 일이든지 가능하다. 다만 보안 레벨을 1 이상으로 올리면 이후 커널을 다시 설치하기 위해서는 리부팅 후 싱글 모드로 부팅해서 작업해야만 한다는 점을 잊지 말자.
설치하는 커널 이름은 INSTKERNNAME으로 바꿀 수 있다. 이렇게 하면 /$INSTKERNNAME으로 설치된다.
# make installkernel INSTKERNNAME=MYHOST
이 경우 부팅시에 이 커널로 부팅하기 위해서는 /boot/loader.conf.local에 다음과 같이 적어주면 된다.
kernel="/MYHOST"
커널 설정 파일
앞서 설명한 것처럼 커널 설정 파일은 일반적인 텍스트 파일로, 좋아하는 편집기로 편집하면 된다. 설정 파일은 키워드와 그에 따른 인수로 이루어져 있는데, 개략적인 내용을 살펴보면 다음과 같다.
- 빈 줄이나 #으로 시작하는 내용은 무시한다.
- 키워드는 다음과 같다.
machine, cpu, ident, maxusers, makeoptions, maxusers, device, pseudo-device
이전 버전에서는 버스, 장치 종류에 따라 여러가지 키워드가 있었으나 현재는 모두 실제 하드웨어는 device, 가상 장치는 pseudo-device로 통일되어 있는 상태이다.
/sys/i386/conf/GENERIC 파일은 설치시 커널의 설정 파일이자 컴파일될 수 있는 가장 기본적인 사항을 포함하고 있다.
아래에 4.4 릴리즈용의 GENERIC 파일의 번역과 함께, 기본적인 커널 설정의 구성 요소에 대해 알아보자.
#
# GENERIC -- FreeBSD/i386의 일반 커널 설정 파일
#
# 더 자세한 정보는 핸드북의 커널 설정 파일 섹션을 읽어보자.
#
# http://www.FreeBSD.org/handbook/kernelconfig-config.html
#
# 핸드북은 doc 배포본을 설치하였다면 /usr/share/doc/handbook
# 디렉토리에 있다. 그렇지 않아도 최신 정보는 언제든지
# FreeBSD 웹 서버 (http://www.FreeBSD.org/)에서 볼 수 있다.
#
# 옵션과 장치 행의 자세한 설명은 ./LINT 설정 파일에도 있다.
# 어떤 행의 목적이나 필요성에 대해 잘 모르겠다면 LINT파일을 먼저
# 보자.
#
# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.246.2.34 2001/08/12 13:13:46 joerg Exp $# machine은 시스템 아키텍처를 의미한다. i386의 경우 일반적인 PC
# 아키텍처를 생각하면 된다.
machine i386# cpu는 사용하는 CPU에 맞는 것을 지정한다. 복수로 있어도 관계없다.
# 최근의 Pentium III기종이라면 I686_CPU를 사용해도 된다. AMD등의
# 다른 CPU포맷은 LINT파일을 참조하자.
cpu I386_CPU
cpu I486_CPU
cpu I586_CPU
cpu I686_CPU# ident는 커널 설정의 이름이다. 설정 파일과 동일하게 주면 된다.
ident GENERIC# maxusers는 커널 내부의 초기 테이블 크기를 결정하는 중요한
# 파라미터이다. 32는 매우 작은 값이므로, 최근의 일반적인 머신에서 또는
# 서버 용도라면 64, 128, 256 정도가 적당할 것이다. 그 이상은 큰 파일
# 디스크립터 테이블이 필요하지 않다면 굳이 지정할 필요는 없다. 또한
# 네트워크 버퍼를 늘리기 위해서라면 꼭 maxusers를 늘려야 할 필요는
# 없다. 자세한 내용은 tuning(7) 매뉴얼 페이지를 보자.
maxusers 32#makeoptions DEBUG=-g #gdb(1) 디버그 심볼 포함 커널 빌드
options MATH_EMULATE #x87 에뮬레이션 지원
options INET #인터넷 지원
options INET6 #IPv6 통신 프로토콜
options FFS #버클리 Fast Filesystem.
options FFS_ROOT #FFS를 루트 장치로 사용가 [유지!]
options SOFTUPDATES #FFS 소프트업데이트 지원
options MFS #메모리 파일시스템
options MD_ROOT #MD를 루트 장치로 사용가
options NFS #네트워크 파일시스템
options NFS_ROOT #NFS를 루트 장치로 사용가, NFS 필요
options MSDOSFS #MSDOS 파일시스템
options CD9660 #ISO 9660 파일시스템
options CD9660_ROOT #CD-ROM을 루트 장치로사용가,CD9660 필요
options PROCFS #프로세스 파일시스템
options COMPAT_43 #BSD 4.3 호환[유지!]# SCSI장치를 사용한다면(아래에 scbus 장치가 있을 때) SCSI 스펙에 의해
# 인식하기 전 대기 시간은 15초이지만, 실제 대부분의 장치는 그 이하의
# 시간을 주어도 잘 인식한다. 부트 시간을 빠르게 하고 싶다며 아래 값을
# 적당하게 줄여주자.
options SCSI_DELAY=15000 #SCSI 인식 전의 지연시간(밀리초)# 이 옵션이 있어야 콘솔에서 X 윈도우를 띄울 수 있다.
options UCONSOLE #사용자가 콘솔 제어 가능# UserConfig 커널 설정 편집기 기능
options USERCONFIG #boot -c 편집기
options VISUAL_USERCONFIG #화면단위 boot -c 편집기# 시스템 콜을 추적하려는 디버깅 목적으로 사용한다.
options KTRACE #ktrace(1) 지원# System V IPC를 지원한다. 구체적인 설정은 sysctl 변수 또는
# 커널 옵션으로 지정할 수 있다.
options SYSVSHM #SYSV 공유 메모리
options SYSVMSG #SYSV 메시지 큐
options SYSVSEM #SYSV 세마포어# 일반적으로는 필요 없으나, CD 라이터 기능에 필요하다.
options P1003_1B #Posix P1003_1B 실시간 확장
options _KPOSIX_PRIORITY_SCHEDULING# ping을 너무 많이 받는 경우 응답율을 낮춘다.
options ICMP_BANDLIM #잘못된 응답율 제한
options KBD_INSTALL_CDEV #/dev에 CDEV 엔트리 설치# SMP 커널을 만들기 위해서 다음 두 행이 필요
# FreeBSD의 기본 커널은 멀티프로세서 지원이 아니다. 멀티프로세서
# 지원을 얻으려면 아래 두줄의 주석을 풀고 커널을 다시 빌드해야 한다.
#options SMP # 대칭형 멀티프로세서 지원
#options APIC_IO # 대칭형 (APIC) I/O# 각 버스 시스템의 정의, isa나 eisa 장치가 없다면 빼도 된다.
device isa
device eisa
device pci# 플로피 장치, fd0는 A:, fd1은 B:에 해당한다.
device fdc0 at isa? port IO_FD1 irq 6 drq 2
device fd0 at fdc0 drive 0
device fd1 at fdc0 drive 1
#
# Y-E Data PCMCIA 플로피를 갖는 Toshiba Libretto 기종이 있다면
# 앞의 fdc0 행을 사용하지 말고 아래 것을 쓴다.
#device fdc0# ATA와 ATAPI 장치
# ata0은 보통 프라이머리 IDE, ata1은 세컨더리 IDE 포트이다.
device ata0 at isa? port IO_WD1 irq 14
device ata1 at isa? port IO_WD2 irq 15
device ata
# ATA의 각 장치를 사용한다면 그대로 놔 두자.
device atadisk # ATA 디스크 드라이브
device atapicd # ATAPI CDROM 드라이브
device atapifd # ATAPI 플로피 드라이브
device atapist # ATAPI 테이프 드라이브
options ATA_STATIC_ID #정적으로 장치 번호 붙임# SCSI 콘트롤러
# SCSI장치가 없다면 아래 atkbdc0 장치 전까지는 모두 필요없다.
# 단 나중에 나오는 USB 디스크 장치를 위해서는 scbus와 da가 필요하다.
device ahb # EISA AHA1742 계열
device ahc # AHA2940와 온보드 AIC7xxx 장치
device amd # AMD 53C974 (Tekram DC-390(T))
device isp # Qlogic 계열
device ncr # NCR/Symbios Logic
device sym # NCR/Symbios Logic (새 칩셋)
options SYM_SETUP_LP_PROBE_MAP=0x40
# sym과 ncr이 설정되었을 때 ncr이 오래된
# NCR 장치를 인식하도록 함device adv0 at isa?
device adw
device bt0 at isa?
device aha0 at isa?
device aic0 at isa?device ncv # NCR 53C500
device nsp # Workbit Ninja SCSI-3
device stg # TMC 18C30/18C50# SCSI 주변기기. 필요한 것만 사용 가능하게 하자.
device scbus # SCSI 버스 (필수)
device da # 직접 접근 (디스크)
device sa # 순차적 접근 (테이프 등)
device cd # CD
device pass # 통과 장치 (직접 SCSI 접근) - CD-R에 필요# SCSI 부시스템에 인터페이스가 있는 RAID 콘트롤러
device asr # DPT SmartRAID V, VI와 Adaptec SCSI RAID
device dpt # DPT Smartcache - 옵션은 LINT를 보자!
device mly # Mylex AcceleRAID/eXtremeRAID# RAID 콘트롤러
device aac # Adaptec FSA RAID, Dell PERC2/PERC3
device ida # Compaq Smart RAID
device amr # AMI MegaRAID
device mlx # Mylex DAC960 계열
device twe # 3ware Escalade# atkbdc0 은 키보트와 PS/2 마우스를 모두 제어
device atkbdc0 at isa? port IO_KBD
device atkbd0 at atkbdc? irq 1 flags 0x1
device psm0 at atkbdc? irq 12device vga0 at isa?
# 초기 그래픽 화면/화면 보호기
# 이것을 사용하면 부팅 화면에 임의의 그래픽 화면을 표시할 수 있다.
# 자세한 설정 방법은 splash(4) 매뉴얼 페이지를 참조하자.
pseudo-device splash# syscons는 SCO 콘솔과 유사한 기본 콘솔 드라이버이다.
device sc0 at isa? flags 0x100# pcvt vt220 호환 콘솔 드라이버를 쓰려면 아래와 PCVT_FREEBSD를
# 정의한다. sc0와는 양립할 수 없다.
#device vt0 at isa?
#options XSERVER # vt 콘솔에서 X 서버 지원
#options FAT_CURSOR # 블록 커서로 시작
# ThinkPAD가 있다면 다른 PCVT 관련 행과 같이 아래도 주석 해제
#options PCVT_SCANSET=2 # IBM 키보드는 비표준# 부동소수점 지원 - 지우지 말자.
device npx0 at nexus? port IO_NPX irq 13# 고급 전원 관리 지원(더 자세한 옵션은 LINT 참조)
# APM지원은 기본적으로 하지 않도록 되어 있다. 이를 가능하게 하고
# 싶다면 아래 행의 disable 키워드를 지우고 flags를 필요에 따라
# 지정하자. apm(4)와 apm(8) 매뉴얼 페이지를 참조하자.
device apm0 at nexus? disable flags 0x20 # 고급 전원 관리# PCCARD (PCMCIA) 지원
# PCMCIA장치가 없는 PC라면 아래 세 행은 필요없다.
device card
device pcic0 at isa? irq 0 port 0x3e0 iomem 0xd0000
device pcic1 at isa? irq 0 port 0x3e2 iomem 0xd4000 disable# 직렬 (COM) 포트
device sio0 at isa? port IO_COM1 flags 0x10 irq 4
device sio1 at isa? port IO_COM2 irq 3
device sio2 at isa? disable port IO_COM3 irq 5
device sio3 at isa? disable port IO_COM4 irq 9# 병렬 포트
# vpo는 병렬포트 zip 드라이브와 같은 장치를 위한 것이다.
device ppc0 at isa? irq 7
device ppbus # 병렬포트 버스(필수)
device lpt # 프린터
device plip # 병렬포트상의 TCP/IP
device ppi # 병렬포트 인터페이스 장치
#device vpo # scbus와 da 요구# PCI Ethernet NIC.
# 아래 장치는 MII 프레임워크에 속하지 않는 것이다.
device de # DEC/Intel DC21x4x ("Tulip")
device txp # 3Com 3cR990 ("Typhoon")
device vx # 3Com 3c590, 3c595 ("Vortex")# PCI Ethernet NIC은 공통 MII 버스 콘트롤러 코드를 사용.
# *주의*: 이러한 NIC를 사용하려면 'device miibus'가 있어야 한다.
device miibus # MII 버스 지원
device dc # DEC/Intel 21143과 여러가지 변종
device fxp # Intel EtherExpress PRO/100B (82557, 82558)
device pcn # AMD Am79C97x PCI 10/100 NIC
device rl # RealTek 8129/8139
device sf # Adaptec AIC-6915 ("Starfire")
device sis # Silicon Integrated Systems SiS 900/SiS 7016
device ste # Sundance ST201 (D-Link DFE-550TX)
device tl # Texas Instruments ThunderLAN
device tx # SMC EtherPower II (83c170 "EPIC")
device vr # VIA Rhine, Rhine II
device wb # Winbond W89C840F
device wx # 인텔 기가비트 이더넷 카드 ("Wiseman")
device xl # 3Com 3c90x ("Boomerang", "Cyclone")# ISA 이더넷 NICs.
# 'device ed'는 'device miibus'에 필요하다. 실제 Realtek 8029와 같은
# PCI 네트워크 카드를 위해서도 아래 줄이 필요하다.
device ed0 at isa? port 0x280 irq 10 iomem 0xd8000
device ex
device ep
device fe0 at isa? port 0x300
# Xircom 이더넷
device xe
# PRISM I IEEE 802.11b 무선 NIC.
device awi
# WaveLAN/IEEE 802.11 무선 NIC. 주의: WaveLAN/IEEE 는 실제로 PCMCIA
# 장치로만 존재하므로 필요한 ISA 관련 내용이 없으며 자원은 항상 pccard
# 코드에 의해 동적으로 할당된다.
device wi
# Aironet 4500/4800 802.11 무선 NIC. 주의: 아래의 선언은 PCMCIA와
# PCI 카드, ISA PnP모드로 지정된 ISA 카드(출고 기본값) 모두에서
# 동작한다. ISA 카드를 I/O 주소와 IRQ를 수동으로 지정하도록 하였다면
# 아래에서 파라미터를 지정할 수 있다.
device an
# 인식 순서는 현재 i386/isa/isa_compat.c 에 나타나 있다.
device ie0 at isa? port 0x300 irq 10 iomem 0xd0000
#device le0 at isa? port 0x300 irq 5 iomem 0xd0000
device lnc0 at isa? port 0x280 irq 10 drq 0
device cs0 at isa? port 0x300
device sn0 at isa? port 0x300 irq 10# 가상 장치 - 숫자는 할당되는 유니트의 개수를 나타낸다.
pseudo-device loop # 네트워크 루프백 장치
pseudo-device ether # 이더넷 장치
pseudo-device sl 1 # 커널 SLIP
pseudo-device ppp 1 # 커널 PPP
pseudo-device tun # 패킷 터널
pseudo-device pty # 가상 tty(telnet 등)
pseudo-device md # 메모리 "디스크"
pseudo-device gif # IPv6 과 IPv4 터널링
pseudo-device faith 1 # IPv6-to-IPv4 릴레이(변환)# `bpf' 가상장치는 버클리 패킷 필터를 이용 가능하게 한다.
# 동작시키려면 관리 순서에 주의하자. 이 장치는 패킷 캡처를 가능하게
# 하므로 악용될 수 있다.
pseudo-device bpf # 버클리 패킷 필터# USB 지원
device uhci # UHCI PCI->USB 인터페이스
device ohci # OHCI PCI->USB 인터페이스
device usb # USB 버스 (필수)
device ugen # 일반 장치
device uhid # "휴먼 인터페이스 장치"
device ukbd # 키보드
device ulpt # 프린터
device umass # 디스크/대용량 장치 - scbus와 da 필요
device ums # 마우스
device uscanner # 스캐너
# USB 이더넷, mii 필요
device aue # ADMtek USB 이더넷
device cue # CATC USB 이더넷
device kue # Kawasaki LSI USB 이더넷#
# 설정 파일의 끝
#
커널 설정을 자신의 PC에 맞게 바꾸는 방법은 대략 다음 순서를 따르면 큰 무리가 없을 것이다.
- GENERIC을 자신의 커널 이름으로 복사한다.
- GENERIC의 내용을 읽어보고, 필요 없다고 생각되는 행을 주석 처리한다.
- LINT를 참고하여 자신만이 갖고 있는 장치의 행을 LINT 파일에서 복사하여 넣는다.
- config 명령으로 문법 확인을 해 본다.
일반적으로 device, pseudo-device로 시작하는 각종 장치 드라이버에는 각각 매뉴얼 페이지가 있다. 따라서 이러한 장치의 세부적인 옵션을 알고 싶다면 각 장치 이름의 매뉴얼 페이지를 보면 된다. 가령 bpf 장치에 대한 내용을 알고 싶다면 bpf(4) 매뉴얼 페이지를(매뉴얼 페이지의 섹션 4는 장치 드라이버에 대한 것들이다), RealTek 8139 드라이버인 rl 장치의 옵션을 알고 싶다면 rl(4) 매뉴얼 페이지를 보면 된다.
앞서도 잠깐 설명하였지만 위에서 지정한 것은 정적 커널의 옵션과 장치들이지, 모듈은 모든 장치에 대해 빌드된다는 점에 유의하자. 즉 기본 커널에 없더라도, options등에 크게 영향받지 않는(예를 들어 방화벽 기능) 것들이라면 커널 설정 파일에 없어도 모듈로 읽어들일 수 있다. 가령 조이스틱 드라이버를 사용하려면 커널 설정 파일에
device joy0 at isa? port IO_GAME
가 있어야 하지만, 없어도 kldload 명령으로 읽어들일 수 있다(이와 비슷하게 pcm 장치를 커널 설정 없이 읽어들이는 방법을 지난 기사에 설명한 바 있다).
kldload joy
사운드 카드를 위한 pcm 드라이버도 비슷하게 할 수 있다.
kldload snd_pcm
pcm 드라이버를 커널 설정 파일에 써 두려면(즉 기본적으로 커널에 포함시키려면) 커널 설정 파일에 다음 행을 써 둔다.
device pcm
다만 이 방법은 상세한 파라미터 설정이 불가능하므로, 자신의 커널에 꼭 필요한 것들이라면 동적 모듈 보다는 정적으로 커널에 포함시키는 편이 좋을 것이다. FreeBSD 4.x의 커널 모듈은 이전보다 많이 안정화되고 유용하게 되었지만, options등에서 지정할 수 있는 의존성과 많이 충돌하는 관계로 사용하고 싶은 기능이라면 커널 설정에 추가하는 편이 좋다. 가령 다음번 4.5 릴리즈에서는 수정되었지만, 4.4 릴리즈까지는 ipfw 방화벽 모듈을 커널 모듈로 읽어들일 수 없다.
5.0-current에서의 커널 설정 변화
현재 개발중인 5.0-current의 커널 파일에서는 또다시 문법이 바뀌어, 하드웨어 의존적인 설정 부분은 모두 /boot/device.hints 파일에 저장되게 되었다. 한가지 예로 4.4 커널의 플로피 드라이버를 살펴보자.
# Floppy drives
device fdc0 at isa? port IO_FD1 irq 6 drq 2
device fd0 at fdc0 drive 0
5.0-current 커널의 설정 파일은 크게 두가지로 나뉜다. 하나는 우리가 알고 있는 커널 설정 파일이고, 또 하나는 힌트 파일이다. 힌트 파일에는 하드웨어의 구체적인 설정 정보가 들어있다. 즉 커널 설정 파일에는 다음과 같이만 적고,
# Floppy drives
device fdc
/boot/device.hints 파일에 다음과 같은 내용이 들어있게 된다.
hint.fdc.0.at="isa"
hint.fdc.0.port="0x3F0"
hint.fdc.0.irq="6"
hint.fdc.0.drq="2"
hint.fd.0.at="fdc0"
hint.fd.0.drive="0"
이 변화에 따라 5.0-current에서는 UserConfig 편집기가 없어졌다. 부팅시 설정은 /boot/device.hints파일을 수정하는 것으로 대체되었다.
또한 부팅 커널은 /kernel이 아니라 /boot/kernel/kernel 로 변경되었으며, 모듈도 모두 /boot/kernel/*.ko 의 형태로 존재하게 되었다. GENERIC커널의 경우 /boot/GENERIC 디렉토리에 들어있다. 이 변화는 부팅에 필요한 파일을 모두 /boot 디렉토리에서 찾을 수 있다는 것을 의미한다. 이러한 디렉토리 구성에 대해서는 -current의 hier(7) 매뉴얼 페이지를 살펴보기 바란다.
- config를 사용하는 고전적인 방법