사전 FreeBSD
구현체

FreeBSD

gabury1고친 사람 github-actions[bot]

FreeBSD 는 컴퓨터 한 대를 여러 프로그램이 나눠 쓰도록 관리하는 운영체제입니다. 웹 서버든 저장 장비든 이것을 깔고 그 위에 올려 굴립니다. 커널과 기본 명령어와 문서를 한 팀이 한 저장소에서 함께 만들어 한 판으로 내놓습니다.

쉽고 빠른 이해

FreeBSD 는 한 대의 기계를 여러 프로그램이 나눠 쓰게 하는 운영체제입니다. 파일을 저장하고, 프로그램에 메모리를 떼어 주고, 랜 카드로 들어온 데이터를 알맞은 프로그램에 넘기는 일을 맡습니다.

커널과 명령어를 서로 다른 곳에서 만들면 어디까지가 한 벌인지를 쓰는 쪽이 챙겨야 합니다. Linux 배포판이 그 조각을 모으는 일을 맡는 까닭입니다. FreeBSD 는 한 벌을 아예 정해 놓고 통째로 냅니다. 라이선스도 여기에 맞물립니다 — 고친 것을 공개하라고 요구하지 않아서, 장비 회사가 이 한 벌을 자기 제품 안에 넣고 팔 수 있습니다.

돌아가는 방식은 이렇습니다.

  1. 커널과 기본 명령어와 매뉴얼을 한 저장소에 두고 같이 고칩니다
  2. 그 묶음을 기본 시스템이라 부르고 통째로 한 판으로 냅니다
  3. 웹 서버나 데이터베이스처럼 그 밖의 프로그램은 ports 와 pkg 로 따로 받습니다

대가가 있습니다. 쓰는 사람이 리눅스보다 적어서 새 하드웨어의 드라이버와 기업이 파는 프로그램이 늦게 오거나 아예 안 옵니다.

상세

FreeBSD 는 유닉스 계열 운영체제입니다. 운영체제는 메모리와 저장 장치와 랜 카드 같은 하드웨어를 여러 프로그램에게 나눠 주고, 프로그램끼리 서로 망가뜨리지 못하게 막는 프로그램입니다. 그 한가운데에서 하드웨어를 직접 다루고 어느 프로그램을 언제 돌릴지 정하는 부분을 커널이라고 부릅니다.

유닉스 계열이라는 말은 파일과 프로세스를 다루는 방식이 유닉스에서 갈라져 나왔다는 뜻입니다. 명령어 이름과 디렉터리 배치가 리눅스나 macOS 와 많이 겹치는 까닭이 이것입니다.

이 절은 일곱을 차례로 봅니다. 한 저장소에서 함께 만드는 기본 시스템, 그 밖의 프로그램을 들이는 ports 와 pkg, 기본 시스템에 들어 있는 이름난 부품, 배포를 정하는 BSD 라이선스, 커널이 장치를 다루는 방식, FreeBSD 가 안 하기로 정한 것, 그리고 이 코드를 바탕으로 만들어진 제품입니다.

한 저장소에서 함께 만드는 기본 시스템

FreeBSD 는 커널과 기본 명령어와 매뉴얼을 한 저장소에 두고 같이 고칩니다. 이 묶음을 기본 시스템이라고 부릅니다. 기본 명령어는 ls 나 cp 처럼 사람이 셸에서 치는 작은 프로그램입니다.

리눅스와 견주면 이 차이가 또렷해집니다. 리눅스는 커널을 만드는 프로젝트와 명령어를 만드는 프로젝트가 따로 서 있고, 배포판을 내는 곳이 그 조각을 모아 하나로 묶어 냅니다. FreeBSD 에는 모으는 단계가 없습니다. 커널을 고친 사람과 그 커널을 쓰는 명령어를 고친 사람이 같은 저장소에 같이 커밋합니다.

아래 그림은 무엇이 그 묶음 안에 있고 무엇이 밖에 있는지를 보입니다.

flowchart TD
    subgraph base["기본 시스템 · 한 저장소에서 함께 만든다"]
        K["커널"]
        U["기본 명령어 · ls · cp · sh"]
        M["매뉴얼 · 핸드북"]
    end
    subgraph out["밖에서 따로 받는 것 · ports · pkg"]
        W["웹 서버 · 데이터베이스 · 데스크톱 환경"]
    end
    base -->|이 위에 얹어 쓴다| out

같이 만들면 판이 어긋나지 않습니다. 커널이 새 기능을 들이면 그것을 부르는 명령어도 같은 판에서 같이 바뀌고, 매뉴얼도 그 커밋에 딸려 갑니다. 대신 조각을 갈아 끼우는 길이 닫힙니다. 커널만 다른 것으로 바꿔 쓰는 선택지가 없습니다.

그 밖의 프로그램을 들이는 ports 와 pkg

웹 서버나 데이터베이스는 기본 시스템에 안 들어 있습니다. 그런 프로그램은 ports 와 pkg 라는 두 방식으로 따로 받습니다.

ports 는 소스 코드를 받아 이 기계에서 빌드하는 방식입니다. 프로그램마다 어디서 소스를 받고 어떤 선택지를 켜고 끌지 적은 작은 파일 묶음이 하나씩 있고, 그 묶음이 큰 트리로 정리되어 있습니다. 빌드에 필요한 다른 프로그램이 아직 없으면 그것부터 따라 빌드합니다. 선택지를 직접 고를 수 있는 대신 빌드가 끝날 때까지 기다려야 합니다.

pkg 는 누군가 이미 빌드해 둔 꾸러미를 받아 푸는 방식입니다. 기다림이 없어지는 대신, 빌드할 때 고르는 선택지는 꾸러미를 만든 쪽이 정한 것을 그대로 받습니다. 두 방식은 같은 ports 트리에서 나옵니다. 어느 쪽으로 깔든 같은 프로그램이고, 한 기계에서 섞어 써도 됩니다.

기본 시스템에 들어 있는 이름난 부품

기본 시스템 안에는 그 자체로 이름이 알려진 부품이 몇 있습니다. FreeBSD 를 고르는 이유가 이 가운데 하나일 때가 많습니다. 아래 표는 각각이 무엇을 하는 것인지만 한 줄로 짚습니다. 자세한 것은 각 항목이 갖습니다.

이름 하는 일
ZFS 이름은 Zettabyte File System 에서 왔습니다. 파일 시스템과 디스크 묶음 관리를 한 덩어리로 맡고, 저장한 데이터가 상했는지 검사값으로 확인합니다
jail 커널 하나 위에서 프로세스와 파일 시스템과 네트워크를 갈라, 한 기계를 여러 대처럼 쓰게 합니다
kqueue 수많은 소켓 가운데 지금 읽고 쓸 준비가 된 것만 커널이 골라 알려 줍니다
bhyve 한 기계 위에 가상 머신을 띄워 다른 운영체제를 함께 굴립니다
pf 들고 나는 패킷을 규칙에 맞춰 거르고 주소를 바꿉니다
DTrace 돌고 있는 커널과 프로그램을 멈추지 않고 들여다봅니다

표의 여섯은 모두 기본 시스템 안에 있습니다. 따로 받지 않아도 설치 직후부터 쓸 수 있다는 뜻입니다.

배포를 정하는 BSD 라이선스

FreeBSD 는 BSD 라이선스로 배포됩니다. BSD 는 Berkeley Software Distribution, 곧 버클리 소프트웨어 배포판의 줄임말이고, 이 계통이 시작된 대학의 배포판 이름에서 왔습니다.

이 라이선스는 받은 사람에게 고친 것을 다시 공개하라고 요구하지 않습니다. 저작권 표시만 남기면 소스를 닫은 채 자기 제품에 넣어 팔아도 됩니다.

GPL(General Public License, 일반 공중 사용 허가서)처럼 공개를 요구하는 라이선스와 여기서 갈립니다. 공개를 요구하면 남이 고친 것이 원래 프로젝트로 돌아올 길이 생깁니다. BSD 라이선스는 그 길을 포기하는 대신, 제품에 넣는 쪽의 부담을 없앱니다. 라우터와 게임기와 저장 장비 안에 FreeBSD 코드가 들어가 있는 까닭이 이것입니다.

커널이 장치를 다루는 방식

디바이스 드라이버는 커널 안에 들어가, 장치마다 다른 말투를 커널이 아는 한 가지 말투로 옮겨 주는 코드입니다. 이것이 없으면 프로그램마다 장치 모델을 따로 알아야 합니다.

유닉스 계열은 장치를 파일처럼 다뤄 왔습니다. /dev 아래에 장치마다 특수 파일이 하나 생기고, 프로그램은 그 파일을 열고 읽고 쓰는 것으로 장치를 씁니다.

flowchart TD
    P["프로그램"] -->|"open · read · write"| F["/dev 아래 특수 파일"]
    F --> D["드라이버가 채워 둔 함수"]
    D --> H["장치"]

유닉스는 이 특수 파일을 두 갈래로 나눠 왔습니다. 문자 장치는 프로그램과 데이터를 곧바로 주고받고, 블록 장치는 커널이 중간에 캐싱을 끼고 정해진 크기 덩어리로 주고받습니다. FreeBSD 는 이 가운데 블록 장치 쪽을 없앴습니다. 디스크까지 문자 장치 하나로 다룹니다.

갈래를 하나로 줄이면 드라이버가 채워야 할 함수가 줄어듭니다. 드라이버는 열기·닫기·읽기·쓰기에 해당하는 함수를 채워 커널에 등록하고, 커널은 그 특수 파일에 온 요청을 그 함수로 넘깁니다.

FreeBSD 가 안 하기로 정한 것

FreeBSD 는 커널만 따로 떼어 쓰는 것을 받아들이지 않습니다. 기본 시스템이 한 판이라 커널과 명령어를 갈라 다른 조합으로 쓰는 길이 없습니다.

데스크톱 환경도 기본 시스템에 넣지 않습니다. 설치를 마치면 그래픽 화면이 아니라 글자 화면이 뜨고, 창과 아이콘이 있는 환경은 ports 나 pkg 로 따로 깝니다. 설치 직후의 상태를 작게 유지하려는 결정이고, 서버로 쓸 때는 그 환경이 애초에 필요 없습니다.

기업이 파는 프로그램과 새 하드웨어의 드라이버는 리눅스 쪽을 먼저 챙깁니다. 쓰는 사람 수가 그 순서를 정합니다. FreeBSD 에서는 그런 것이 늦게 오거나 아예 안 옵니다. 대신 리눅스용 실행 파일을 고치지 않고 그대로 돌리는 리눅스 호환 계층을 기본 시스템에 두고 있습니다.

FreeBSD 를 바탕으로 만든 제품

FreeBSD 코드는 여러 제품 안에 들어가 있습니다. BSD 라이선스가 소스를 닫는 것을 막지 않아서, 만든 쪽이 밝히지 않으면 겉으로는 안 보입니다.

macOS 와 iOS 의 바탕인 Darwin 은 기본 명령어와 네트워크 코드의 많은 부분을 FreeBSD 에서 가져왔습니다. 소니의 PlayStation 콘솔이 쓰는 시스템 소프트웨어도 FreeBSD 에서 갈라져 나왔습니다.

제품이 아니라 서비스로 쓰는 곳도 있습니다. Netflix 는 영상을 내보내는 자기 서버에 FreeBSD 를 씁니다. 방화벽 제품 pfSense 와 저장 장비 TrueNAS, 주니퍼 네트웍스의 Junos 도 FreeBSD 를 바탕으로 합니다.

관련 항목

FreeBSD 가 속하는 운영체제 계통

운영체제 · 유닉스 · BSD · 4.4BSD · 386BSD · POSIX

FreeBSD 와 같은 일을 두고 겨루는 운영체제

Linux · OpenBSD · NetBSD · DragonFly BSD · Solaris · Windows

FreeBSD 기본 시스템을 이루는 부품

커널 · 셸 · libc · UFS · ZFS · GEOM · jail · bhyve · pf · DTrace · kqueue · devfs

FreeBSD 에 프로그램을 들이는 수단

ports · pkg · 패키지 관리자 · 의존성 · 빌드 · 리눅스 호환 계층

FreeBSD 커널이 장치를 다루는 개념

디바이스 드라이버 · 문자 장치 · 블록 장치 · 장치 파일 · newbus · 인터럽트 · 캐싱

FreeBSD 배포를 정하는 라이선스

BSD 라이선스 · GPL · MIT 라이선스 · 카피레프트 · 오픈 소스

FreeBSD 를 설정하고 판올림하는 수단

rc.conf · sysctl · freebsd-update · 부팅 · loader

FreeBSD 를 바탕으로 만든 제품

Darwin · macOS · iOS · pfSense · TrueNAS · Junos · Netflix · PlayStation

다른 이름: freebsd