stdio


Random ramblings of a anonymous software engineer. Contains occasional profanity. Personal opinions, not related to employer.


Ubuntu Server에 익숙한 유저를 위한 FreeBSD 기본 설정

회사에서 이전까지 내부 테스트 서버 등을 접속하기 위해서 mDNS (Bonjour)를 이용하다가, 안정성 문제나 broadcast 노이즈 등이 너무 많고, 서브넷을 분리할 생각에 내부 DNS를 구축하기로 하였다. 새로 아주 저사양 서버를 2대 구입하여, DNS를 거기에 넣기로 하였는데, 간혈적으로 재부팅시 부팅이 완료되지 않는 어이없는 systemd 버그를 겪게 되어 초기 세팅 후 장기적인 안정성 문제에 대해서 걱정이 들기 시작하였다.

해당 버그는 수정이 된 상태이나, 부팅을 담당하는 모듈이 부팅을 완료하지 못하는 버그가 있는 상태에서 릴리즈가 되었다는 것 자체에 대해서 신뢰도의 문제가 있어, 일단은 당분간은 사내에 systemd를 사용하는 배포판의 도입은 미루는 것으로 하고, 그 사이에 대책을 조금 고민하다 systemd와 연이 있을래야 있을 수 없는 BSD를 사용하기로 하였다. (아울러 개인적으로 Lennart Poettering의 철학과 동의하지 않는다. 이건 어디까지나 사족이지만...)

여러가지를 검토하다 (DragonflyBSD를 특히 유심히 보았다) 결국은 해본적이 있는 FreeBSD로 결정을 하였는데, 오랫만에 해보니 (마지막으로 양산에서 썼던게 4.x대였던걸로 기억된다.) 저쪽 환경에 너무 익숙해져버려 불편한 점이 한두가지가 아니었다. 그래서 조금 환경을 비슷하게 맞추는 과정의 기록을 남기기로.

FreeBSD는 apt-get이나 yum이 없고, 자체 패키지 매니져를 사용한다. ports와 pkg 두 가지 중에서 선택을 할 수 있는데, 전자는 소스 빌드라고 생각하면 되고 후자는 빌드 된 바이너리를 사용한다. 배포 대상 하드웨어가 흔해빠진 인텔이어서, 아래 예시에는 시간 절약을 위해 후자를 사용하였다. 이전에 양산때에는 서버가 DEC Alpha여서 포트로 다 빌드를 했던 (좋지 않은) 기억이 있다.

설치 자체는 인스톨러를 사용할 경우 크게 어려움이 없으니 설명을 생략하고, 환경을 조금이나마 근대적인 환경으로 사용할 수 있도록 하는 방법을 공유하면 도움이 될 사람이 있을까 싶어 문서화. (이 서버들의 경우에는 ZFS 전체 디스크 사용으로 자동 설정, 나머지는 거의 기본 설정, 단 games 메타 패키지는 뺐다.)

한 가지 주의할 점이 있다면, 서버 목적이라면 설치 과정 중 사용자 계정 추가시 관리자는 wheel 그룹에 넣어주는게 좋다는 것 정도가 되겠다. OpenSSH 설치 기본 옵션에 root 로그인이 금지되어 있는데, wheel 그룹에 넣어줘야 su가 된다. (FreeBSD는 기본 배포시 sudo가 없다. 필요하면 설치해서 사용해야한다.) 이걸 까먹으면 이후에 물리적으로 서버에 가서 작업을 한번 해줘야하는 문제가 발생하니 주의하도록 하자.

개인적으로 사용중인 노트북 모니터가 작아서, motd가 보지 않을 내용이 너무 많이 표시되어 빈 내용으로 삭제.

mv /etc/motd /etc/motd.bak
touch /etc/motd

FreeBSD에는 설치시 컴파일러가 (10.x 설치시 LLVM 3.7이 깔려있다.) 따라오나 build-essential에 해당되는 메타패키지가 없어 이걸 알아서 조립을 해야한다. 아래가 그것.

pkg install autoconf automake devel/pkgconf libtool bison gmake ragel devel/boost-all git

이 중에서 매우 중요한것이 gmake이다. FreeBSD는 자체적인 make를 포함하여 배포를 하는데, GNU Make와 호환이 되지 않기 때문에 상당수 오픈 소스 프로젝트가 빌드가 되지 않는다. 마지막 2개는 나의 경우에는 필요했는데, 필요하지 않을 경우에는 생략하여도 된다.

상당수 오픈소스 프로젝트는 Makefile내에 게으르게 gcc/g++를 쓰도록 하드 코딩 되어있다. 컴파일러가 깔려있는 마당에 굳이 GNU Compiler를 설치할 의미는 없는듯 하여, 이 부분은 macOS에서 애플이 사용하는 꼼수를 사용하였다.

# 이런 짓 자주 하면 지옥 간다.
ln -s /usr/local/llvm37/bin/clang /usr/local/bin/gcc
ln -s /usr/local/llvm37/bin/clang++ /usr/local/bin/g++

사용하는 FreeBSD 버전에 따라 /usr/local/llvm[0-9]+ 에서 사용하고 싶은 버전을 찾아서 써주면 된다.

마지막으로, FreeBSD는 기본으로 쉘로 csh를, 기본 에디터로 BSD vi를 사용하는데, 상당 수 프로젝트들이 (아울러 사내 프로젝트들) bashism이 심하고, BSD vi의 기능상 제약이 많아 전역 bash 설정의 alias 레벨에서 바꾸었다. 아울러 make도 gmake로 alias. bash 사용자에만 해당되지만, rootfs를 손상시키지 않고 익숙한 환경을 유지할 수가 있는 편법이다.

/etc/profile 하단에 아래 내용 추가

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    . /etc/bash.bashrc
  fi
fi

/etc/bash.bashrc 작성

# Better prompt for both normal and sudo
PS1='[\u@\h \W]\$ '
SUDO_PS1='[\u@\h \W]\$ '

export TERM=xterm-color
export CLICOLOR=1
export LSCOLORS=ExFxCxDxBxegedabagacad

# BSD ls uses a different parameter for colorization
alias ls="ls -G"
alias l="ls -lG"
alias ll="ls -lGa"
alias vi="vim"
# BSD make isn't particularly useful, so replace that with gmake
alias make="gmake"

BSD ls의 경우는 색상 표시를 위한 옵션이 다르다. BSD에서 제공하는 coreutils에 해당되는 명령의 경우 GNU에 비해서 기능이 없거나, 사용 방법이 달라 불편함이 있을 수 있다. GNU에만 있는 기능들이 필요할 경우, sysutils/coreutils를 설치하면 된다. (현재 작업중인 배포 환경에는 디스크 용량 절약을 위해 coreutils설치를 하지 않았다.)

PowerDNS 설치법은 다음 글에.