Trans:OpenRCMigration

Gentoo Korea Wiki
둘러보기로 가기 검색하러 가기

Baselayout과 OpenRC 설정 가져오기 안내서

배경

Baselayout이란 뭔가요?

Baselayout은 /etc/hosts와 같이 모든 시스템에서 기능을 올바르게 동작하기 위해 필요로 하는 기본 파일 모음을 제공합니다. 또한 젠투에서 사용하는 (/etc, /var ,/usr, /home과 같은)파일 시스템 배치를 제공하기도 합니다.

OpenRC란 뭔가요?

OpenRC는 시스템에서 제공하는 보통 /sbin/init인 init 기능이 어떤 것이냐에 대해서는 상관 없이 동작하는 의존성 기반 rc 시스템입니다만 /sbin/init을 대체할 수 없습니다. 젠투 리눅스에서 사용하는 기본 init은 sys-apps/sysvinit 이고, Gentoo/FreeBSD는(이하 젠투프비라고 합니다) sys-freebsd/freebsd-sbin이 제공하는 FreeBSD init을 사용합니다.

그래서, 왜 설정을 가져와야 하나요?

본래 젠투의 rc 시스템은 baselayout 1에 빌드했고 완전히 bash 스크립트로 작성했습니다. 이는 약간의 제한 요소가 있었습니다. 예를 들어 각각의 시스템 호출들은 시동하는 동안에 접근할 필요가 있고 추가할 C 기반의 콜 아웃이 필요합니다. 이들 각각의 콜 아웃은 점차적으로 rc 시스템을 보기 흉하게 커지도록 정적으로 링크했었습니다.

게다가 젠투프비와 젠투 임베디드 같은 플랫폼으로 젠투를 확장했을 때 Bash 기반 rc 시스템을 요구하는 것은 불가능하게 되었습니다. 이는 C기반으로 작성하였고 POSIX 호환 쉘만을 요구하는 Baselayout 2를 개발하는 요인이 되었습니다. Baselayout 2를 개발하는 동안 젠투용 기반 파일과 파일시스템 배치를 Baselayout이 대부분 제공했다면 더 좋았을 것이라는 판단을 하게 됐고, rc시스템은 패키지 내부에서 깨졌습니다. 그래서 OpenRC를 보유하게 된 것입니다.

OpenRC는 초기에 Roy Marples가 2010년까지 개발했고 지금은 젠투 OpenRC 프로젝트 에서 관리하고 있습니다. OpenRC는 현재 다양한 모든 젠투 시스템(젠투 리눅스, 젠투프비, 젠투 임베디드 젠투 V서버)과 FreeBSD와 NetBSD 같은 다른 플랫폼을 지원합니다.

OpenRC로 설정 가져오기

OpenRC로 설정을 가져오는 것은 무지 쉽습니다. 꾸러미 관리자에 보통 업그레이드 과정의 일부가 될 것입니다. 실제로 가장 중요한 과정은 >=sys-apps/baselayout-2sys-apps/openrc 꾸러미를 설치하고난 다음입니다. 재시동을 하기 전에 dispatch-conf를 실행하고 /etc가 최신인지를 확인하는 것이 매우 중요 합니다. 이 과정을 실패하면 시동할 수 없는 시스템이 될 것 이며, 시스템을 복구하기 위해 젠투 라이브CD를 사용하고 아래의 과정을 수행하는 것이 필요할 것입니다.

/etc/conf.d/rc

/etc/conf.d/rc는 이미 오래됐으며 여기에 있는 설정 내용들은/etc/rc.conf에 적당한 설정으로 가져다 놓을 필요가 있을 것입니다. /etc/rc.conf와 /etc/conf.d/rc의 내용을 쭉 살펴보시고 설정 내용을 가져다 놓으시기 바랍니다. 이 과정이 끝나면 /etc/conf.d/rc를 삭제하십시오.

커널 모듈

보통 시동시 각각의 커널 모듈을 자동으로 불러오고 싶을 경우, 여러분이 불러오고 싶은 모듈에 대한 인자들과 함께 커널 모듈을 /etc/modules.autolod.d/kernel-2.6에 놓을 것입니다. baselayout-2에서는 이 파일을 더 이상 사용하지 않습니다. 대신 자동으로 불러올 모듈과 모듈 인자들은 커널 버전에 상관 없이 /etc/conf.d/modules에 놓입니다.

예전 방식의 설정 파일은 다음과 같을 것입니다.


코드 예제 2.1: /etc/modules.autoload.d/kernel-2.6
ivtv

cx88_dvb video_br=2


위 예제는 바꾼 결과는 다음과 같습니다.


코드 예제 2.2: /etc/conf.d/modules
# 시동시 자동으로 불러올 모듈

modules_2_6="ivtv cx88_dvb"
# 모듈 인자
module_cx88_dvb_args_2_6="video_br=2"


위의 예제에서 2.6 버전의 커널에 대한 모듈과 인자들만이 전달될 것입니다. 새 설정내용에서는 커널 버전에 따라 모듈과 인자를 세밀하게 조절할 수 있습니다.


중요: module* 변수는 누적할 수 없습니다. 좀더 버전에 특화된 변수의 내용이 좀 더 일반적인 변수를 덮어쓸 것입니다.



참고: ModuleModules의 차이를 숙지하여 주십시오.


좀 더 자세한 예제는 다음과 같습니다.


코드 예제 2.3: /etc/conf.d/modules의 자세한 예제
# 2.6.23-gentoo-r5에 대한 ivtv만 불러옵니다

modules_2_6_23_gentoo_r5="ivtv"
# (-gentoo-r5 말고) 2.6.23 커널에 대한 cx88_dvb만을 불러옵니다
modules_2_6_23="cx88_dvb"
# 2.6.x대 버전의 커널에서 x가 23이 아닌 경우 tun과 usbserial만을 불러옵니다
modules_2_6="tun usbserial"
# 이 외의 경우에 ochi1394와 ieee1394를 불러옵니다.
modules="ohci1394 ieee1394"

# 2.6.23-gentoo-r5에 대해 pass video_br=2 인자 값을 cx88_dvb에 전달합니다
module_cx88_dvb_args_2_6_23_gentoo_r5="video_br=2"
# 2.6.x 버전대 커널에 대해 vendor와 product 인자를 전달합니다
module_usbserial_args_2_6="vendor=0x1410 product=0x2110"
# ieee1394에 debug라는 값을 전달합니다
module_ieee1394_args="debug"


런레벨 시동

boot 런레벨은 모든 장치에 대해 중요한 여러단계를 수행합니다. 예를 들어 루트 파일 시스템을 읽기/쓰기로 마운트 했는지 확인하고, 이 파일시스템의 오류를 검사하며, 마운트 지점을 사용할 수 있는지 확인하고, /proc 가상 파일시스템을 시동시 시작합니다.

OpenRC에서는 여러분의 블록 저장장치 에 대한 볼륨 관리 서비스를 더이상 시동시 자동으로 실행하지 않습니다. lvm, raid, swap, device-mapper(dm), dm-crypt와 같은 것들이 여기에 포함됩니다.이들 서비스에 대한 적당한 초기화 스크립트가 boot 런레벨에 있는지 반드시 확인해야 하며, 그렇지 않으면 시스템을 시동할 수 없을 것입니다!

OpenRC ebuild는 이 설정 내용 가져오기를 시도해볼 것이며 여러분은 모든 볼륨 관리 서비스에 대한 설정이 제대로 옮겨졌는지 검증해야 합니다.


코드 예제 2.4: boot 런레벨에 있는 모든 서비스 표시하기
# ls -l /etc/runlevels/boot/


root, procfs, mtab, swap, fsck가 위 목록에 보이지 않는다면 이들을 boot 런레벨에 추가하기 위해 다음 명령을 수행합니다.


코드 예제 2.5: boot 런레벨에 중요한 서비스 추가하기
# rc-update add root boot

# rc-update add procfs boot
# rc-update add mtab boot
# rc-update add fsck boot
# rc-update add swap boot


mdraid와 lvm을 사용하는 것을 알고 있고 위 목록에서 보지 못했다면, 초기화 스크립트를 boot 런레벨에 추가하기 위해 다음 명령을 수행해야 합니다.


코드 예제 2.6: boot 런레벨에 mdraid와 lvm 추가하기
# rc-update add mdraid boot

# rc-update add lvm boot


Udev

OpenRC는 더이상 기본적으로 udev를 시작하지 않지만 sysinit 런레벨에서 시작하도록 나타내야 합니다. OpenRC ebuild는 udev를 이미 활성화 했고 sysinit 런레벨로 추가했는지 감지할 것입니다. 그러나 안전을 위해 udev가 있는지 확인해보십시오


코드 예제 2.7: udev 확인하기
# ls -l /etc/runlevels/sysinit

lrwxrwxrwx 1 root root 14 2009-01-29 08:00 /etc/runlevels/sysinit/udev -> /etc/init.d/udev


udev가 안보이면 올바른 런레벨에 추가합니다.


코드 예제 2.8: udev를 sysinit 런레벨에 추가하기
# rc-update add udev sysinit


네트워크

서로 다른 baselayout과 OpenRC 패키지로 쪼개진 이유 때문에 net.eth0 초기화 스크립트는 업그레이드 과정에서 없어질 것입니다. 이 초기화 스크립드를 바꾸고 기본 런레벨에 추가하려면 다음 명령을 수행해 주십시오:


코드 예제 2.7: 빠진 net.eth0 스크립트를 다시 추가하기
# cd /etc/init.d

# ln -s net.lo net.eth0
# rc-update add net.eth0 default


다른 네트워크 초기화 스크립트가 빠져있다면 다시 추가하기 위해 위 방법을 따라하도록 합니다. eth0를 여러분의 네트워크 장치로 간단하게 바꿉니다.

또한 /etc/conf.d/net (이전 네트워크) 는 설정 내용에 배시 방식의 배열을 더이상 사용하지 않습니다. 설정 방법을 보려면 /usr/share/doc/openrc-<버전>/net.example 을 검토하여 주시기 바랍니다. 배열의 여러 항목에 대해 줄바꿈 문자를 넣어 설정을 바꾸는건 비교적 쉬울 텐데, 예를 들어 정적 IP 할당은 다음처럼 바꿉니다.


코드 예제 2.10: 이전 /etc/conf.d/net 방식
config_eth0=( "192.168.1.37 netmask 255.255.255.0 brd 192.168.1.255" )

routes_eth0=( "default via 192.168.1.100" "10.0.0.0/8 via 192.168.1.2" )



코드 예제 2.11: 새로운 /etc/conf.d/net 방식
config_eth0="192.168.1.37 netmask 255.255.255.0 brd 192.168.1.255"

routes_eth0="default via 192.168.1.100
10.0.0.0/8 via 192.168.1.2"


시계

시계 설정 파일은 설정을 위해 /etc/conf.d/clock에서 시스템 자체 도구로 이름이 바뀌었습니다. 이는 리눅스에서는 /etc/conf.d/hwclock으로 바뀔 것이며 FreeBSD에서는 /etc/conf.d/adjkerntz로 바뀔 것임을 의미합니다. 실시간 시계(RTC) 칩이 동작하지 않는 시스템이라면 시스템을 종료할 때 만들어지는 파일의 mtime을 기반으로 하여 시스템 시간을 설정하는 /etc/init.d/sqclock을 사용해야 합니다. /etc/init.d의 초기화 스크립트는 이에 따라 이름을 바꾸었으니, 여러분의 시스템에 대해 boot 런레벨에 이미 적당한 스크립트를 추가했는지 확인하십시오.

게다가 TIMEZONE 변수는 더이상 이 파일에 없습니다. 이 내용은 대신 /etc/timezone 파일에서 찾을 수 있습니다. 만약 이 파일이 없다면, 물론 시간대 설정에 따라 이 파일을 만들어야 합니다. 이들 파일이 올바른지 검토하여 주시기 바랍니다.

이 파일에 대한 적당한 값은 /usr/share/timeinfo에 있는 여러분의 시간대와 관련된 경로입니다. 예를 들어 아메리카 합중국 동부 해안에 거주하고 있다면 다음 값이 올바른 설정이 될 것입니다.


코드 예제 2.12: /etc/timezone
America/New_York


XSESSION

XSESSION 변수는 /etc/rc.conf에 더이상 없습니다. 대신 각 사용자에 대해, 사용자의 각 디렉터리에 있는 ~/.bashrc (또는 이와 같은) 파일을, 또는 시스템 전체에 대해 /etc/env.d/ 에서 XSESSION 변수를 설정할 수 있습니다.

전체 시스템에 대해 XSESSION 변수를 설정하는 예제는 다음과 같습니다.


코드 예제 2.13: 시스템 영역의 XSESSION 변수 설정하기
# echo 'XSESSION="Xfce4"' >/etc/env.d/90xsession



중요: /etc/env.d 에 파일을 만든 다음에 설정 내용을 적용하려면 반드시 env-update 를 실행해야 하고, 로그아웃 한 다음 다시 로그인해야 합니다. 만약 ~/.bashrc에 변수를 설정했다면 source ~/.bashrc로 변수 원본을 다시 지정할 수 있습니다.


EDITOR와 PAGER

EDITOR 변수는 /etc/rc.conf에 더이상 없습니다. EDITOR와 PAGER 환경변수들은 기본적으로 /etc/profile에 설정되어 있습니다. 여러분 각자가 필요하다면 ~/.bashrc (또는 이와 같은) 파일에 필요한대로 설정을 해주시고 시스템 기본값을 설정하시려면 /etc/env.d/99editor파일을 만들고 여기에 설정해주십시오.


중요: /etc/env.d 에 파일을 만든 다음에 설정 내용을 적용하려면 반드시 env-update 를 실행해야 하고, 로그아웃 한 다음 다시 로그인해야 합니다. 만약 ~/.bashrc에 변수를 설정했다면 source ~/.bashrc로 변수 원본을 다시 지정할 수 있습니다.


시동 로그

예전에는 app-admin/showconsole을 사용해서 시동과정을 기록할 수 있었습니다. 그러나 이제 OpenRC는 내부적으로 모든 로그를 다루기 때문에, 배포중인 showconsole을 더이상 뜯어보지 않아도 됩니다. 이제 안전하게 showconsole을 제거할 수 있습니다. 시동 메시지 기록을 계속하려면 /etc/rc.conf에 적당한 변수를 설정합니다. 로그 내용은 /var/log/rc.log에 나타날 것입니다.


코드 예제 2.14: /etc/rc.conf에서 시동 기록 활성화하기
rc_logger="YES"


local.start와 local.stop

OpenRC에서 /etc/conf.d/local.start와 local.stop은 오래된 존재입니다. OpenRC로 설정 내용을 가져오는 동안에 이 파일들은 /etc/local.d로 옮겨지며 여기에 .start나 .stop이 붙습니다. 그러면 OpenRC가 이들을 알파벳 순서대로 실행할 것입니다.

시스템 하위유형: 가상화 특수 요건

이전 OpenRC 버전에서는 다양한 형식의 가상화를 감지했고 각각의 초기화 스크립트를 건너뛰었을 때 감지한 요소들을 기록하기 위해 Depend함수의 keyword호출을 통해 사용하였습니다.

그러나 0.7.0 릴리즈때에는 /etc/rc.conf의 rc_sys 변수를 사용하여 하위 형식을 분명하게 설정해주어야 합니다. 하위형식은 루트가 있는 가상화 환경에 일치하도록 설정해야 합니다. 일반적으로 비어있지 않은 rc_sys 값은 가상 컨테이너에 있을 것입니다. 호스트 노드는 '''rc_sys=""''' 설정을 가질 것입니다.


중요: 정해진 하위유형이 없으면 빈문자열을 기본값으로 사용해주시기 바랍니다. 이 변수를 지정하지 않으면 경고를 받을 것이고 이전 감지 알고리즘을 사용하려 할 것입니다.



참고: 자동감지를 수행할 때 시스템에서 무슨 값을 사용하는지 모른다면 rc_sys변수를 임시로 주석처리하고 감지 명령인 rc -S를 사용해보아야 합니다.



코드 예제 2.15: /etc/rc.conf에 시스템 하위 유형을 없음으로 설정하기
rc_sys=""


감지 알고리즘은 하위 시스템 유형의 도입과 우선 순위 감지를 신뢰할 수 없게 만드는 커널을 바꾸기 위해 수동 설정으로 바꾸어야 합니다.

하위유형 설명 참고
  기본, 하위유형 없음 설정하지 않은것과 같습니다. FreeBSD, Linux, NetBSD
jail FreeBSD jails  
lxc 리눅스 컨테이너 자동감지 못함
openvz 리눅스 OpenVZ  
prefix Prefix 자동감지 못함, FreeBSD, Linux, NetBSD
vserver 리눅스 V서버  
xen0 Xen0 도메인 리눅스, FreeBSD
xenU XenU 도메인 리눅스, FreeBSD

오래된 설정 파일 지우기

설정 파일을 옮기고 나면 포티지가 지우지 못한 파일들이 파일 시스템에 남아있을 것입니다. 이것들은 포티지 설정 파일 보호 기능으로 인해 보존된 설정 파일들입니다.

가장 자세한 예제는 /usr/share/doc/openrc-*/net.example.bz2로 대체할 수 있는 /etc/conf.d/net.exmaple이 될 것입니다.

끝내기

설정 파일과 초기화 스크립트의 갱신이 끝나면 마지막으로 남은 일은 재시동하는 것입니다. 시스템 상태 정보는 업그레이드 하는 동안 보존되는 것이 아니기 때문에 필요하며 새로 시동하여 시스템 상태 정보를 제공할 필요가 있습니다.

바뀐 기능

일시정지 동작

이전에는 /etc/init.d/service pause명령을 사용하여 모든 관련된 설정들에 지시하지 않고 서비스를 임시로 멈출 수 있었습니다만 OpenRC에서는 pause 동작을 없앴습니다. 이 기능은 이전 baselayout에서도 동작하는 /etc/init.d/service --nodeps stop 명령으로 지원합니다.

/etc/mtab의 rootfs 항목

이전에는 초기에 /etc/mtab에서 rootfs 항목을 지우고 / 항목만 남겨두었습니다. 복제된 rootfs 항목은 실제로 시스템을 종료하는 도중에 다시 추가됩니다. OpenRC에서는 initramfs와 시동시의 tmpfs를 완벽히 지원하기 위해 rootfs와 / 항목 둘 다 있어야 합니다. 이는 시스템을 종료하는 동안에 더 적은 양의 기록이 필요하다는 의미입니다.