사전 FreeBSD
구현체

FreeBSD

gabury1고친 사람 github-actions[bot]

FreeBSD 는 컴퓨터 한 대를 여러 프로그램이 나눠 쓰도록 관리해 주는 운영체제입니다. 영상을 내보내는 서버나 방화벽 장비에 이것을 깔고 그 위에서 프로그램을 굴립니다. 커널과 기본 명령어를 한 저장소에서 함께 만들어 한 벌로 내놓습니다.

쉽고 빠른 이해

FreeBSD 는 기계 한 대를 여러 프로그램이 나눠 쓰게 해 주는 운영체제입니다. Netflix 는 영상을 내보내는 자기 서버에 이것을 깔아 씁니다.

커널과 기본 명령어를 한 곳에서 같이 만들어 운영체제 본체를 한 벌로 냅니다. 그래서 이것을 바탕으로 제품을 만드는 회사가 자기 빌드 설비에 붙이기 쉽습니다. 고친 코드를 공개하라고 요구하지 않는 라이선스라서, 장비 회사가 자기 제품 안에 넣고 소스를 닫은 채 팔 수 있습니다.

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

  1. 커널과 기본 명령어를 한 저장소에서 함께 고쳐 운영체제 본체를 한 벌로 냅니다
  2. 그래픽 환경 같은 나머지 프로그램은 미리 빌드된 패키지나 소스 빌드로 따로 들입니다
  3. 본체와 나머지 프로그램은 설정 파일을 두는 디렉터리도, 버전을 올리는 도구도 따로입니다

대가가 있습니다. 버전 올리기를 두 번 챙겨야 합니다. 본체의 메이저 버전을 올리면 따로 들인 프로그램도 전부 다시 올려야 합니다. 리눅스용 프로그램을 돌리려면 꺼져 있는 호환 기능을 켜고 리눅스용 파일을 따로 깔아야 합니다.

상세

이 절은 FreeBSD 가 무엇으로 이루어진 물건인지 봅니다. 대상은 설치하면 깔리는 운영체제 본체와, 그 밖에서 따로 들이는 프로그램입니다. 둘 사이의 선이 어디에 그어져 있는지를 따라갑니다.

FreeBSD 는 표준을 따르도록 만든 오픈 소스 유닉스 계열 운영체제입니다. 운영체제는 메모리와 디스크와 랜 카드 같은 하드웨어를 여러 프로그램에 나눠 주는 프로그램입니다. 프로그램끼리 서로 망가뜨리지 못하게 막는 일도 합니다. 그 한가운데서 하드웨어를 직접 다루고 어느 프로그램을 언제 돌릴지 정하는 부분을 커널이라고 부릅니다.

유닉스 계열이라는 말은 뿌리가 유닉스에 있다는 뜻입니다. FreeBSD 는 BSD 에서 나왔습니다. BSD 는 캘리포니아 대학교 버클리에서 만든 유닉스 판입니다. 바탕은 그 가운데 4.4BSD-Lite 입니다. 버클리의 연구 그룹 CSRG(Computer Systems Research Group)가 낸 판입니다.

FreeBSD 는 프로세서 여섯 계열에서 돕니다. PC 와 서버에 흔한 x86(32비트·64비트)이 그 하나입니다. 나머지 다섯은 AArch64·PowerPC 처럼 x86 과 명령어 집합이 다른 프로세서 계열입니다.

기본 시스템과 바깥 프로그램

FreeBSD 는 커널과 사용자 공간을 한 저장소에서 만듭니다. 사용자 공간은 커널 밖에서 도는 부분입니다. ls 나 cp 처럼 사람이 셸에서 치는 기본 명령어가 여기 듭니다. 셸은 사람이 친 명령을 받아 실행해 주는 프로그램입니다.

빌드 체계도 하나로 묶여 있습니다. 이렇게 한 저장소에서 함께 만들어 한 벌로 내는 운영체제 본체를 기본 시스템이라고 부릅니다. 그래서 FreeBSD 를 바탕으로 제품을 만드는 회사가 자기 빌드 설비에 붙이기 쉽습니다.

기본 시스템에는 시스템 도구가 넉넉히 들어 있습니다. 그 밖의 프로그램은 따로 들입니다. 이렇게 들이는 프로그램을 서드파티 소프트웨어라고 부릅니다. FreeBSD 프로젝트 바깥에서 만든 프로그램이라는 뜻입니다.

그래픽 환경이 그 예입니다. 설치 프로그램 bsdinstall 로 깔면 그래픽 환경이 자동으로 깔리지 않습니다. 그래픽 환경은 X Window System(흔히 X11)이 맡습니다. 그 서버가 Xorg 입니다. Xorg 는 바깥 프로그램으로 따로 깝니다.

FreeBSD 는 두 부분을 분명히 갈라 둡니다. 그 선은 설정 파일의 위치로도 드러납니다. 기본 시스템의 설정은 /etc 에 있습니다. 따로 들인 프로그램의 설정은 /usr/local/etc 에 있습니다.

flowchart TD
    subgraph base["기본 시스템 · 한 저장소에서 함께 만든다"]
        K["커널"]
        U["사용자 공간 · ls · cp · 셸"]
        E["설정 · /etc"]
    end
    subgraph third["서드파티 소프트웨어 · 따로 들인다"]
        W["그래픽 환경 Xorg 같은 프로그램"]
        L["설정 · /usr/local/etc"]
    end
    base -->|이 위에 얹어 쓴다| third

만드는 사람들

FreeBSD 는 그 한 저장소에 변경을 올릴 권한을 가운데로 모아 둡니다. 누가 올릴 수 있는지, 그것을 누가 정하는지가 정해져 있습니다.

커미터는 FreeBSD 의 Git 저장소에 변경을 올릴 권한을 가진 사람입니다. 이름은 변경을 저장소에 들이는 명령인 commit 에서 왔습니다.

코어 팀은 프로젝트를 회사에 견주면 이사회에 해당합니다. 프로젝트 전체가 제 방향으로 가는지 챙깁니다. 새 커미터를 초대하는 것도 코어 팀의 일입니다. 코어 팀 선거는 2년마다 합니다.

권한을 이렇게 모아 둔 까닭은 쓰는 사람에게 있습니다. 코드베이스 하나만 따라가면 FreeBSD 를 쫓아갈 수 있게 하려는 것입니다. 고치려는 사람을 막으려는 것이 아닙니다.

ports 와 패키지

바깥 프로그램을 들이는 길은 둘입니다. 하나는 소스에서 빌드하는 ports 입니다. 다른 하나는 미리 빌드해 둔 패키지입니다. 패키지는 pkg 라는 명령으로 다룹니다.

port 하나는 프로그램 하나를 소스에서 빌드하는 과정을 자동으로 돌리는 파일 묶음입니다. 소스를 받고, 풀고, 패치를 대고, 컴파일하고, 설치하는 데 필요한 정보가 다 들어 있습니다. 그 port 의 디렉터리로 가서 make install 을 치면 나머지는 시스템이 합니다. 이런 port 들을 모은 것이 ports 트리입니다.

패키지는 그 프로그램을 미리 컴파일해 둔 것입니다. 실행 파일과 설정 파일과 문서가 함께 들어 있습니다. pkg install 한 줄로 깝니다. 거의 모든 port 가 패키지로도 나옵니다.

두 길 모두 의존성을 압니다. 의존성은 프로그램이 돌려면 먼저 있어야 하는 다른 라이브러리나 프로그램입니다. 그것이 아직 없으면 먼저 깝니다.

둘은 고를 수 있는 폭이 다릅니다. 패키지는 최대한 많은 기계에서 돌아야 해서 대개 보수적인 컴파일 옵션으로 빌드됩니다. port 로 직접 빌드하면 그 옵션을 바꿀 수 있습니다.

한 기계에서 둘을 섞어 쓰는 것은 대체로 권하지 않습니다. ports 트리에는 개발 중인 맨 앞 브랜치(HEAD)와, 석 달마다 거기서 잘라 내는 분기별(quarterly) 브랜치가 있습니다. pkg 는 기본으로 분기별 브랜치를 따라갑니다. 같은 port 라도 두 브랜치에서 의존성이 다를 수 있습니다. 그러면 패키지로 깐 의존성과 ports 로 깐 의존성이 부딪힐 수 있습니다. 꼭 섞어야 하면 ports 와 pkg 를 ports 트리의 같은 브랜치에 맞춥니다.

flowchart TD
    H["맨 앞 브랜치 · 개발 중"] -->|"석 달마다 잘라 낸다"| Q["분기별 브랜치"]
    Q --> P["pkg 가 기본으로 받는 패키지"]
    H --> R["맨 앞 브랜치의 ports 로 빌드한 프로그램"]
    P -.->|"의존성이 다를 수 있다"| R

기본 시스템에 든 이름난 부품

기본 시스템 안에는 이름이 알려진 부품이 몇 있습니다. 아래 표는 각각이 무슨 일을 하는지 짧게만 적습니다.

이름 하는 일
ZFS(Z File System) 파일 시스템과 볼륨 관리자 역할을 한 덩어리로 맡는 저장 계층입니다. 볼륨 관리자는 여러 디스크를 묶어 하나처럼 쓰게 해 주는 프로그램입니다. 지금은 OpenZFS 프로젝트가 개발합니다. 설치 프로그램이 ZFS 위에 바로 시스템을 깔 수 있습니다
jail chroot 를 넓힌 격리 장치입니다. chroot 는 프로세스 묶음의 루트 디렉터리를 바꿔 볼 수 있는 파일 시스템 범위를 좁힙니다. jail 은 파일 시스템에 더해 사용자 목록과 네트워크까지 가릅니다. 운영체제 수준의 가상화로 볼 수 있습니다
kqueue 이벤트가 생기거나 조건이 맞으면 프로그램에 알려 주는 시스템 콜입니다. 시스템 콜은 프로그램이 커널에 일을 부탁하는 호출입니다. 알릴지 말지는 필터라는 커널 안의 작은 코드 조각이 판단합니다
bhyve 한 기계 위에 가상 머신을 띄우는 하이퍼바이저입니다. FreeBSD·OpenBSD·여러 리눅스 배포판·Windows 같은 손님 운영체제를 띄웁니다. 10.0 부터 기본 시스템에 들어 있습니다
PF(Packet Filter) OpenBSD 의 방화벽을 옮겨 온 것입니다. 세월이 지나며 OpenBSD 의 원본과 많이 갈라졌습니다. 그래서 모든 기능이 양쪽에서 똑같이 돌지는 않습니다
DTrace Dynamic Tracing 이라고도 부르는 추적 도구입니다. 돌고 있는 커널과 프로그램을 들여다보며 성능 병목과 뜻밖의 동작을 찾습니다. 커널 안은 온전히 지원합니다. 사용자 공간은 실험 단계입니다

여섯 모두 기본 시스템에 들어 있어 따로 받지 않습니다. 다만 PF 와 bhyve 는 쓰기 전에 커널 모듈을 올려야 합니다. 커널 모듈은 돌고 있는 커널에 나중에 끼워 넣는 코드 묶음입니다. 켜는 방법은 「운영」 절이 다룹니다.

장치를 다루는 방식

FreeBSD 에서 장치는 대부분 장치 노드라는 특수 파일을 거쳐 씁니다. 장치 노드는 /dev 아래에 있습니다. 장치마다 이름과 번호가 붙습니다. ada0 은 첫 번째 SATA(Serial Advanced Technology Attachment) 하드 디스크입니다. kbd0 은 키보드입니다.

/dev 는 devfs 라는 장치 파일 시스템이 채웁니다. devfs 는 커널이 아는 장치 이름들을 파일 시스템의 이름 공간에 보여 줍니다. 보통 /dev 에 마운트됩니다.

장치 드라이버는 커널 안에서 특정 장치를 맡아 다루는 코드입니다. FreeBSD 의 장치 드라이버는 크게 문자 장치 드라이버와 네트워크 장치 드라이버로 나뉩니다. 문자 장치 드라이버는 사용자 프로세스와 데이터를 곧바로 주고받습니다. 가장 흔한 종류입니다.

flowchart TD
    P["프로그램"] -->|"열고 읽고 쓴다"| N["/dev 아래 장치 노드 · devfs 가 채운다"]
    N --> D["문자 장치 드라이버 · 커널 안"]
    D --> H["장치 · 디스크 · 키보드"]

디스크도 문자 장치로 다룹니다. 다른 유닉스에는 커널이 캐시를 끼워 주는 디스크 장치인 블록 장치가 따로 있습니다. FreeBSD 는 이것을 없앴습니다. 왜 없앴는지는 「포기한 것」에서 봅니다.

포기한 것

이 절은 FreeBSD 가 안 하기로 한 결정 둘을 봅니다. 대상은 디스크 장치와 배포 라이선스입니다. 결정마다 무엇을 내려놓고 무엇을 얻었는지 짝으로 적습니다.

캐시를 끼는 블록 장치

다른 유닉스 시스템은 디스크 파티션 하나를 장치 둘로 보여 주기도 합니다. 하나는 커널이 캐시를 끼워 주는 블록 장치입니다. 다른 하나는 캐시 없이 프로그램과 곧바로 주고받는 문자 장치입니다. 날것이라는 뜻으로 raw 장치라고도 부릅니다.

flowchart TD
    subgraph other["다른 유닉스 · 파티션 하나에 장치 둘"]
        P1["디스크 파티션"] --> B1["블록 장치 · 커널 캐시를 낀다"]
        P1 --> C1["문자 장치 · raw"]
    end
    subgraph fbsd["FreeBSD · 파티션 하나에 장치 하나"]
        P2["디스크 파티션"] --> C2["문자 장치"]
    end

FreeBSD 는 블록 장치를 없앴습니다. 커널 캐시가 쓰기 순서를 바꿔 버리기 때문입니다. 그러면 프로그램은 어느 순간 디스크에 무엇이 적혀 있는지 알 수 없습니다. 이 캐시 때문에 블록 장치는 거의 쓸 수 없거나, 적어도 위험할 만큼 믿을 수 없게 됩니다.

파일 시스템이나 데이터베이스처럼 디스크 위에 구조를 쌓는 프로그램이 여기서 걸립니다. 기계가 죽은 뒤에 그 구조를 예측 가능하게 복구할 수 없게 됩니다. 쓰기가 늦춰질 수 있으니 어느 쓰기가 오류를 냈는지 커널이 프로그램에 알려 줄 길도 없습니다.

그래서 디스크를 직접 다루는 프로그램은 거의 다 문자 장치를 쓰라고 굳이 지정해 왔습니다. 블록 장치에 기대는 진지한 프로그램은 없다고 봅니다.

얻은 것은 단순해진 커널 코드입니다. 파티션마다 뜻이 다른 장치 둘을 겹쳐 두는 구현이 관련 커널 코드를 크게 복잡하게 만들었습니다. FreeBSD 는 디스크 입출력 기반을 새로 손보면서 캐시를 끼는 디스크 장치 지원을 뺐습니다.

고친 코드를 돌려받을 권리

FreeBSD 는 BSD 라이선스로 배포됩니다. 버클리에서 나온 라이선스라서 버클리 라이선스라고도 부릅니다. 조건은 두 가지입니다. 소스를 다시 배포하면 저작권 표시와 조건 목록과 면책 문구를 남깁니다. 바이너리로 다시 배포하면 같은 내용을 문서나 함께 주는 자료에 싣습니다.

소스를 공개하라는 조건은 없습니다. 그래서 FreeBSD 코드는 팔 수 있습니다. 소스를 닫은 제품에 넣을 수도 있습니다. 넣은 회사가 자기 코드를 공개할지, 앞으로 무엇을 할지에도 제약이 없습니다.

GPL(General Public License)은 반대편에 섭니다. GPL 프로그램을 고친 것은 공동체에 돌려줘야 합니다. GPL 코드를 쓰거나 링크한 프로그램도 GPL 이 되어야 합니다.

내려놓은 것은 돌아오는 코드를 강제할 권리입니다. FreeBSD 로 제품을 만드는 회사는 자기가 고친 것 가운데 얼마를 돌려줄지 스스로 정합니다.

얻은 것은 가장 넓은 쓰임입니다. 프로젝트는 어떤 목적에든 조건 없이 쓸 수 있는 소프트웨어를 내는 것을 목표로 삼습니다. 코드가 가장 널리 쓰여 가장 넓은 이익을 내게 하려는 것입니다.

그래서 새로 들어오는 코드도 무리가 없으면 BSD 라이선스로 받기를 선호합니다. GPL 소프트웨어를 상업적으로 쓸 때 생길 수 있는 복잡함을 피하려는 것입니다. 소스 트리 안에는 GPL 이나 LGPL(Library General Public License) 아래의 코드도 일부 있습니다.

예시

이 절은 FreeBSD 를 고른 두 시스템을 봅니다. 대상은 Netflix 의 영상 서버와 pfSense 방화벽입니다. 각각 FreeBSD 의 어느 부분에 기대는지, 왜 골랐는지를 봅니다.

Netflix Open Connect Appliance

Netflix 는 Open Connect 라는 자체 CDN(Content Delivery Network, 콘텐츠 전송 네트워크)을 둡니다. 그 안에서 가입자에게 영화와 방송 영상을 내보내는 장비가 OCA(Open Connect Appliance)입니다. OCA 는 FreeBSD 기반 장비입니다.

OCA 소프트웨어를 설계하며 세운 목표는 넷입니다.

  • 오픈 소스 소프트웨어를 쓴다
  • 디스크에서 읽어 네트워크로 내보내는 일을 효율 있게 한다
  • HTTP(HyperText Transfer Protocol) 전송을 빠르게 한다
  • BGP(Border Gateway Protocol)로 경로 정보를 모은다

운영체제는 FreeBSD 의 -CURRENT 브랜치입니다. 웹 서버는 nginx 입니다. -CURRENT 는 기본 시스템 소스의 개발 중인 맨 앞 브랜치입니다. 주로 FreeBSD 개발자를 향합니다. 「상세」에서 본 ports 트리의 맨 앞 브랜치와는 다른 나무입니다.

Netflix 는 FreeBSD 를 고른 이유로 안정성과 기능 사이의 균형, 튼튼한 개발 공동체, 팀 안의 전문성을 듭니다. 고친 코드는 팀 안의 FreeBSD 커미터를 거쳐 오픈 소스로 바로 돌려줍니다.

-CURRENT 를 따라가는 이유도 밝힙니다. 맨 앞을 따라가면 회귀를 바로 잡아냅니다. 회귀는 전에 되던 것이 새 변경 때문에 깨지는 일입니다. 누가 커밋하고 2~3년이 지나서야 문제를 찾는 일이 없습니다. 자기 소스 트리가 업스트림과 거의 같습니다. 업스트림은 FreeBSD 프로젝트의 본 저장소입니다. 그래서 자기 패치를 따로 들고 있을 때 쌓이는 기술 부채도 크게 줄어듭니다.

커널에서 Netflix 가 기댄 것은 sendfile 입니다. sendfile 은 파일 내용을 소켓으로 보내 달라고 커널에 부탁하는 시스템 콜입니다. 소켓은 프로그램이 네트워크로 데이터를 주고받는 끝점입니다.

nginx 는 요청이 오면 sendfile 을 부릅니다. 파일 디스크립터와 소켓 디스크립터를 함께 넘깁니다. 디스크립터는 프로그램이 연 파일이나 소켓을 가리키는 번호입니다.

커널은 파일 내용을 페이지 캐시로 읽어 들입니다. 페이지 캐시는 커널이 디스크에서 읽은 내용을 메모리에 붙잡아 두는 영역입니다. 커널은 그 캐시 페이지를 가리키는 포인터 묶음을 소켓 버퍼에 넘깁니다. 버퍼를 더 두지도, 데이터를 복사하지도 않습니다. 디스크에서 소켓까지 복사 없이 흐르는 셈입니다. 이것을 제로 카피(zero-copy)라고 부릅니다.

sequenceDiagram
    participant N as nginx
    participant K as 커널
    participant D as 디스크
    participant S as 소켓 버퍼
    N->>K: sendfile(파일, 소켓)
    K->>D: 영상 파일을 읽는다
    D-->>K: 페이지 캐시에 올린다
    K->>S: 캐시 페이지를 가리키는 포인터만 넘긴다
    Note over K,S: 데이터가 커널 메모리 밖으로 안 나간다

Netflix 는 여기에 둘을 더했습니다. 먼저 sendfile 을 비동기로 바꿨습니다. nginx 는 여러 클라이언트의 요청을 한꺼번에 내보냅니다. 각 요청은 디스크 읽기가 끝나는 대로 따로 진행됩니다.

다음은 커널 TLS(KTLS, Kernel Transport Layer Security)입니다. TLS 는 통신 내용을 암호화하는 프로토콜입니다. KTLS 는 그 TLS 처리를 응용 프로그램에서 커널로 옮깁니다.

처음 연결을 맺는 핸드셰이크는 사용자 공간에서 합니다. 핸드셰이크는 양쪽이 암호화에 쓸 열쇠를 정하는 첫 교환입니다. 세션 키가 정해지면 TCP_TXTLS_ENABLE 같은 소켓 옵션으로 커널에 넘깁니다.

그 뒤로는 데이터가 있는 커널 안에서 암호화합니다. 그래서 sendfile 을 쓰는 서버의 성능이 좋아집니다. 커널 TLS 는 FreeBSD 13.0 에 처음 들어왔습니다.

sequenceDiagram
    participant N as nginx
    participant K as 커널
    participant S as 소켓 버퍼
    Note over N: 사용자 공간에서 핸드셰이크를 해 세션 키를 정한다
    N->>K: 세션 키를 소켓 옵션으로 넘긴다
    N->>K: sendfile(파일, 소켓)
    Note over K: 커널 안에서 암호화한다
    K->>S: 암호화한 데이터를 넘긴다

pfSense

pfSense 는 방화벽과 라우터로 쓰도록 다듬은 FreeBSD 배포판입니다. 관리는 전부 웹 화면에서 합니다. FreeBSD 를 몰라도 깔아 씁니다. 방화벽 기능은 FreeBSD 의 PF 위에서 돕니다.

pfSense 가 바탕 운영체제로 FreeBSD 를 고른 이유는 셋입니다.

이유 무엇이 있었나
무선 2004년 당시 OpenBSD 의 무선 인터페이스 지원이 FreeBSD 보다 크게 모자랐습니다
처리량 OpenBSD 위의 PF 방화벽 수백 대를 관리하던 개발자가, 초당 패킷 수가 높은 구간을 버티려고 고부하 장비를 FreeBSD 위의 PF 로 옮겼습니다. FreeBSD 의 PF 는 멀티프로세서를 써서 더 크게 늘릴 수 있습니다
계보 pfSense 는 m0n0wall 이라는 앞선 프로젝트에서 갈라져 나왔습니다. m0n0wall 의 코드가 FreeBSD 기반이었습니다. 바탕 운영체제를 바꾸려면 감당하기 어려울 만큼 고쳐야 했습니다

사용처

이 절은 FreeBSD 코드를 안에 넣은 제품을 셉니다. 대상은 운영체제·게임기·저장 장비·네트워크 장비입니다. 제품마다 FreeBSD 의 어느 부분이 들어갔는지, 지금 버전에도 그런지를 봅니다.

장비 회사들이 FreeBSD 를 바탕으로 삼는 까닭은 둘입니다. 하나는 하나로 묶인 빌드 환경과 크로스 빌드 환경입니다. 크로스 빌드는 다른 종류의 프로세서에서 돌 프로그램을 지금 기계에서 빌드하는 일입니다.

다른 하나는 「포기한 것」에서 본 BSD 라이선스입니다. 고친 것 가운데 얼마를 돌려줄지 회사가 스스로 정합니다.

메일 장비와 웹 장비부터 라우터, 시간 서버, 무선 액세스 포인트까지 이런 임베디드 제품이 FreeBSD 위에 섭니다. 임베디드 제품은 장비 안에 넣어 정해진 일만 하게 만든 제품입니다. 아래 표가 그 가운데 이름이 알려진 넷입니다.

제품 FreeBSD 의 어느 부분이 들어갔나 버전에 따른 갈림
macOS 커널 커널의 BSD 부분이 주로 FreeBSD 에서 왔습니다 —
PlayStation 4 쓰인 오픈 소스 목록에 FreeBSD 커널, C 표준 라이브러리인 BSD libc, 파일 시스템을 검사하고 만드는 FreeBSD 의 fsck·newfs 명령, FreeBSD 네트워크 코드가 올라 있습니다 PlayStation 4 에 한한 목록입니다
TrueNAS 저장 장비 운영체제입니다. 그 가운데 TrueNAS CORE(FreeBSD 기반 갈래)가 FreeBSD 를 바탕으로 합니다 CORE 는 2024년 3월부터 유지 보수 단계로 들어갔습니다. 13.0 버전은 안정성·보안 관련 버그 수정을 계속 받습니다. 24.10 이후 버전은 Linux 기반입니다. SCALE(Linux 기반 갈래)이 기능·성능·품질에서 CORE 를 앞섰습니다. 그래서 두 갈래를 함께 유지하지 않게 됐습니다
Junos 주니퍼 네트웍스의 네트워크 장비 운영체제입니다. FreeBSD 를 커널로 써서 명령줄에서 여러 유닉스 도구를 씁니다 Junos OS Evolved 는 Linux 커널 위에 섭니다

운영

이 절은 FreeBSD 를 굴릴 때 만지는 설정과 아픈 곳을 봅니다. 대상은 업데이트 도구, 패키지 저장소의 브랜치, 설정 파일, 지원 기간입니다. 무엇이 기본값이고 어디를 바꾸는지를 적습니다.

기본 시스템과 패키지를 따로 올리는 업데이트

FreeBSD 는 두 말을 가릅니다. 업데이트는 보안·오류 패치를 대어 패치 수준만 올리고 버전 번호는 그대로 두는 일입니다. 업그레이드는 기본 시스템 전체를 버전 번호가 다른 것으로 갈아 끼우는 일입니다.

기본 시스템과 바깥 프로그램은 이 일을 따로 합니다.

대상 쓰는 도구 설정 파일 위치
기본 시스템(커널과 사용자 공간) freebsd-update /etc
패키지로 깐 프로그램 pkg upgrade /usr/local/etc
ports 로 깐 프로그램 ports-mgmt/portmaster 같은 도구 /usr/local/etc

freebsd-update 는 업데이트와 업그레이드를 둘 다 합니다. 보안 팀이 지원하는 릴리스면 직접 컴파일하지 않고 바이너리로 받습니다.

아픈 곳은 메이저 버전을 올릴 때입니다. 마이너 버전을 올린 뒤에는 깔아 둔 프로그램이 대개 문제없이 돕니다.

메이저 버전끼리는 ABI(Application Binary Interface)가 다릅니다. ABI 는 컴파일된 프로그램이 운영체제와 맞물리는 이진 수준의 약속입니다. 그래서 메이저 버전을 올리면 바깥 프로그램 대부분이 깨집니다. 패키지와 ports 를 전부 다시 올려야 합니다.

flowchart TD
    U["freebsd-update 로 기본 시스템을 올린다"] --> Q{"마이너인가 메이저인가"}
    Q -->|마이너| M["깔아 둔 프로그램이 대개 그대로 돈다"]
    Q -->|메이저| A["ABI 가 달라진다"]
    A --> B["바깥 프로그램 대부분이 깨진다"]
    B --> C["pkg upgrade · portmaster 로 패키지와 ports 를 전부 다시 올린다"]

업데이트와 업그레이드는 옛 버전에서 새 버전 방향으로만 지원합니다.

이 두 갈래는 바뀌는 중입니다. 14.0 부터 기본 시스템도 pkg 패키지로 내기 시작했습니다. 이 방식을 전통적으로 pkgbase 라고 불러 왔습니다. 14 에서는 실험 단계입니다.

15.0 부터는 같은 방식을 freebsd-base 라는 이름으로 설치와 업그레이드에 기술 미리보기로 지원합니다. 언젠가 freebsd-update 를 대신할 계획입니다. 지금 설치에 쓰는 배포 세트, 곧 base.txz·kernel.txz 같은 압축 묶음을 대신하기까지는 시간이 걸립니다.

패키지 저장소의 quarterly 브랜치와 latest 브랜치

pkg 는 기본으로 분기별(quarterly) 브랜치를 따라갑니다. 이 브랜치는 해마다 1월·4월·7월·10월 초에 개발 중인 맨 앞에서 잘라 냅니다. 그 뒤로는 기능이 아닌 변경만 들입니다. 보안 수정, 오류 수정, 그리고 ports 를 짓는 규칙의 변경을 받는 것이 목표입니다. 업그레이드가 예측 가능해지는 대신 새 기능은 다음 분기를 기다립니다.

분기별 브랜치가 기능 변경을 안 받는 대신, 최신(latest) 브랜치는 패키지의 가장 새 버전을 줍니다. 바꾸려면 /usr/local/etc/pkg/repos/FreeBSD.conf 에 저장소 주소를 다시 적습니다.

FreeBSD-ports: { url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest" }

이 한 줄은 FreeBSD-ports 저장소의 주소를 latest 브랜치로 바꿉니다. ports 와 패키지를 섞어 쓴다면 pkg 가 보는 브랜치와 ports 트리의 브랜치를 같은 것으로 맞춰야 합니다(「상세」의 ports 와 패키지).

서비스를 켜는 rc.conf

시스템 설정의 중심은 /etc/rc.conf 입니다. 부팅할 때 읽힙니다. /etc/defaults/rc.conf 의 기본값을 덮어씁니다. 기본값 파일은 고치지 않습니다. 이 기계만의 변경은 전부 /etc/rc.conf 에 적습니다.

서비스는 rc.conf 에 해당 변수가 켜져 있어야 시작과 정지가 됩니다. nginx 라면 이렇습니다.

# sysrc nginx_enable="YES"
# service nginx start

첫 줄이 rc.conf 에 변수를 켭니다. 둘째 줄이 서비스를 띄웁니다. 변수와 상관없이 한 번만 돌리려면 onestart 처럼 명령 앞에 one 을 붙입니다.

기본으로 꺼져 있어 따로 켜야 하는 기능이 몇 있습니다. 표의 zfsd 는 ZFS 의 장애에 자동으로 대응하는 데몬입니다. 데몬은 뒤에서 늘 도는 프로그램입니다.

기능 켜는 방법
PF 커널 모듈을 먼저 올립니다. 그 다음 /etc/rc.conf 에 켜는 항목을 넣습니다
bhyve kldload vmm 으로 커널 모듈을 올립니다
zfsd 기본 시스템에 있지만 기본으로 꺼져 있습니다. 켜는 명령은 공개된 문서에서 확인하지 못했습니다(미확인)
리눅스 바이너리 호환 sysrc linux_enable="YES" 로 켭니다. 아래 소절이 다룹니다

리눅스 바이너리 호환

FreeBSD 는 선택 기능으로 리눅스 바이너리 호환을 줍니다. 흔히 Linuxulator 라고 부릅니다. 리눅스용 실행 파일을 고치지 않고 돌리는 기능입니다. x86(32비트·64비트)과 AArch64 에서 됩니다.

기본은 꺼져 있습니다. 켜면 필요한 커널 모듈을 올립니다. 그리고 리눅스 프로그램이 기대하는 파일 시스템을 /compat/linux 아래에 마운트합니다.

호환 기능만으로는 리눅스 프로그램이 안 돕니다. 리눅스용 사용자 공간을 먼저 깔아야 합니다. ports 트리에 있는 프로그램이면 pkg 가 필요한 리눅스 사용자 공간을 알아서 깝니다. cgroups 나 namespaces 처럼 하드웨어나 시스템 관리에 묶인 리눅스 전용 기능 일부는 아직 지원하지 않습니다.

커널 상태를 바꾸는 sysctl

sysctl 은 커널 상태를 읽는 도구입니다. 권한이 있으면 바꾸기도 합니다. 값은 MIB(Management Information Base) 꼴의 이름으로 가리킵니다. 점으로 이은 이름입니다.

재부팅 뒤에도 값을 남기려면 /etc/sysctl.conf 에 적습니다. 이 파일의 값은 시스템이 멀티유저 모드로 들어간 뒤에 적용됩니다. 멀티유저 모드는 부팅이 끝나 여러 사용자가 로그인할 수 있게 된 상태입니다. 그 모드에서 못 바꾸는 변수도 있습니다.

지원 기간

릴리스마다 보안 담당자가 지원하는 기간이 정해져 있습니다. 메이저 버전마다 stable 브랜치가 하나씩 있습니다. 마이너 버전들이 그 아래로 나옵니다.

대상 지원 기간
마이너 버전 같은 메이저 버전의 다음 마이너 버전이 나온 뒤 석 달까지
메이저 버전의 마지막 마이너 버전 그 메이저 버전의 stable 브랜치 지원이 끝날 때까지
stable 브랜치(15 부터) .0 버전이 나온 날부터 4년

공개된 종료 예정일은 가장 이른 날입니다. 사정에 따라 뒤로 밀릴 수 있습니다.

보안 권고는 stable 브랜치와 보안 브랜치에만 나옵니다. 보안 브랜치가 어떤 브랜치를 가리키는지는 공개된 문서에서 확인하지 못했습니다(미확인). 개발자를 향한 -CURRENT 에는 보안 권고가 없습니다. ports 의 보안 문제는 ports 만을 위한 보안 문서가 따로 다룹니다.

관련 항목

FreeBSD 가 속하는 운영체제 계통

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

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

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

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

커널 · 사용자 공간 · 셸 · libc · UFS · ZFS · OpenZFS · 볼륨 관리자 · zfsd · GEOM · jail · chroot · bhyve · 하이퍼바이저 · PF · IPFW · DTrace · kqueue · 시스템 콜 · Capsicum · devfs · fsck · newfs

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

ports · pkg · 패키지 관리자 · 의존성 · 빌드 · 크로스 컴파일 · portmaster · Xorg · X Window System · 리눅스 호환 계층

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

디바이스 드라이버 · 문자 장치 · 블록 장치 · 장치 파일 · raw 장치 · 페이지 캐시 · 캐싱

FreeBSD 배포를 정하는 라이선스

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

FreeBSD 를 설정하고 업그레이드하는 도구

rc.conf · sysrc · sysctl · freebsd-update · pkgbase · ABI · loader · 부팅

FreeBSD 릴리스를 가르는 브랜치와 보안 지원

FreeBSD-CURRENT · FreeBSD-STABLE · EoL · 보안 권고 · VuXML

Netflix 영상 서버가 FreeBSD 위에서 쓰는 기술

sendfile · 제로 카피 · KTLS · TLS · nginx · CDN · Open Connect · BGP · HTTP

FreeBSD 를 바탕으로 만든 제품

Darwin · macOS · pfSense · m0n0wall · TrueNAS · Junos · PlayStation

다른 이름: freebsd · 프리BSD