FreeBSD 맞춤 커널 만들기
최준호
OpenBIRD, Inc.
Category: NEWBIE
Updated: 2001-12-19
커널이라는 것은 운영체제의 핵심 요소로, 커널 그 자체도 하나의 프로그램으로서 동작하지만, 하드웨어와 사용자 소프트웨어 사이의 인터페이스 역할을 한다. 커널은 시스템 콜을 통해 어플리케이션이 시스템을 다루고 제어할 수 있도록 해 주며, 프로세스, 가상 메모리, 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 기능 추가
버전 3.1 이후 버전 3.x
USB 장치 지원
NTFS, CDROM의 Joliet 등의 파일시스템 추가
기가비트 이더넷 카드 지원
알파 시스템 포팅
버전 4
VM 서브시스템의 대폭 개량
NFS 파일시스템의 대폭 개량
ATA/ATAPI 드라이버를 새 ata 드라이버로 교체
IPv6 지원
USB 장치 지원 강화
PC 카드 지원 강화
PCI 사운드 카드 지원
kqueue 이벤트 핸들러 메카니즘
버전 5(개발중)
TrustedBSD의 접근 제어 목록(ACL) 기능 도입
SMPng: Giant Lock을 제거하고 보다 세부적인 락킹 도입
KSE(kernel-scheduled entity) 기능 도입
FFS의 스냅샷 기능
커널 디렉토리 구조 변경
devfs 도입
i386 별도 지원
새 장치와 커널 구조의 변경에 따라 커널 설정 파일의 구조도 달라지게 된다. 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 12
device 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
FreeBSD 맞춤 커널 만들기 #2