<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://wiki.gentoo-kr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Onionmixer</id>
	<title>Gentoo Korea Wiki - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gentoo-kr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Onionmixer"/>
	<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/Onionmixer"/>
	<updated>2026-04-24T11:27:17Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Gentoo_postfix_dovecot_sqlite&amp;diff=1615</id>
		<title>Gentoo postfix dovecot sqlite</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Gentoo_postfix_dovecot_sqlite&amp;diff=1615"/>
		<updated>2014-04-08T01:14:39Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==gentoo, postfix, dovecot, sqlite howto==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===개요===&lt;br /&gt;
&lt;br /&gt;
postfix 는 MTA(main transfer agent) 로서 qmail&amp;lt;ref name=&amp;quot;qmail&amp;quot;&amp;gt;http://www.qmail.org&amp;lt;/ref&amp;gt; 또는 exim&amp;lt;ref name=&amp;quot;exim&amp;quot;&amp;gt;http://www.exim.org&amp;lt;/ref&amp;gt; 및 전통적인 sendmail&amp;lt;ref name=&amp;quot;sendmail&amp;quot;&amp;gt;http://www.sendmail.org&amp;lt;/ref&amp;gt; 와 같은 역할을 하는 프로그램 집합이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dovecot 은 POP3 및 IMAP protocol 을 지원하는 서버로서 postfix 와 연동되어 사용되는 경우가 많은 범용서버이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sqlite 는 데이터베이스 당 단일파일로 구성된 sql database 엔진이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 문서는 위의 구성으로 email account 를 실계정이 아닌 가상 계정으로 세팅해서 사용하는 email system 을 구성하는 방법을 설명하는것이 목적이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===필요한 프로그램의 설치===&lt;br /&gt;
&lt;br /&gt;
postfix 설치는 아래와 같이 하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
USE=&amp;quot;doc sqlite mbox dovecot-sasl&amp;quot; emerge postfix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dovecot 의 설치는 아래와 같이 하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
USE=&amp;quot;imapc mbox mdbox sqlite&amp;quot; emerge dovecot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
console 환경에서 email 테스트를 진행하기 위해 mailx 를 설치한다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
emerge mailx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
console 환경에서 mail 을 테스트하고싶다면 mutt 을 설치하는것이 좋다. mutt 은 오래된 curses 기반의 email client 이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
emerge mutt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sqlite 데이터베이스의 초기화===&lt;br /&gt;
&lt;br /&gt;
먼저 sqlite 의 데이터베이스를 어디에 놓을지 위치를 결정해야한다. 이 문서에서는 '''/var/lib/postfix''' 를 경로로 사용한다.&lt;br /&gt;
&lt;br /&gt;
데이터베이스 파일의 절대경로는 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음과 같은 명령어를 통해서 데이터베이스를 생성한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
sqlite /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참고로 데이터베이스 안에 아무것도 집어넣지 않는다면 sqlite 는 파일을 생성하지 않는다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
파일이 제대로 생성된 이후에는 파일의 owner 및 group 을 postfix 로 변경한다. 이 문서에서 세팅되는 owner 는 모두 postfix 를 사용하게 될것이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
chown postfix.postfix /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sqlite 에 들어갈 sql 정보는 다른부분에서 별도로 언급하기로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===postfix 의 기본설정===&lt;br /&gt;
&lt;br /&gt;
postfix 의 설정파일은 다음의 디렉토리에 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/etc/postfix/main.cf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 이 아래 부분에서 설정을 진행하기전에 original 백업파일을 만들어놓는것을 잊지말자.&lt;br /&gt;
&lt;br /&gt;
이 아래에는 main.cf 에서 중요한 부분만 일단 언급하는것으로 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
mydomain = aaa.com&lt;br /&gt;
myhostname = mail.aaa.com&lt;br /&gt;
mynetworks = 127.0.0.0/8, 172.16.1.0/24, 192.168.0.0/20&lt;br /&gt;
append_dot_mydomain = no&lt;br /&gt;
enable_long_queue_ids = yes&lt;br /&gt;
home_mailbox = Mail/&lt;br /&gt;
inet_protocols = ipv4&lt;br /&gt;
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain&lt;br /&gt;
relay_domains = $mydestination&lt;br /&gt;
smtpd_banner = $myhostname ESMTP unknown&lt;br /&gt;
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, permit_inet_interfaces, reject_unauth_destination&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===postfix 의 기본설정을 테스트하기===&lt;br /&gt;
&lt;br /&gt;
아래의 명령어를 이용해서 세팅한 postfix 를 테스트해보기로 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
testaccount@localhost ~ $ telnet localhost 25&lt;br /&gt;
Trying 127.0.0.1...&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
220 mail.yourdomain.com ESMTP unknown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위처럼 220 이라는 메세지가 나오면 일단 성공. 이제부터 테스트를 시작하도록 하자&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
EHLO aaa.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래와 같은 메시지를 확인할 수 있다면 성공.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
250-mail.aaa.com&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-SIZE 10240000&lt;br /&gt;
250-VRFY&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250 DSN&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 실제로 email 을 보내보기로 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
MAIL FROM:(내메일주소)&lt;br /&gt;
250 2.1.0 Ok&lt;br /&gt;
RCPT TO:(받는사람메일주소)&lt;br /&gt;
250 2.1.5 Ok&lt;br /&gt;
DATA(엔터키)&lt;br /&gt;
354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
SUBJECT:test email from new email server&lt;br /&gt;
sample email....&lt;br /&gt;
.&lt;br /&gt;
250 2.0.0 Ok: queued as 3dH3xl3cwgz9Kw7h7&lt;br /&gt;
^]  &lt;br /&gt;
telnet&amp;gt; quit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
받는쪽에 email 이 도착한다면 메일을 보내는데는 성공했다고 봐도된다. 받는쪽의 email 이 google 또는 hotmail 등의 서비스라면 '''스팸함''' 으로 들어가는경우도 있으니 꼼꼼히 확인하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 gmail 등에서 여러분이 만든 system 상의 real account 로 email 을 보내보도록 하자. 만약 메일이 안들어가는것 같다면 mail daemon 의 log를 확인하도록 한다. 다음과 같은 부분이 나온다면 system 상에서 alias 관련된 데이터베이스를 생성해야한다는 의미가 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Nov 10 01:52:03 [postfix/smtpd] warning: hash:/etc/mail/aliases is unavailable. open database /etc/mail/aliases.db: No such file or directory&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 아래의 명령어를 이용해서 alias db 를 생성해주도록 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
newaliases&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래의 경로에 파일이 존재한다면 정상적으로 alias db 가 생성된것이 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/etc/mail/aliases.db&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
자 이제 메일이 온것을 어디서 확인할 수 있을까? 만들어진 계정으로 login 해서 다음의 경로를 확인해보면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
~/Mail/new/blahblah.(hostname)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
파일이 존재한다면 외부 서버에서 정상적으로 email 이 들어온 것이라고 보면 된다.&lt;br /&gt;
&lt;br /&gt;
이렇게까지 된다면 postfix 의 기본기능은 세팅이 되었다고 판단해도 된다.&lt;br /&gt;
&lt;br /&gt;
물론 이 상태는 local 의 사용자끼리 email 을 주고받을 수 있는 상태이니 궁금하다면 테스트를 해봐도 좋다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 local 메일과 mutt 의 사용====&lt;br /&gt;
&lt;br /&gt;
아래의 주소를 참고한다&lt;br /&gt;
&lt;br /&gt;
* http://www.cmsimike.com/blog/2011/10/30/setting-up-local-mail-delivery-on-ubuntu-with-postfix-and-mutt/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
기본적으로 mutt 은 mail 을 spool directory 를 /var/spool/mail 에서 찾게되지만 postfix 는 각 계정의 Maildir 로 파일을 각각 넣어준다. 고로 mail spool 디렉터리를 별도로 지정해 주어야만 한다.&lt;br /&gt;
&lt;br /&gt;
local 계정의 ~/.muttrc 라는 파일에 다음과같은 내용을 넣어준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set mbox_type=Maildir&lt;br /&gt;
set folder=&amp;quot;~/Mail&amp;quot;&lt;br /&gt;
&lt;br /&gt;
set mask=&amp;quot;!^\\.[^.]&amp;quot;&lt;br /&gt;
set mbox=&amp;quot;~/Mail&amp;quot;&lt;br /&gt;
set record=&amp;quot;+.Sent&amp;quot;&lt;br /&gt;
set postponed=&amp;quot;+.Drafts&amp;quot;&lt;br /&gt;
set spoolfile=&amp;quot;~/Mail&amp;quot;&lt;br /&gt;
&lt;br /&gt;
set pager_index_lines=4&lt;br /&gt;
set pager_format = &amp;quot; %C - %[%H:%M] %.20v, %s%* %?H? [%H] ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
set menu_scroll=yes&lt;br /&gt;
&lt;br /&gt;
color attachment blue white&lt;br /&gt;
color error red white&lt;br /&gt;
color hdrdefault black white&lt;br /&gt;
color indicator white black&lt;br /&gt;
color normal blue white&lt;br /&gt;
color tilde blue white&lt;br /&gt;
color quoted red white&lt;br /&gt;
color quoted1 brightred white&lt;br /&gt;
color quoted2 brightmagenta white&lt;br /&gt;
color quoted3 brightmagenta white&lt;br /&gt;
color quoted4 brightmagenta white&lt;br /&gt;
color quoted5 brightmagenta white&lt;br /&gt;
color signature red white&lt;br /&gt;
color status brightyellow blue&lt;br /&gt;
color markers red white&lt;br /&gt;
color header red white Subject &lt;br /&gt;
color header red white From &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이후 mutt 을 실행하면 도착한 email 을 확인할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postfix 는 Maildir&amp;lt;ref name=&amp;quot;Maildir from wikipedia&amp;quot;&amp;gt;http://en.wikipedia.org/wiki/Maildir&amp;lt;/ref&amp;gt; 이라는 규격을 사용한다. 이 이전에는 mbox 라는 규격이 사용되었으며 qmail 을 만든 제작자가 nfs 등의 상황에서 좀 더 유동적으로 반응할 수 있도록 Maildir 이라는 규격을 만들었다. 이런 부분을 참고하면 메일세팅을 좀 더 자유자재로 할 수 있을듯 하다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 디버깅====&lt;br /&gt;
&lt;br /&gt;
postfix 의 동작을 좀 더 자세히 디버깅하기 위해서는 다음의 파일을 편집하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/etc/postfix/master.cf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 파일 내부에 다음과같은 line 이 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
smtp      inet  n       -       n       -       -       smtpd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이를 다음과같이 수정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
smtp      inet  n       -       n       -       -       smtpd -D&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이렇게하면 postfix 에 대해 보다 자세한 동작 log 를 얻을 수 있다.&lt;br /&gt;
&lt;br /&gt;
로그파일은 '''/var/log/mail/*''' 에 위치한다.(이 부분은 logger 에 따라 다를 수 있다. 본인은 metalog 를 사용한다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sqlite 를 이용한 postfix 와 dovecot 의 세팅을 위한 사전지식===&lt;br /&gt;
&lt;br /&gt;
이 문서가 작성된 기본적인 목적은 postfix, dovecot, sqlite 를 사용함으로서 virtual mailbox 를 사용하게 하는것에 있다. 물론 virtual mailbox 라고해도 실제 메일이 sqlite 에 들어가는것은 아니다. 기본적으로는 email account 에 대한 계정정보를 sqlite 를 통해서 postfix 와 dovecot 사이에서 공유하는것에 있으며 실제로 메일은 서버상의 디렉토리안쪽에 나뉘어 들어가게 된다. 다만 차이점이 있다면 이 디렉토리는 postfix permission 으로 작동하게 되며 real account 를 사용하지 않기 때문에 ssh 접속등의 보안적인 측면에서 보다 좋은 장점을 얻게 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 에서 취급하는 mailbox와 domain 대한 개념====&lt;br /&gt;
&lt;br /&gt;
참고주소&lt;br /&gt;
&lt;br /&gt;
* https://workaround.org/ispmail/wheezy/virtual-domains&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====local domain=====&lt;br /&gt;
&lt;br /&gt;
일반적으로 가상메일박스등을 쓰지 않는 경우를 의미한다.&lt;br /&gt;
&lt;br /&gt;
mydestination 의 값이 아래처럼 세팅되어있는 경우&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mydestination = example.org, example.com, example.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
system 의 johndoe 라는 계정을 생성하게되면 다음의 3 가지 email 주소는 같은 메일함으로 취급된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
johndoe@example.org&lt;br /&gt;
johndoe@example.com&lt;br /&gt;
johndoe@example.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
모두 /var/mail/johndoe 라는 위치의 메일함으로 들어가게 된다는 의미가 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Virtual mailbox domains=====&lt;br /&gt;
&lt;br /&gt;
이 경우는 email 의 account 가 /etc/passwd 의 영향을 받지 않는 상태를 의미한다.&lt;br /&gt;
&lt;br /&gt;
virtual_mailbox_domains 의 값이 아래와 같이 세팅되어있는경우&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = example.org example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
실제 email 이 들어가게되는건 아래와같은 경로로 들어가도록 취급된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
john@example.org  /var/vmail/example.org/john/Maildir&lt;br /&gt;
jack@example.org  /var/vmail/example.org/jack/Maildir&lt;br /&gt;
jack@example.com  /var/vmail/example.com/jack/Maildir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위처럼 사용하려는 경우에는 /etc/postfix/virtual_mailbox_domains 파일에 내용이 추가되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
example.org  OK&lt;br /&gt;
example.com  OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
각 domain 을 virtual mailbox 에서 허용한다는 의미가 되겠다.&lt;br /&gt;
&lt;br /&gt;
이렇게 파일에 내용을 넣는걸로 끝나면 편하겠지만 그렇게 쉽게 가주지는 않는다. 파일의 내용이 세팅을 원하는 내용대로 된다면 다음과같은 compile 과정을 거쳐줘야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
postmap /etc/postfix/virtual_mailbox_domains&lt;br /&gt;
postmap /etc/postfix/virtual_mailbox_users&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 이용해서 작업을 진행하면 '''.db''' 라는 확장자를 가진 파일을 만들어준다. postfix 는 이 과정을 자동으로 해주지는 않기때문에 이점에는 주의하는것이 좋다. 이렇게 만들어진 내용을 실제로 사용하기 위해서는 postfix 의 설정파일중 main.cf 에 다음과같은 내용을 추가해 주어야 한다.(hash라는 부분이 붙는것에 주의하는게 좋을듯 하다)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = hash:/etc/postfix/virtual_mailbox_domains&lt;br /&gt;
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_users&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다행히 database 를 사용하는 경우는 hash 를 사용하지않고 database 에서 값을 feedback 받기때문에 위와같은 복잡한 방법은 거치지 않아도 된다. 지금 작성하고 있는 이 부분에 대한 원문에서는 mysql 을 예로 들었지만 이 문서에서는 sqlite 를 사용하게 될것이기 때문에 이 부분에 대한 원래 문장은 인용하지 않는다. 다만 사용된 query 에 대해서는 간단하게 분석해봐야할 필요가 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
query = SELECT mailbox_path FROM virtual_users WHERE email_address='%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 아래의 페이지 2 개를 참고해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* http://www.postfix.org/SQLITE_README.html&lt;br /&gt;
* http://www.postfix.org/sqlite_table.5.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 위의 query 구문에서 %s 는 입력값을 의미한다. 뭐가 입력되는지 모르는경우, 일반적으로 그냥 사용하는것 같다. 위 query 의 내용을 간단히 살펴보면 virtual_users 라는 데이터베이스 테이블에서 email_address 를 기준으로 검색을 진행해서 mailbox_path 라는 필드의 값을 반환하고 있다. 결과적으로 위 query 의 내용은 사용자의 virtual mailbox 의 경로를 알아내는것이 그 목적이라 할 수 있다. 이제 이렇게 작업된 파일을 실제로 postfix 의 main.cf 파일에 넣어보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_maps = $query/maps-vmbox.query&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
원문의 경우는 여기서 mysql 이라는 부분을 사용했지만 여기서는 postfix 를 기준으로 하고있기때문에 해당 문서의 내용을 기준으로 변경해보았다. 그럼 maps-vmbox.query 라는 파일에는 대체 어떤 내용이 있는걸까?&lt;br /&gt;
&lt;br /&gt;
이 '''.query''' 파일을 살펴보기전에 postfix-sqlite 에 대해 설명한 내용의 main.cf 파일의 내용을 잠시 참고해야 할 필요가 있다. 해당 파일에는 다음과같은 내용이 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
query = sqlite:$config_directory/query&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오호..... mysql 대신 이미 sqlite 라는 driver 부분이 선언되어있다. 이후 main.cf 파일내에서 $query 를 사용하는 부분은 전부 공통적으로 적용이 가능하다는걸 알 수 있다. 물론 내용을 잘 살펴보면 별도로 특별한 기술이 있는게 아니라 postfix 의 실행시 string replace 수준으로 작용된다라는걸 알 수 있다. 이제 정말로 '''maps-vmbox.query''' 라는 파일의 내용을 살펴보도록 하겠다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
dbpath = /etc/postfix/private/mail.sqlite&lt;br /&gt;
query = SELECT coalesce(VM.home, 'vmail/%d/%u')&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS '%s'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
result_format = %s/Mail/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
첫번째줄에 sqlite 데이터베이스 파일의 path 부분이 정의되어있다.&lt;br /&gt;
&lt;br /&gt;
두번째 줄에는 query 문장이 들어가있다. 두번째 줄을 보다보면 익숙하지 않은 것이 보인다. 다음의 내용을 잠시 참고하도록 한다.&lt;br /&gt;
&lt;br /&gt;
* http://overoid.tistory.com/16&lt;br /&gt;
&lt;br /&gt;
'''coalesce(X,Y,...)''' coalesce() 함수는 Argument 중에서 첫번째로 Not Null 인 Argument 값을 리턴하는 함수입니다. 만일 모든 인자가 null 이면 null을 리턴합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오호.. 뭔말인지 모르겠다! 사실 원문을 직역한 수준이기는한데.... 원문&amp;lt;ref name=&amp;quot;sqlite core functions&amp;quot;&amp;gt;http://www.sqlite.org/lang_corefunc.html&amp;lt;/ref&amp;gt;을 보면 인수는 2 개 이상이어야 한다고 되어있다. 굳이 풀어보자면 VM.home 이라는 필드가 값이있으면 그걸 반환하고, VM.home 필드가 값을 가지고 있지 않으면 뒤에 나오는 ''''vmail/%d/%u'''' 이라는 값을 반환하게 되어있다.&lt;br /&gt;
&lt;br /&gt;
이제 쿼리의 흐름을 살펴보기로 하자.&lt;br /&gt;
&lt;br /&gt;
* VMailbox 테이블의 id 필드와 Address 라는 테이블의 id 필드가 일치하며&lt;br /&gt;
* Domain 이라는 테이블의 id 와 Address 라는 테이블의 domain 이라는 필드가 일치하는 데이터중&lt;br /&gt;
* (Address 라는 테이블의 localpart + '@'  + Domain 테이블의 name) 의 문자열 결합 결과가 '%s' 와 같으며&lt;br /&gt;
* VMailbox 의 active 필드의 값이 0 이 아닌 데이터의 메일박스 경로를 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 흐름에서 중요한간 localpart 가 곧 id 를 의미한다는것이 중요하다. 이 경우 인수로 주어지는 %s 는 '''&amp;quot;aaa@bbb.com&amp;quot;''' 정도의 값이 주어지게 되기때문에 id 와 domain 을 결합해서 해당되는 ID 의 virtual mailbox 값을 얻어내는것이 목적인 쿼리가 되겠다. 결과적으로 mysql 의 경우 얻는값과 별반 차이는 없다고 생각해도 무방하겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
세번째줄은 result_format 이라는 구문이 있다. 여기에도 %s 가 사용되는데 선택한 사용자의 virtual mailbox 값을 완성시키는 부분이라 보면 되곘다. 이후에 설명할 '''virtual_mailbox_base''' 의 값과 결합되면 다음과 같은 결과가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_base = /home&lt;br /&gt;
result_format = %s/Mail/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
final :: /home/aaa@bbb.com/Mail/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Virtual alias domains=====&lt;br /&gt;
&lt;br /&gt;
virtual mailbox 를 사용하는경우 에는 위에서 설명했다시피 local domain 을 사용하는것처럼 기본적으로 한개의 id 와 여러개의 domain 이 연결되지는 않는다. 이 경우 virtual alias domain 을 사용하게 된다. main.cf 파일 내에서는 virtual_alias_maps 라는것으로 설정되게 되는데 이 경우 인수의 처리 흐름은 왼쪽에서 오른쪽으로 가게 된다고 한다. 이런 기능은 다음과같은 3가지 경우를 대상으로 하게된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''하나''' : john@example.org 의 모든 email 을 jeff@example.com 로 포워딩 하는경우는 다음과같이 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
john@example.org   jeff@example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''둘''' : john@example.org 의 모든 email 을 jeff@example.com 로 포워딩 하지만 원래의 계정에도 이메일을 남겨놓는경우 다음과같이 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
john@example.org   john@example.org&lt;br /&gt;
john@example.org   jeff@example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
간단하게 한줄로 작성할 수도 있다. 이 경우 콤마(,) 를 사용하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
john@example.org   john@example.org, jeff@example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''셋''' : example.org 도메인의 모든 메일을 joe@example.com 계정으로 포워딩하려면 다음과같이 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@example.org   joe@example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
지금까지 기본적인 virtual mailbox 에 대한 내용을 살펴보았다. 이 이후부터는 postfix, dovecot, sqlite 에 대한 세팅에 직접적으로 관련된 내용을 알아보도록 하겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix, dovecot, sqlite 에 대한 자료====&lt;br /&gt;
&lt;br /&gt;
사실 sqlite 를 사용하지않는.... mysql 또는 postgreSQL 에 대한 내용은 인터넷상에서 심심치 않게 찾아볼 수 있다. 하지만 sqlite 를 기준으로 한 내용은 생각보다 많지않다. (사실 이 문서를 작성하기 시작한 원인이기도 하다) 현시점에서 가장 자료가 많은곳은 아래와 같다.&lt;br /&gt;
&lt;br /&gt;
* http://rob0.nodns4.us/&lt;br /&gt;
* http://rob0.nodns4.us/howto/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
기본적으로 postfix 로 컨설팅을 하시는분의 홈페이지다. 정말 자료는 잘 되어있는데... 사실 dovecot 의 경우는 그다지 내용이 어렵지않은데 postfix 의 경우 어떤 부분이 어떤 역할을 하는지에 대한 학습이 필요하다. 물론 예제 자료는 잘 되어있지만 사용자가 원하는대로 세팅을 하기 위해서는 sqlite 데이터베이스에 들어갈 테이블 구조에 대한 고찰이 필요하다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 rob 의 홈페이지에서는 이런부분에 대한 자세한 설명은 들어가 있지 않다. 본 문서에서는 이러한 부분에 대한 조금의 분석을 통해 원하는대로 데이터를 세팅하게 하는것을 목표로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 와 sqlite 연동을 위한 디렉토리 및 파일의 구성====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/etc/postfix/query/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postfix 에서 sqlite 의 연동을 위해 사용하는 query 들이 들어가있는 디렉토리가 된다. 어떤 query file 들이 들어가는지는 아래에서 자세히 살펴보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====smtpd restriction 에 대한 query 파일들=====&lt;br /&gt;
&lt;br /&gt;
main.cf 에서 사용되는 smtpd_restriction_classes 에 대한 내용은 기본적으로 아래의 주소를 참고하도록 한다.&lt;br /&gt;
&lt;br /&gt;
* http://brucekim.egloos.com/2993551&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
관련된 파일들의 정보는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
* access-bscat.query &amp;gt;&amp;gt; smtpd_restriction_classes 관련파일&lt;br /&gt;
* access-rcpt.query &amp;gt;&amp;gt; smtpd_recipient_restrictions 관련파일&lt;br /&gt;
* access-rcptDomain.query &amp;gt;&amp;gt; smtpd_recipient_restrictions 관련파일&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 문서에서는 필터링에 대한것을 다루는것이 주 목적이 아니기때문에 이 부분은 지금 언급하지 않도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====그외 설정들에 대한 query 파일들=====&lt;br /&gt;
&lt;br /&gt;
* dom-local.query &amp;gt;&amp;gt; mydestination 에 대한 쿼리파일&lt;br /&gt;
* dom-relay.query &amp;gt;&amp;gt; relay_domains 에 대한 쿼리파일&lt;br /&gt;
* dom-valias.query &amp;gt;&amp;gt; virtual_alias_domains 에 대한 쿼리파일&lt;br /&gt;
* dom-vmbox.query &amp;gt;&amp;gt; virtual_mailbox_domains 에 대한 쿼리파일&lt;br /&gt;
* maps-alias.query &amp;gt;&amp;gt; alias_maps 에 대한 쿼리파일&lt;br /&gt;
* maps-local.query &amp;gt;&amp;gt; local_recipient_maps 에 대한 쿼리파일. 모든 domain 을 sqlite 에서 제어하기 위해서는 사용해야하는 쿼리&lt;br /&gt;
* maps-relay.query &amp;gt;&amp;gt; relay_recipient_maps 에 대한 쿼리파일. relay_domains 를 사용하지 않는 경우에는 주석처리하면 된다&lt;br /&gt;
* maps-transport.query &amp;gt;&amp;gt; transport_maps 에 대한 쿼리파일. transport_maps 는 특정 domain 을 다른 smtp 등으로 보내는데 사용된다&amp;lt;ref name=&amp;quot;transport_maps&amp;quot;&amp;gt;http://www.postfix.org/STANDARD_CONFIGURATION_README.html 페이지의 '''Running Postfix behind a firewall''' 부분의 설정파일 참고&amp;lt;/ref&amp;gt;. 사용하지 않는다면 주석처리하면 된다&lt;br /&gt;
* maps-valias.query &amp;gt;&amp;gt; virtual_alias_maps 에 대한 쿼리파일. virtual mailbox 의 domain alias 와 관련이 있다.&lt;br /&gt;
* maps-vgid.query &amp;gt;&amp;gt; virtual_gid_maps 에 대한 쿼리파일. mailbox 의 email account 에 대한 gid 와 관련이 있다.&lt;br /&gt;
* maps-vmbox.query &amp;gt;&amp;gt; virtual_mailbox_maps 에 대한 쿼리파일. 직접적으로 virtual mailbox 에 대한 동작과 관련이 있다.&lt;br /&gt;
* maps-vuid.query &amp;gt;&amp;gt; virtual_uid_maps 에 대한 쿼리파일. mailbox 의 email account 에 대한 uid 와 관련이 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 와 query 파일에서 사용하게될 sqlite 의 데이터베이스 schema====&lt;br /&gt;
&lt;br /&gt;
이제부터의 내용은 다음의 schema 내용을 기준으로 진행된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Mentioned in the old TODO file was that I wanted to do away with the&lt;br /&gt;
-- ugly unique column names and use plain words instead. Also mentioned&lt;br /&gt;
-- was the desire to improve the Transport and Alias tables. This is the&lt;br /&gt;
-- result: what the new schema should be. It surprised me!&lt;br /&gt;
--&lt;br /&gt;
-- New revision 2012-02-16 for those who are following along at home:&lt;br /&gt;
-- This removes the RClass table and foreign key constraints thereto,&lt;br /&gt;
-- because it is useless unless main.cf reads restriction classes from&lt;br /&gt;
-- the database.&lt;br /&gt;
--&lt;br /&gt;
PRAGMA foreign_keys=ON;&lt;br /&gt;
BEGIN TRANSACTION;&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;Transport&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	active INTEGER DEFAULT 1, transport TEXT, nexthop INTEGER,&lt;br /&gt;
	mx INTEGER DEFAULT 1, port INTEGER,&lt;br /&gt;
	UNIQUE (transport,nexthop,mx,port));&lt;br /&gt;
-- Transport.nexthop would be a pointer to Domain.id, but without a&lt;br /&gt;
-- foreign key constraint because the Domain table has yet to be&lt;br /&gt;
-- created at this point.&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;Domain&amp;quot; (id INTEGER PRIMARY KEY, name TEXT,&lt;br /&gt;
	active INTEGER DEFAULT 1, class INTEGER DEFAULT 0,&lt;br /&gt;
	owner INTEGER DEFAULT 0, transport INTEGER,&lt;br /&gt;
	rclass INTEGER DEFAULT 30, UNIQUE (name),&lt;br /&gt;
	FOREIGN KEY(transport) REFERENCES Transport(id));&lt;br /&gt;
-- This revision removes the NOT NULL constraint from Domain.name; we&lt;br /&gt;
-- will insert a special record Domain.id=0 with Domain.name=NULL,&lt;br /&gt;
-- which thus maintains a defacto NOT NULL constraint for other rows.&lt;br /&gt;
INSERT INTO &amp;quot;Domain&amp;quot; VALUES(0,NULL,NULL,NULL,NULL,NULL,NULL);&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;Address&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	localpart TEXT NOT NULL, domain INTEGER NOT NULL,&lt;br /&gt;
	active INTEGER DEFAULT 1, transport INTEGER, rclass INTEGER,&lt;br /&gt;
	FOREIGN KEY(domain) REFERENCES Domain(id),&lt;br /&gt;
	FOREIGN KEY(transport) REFERENCES Transport(id),&lt;br /&gt;
	UNIQUE (localpart, domain));&lt;br /&gt;
-- We will insert a special record Address.id=0 with Address.domain=0&lt;br /&gt;
-- to differentiate aliases(5) commands, paths or includes from&lt;br /&gt;
-- address targets.&lt;br /&gt;
INSERT INTO &amp;quot;Address&amp;quot; VALUES(0,'root',0,NULL,NULL,NULL);&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;Alias&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	address INTEGER NOT NULL, active INTEGER DEFAULT 1,&lt;br /&gt;
	target INTEGER NOT NULL, extension TEXT,&lt;br /&gt;
	FOREIGN KEY(address) REFERENCES Address(id)&lt;br /&gt;
	FOREIGN KEY(target) REFERENCES Address(id)&lt;br /&gt;
	UNIQUE(address, target, extension));&lt;br /&gt;
-- This revision changes Alias.name to Alias.address, because INTEGER&lt;br /&gt;
-- fields should not be called &amp;quot;name&amp;quot; (to me that implies TEXT.) If&lt;br /&gt;
-- Alias.target=0, that tells us that the Alias.extension contains a&lt;br /&gt;
-- /file/name, or a |command, or an :include:/file/name. Otherwise,&lt;br /&gt;
-- Alias.extension contains an address extension.  Differentiation of&lt;br /&gt;
-- local(8) aliases(5) from virtual(5) is in the Address table, where&lt;br /&gt;
-- Address.domain=0, the special null record in the Domain table.&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;VMailbox&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	active INTEGER DEFAULT 1, uid INTEGER,&lt;br /&gt;
	gid INTEGER, home TEXT, password TEXT,&lt;br /&gt;
	FOREIGN KEY(id) REFERENCES Address(id));&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;BScat&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	sender TEXT NOT NULL, priority INTEGER,&lt;br /&gt;
	target TEXT NOT NULL, UNIQUE (sender, priority));&lt;br /&gt;
--&lt;br /&gt;
COMMIT;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
각 테이블에 대한 역할은 다음과같다.&lt;br /&gt;
&lt;br /&gt;
* '''Transport''' 테이블&lt;br /&gt;
** transport 기능을 사용하는 경우에 필요한 테이블&lt;br /&gt;
* '''Domain''' 테이블&lt;br /&gt;
** domain 에 대한 정보를 관리하는 테이블&lt;br /&gt;
* '''Address''' 테이블&lt;br /&gt;
** email account 와 domain 정보등을 연관지어 관리하는 테이블&lt;br /&gt;
** id(localpart) 와 domain 필드를 pair 로 unique 로 처리한다. 개별 필드내에서 중복값은 허용하는 경우가 된다.&lt;br /&gt;
* '''Alias''' 테이블&lt;br /&gt;
** virtual mailbox alias 기능을 정의할때 사용되는 테이블&lt;br /&gt;
** email주소(address), alias 처리할 대상(target), extenstion(alias 가 일어날때 별도로 동작시킬 수 있는 script등) 을 pair 로 unique 처리한다.&lt;br /&gt;
* '''VMailbox''' 테이블&lt;br /&gt;
** virtual mailbox 에 대한 email account 정보를 관리하는데 사용되는 테이블. email account 의 비밀번호, gid, uid 등이 이쪽에서 관리된다. ID 는 address 테이블에서 관리한다.&lt;br /&gt;
* BScat 테이블&lt;br /&gt;
** smtpd restriction 에 대한 정보를 담고있는 테이블&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 중요 query 파일 분석:map 관련 파일들====&lt;br /&gt;
&lt;br /&gt;
=====maps-alias.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
query = SELECT ALL&lt;br /&gt;
	  CASE WHEN Alias.target=0 THEN Alias.extension&lt;br /&gt;
	  ELSE TA.localpart ||&lt;br /&gt;
	    (CASE WHEN Alias.extension IS NOT NULL THEN '-'&lt;br /&gt;
	      || Alias.extension ELSE '' END) ||&lt;br /&gt;
	    (CASE WHEN TD.id=0 THEN '' ELSE '@' || TD.name END)&lt;br /&gt;
	  END&lt;br /&gt;
	FROM &amp;quot;Alias&amp;quot;&lt;br /&gt;
	JOIN &amp;quot;Address&amp;quot; AS TA ON Alias.target=TA.id&lt;br /&gt;
	JOIN &amp;quot;Domain&amp;quot; AS TD ON TA.domain=TD.id&lt;br /&gt;
	JOIN &amp;quot;Address&amp;quot; AS AA ON Alias.address=AA.id&lt;br /&gt;
	WHERE AA.localpart IS '%s'&lt;br /&gt;
	AND AA.domain=0 AND Alias.active!=0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 쿼리를 간단하게 분석해보자.&lt;br /&gt;
&lt;br /&gt;
* email 의 ID 부분을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Alias 테이블의 target 필드의 값이 Address 테이블의 id 와 같으며&lt;br /&gt;
* Alias 테이블의 domain 필드의 값이 Domain 테이블의 id 와 같으며&lt;br /&gt;
* Alias 테이블의 address 필드의 값이 Address 테이블의 id 와 같은 자료중에서&lt;br /&gt;
* Address 테이블의 domain 필드의 값이 0 이며&lt;br /&gt;
* Alias 테이블의 active 필드의 값이 0 이 아니며&lt;br /&gt;
* Address 테이블의 localpart 의 값과 %s 의 값이 일치하는 데이터에 대해&lt;br /&gt;
* 데이터의 Alias 테이블의 target 값이 0 인 경우는 Alias 테이블의 extension 필드의 값을 반환하고&lt;br /&gt;
* 데이터의 Alias 테이블의 target 값이 0 이 아닌 경우에는 문자열을 결합해서 반환한다&lt;br /&gt;
** Alias 테이블의 extentsion 이 공백이 아닌경우에는 ''''-' 문자 + extension''' 의 값을 반환&lt;br /&gt;
*** 공백이라면 '' 를 반환&lt;br /&gt;
** Domain 의 id 값이 0 이라면 공백을 반환.&lt;br /&gt;
*** 공백이 아니라면 ''''@' + domain 테이블의 name 필드''' 를 반환&lt;br /&gt;
** 간단하게 보면 아래와 같다&lt;br /&gt;
**# alias.extension 이 반환되거나&lt;br /&gt;
**# '''Address.localpart-Alias.extension''' 이 반환되거나&lt;br /&gt;
**# '''Address.localpart''' 이 반환되거나&lt;br /&gt;
**# '''Address.localpart-Alias.extension@Domain.name''' 이 반환되거나&lt;br /&gt;
**# '''Address.localpart@Domain.name''' 이 반환된다&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이정도의 내용이 되겠다. 이중에서 Alias 테이블의 extension 은 뭐하는놈인지를 아직 모르겠으니 나중에 살펴보도록 하다.&lt;br /&gt;
&lt;br /&gt;
결과적으로 위의 쿼리는 id 를 받아서 id 와 domain 이 연결된 주소를 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====maps-local.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT localpart FROM Address&lt;br /&gt;
	WHERE localpart is '%s' AND domain=0 AND active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오오 간단하다. 역시 분석해보자.&lt;br /&gt;
&lt;br /&gt;
* email 의 ID 부분을 검색용 인자로 받아서(%s)&lt;br /&gt;
* localpart 와 id 과 같고&lt;br /&gt;
* Address 테이블의 domain 값이 0 이며&lt;br /&gt;
* Address 테이블의 active 값이 0 이 아닌 데이터의&lt;br /&gt;
* localpart 필드를 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 입력받은 id 가 별도로 domain 을 사용하지않는 local 계정인지를 검색해서 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====maps-valias.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT TA.localpart || (CASE WHEN VA.extension IS NOT NULL&lt;br /&gt;
	  THEN '-' || VA.extension ELSE '' END) ||&lt;br /&gt;
	  (CASE WHEN TD.id=0 THEN '' ELSE '@' || TD.name END)&lt;br /&gt;
	FROM Alias AS VA&lt;br /&gt;
	  JOIN Address AS TA ON (VA.target = TA.id)&lt;br /&gt;
	  JOIN Domain AS TD ON (TA.domain = TD.id)&lt;br /&gt;
	  JOIN Address AS AA ON (VA.address = AA.id)&lt;br /&gt;
	  JOIN Domain AS AD ON (AA.domain = AD.id)&lt;br /&gt;
	WHERE AA.localpart || '@' || AD.name IS '%s'&lt;br /&gt;
	AND VA.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이번에는 조금 길다. 하지만 분석해보도록 하자. (와아아 case 가 쓰이셨다.......)&lt;br /&gt;
&lt;br /&gt;
* email 전체를(aaa@bbb.com) 검색용 인자로 받아서(%s)&lt;br /&gt;
* Alias 의 target 과 Address 의 id 가 같고&lt;br /&gt;
* Address 의 domain 과 Domain 의 id 가 같으며&lt;br /&gt;
* Alias 의 address 와 Address 의 id 가 같으며&lt;br /&gt;
* Address 의 domain 과 Domain 의 id 가 같은 자료중에서&lt;br /&gt;
* Address 의 localprt + '@' + domain.name 의 결합결과가 %s 와 같고&lt;br /&gt;
* Alias 의 active 가 0 이 아닌 데이터에 대해&lt;br /&gt;
* Alias.localpart 와 다른 문자열을 결합해서 반환한다&lt;br /&gt;
** TA.localpart 와&lt;br /&gt;
** Alias.extension 이 공백이 아닌경우 ''''-' + Alias.extension''' 과&lt;br /&gt;
** Domain 의 id 값이 이 아닌경우 ''''@' + domain.name''' 을 결합한다&lt;br /&gt;
** 간단하게 보면 아래와 같다&lt;br /&gt;
*** '''TA.localpart''' 가 반환되거나&lt;br /&gt;
*** '''TA.localpart-Alias.extension''' 이 반환되거나&lt;br /&gt;
*** '''TA.localpart@domain.name''' 이 반환되거나&lt;br /&gt;
*** '''TA.localpart-Alias.extension@domain.name''' 이 반환된다&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 email account 의 전체 주소를 받아서 id 또는 id@domain 을 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====maps-vmbox.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT coalesce(VM.home, 'vmail/%d/%u')&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS '%s'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이정도면 나름 준수한 편인거같다. 이 쿼리도 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* email account 전체를(aaa@bbb.com) 검색용 인자로 받아서(%s)&lt;br /&gt;
* Address 테이블의 id 필드와 VMailbox 의 id 필드가 같으며&lt;br /&gt;
* Address 테이블의 domain 필드와 Domain 테이블의 id 필드가 같은 자료중에서&lt;br /&gt;
* Address.localprt + '@' + Domain.name 의 결합결과가 %s 와 같으며&lt;br /&gt;
* VMailbox 의 active 가 0 이 아닌 데이터에 대해&lt;br /&gt;
* VMailbox.home 이 공백이 아니면 VMailbox.home 의 값을 반환하고&lt;br /&gt;
* VMailbox.home 이 공백이라면 'vmail/%d/%u' 를 반환한다&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 경우 %d 는 email 계정의 domain, %u 는 email 계정의 user 를 의미한다. aaa@bbb.com 의 경우&lt;br /&gt;
&lt;br /&gt;
* %u : aaa&lt;br /&gt;
* %d : bbb.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이런 결과가 된다. 이 쿼리는 입력된 사용자에 대한 mailbox 경로를 받아내는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 중요 query 파일 분석:그외 domain 관련 쿼리파일들====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====dom-vmbox.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class&amp;gt;800&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS '%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
쿼리는 상대적으로 간단하다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* domain 을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Domain.Class 가 800 이상이며&lt;br /&gt;
* Domain 테이블의 active 값이 0 이 아니며&lt;br /&gt;
* Domain 테이블의 name 이 %s 와 같은 결과의&lt;br /&gt;
* Domain.name 을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 입력된 domain 이 취급가능한 domain 인지를 조회해서 반환하는 역할을 하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
바로 아래쪽에서 살펴볼 dom-local.query 와 약간 비교되는데 Domain.clss 의 조건값이 틀리다. 결국 virtual domain 은 800 이상의 class 값을 가져야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====dom-local.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class=1&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS '%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
쿼리는 dom-vmbox.query 와 비슷하다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* domain 을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Domain.Class 가 1 이며&lt;br /&gt;
* Domain 테이블의 active 값이 0 이 아니며&lt;br /&gt;
* Domain 테이블의 name 이 %s 와 같은 결과의&lt;br /&gt;
* Domain.name 을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 main.cf 의 mydestination 부분에 사용된다. 일반적으로 mydestination 은 local domain 을 처리하는데 사용되며 이런 전제들을 살펴봤을때 local domain 으로 처리하기 위해서는 Domain.class 의 값은 1 이 되어야 하므로 local domain 은 데이터베이스 상에서 Domain.class 가 1 의 값을 가져야 한다는걸 알 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====dom-relay.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class=2&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS '%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
쿼리는 dom-local.query 와 비슷하다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* domain 을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Domain.Class 가 2 이며&lt;br /&gt;
* Domain 테이블의 active 값이 0 이 아니며&lt;br /&gt;
* Domain 테이블의 name 이 %s 와 같은 결과의&lt;br /&gt;
* Domain.name 을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 dom-local.query 와 동일한 조건에서 Domain.class 가 2 인 domain 을 반환한다. 결과적으로 relay 가능한 domain 은 Domain.class 가 2 의 값을 가져야 한다는걸 알 수 있다. 이 쿼리는 main.cf 의 relay_domains 의 값으로 사용된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====dom-valias.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class=3&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS '%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
쿼리는 dom-local.query 와 비슷하다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* domain 을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Domain.Class 가 3 이며&lt;br /&gt;
* Domain 테이블의 active 값이 0 이 아니며&lt;br /&gt;
* Domain 테이블의 name 이 %s 와 같은 결과의&lt;br /&gt;
* Domain.name 을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 dom-local.query 와 동일한 조건에서 Domain.class 가 3 인 domain 을 반환한다. 결과적으로 alias 가 가능한 domain 은 Domain.class 가 3 의 값을 가져야 한다는걸 알 수 있다. 이 쿼리는 main.cf 의 virtual_alias_domains 의 값으로 사용된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 중요 query 파일 분석:uid 및 gid 관련 파일들====&lt;br /&gt;
&lt;br /&gt;
=====maps-vuid.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT coalesce(VM.uid, D1.class)&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS '%s'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
조건은 그리 복잡하지 않지만 조금 주의해야할 부분이 있을거같다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* email account 전체를(aaa@bbb.com) 검색 인자로 받아서(%s)&lt;br /&gt;
* VMailbox 테이블의 id 필드와 Address 의 id 가 같으며&lt;br /&gt;
* Address 테이블의 domain 필드와 Domain 테이블의 id 가 같은 자료중&lt;br /&gt;
* Address.localprt + '@' + Domain.name 의 결합결과가 %s 와 같으며&lt;br /&gt;
* VMailbox.active 의 값이 0 이 아닌 결과를 대상으로&lt;br /&gt;
* VMailbox.uid 가 공백이 아닌경우에는 VMailbox.uid 를 반환하고&lt;br /&gt;
* VMailbox.uid 가 공백인경우에는 Domain 의 class 필드의 값을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 요청된 email account 의 uid 값을 반환하는 쿼리로서 값이 지정되어있으면 지정된 uid 값을 반환하고, uid 값이 별도로 지정되어있지 않은 경우에는 Domain 의 class 값을 uid 로 사용하게 되어있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====maps-vgid.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT coalesce(VM.gid, 800)&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS '%s'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 maps-vuid.query 와 비슷하지만 약간의 차이가 있다 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* email account 전체를(aaa@bbb.com) 검색 인자로 받아서(%s)&lt;br /&gt;
* VMailbox 테이블의 id 필드와 Address 의 id 가 같으며&lt;br /&gt;
* Address 테이블의 domain 필드와 Domain 테이블의 id 가 같은 자료중&lt;br /&gt;
* Address.localprt + '@' + Domain.name 의 결합결과가 %s 와 같으며&lt;br /&gt;
* VMailbox.active 의 값이 0 이 아닌 결과를 대상으로&lt;br /&gt;
* VMailbox.gid 가 공백이 아닌경우에는 VMailbox.gid 를 반환하고&lt;br /&gt;
* VMailbox.gid 가 공백인경우에는 800 이라는 값을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 요청된 email account 의 gid 값을 반환하는 쿼리로서 값이 지정되어있으면 지정된 gid 값을 반환하고, gid 값이 별도로 지정되어있지 않은 경우에는 800 이라는 gui 값을 강제로 사용하게 되어있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sqlite 를 사용하기 위한 postfix 의 map file 테스트===&lt;br /&gt;
&lt;br /&gt;
이제 database 를 연동하기전에 postfix 의 main.cf 에서 사용하는 각 field 를 테스트함으로서 실제 sqlite 데이터베이스에 어던 데이터가 들어가야하는지를 사전 테스트를 먼저 해보는것으로 진행하려 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
하나하나 기존에 있던 option 들을 portmap 이라는 postfix 의 프로그램을 통해 파일로 뽑아서 어떤형식으로 데이터가 유지되어야 하는지를 알아보도록 하겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====mydestination, relay_domains====&lt;br /&gt;
&lt;br /&gt;
기존의 mydestination 값은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이걸 다음과 같이 변경한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mydestination = hash:/etc/postfix/mapdatas/mydestinations&lt;br /&gt;
relay_domains = hash:/etc/postfix/mapdatas/relaydomains&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 /etc/postfix/mapdatas/mydestinations 파일의 내용을 다음과 같이 편집한다.&amp;lt;ref name=&amp;quot;mydestinations 파일 형식&amp;quot;&amp;gt;http://www.irbs.net/internet/postfix/0401/1694.html&amp;lt;/ref&amp;gt;(mapdatas 디렉토리가 없다고? 그냥 만들면 된다. 규칙이 딱히 정해져있는건 아니다)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail.aaa.com    OK&lt;br /&gt;
localhost       OK&lt;br /&gt;
aaa.com         OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 /etc/postfix/mapdatas/relaydomains 파일의 내용을 다음과 같이 편집한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail.aaa.com    1&lt;br /&gt;
localhost       1&lt;br /&gt;
aaa.com         1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
편집이 끝나면 다음과 같은 명령을 실행해준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
postmap /etc/postfix/mapdatas/mydestinations&lt;br /&gt;
postmap /etc/postfix/mapdatas/relaydomains&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 외부에서 세팅한 서버로 email 을 보내보도록 한다.&lt;br /&gt;
&lt;br /&gt;
email 이 local 의 서버까지 도착했다는걸 확인하면 mydestination 에 대한 hash 파일로의 변경은 성공했다고 봐도 된다.&lt;br /&gt;
기본적으로 mydestination 하나만 변경해봤자 어차피 relay_domains 가 제대로 설정되어있지 않으면 메일은 안쪽으로 도착하지 않는다. 고로 relay_domains 까지 설정해주어야 하는게 중점. 다만 widcard(* 기호) 는 사용할 수 없으니 필요한 domain 은 주르륵 적어주어야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====virtual mailbox 에 대한 설정====&lt;br /&gt;
&lt;br /&gt;
이제부터 virtual mailbox 에 대한 세팅을 해보도록 한다. 순서대로 몇가지를 살펴보기로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 다음의 페이지를 참고한다.&lt;br /&gt;
&lt;br /&gt;
* http://postfixmail.com/blog/index.php/virtual-domain-aliases/&lt;br /&gt;
* http://www.postfix.org/VIRTUAL_README.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위 페이지의 내용을 기준으로 작업을 진행해보도록 하겠다. 추가로 참고해둘것이 있다.&lt;br /&gt;
&lt;br /&gt;
* virtual alias 계열은 내 서버내에서 alias 를 처리할때 쓰인다.&lt;br /&gt;
* virtual mailbox 계열은 내 서버내에서 virtual mailbox 의 메일을 처리할때 쓰인다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
차이점이 좀 미묘하지만.. 굳이 alias 를 사용하지 않을거라면 virtual_alias_* 는 사용하지 않아도 좋다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_alias_domains=====&lt;br /&gt;
&lt;br /&gt;
main.cf 에 다음과같은 내용을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_alias_domains = hash:/etc/postfix/mapdatas/virtualaliasdomains&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/mapdatas/virtualaliasdomains 파일의 내용에 다음을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail.aaa.com         20131112&lt;br /&gt;
aaa.com              20131112&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 실행해서 만든 파일의 hash db 파일을 생성해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_alias_maps=====&lt;br /&gt;
&lt;br /&gt;
위에서 이미 한번 언급했다시피 virtual mailbox 는 aaa@zzz.com 과 aaa@kkk.com 이 물리적으로 같은서버라고 하더라도 같은 계정으로 취급하지 않는다. 이 경우에 alias 를 사용해야 한다.&lt;br /&gt;
&lt;br /&gt;
main.cf 에 다음과같은 내용을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_alias_maps = hash:/etc/postfix/mapdatas/virtualaliasmaps&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/mapdatas/virtualaliasmaps 파일의 내용에 다음을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
aaa@zzz.com     aaa@kkk.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 실행해서 만든 파일의 hash db 파일을 생성해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 alias 를 별도로 사용하지 않을거라면 상관없다. 자세한 내용은 /etc/mail/aliases 관련된 내용을 검색해서 참고할것.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_mailbox_domains=====&lt;br /&gt;
&lt;br /&gt;
이제 virtual mailbox 를 사용하는 domain 을 세팅할 차례다.&lt;br /&gt;
&lt;br /&gt;
main.cf 에 다음과같은 내용을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = hash:/etc/postfix/mapdatas/virtualmailboxdomains&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/mapdatas/virtualmailboxdomains 파일의 내용에 다음을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
aaa.com     OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 실행해서 만든 파일의 hash db 파일을 생성해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_mailbox_maps=====&lt;br /&gt;
&lt;br /&gt;
이제 virtual mailbox 를 사용하는 계정(email account)에 대한 내용을 세팅해줄 차례다&lt;br /&gt;
&lt;br /&gt;
main.cf 에 다음과같은 내용을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_maps = hash:/etc/postfix/mapdatas/virtualmailboxmaps&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/mapdatas/virtualmailboxmaps 파일의 내용에 다음을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
bbb@aaa.com     aaa.com/bbb/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 주의할점이 있다. '''aaa.com/bbb''' 가 되는경우는 bbb 라는 파일 자체가 수신한 email 파일이 되어버린다. 하지만 '''aaa.com/bbb/''' 라고 정의하면 그 아래쪽에 Maildir 형식으로 디렉토리등을 생성하고 파일을 넣는다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 실행해서 만든 파일의 hash db 파일을 생성해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_mailbox_base=====&lt;br /&gt;
&lt;br /&gt;
이제 virtual mailbox 의 파일들이 위치할 기본 디렉토리를 설정해줄 차례다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_base = /home/virtualmailbox&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 owner 를 변경해주어야 이후 메일폴더를 postfix 에서 생성할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
chown -R postfix.postfix /home/virtualmailbox&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual mailbox 를 위한 uid, gid 등의 설정=====&lt;br /&gt;
&lt;br /&gt;
virtual mailbox 가 어떤 권한으로 유지되는지에 대한 설정이 필요하다. 왜냐하면 실제로 파일이 생성되기 때문이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래와같이 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_minimum_uid = 100&lt;br /&gt;
virtual_uid_maps = static:207&lt;br /&gt;
virtual_gid_maps = static:207&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 207 은 필자 머신의 postfix 의 uid 및 gid 되시겠다.&lt;br /&gt;
&lt;br /&gt;
어차피 나중에 postfix 와 dovecot 을 연동할때 dovecot 의 daemon 을 postfix owner 로 실행할거라 이렇게 하는게 속편할거라 생각한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====설정파일 점검 및 테스트=====&lt;br /&gt;
&lt;br /&gt;
위에서 살펴본 부분중 virtual mailbox 를 직접적으로 사용하기 위한 main.cf 내의 최소 내용은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = hash:/etc/postfix/mapdatas/virtualmailboxdomains&lt;br /&gt;
virtual_mailbox_maps = hash:/etc/postfix/mapdatas/virtualmailboxmaps&lt;br /&gt;
virtual_mailbox_base = /home/virtualmailbox&lt;br /&gt;
virtual_minimum_uid = 100&lt;br /&gt;
virtual_uid_maps = static:207&lt;br /&gt;
virtual_gid_maps = static:207&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기에 몇가지 추가사항이 더 붙어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$recipient_delimiter = '-';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위에서 설정한대로의 디렉토리를 생성해준다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mkdir /home/virtualmailbox/aaa.com/bbb/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 만들어진 directory 의 owner 를 postfix 변경해주는것을 잊지 말자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
외부에서 당신이 생성한 virtual mailbox 의 account 안쪽으로 email 이 들어오면 virtual mailbox 의 작업까지는 성공했다고 봐도 무방하다. 성공한경우에는 mail log 부분에 아래와같은게 표시된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Nov 12 17:37:48 [postfix/virtual] 3dJj5806Lwz9Kw6bY: to=&amp;lt;수신이메일주소&amp;gt;, relay=virtual, delay=1, delays=0.98/0/0/0.03, dsn=2.0.0, status=sent (delivered to maildir)&lt;br /&gt;
Nov 12 17:37:48 [postfix/qmgr] 3dJj5806Lwz9Kw6bY: removed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이로서 virtual mailbox 에 대한 hash 를 이용한 기본 테스트는 끝났다.&lt;br /&gt;
&lt;br /&gt;
이제부터는 dovecot 과 인증정보 연동을 위한 postfix 의 setting values 를 알아보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===postfix 와 dovecot 의 연동을 위한 설정 살펴보기===&lt;br /&gt;
&lt;br /&gt;
일단 http://rob0.nodns4.us/ 에서 제공되는 설정파일의 내용을 살펴보기로 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
submission_rcpt_restrictions = permit_sasl_authenticated,&lt;br /&gt;
	permit_mynetworks, reject&lt;br /&gt;
smtpd_sasl_path = private/auth&lt;br /&gt;
smtpd_sasl_type = dovecot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 내용에서 RCPT 는 메일서버를 통해 메일을 받는다는것에 대한 정보를 의미한다.(아마도 receipt 의 약어라고 생각되지만) 기본적으로 postfix 나 dovecot 이나 원래는 system 상에서 제공되는 pam 을 이용한 account auth 를 진행하지만 이 문서에서는 real account 가 아닌 virtual mail account 를 사용할것이기 때문에 pam 을 사용하는것은 의미가 없다.&lt;br /&gt;
&lt;br /&gt;
SASL 이란 Simple Authentication and Security Layer 의 약어로서 주로 메일 서버의 인증에 사용된다. postfix 도 마찬가지로 email 을 '''보내려는 사용자''' 에 대한 인증방법으로 sasl 을 사용할 수 있다. 위의 설정내용을 보면 알겠지만 sasl 의 type 으로 dovecot 을 지원하고 있다. 사용자에게서 인증요청이 postfix 를 대상으로 들어가면 postfix 는 dovecot 에게 요청해서 email account 인증을 지원한다는 의미가 된다. 고로 이건 mail receive 가 아니라 mail send(SMTP) 에 대한 설정이 되겠다 위와 같은 설정 하나만으로 postfix 를 이용한 SMTP 인증은 손쉽게 처리할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기까지의 작업만으로도, 당신은 postfix 를 이용해서 email 을 외부에서 수신하고 dovecot 을 이용한 연동을 하기위한 기본지식을 익힐 수가 있었다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===postfix 와의 연동을 위한 dovecot 의 설정 살펴보기===&lt;br /&gt;
&lt;br /&gt;
dovecot 은 1.x 에서 2.x 로 버전이 올라오면서 기본적인 설정파일의 틀이 많이 바뀐듯 하다. 여기서는 dovecot 2.x 를 기준으로 설명하기도 한다. 1.x 에 대한 내용이 필요하다면.............. 인터넷에서 재주껏 찾아보기 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dovecot 의 설정에 필요한 기본 파일 구성은 다음과같다.&lt;br /&gt;
&lt;br /&gt;
* /etc/dovecot/dovecot.conf &amp;gt;&amp;gt; 기본 설정파일&lt;br /&gt;
* /etc/dovecot/sql-deny.conf.ext &amp;gt;&amp;gt; dovecot 에서 deny=yes 로 세팅되어있는경우 사용되는 query 파일&lt;br /&gt;
* /etc/dovecot/dovecot-sql.conf.ext &amp;gt;&amp;gt; sql 인증을 위한 데이터 베이스 정보가 있는 파일&lt;br /&gt;
* /etc/dovecot/conf.d/10-auth.conf &amp;gt;&amp;gt; dovecot 을 통한 인증을 설정해주는 파일&lt;br /&gt;
* /etc/dovecot/conf.d/auth-sql.conf.ext &amp;gt;&amp;gt; sql 을 통한 인증에 대한 세팅정보를 담고있다. 10-auth.conf 에서 사용된다.&lt;br /&gt;
* /etc/dovecot/conf.d/auth-deny.conf.ext &amp;gt;&amp;gt; 10-auth.conf 에 include 되는 파일로서 사용자의 deny access 를 설정하는데 사용된다.&lt;br /&gt;
* /etc/dovecot/conf.d/10-logging.conf &amp;gt;&amp;gt; dovecot 에 대한 디버깅 세팅정보를 담고있다.&lt;br /&gt;
* /etc/dovecot/conf.d/10-mail.conf &amp;gt;&amp;gt; dovecot 에서 접근하게될 Maildir 에 대한 세팅정보를 가지고 있다.&lt;br /&gt;
* /etc/dovecot/conf.d/10-master.conf &amp;gt;&amp;gt; pop3, imap, postfix 에 대한 인증정보등을 세팅한다.&lt;br /&gt;
* /etc/dovecot/conf.d/10-ssl.conf &amp;gt;&amp;gt; ssl 인증서를 세팅하는 경우에 사용하면 된다.&lt;br /&gt;
* /etc/dovecot/conf.d/20-imap.conf &amp;gt;&amp;gt; dovecot 에서 서비스하게될 imap 에 대한 세팅정보가 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 문서에서는 imap 만을 세팅하는것을 대상으로 하며 필요한 파일에 대한 수정부분만 별도로 언급하기로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====10-auth.conf====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
!include auth-deny.conf.ext&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위부분의 주석을 해제한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''auth_mechanisms''' 부분에 '''cram-md5''' 를 추가해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====auth-deny.conf.ext====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
passdb {&lt;br /&gt;
  driver = passwd-file&lt;br /&gt;
  deny = yes&lt;br /&gt;
&lt;br /&gt;
  # File contains a list of usernames, one per line&lt;br /&gt;
  args = /etc/dovecot/deny-users&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위 부분을 추석처리한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
passdb {&lt;br /&gt;
  driver = sql&lt;br /&gt;
  deny = yes&lt;br /&gt;
&lt;br /&gt;
  args = /etc/dovecot/conf.d/sql-deny.conf.ext&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sql 과 관련된 부분을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====sql-deny.conf.ext====&lt;br /&gt;
&lt;br /&gt;
새로 파일을 만들고 아래의 내용을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
driver = sqlite&lt;br /&gt;
&lt;br /&gt;
connect = /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&lt;br /&gt;
### deny password_query&lt;br /&gt;
# The &amp;quot;deny=yes&amp;quot; passdb needs to handle either a &amp;quot;user@domain&amp;quot; or a&lt;br /&gt;
# plain &amp;quot;user&amp;quot; credential. In the former case, we look up the domain;&lt;br /&gt;
# latter case we use the special null domain, Domain.id=0. A simple glob&lt;br /&gt;
# expression to detect the &amp;quot;@&amp;quot; sign tells us which case we are in.&lt;br /&gt;
&lt;br /&gt;
password_query = SELECT '%u' FROM Address AS A1 \&lt;br /&gt;
        JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
        WHERE A1.localpart IS '%n' \&lt;br /&gt;
        AND (CASE WHEN '%u' GLOB '*@*' THEN \&lt;br /&gt;
                D1.name IS '%d' ELSE \&lt;br /&gt;
                D1.id=0 END) \&lt;br /&gt;
        AND A1.active=-1&lt;br /&gt;
&lt;br /&gt;
# This is the third state of the tristate Address.active column.&lt;br /&gt;
&lt;br /&gt;
# BUG: an &amp;quot;@&amp;quot; sign is permissible in an address localpart. This query&lt;br /&gt;
# works fine with SQL (virtual) users, because they have another &amp;quot;@&amp;quot; in&lt;br /&gt;
# their username anyway. But if your OS supports &amp;quot;@&amp;quot; in the username,&lt;br /&gt;
# this will break -- and you get to keep both pieces! I would not use&lt;br /&gt;
# &amp;quot;@&amp;quot; in system usernames, so I don't intend to fix this. :)&lt;br /&gt;
&lt;br /&gt;
# end of sql-deny.conf.ext&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====dovecot-sql.conf.ext====&lt;br /&gt;
&lt;br /&gt;
아래의 내용을 참고해서 파일을 편집한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
driver = sqlite&lt;br /&gt;
connect = /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
default_pass_scheme = MD5&lt;br /&gt;
&lt;br /&gt;
password_query = SELECT '%u' AS user, V1.password, \&lt;br /&gt;
	coalesce(V1.uid, D1.class) AS userdb_uid, \&lt;br /&gt;
	coalesce(V1.gid, 800) AS userdb_gid, \&lt;br /&gt;
	'/home/virtualmailbox/' || coalesce(V1.home, 'vmail/%d/%n') AS userdb_home \&lt;br /&gt;
	FROM VMailbox AS V1 \&lt;br /&gt;
	JOIN Address AS A1 ON (V1.id=A1.id) \&lt;br /&gt;
	JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
	WHERE A1.localpart IS '%n' \&lt;br /&gt;
	AND D1.name IS '%d' \&lt;br /&gt;
	AND V1.active!=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
user_query = SELECT coalesce(V1.uid, D1.class) AS uid, \&lt;br /&gt;
	coalesce(V1.gid, 800) AS gid, \&lt;br /&gt;
	'/home/virtualmailbox/' || coalesce(V1.home, 'vmail/%d/%n') AS home \&lt;br /&gt;
	FROM VMailbox AS V1 \&lt;br /&gt;
	JOIN Address AS A1 ON (v1.id=A1.id) \&lt;br /&gt;
	JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
	WHERE A1.localpart IS '%n' \&lt;br /&gt;
	AND D1.name IS '%d' \&lt;br /&gt;
	AND V1.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
윗부분에서 ''''/home/virtualmailbox/'''' 부분을 주의하도록 한다. postfix 에서 설정한 '''virtual_mailbox_base''' 와 같은 경로를 세팅해야 한다는것에 주의한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====10-mail.conf====&lt;br /&gt;
&lt;br /&gt;
아래의 내용을 참고해서 파일을 편집한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail_location = maildir:~/Mail&lt;br /&gt;
&lt;br /&gt;
first_valid_uid = 207&lt;br /&gt;
last_valid_uid = 65535&lt;br /&gt;
&lt;br /&gt;
first_valid_gid = 100&lt;br /&gt;
last_valid_gid = 65535&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
원문과는 다르게 '''first_valid_uid''' 는 207 로 설정하였다. 왜냐하면 postfix 의 uid 를 사용하기 때문이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====10-master.conf====&lt;br /&gt;
&lt;br /&gt;
아래의 내용을 참고해서 파일을 편집한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
unix_listener /var/spool/postfix/private/auth {&lt;br /&gt;
  mode = 0666&lt;br /&gt;
  user = postfix&lt;br /&gt;
  group = postfix&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Auth process is run as this user.&lt;br /&gt;
user = root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====15-mailboxes.conf====&lt;br /&gt;
&lt;br /&gt;
중간쯤에 아래와 같은 부분을 추가해준다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
inbox = yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===dovecot 에서 사용하는 sql 살펴보기===&lt;br /&gt;
&lt;br /&gt;
dovecot 에서의 sql 을 분석하기위해서는 wiki 페이지를 참고하는것이 좋다.&lt;br /&gt;
&lt;br /&gt;
wiki 페이지를 참고할때 주의할점이 있다. dovecot 은 version 1 과 version 2 가 wiki 가 따로 나뉘어있다. 이 문서에서는 dovecot 2.x 를 기준으로 한다.&lt;br /&gt;
&lt;br /&gt;
* http://wiki2.dovecot.org/AuthDatabase/SQL&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
문서를 기준으로 다루는 쿼리의 인수에 대한 설명을 간단히 해보도록 하자. id 는 '''aaa@bbb.com''' 으로 기준해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
* %u :: 사용자 id 전체를 의미한다. - '''aaa@bbb.com'''&lt;br /&gt;
* %n :: 사용자의 id 를 의미한다. - '''aaa'''&lt;br /&gt;
* %d :: 사용자 id 중 domain 부분을 의미한다. - '''bbb.com'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====sql-deny.conf.ext 에서 사용하는 쿼리====&lt;br /&gt;
&lt;br /&gt;
이제 사용되는 쿼리를 알아보자. 이 쿼리의 경우는 active 값을 -1 로 세팅해서 사용 불가능하게 만든 계정에 대한 정보를 return 받는 작업을 진행한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
password_query = SELECT '%u' FROM Address AS A1 \&lt;br /&gt;
        JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
        WHERE A1.localpart IS '%n' \&lt;br /&gt;
        AND (CASE WHEN '%u' GLOB '*@*' THEN \&lt;br /&gt;
                D1.name IS '%d' ELSE \&lt;br /&gt;
                D1.id=0 END) \&lt;br /&gt;
        AND A1.active=-1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오호.... 어차피 데이터베이스 테이블은 postfix 의 테이블을 같이 사용하기 때문에 postfix 의 테이블을 기준으로 알아보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
인수로 주어진 것들을 기준으로 쿼리를 분석해 보면 다음과같다.&lt;br /&gt;
&lt;br /&gt;
* address 테이블의 domain 필드와 Domain 의 id 필드의 값이 같은 데이터를 대상으로&lt;br /&gt;
* Address 의 localpart 필드와 사용자 id(%n) 이 같으며&lt;br /&gt;
* %u(email account) 안에 '''@''' 문자가 있는지를 확인해서&lt;br /&gt;
** @ 문자가 있다면 domain 테이블의 name 필드에 domain 이 있는지를 확인하고&lt;br /&gt;
** @ 문자가 없다면 domain 테이블의 id 가 0 인 데이터를 확인하며&lt;br /&gt;
* Address 의 active 값이 -1 인경우를 확인해서&lt;br /&gt;
* 데이터가 있다면 email account id 를 그대로 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 주의할점은 '''case when''' 에서 사용된 '''GLOB''' 이라는 연산자다. GLOB 이라는 연산자는 wildcard 를 사용해서 문자열 비교를 하는 유용한 함수다. LIKE 의 경우는 '%' 문자를 사용한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 사용자의 id 를 입력받아 id 안에 domain 이 있는지를 확인하고 id 안에 domain 이 있다면 관련된값을, domain 이 없다면 domain 테이블의 id 값이 0 이며 active 가 -1 인 계정이 있는지를 찾아서 있으면 반환한다. 결과적으로 Address 테이블에서 비활성화된 계정을 찾아서 입력받은 사용자가 비활성화 계정인지를 확인해주는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====dovecot-sql.conf.ext 에서 사용되는 쿼리====&lt;br /&gt;
&lt;br /&gt;
이 파일 내에서는 두개의 쿼리가 사용된다 쿼리별로 살펴보기로 하겠다. 원래 문서에는 password_query 다음에 user_query 가 명시되어있다. 왜냐하면 일단 password 인증을 하고나서 사용자 정보를 받아오는 순서가 되어야 하기 때문에 순서상으로는 그리 명시되어있다. 파일에서 명시한 순서대로 설명한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====password_query=====&lt;br /&gt;
&lt;br /&gt;
관련된 쿼리는 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
password_query = SELECT '%u' AS user, V1.password, \&lt;br /&gt;
	coalesce(V1.uid, D1.class) AS userdb_uid, \&lt;br /&gt;
	coalesce(V1.gid, 800) AS userdb_gid, \&lt;br /&gt;
	'/home/' || coalesce(V1.home, 'vmail/%d/%n') AS userdb_home \&lt;br /&gt;
	FROM VMailbox AS V1 \&lt;br /&gt;
	JOIN Address AS A1 ON (V1.id=A1.id) \&lt;br /&gt;
	JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
	WHERE A1.localpart IS '%n' \&lt;br /&gt;
	AND D1.name IS '%d' \&lt;br /&gt;
	AND V1.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이번에는 내용이 좀 길지만 실제 내용은 별거없다. 이번에는 간단하게 반환값, 관련테이블(join), 검색조건 등으로 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 반환값&lt;br /&gt;
** user 반환&lt;br /&gt;
*** 입력받은 email account id 를 그대로 user 로 반환한다.&lt;br /&gt;
** password 반환&lt;br /&gt;
*** Address.password 값을 반환한다.&lt;br /&gt;
** userdb_uid 반환&lt;br /&gt;
*** VMailbox.uid 값이 존재하면 그걸 userdb_uid 로 반환.&lt;br /&gt;
*** VMailbox.uid 값이 없다면 domain.class 를 userdb_uid 로 반환.&lt;br /&gt;
** userdb_gid 반환&lt;br /&gt;
*** VMailbox.gid 값이 존재하면 그걸 userdb_gid 로 반환.&lt;br /&gt;
*** VMailbox.gid 값이 없다면 800 이라는 값을 userdb_gid 로 반환.&lt;br /&gt;
** userdb_home 반환&lt;br /&gt;
*** VMailbox.home 값이 있다면 '/home/' + VMailbox.home 의 값을 userdb_home 으로 반환&lt;br /&gt;
*** VMailbox.home 값이 있다면 'vmail/%d/%n' + VMailbox.home 의 값을 userdb_home 으로 반환&lt;br /&gt;
* table join&lt;br /&gt;
** VMailbox.id 와 Address.id 가 일치하는 데이터와&lt;br /&gt;
** Address.domain 과 Domain.id 가 일치하는 데이터의&lt;br /&gt;
** VMailbox 테이블의 자료&lt;br /&gt;
* 검색조건&lt;br /&gt;
** Address.localpart 와 %n(id) 의 비교&lt;br /&gt;
** Domain.name 이 같아야함&lt;br /&gt;
** Address.active 값이 0 이 아니어야함&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서는 userid,password,uid,gid,virtual mailbox 경로값 등 5개값을 반환하는것을 확인할 수 있다. 다만 위에서 설명한 '''sql-deny.conf.ext 에서 사용되는 쿼리''' 부분의 조건을 감안한다면 사용제한된 사용자는 한번 걸러지기 때문에 실제 사용하는 계정을 대상으로 검색조건이 이루어진다고 판단하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 일치하는 사용자를 찾아서 그에 해당하는 password 값을 포함한 다른값들을 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====user_query=====&lt;br /&gt;
&lt;br /&gt;
관련된 쿼리는 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
user_query = SELECT coalesce(V1.uid, D1.class) AS uid, \&lt;br /&gt;
	coalesce(V1.gid, 800) AS gid, \&lt;br /&gt;
	'/home/' || coalesce(V1.home, 'vmail/%d/%n') AS home \&lt;br /&gt;
	FROM VMailbox AS V1 \&lt;br /&gt;
	JOIN Address AS A1 ON (v1.id=A1.id) \&lt;br /&gt;
	JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
	WHERE A1.localpart IS '%n' \&lt;br /&gt;
	AND D1.name IS '%d' \&lt;br /&gt;
	AND V1.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 password_query 부분과 마찬가지로 반환값, 관련테이블(join), 검색조건 등으로 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* 반환값&lt;br /&gt;
** uid 반환&lt;br /&gt;
*** VMailbox.uid 값이 존재하면 그걸 uid 로 반환.&lt;br /&gt;
*** VMailbox.uid 값이 없다면 domain.class 를 uid 로 반환.&lt;br /&gt;
** gid 반환&lt;br /&gt;
*** VMailbox.gid 값이 존재하면 그걸 gid 로 반환.&lt;br /&gt;
*** VMailbox.gid 값이 없다면 800 이라는 값을 gid 로 반환.&lt;br /&gt;
** '''/home/''' 관련된 반환&lt;br /&gt;
*** VMailbox.home 값이 있다면 '/home/' + VMailbox.home 의 값을 home 으로 반환&lt;br /&gt;
*** VMailbox.home 값이 있다면 'vmail/%d/%n' + VMailbox.home 의 값을 home 으로 반환&lt;br /&gt;
* table join&lt;br /&gt;
** VMailbox.id 와 Address.id 가 일치하는 데이터와&lt;br /&gt;
** Address.domain 과 Domain.id 가 일치하는 데이터의&lt;br /&gt;
** VMailbox 테이블의 자료&lt;br /&gt;
* 검색조건&lt;br /&gt;
** Address.localpart 와 %n(id) 의 비교&lt;br /&gt;
** Domain.name 이 같아야함&lt;br /&gt;
** Address.active 값이 0 이 아니어야함&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 결과로 봤을때 Address 테이블의 active 값이 0 이 아닌 사용자 계정의 데이터는 모두 검색 대상이 된다는걸 알 수 있다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 id 와 domain 값이 같은 활성화된 사용자를 검색해서 일치하는 사용자의 uid, gid, virtual mailbox 의 경로값을 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sqlite 에 데이터는 어떻게 넣어야 하나요?===&lt;br /&gt;
&lt;br /&gt;
지금부터는 sqlite 테이블에 데이터를 넣어서 vmailbox 의 값들을 이전처럼 hash 가 아닌 sqlite 에서 얻어오게 세팅함으로서 postfix 와 dovecot 의 연동을 위한 기초준비를 해보도록 하겠다. 일단 '''postfix 와 query 파일에서 사용하게될 sqlite 의 데이터베이스 schema''' 부분에서 설명한 테이블 구조를 기준으로 중요한 필드들에 대해 어떤값이 사용되어야 하는가를 알아보고 사용하게될 예제 데이터를 어떻게 넣어야 하는지를 살펴보도록 하자.&lt;br /&gt;
&lt;br /&gt;
여기서는 모든 테이블의 값에 대해 언급하지는 않는다. 최소로 필요한 부분에 대해서만 조사하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====데이터베이스 테이블에 대한 필드 값의 의미====&lt;br /&gt;
&lt;br /&gt;
=====Address 테이블=====&lt;br /&gt;
&lt;br /&gt;
id :: 일반적으로 sql 에서 사용하는 seq 값의 의미다. Address 의 id 가 다른 테이블에서 큰 의미를 차지하는 경우는 없다.&lt;br /&gt;
&lt;br /&gt;
localpart :: email account id 를 ''aaa@bbb.com''' 이라고 했을때 aaa 부분에 해당된다&lt;br /&gt;
&lt;br /&gt;
domain :: email account id 를 ''aaa@bbb.com''' 이라고 했을때 bbb.com 부분에 해당된다. 다만 직접적으로 domain 이 들어가는것이 아니라 bbb.com 이라는 domain 은 이후에 언급할 domain 테이블에 들어가있게되며 이 값은 domain 테이블의 id 필드에 대해서 forign key 가 되므로 domain.id 의 값중에 하나가 되어야 한다. 모든 virtual mailbox 계정은 domain 값을 가지게 된다.&lt;br /&gt;
&lt;br /&gt;
active :: 계정의 활성화 상태를 나타낸다. 0 이면 미사용, -1 이면 block, 0 이상이면 사용가능으로 분류된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Domain 테이블=====&lt;br /&gt;
&lt;br /&gt;
id :: 다른테이블에서 forign key 로 사용된다.&lt;br /&gt;
&lt;br /&gt;
active :: domain 의 활성화 상태를 나타낸다. 0 이면 미사용, 0 이상이면 사용가능으로 분류한다.&lt;br /&gt;
&lt;br /&gt;
class :: 기본값은 0 이기는 한데..... virtual mailbox 에 사용되는 domain 들은 '''800''' 이상의 값을 가져야 한다. 고로 virtual mailbox 용 domain 은 801 부터의 값을 가지면 된다. 1 은 postfix 으 mydestination 에서, 2 는 relay_domains 에서 사용된다.&amp;lt;ref name=&amp;quot;domain.class 관련설명&amp;quot;&amp;gt;virtual mailbox 에 대한 부분은 dom-vmbox.query 설명 부분을 참고하도록 한다. local domain 에 대한 부분은 dom-local.query 부분을 참고한다.&amp;lt;/ref&amp;gt; &lt;br /&gt;
&lt;br /&gt;
name :: domain 의 이름이다. 실제 비교시에는 이 필드를 주로 참고하게 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Domain 테이블은 address 테이블에서 domain 에 대한 정보로 참조되기위해 존재한다. 참조의 기준은 id 필드의 값이 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====VMailbox 테이블=====&lt;br /&gt;
&lt;br /&gt;
id :: Account 테이블의 id 값과 같아야 한다. virtual mailbox 용으로 사용되기 위한 email account 는 Address.id 와 같은값의 VMailbox.id 데이터를 가지고 있어야 한다.&lt;br /&gt;
&lt;br /&gt;
active :: virtual mailbox 의 활성화 상태를 나타낸다. 0 이면 미사용, 0 이상이면 사용가능으로 분류한다.&lt;br /&gt;
&lt;br /&gt;
uid :: virtual mailbox 는 실제 unix 서버상의 폴더에 접근해야 하기때문에 uid 를 취급하게된다. postfix 에서는 Mailbox 형식에 맞춰 배달만 해주면 되기때문에 별로 까다로운 취급을 하지 않지만 dovecot 에서는 메일폴더에서 파일을 read/write 해야하기때문에 조금 더 관련이 깊다. dovecot 에서는 이 값이 지정되어있지 않은 경우에는 Domain 테이블의 class 값을 이 값으로 대체해서 사용한다. virtual mailbox 로 사용하기 원하는 account 라면 postfix 의 uid 와 통일시킬것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
gid :: 위의 uid 와 마찬가지 이유때문에 존재한다. dovecot 에서는 이 값이 지정되어있지 않는 경우 800 이라는 값을 강제로 사용한다. 이렇게하면 gid 값을 세팅하지 않은 email account 는 모두 800 이라는 그룹에 소속되게된다. 역시 가능하다면 postfix 의 gid 값을 사용해주는것이 좋겠다.&lt;br /&gt;
&lt;br /&gt;
home :: virtual mailbox 에서 수신되는 메일들이 놓일 경로를 의미한다. 이 문서는 위&amp;lt;ref name=&amp;quot;virtual_mailbox_maps 에 대한 테스트데이터&amp;quot;&amp;gt;virtual_mailbox_maps 부분을 참고한다.&amp;lt;/ref&amp;gt;에서 이미 postfix 의 기본 동작 테스트를 위해 이 값을 세팅한적이 있다. 위에서는 '''aaa.com/bbb/''' 라고 세팅한값이 이에 해당된다. 이 값은 virtual_mailbox_base 값과 같이 결합되어 반응한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
password :: 이 부분은 굳이 가자면 설명이 복잡해진다&amp;lt;ref name=&amp;quot;Authentication Mechanisms dovecot 2&amp;quot;&amp;gt;http://wiki2.dovecot.org/Authentication/PasswordSchemes 주소를 참고한다&amp;lt;/ref&amp;gt;. 일단 간편하게 가기위해서 이 문서는 '''{PLAIN}''' 으로 사용하는것을 기준으로 설명하도록 하겠다. 실제 지금까지 세팅한 dovecot 의 내용도 이 값을 기준으로 설명하고 있다. email account 의 비밀번호를 '''kkk''' 로 하고싶다면 이 필드의 값을 '''{PLAIN}kkk''' 로 세팅해주면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====테스트를 위한 sql 값의 세팅====&lt;br /&gt;
&lt;br /&gt;
이제 virtual mailbox 를 위한 sql 값을 세팅해보도록 한다. 세팅을 위한 기본 전제조건을 미리 정해놓고 세팅을 하는것이 좋다. 이제부터 전제조건의 예를 들어보자&lt;br /&gt;
&lt;br /&gt;
# aaa 라는 id 를 사용한다.&lt;br /&gt;
# bbb.com 이라는 domain 을 사용한다.&lt;br /&gt;
# kkk 라는 비밀번호를 사용한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 조건에 몇가지 더 추가조건을 다시 생각해보자. 물론 이 문서의 윗부분에서 다뤘던 내용을 다시한번 간단하게 정리하는것뿐이지 기억이 잘 나지 않는다면 위의 내용을 살펴보도록 하자.&lt;br /&gt;
&lt;br /&gt;
# virtual mailbox 로 사용할 domain 은 bbb.com 으로 정한다.&lt;br /&gt;
# virtual_mailbox_base 의 값은 /home/virtualmailbox 으로 정한다.&lt;br /&gt;
# virtual mailbox email account 의 실제 하드디스크상 위치는 '''/home/virtualmailbox/bbb.com/aaa''' 가 되는것으로 한다.&lt;br /&gt;
#* virtual mailbox 의 형식은 Maildir 이 된다.&lt;br /&gt;
#* 위에서 살펴본 query 파일중 '''maps-vmbox.query''' 파일을 기억하는가? 거기에는 '''result_format''' 이라는 항목이 있다.&lt;br /&gt;
#* 결과적으로 aaa@bbb.com 사용자의 email 배달 주소는 '''/home/virtualmailbox/bbb.com/aaa/Mail''' 이 된다. 참고하도록 하자&lt;br /&gt;
# system 에서 사용하는 postfix 의 uid 와 gid 는 207 로 정한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 두 종류의 조건을 가지고 실제 테스트에 사용할 sql 을 만들면 다음과 같은 결과가 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO &amp;quot;Domain&amp;quot; (id, name, active, class) VALUES (1,'bbb.com',1,801);&lt;br /&gt;
INSERT INTO &amp;quot;Address&amp;quot; (id, localpart, domain, active) VALUES (1, 'aaa', 1, 1);&lt;br /&gt;
INSERT INTO &amp;quot;VMailbox&amp;quot; (id, active, password, home, uid, gid) VALUES (&lt;br /&gt;
    (SELECT id FROM &amp;quot;Address&amp;quot; WHERE localpart IS 'aaa' AND domain=1),&lt;br /&gt;
    1,'{CRAM-MD5}445ee34964404bdba3d7d7fd1187839811699c8be7b71596f934141f721864d2','bbb.com/aaa',207,207);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 주의할 부분이 있다. ssl/tls 를 사용하지 않는경우 대부분의 imap 을 지원하는 email client 또는 서버는 PLANE 방식의 비밀번호를 지원하지 않는다. 때문에 '''doveadm''' 이라는 프로그램을 사용해서 비밀번호를 넣어주어야 한다. 간단한 예제를 들어보자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
localhost # doveadm pw -pkkk -s CRAM-MD5 -u aaa@bbb.com&lt;br /&gt;
{CRAM-MD5}445ee34964404bdba3d7d7fd1187839811699c8be7b71596f934141f721864d2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
형식은 그리 어렵지 않을거라 생각한다. dovocot 2 wiki 를 참고하기 바란다.&amp;lt;ref name=&amp;quot;dovecot 비밀번호 생성방법&amp;quot;&amp;gt;http://wiki2.dovecot.org/Tools/Doveadm/Pw 주소를 참고한다. 사용 가능한 비밀번호 암호화 방식의 종류는 http://wiki2.dovecot.org/Authentication/PasswordSchemes 주소를 참고한다.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 내용을 sqlite 데이터베이스에 넣는다. 데이터베이스의 위치는 이미 몇번을 설명했듯이 아래와 같은 위치가 되겠다.&lt;br /&gt;
&lt;br /&gt;
* /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''sqlite 데이터베이스 파일의 위치를 postfix 의 각 쿼리파일 상단에 세팅해주는것을 잊지 말길 바란다!!!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====세팅된 sql 값에 대한 검증====&lt;br /&gt;
&lt;br /&gt;
지금까지 sqlite 를 사용하기위한 쿼리와 데이터들을 알아봤다. 이미 위에서 설명한 내용을 잠시 복습해보자. virtual mailbox 를 사용하기 위한 postfix 의 최소 설정항목은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
* virtual_mailbox_domains&lt;br /&gt;
* virtual_mailbox_maps&lt;br /&gt;
* virtual_mailbox_base&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
맞다. 위에서 postfix 의 virtual mailbox 테스트를 진행할때 hash 값을 사용했던 값이 대부분이다. 이중에서 virtual_mailbox_base 는 쿼리로 대체할 값이 아니니 무시하도록 한다. 여기서는 virtual_mailbox_domains 와 virtual_mailbox_maps 에 대한 쿼리를 이용해서 입력한 값을 검증해 보기로 한다&amp;lt;ref name=&amp;quot;query 테스트에 대한 참고사항&amp;quot;&amp;gt;물론 relay_domains 와 mydestination 에 대한 테스트도 같이 해주면 좋다&amp;lt;/ref&amp;gt;. 위에서 설명한 query 를 기반으로 테스트용 query 를 만들어보면 다음과같은 내용이 될것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이외에 테이블 설명을 참고로 다음의 항목을 설정해주면 좋다.&lt;br /&gt;
&lt;br /&gt;
* mydestination&lt;br /&gt;
* relay_domains&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====테스트용 dom-vmbox.query=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class&amp;gt;800&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS 'bbb.com';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리의 테스트결과는 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
bbb.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====테스트용 maps-vmbox.query=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT coalesce(VM.home, 'vmail/%d/%u')&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS 'aaa@bbb.com'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 쿼리의 테스트결과는 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
bbb.com/aaa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 입력한 데이터가 원하는 작동을 한다는것을 알아냈다. 입력된 데이터도 정상이고 postfix 와 연동하는 쿼리를 수정없이 작동시켜도 이상이 없다는것을 확인했다. 이제 이 결과를 가지고 postfix 에서 sqlite 의 데이터베이스 연동이 정상인지를 확인해보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===마지막단계::순서대로 테스트하기===&lt;br /&gt;
&lt;br /&gt;
====postfix 와 sqlite 의 연동테스트====&lt;br /&gt;
&lt;br /&gt;
이 문서의 앞부분에서 postfix 의 virtual mailbox 연동을 위한 테스트를 했던걸 기억해보자. 일단 이전에 hash 로 세팅했던 값중에서 virtual_mailbox_domains 와 virtual_mailbox_maps 만 query 로 변경해서 적용해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = $query/dom-vmbox.query&lt;br /&gt;
virtual_mailbox_maps = $query/maps-vmbox.query&lt;br /&gt;
virtual_uid_maps = $query/maps-vuid.query&lt;br /&gt;
virtual_gid_maps = $query/maps-vgid.query&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 외부에서 email 을 보내보자. 당신이 세팅한 대로 '''/home/virtualmailbox/bbb.com/aaa/Mail''' 이라는 디렉토리 아래쪽에 email 이 제대로 들어오는것을 확인했다면 postfix 와 sqlite 의 연동은 제대로 된것으로 확인해도 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 와 dovecot 의 인증의 연동====&lt;br /&gt;
&lt;br /&gt;
이제 외부에서 postfix 로 email 이 들어오는것을 확인했으니 smtp 인증 연동을 작업해봐야 한다. 다음의 내용을 postfix 의 main.cf 에 추가해준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
smtpd_sasl_auth_enable = yes&lt;br /&gt;
smtpd_sasl_authenticated_header = yes&lt;br /&gt;
smtpd_sasl_local_domain = $mydomain&lt;br /&gt;
smtpd_sasl_security_options = noanonymous&lt;br /&gt;
smtpd_sasl_path = private/auth&lt;br /&gt;
smtpd_sasl_type = dovecot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postfix 를 재시작한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====dovecot 과 sqlite 의 연동테스트====&lt;br /&gt;
&lt;br /&gt;
dovecot 의 경우에는 애초에 sqlite 와 연동하는것을 목표로 세팅했기 때문에 별도로 테스트를 위해 세팅을 바꿔야 할것은 없다. thunderbird 등의 imap 을 지원하는 email client 를 준비하고 imap 연결을 준비한다. 그리고 postfix 에서 테스트할때 확인했던 메일이 email client 에서 보이는지를 확인한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 email client 프로그램을 이용해서 외부로 email 이 제대로 전송되는지도 확인한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====tip::telnet 으로 imap 을 테스트하자====&lt;br /&gt;
&lt;br /&gt;
dovecot 이 마음대로 되지 않는다고 판단될때.. 일반적인 email client 는 에레메시지를 명확하게 내뱉어주지도 않을뿐더러 별도의 smtp 를 준비하지않으면 smtp 오류인지 어떤 오류인지 테스트하기 좀 귀찮을때가 있다. 그럴때는 telnet 을 통해 다음과같이 간단한 테스트를 진행할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
telnet localhost 143&lt;br /&gt;
&lt;br /&gt;
1 login aaa@bbb.com kkk&lt;br /&gt;
&lt;br /&gt;
2 select INBOX&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 맨 앞부분의 숫자까지 입력을 해줘야하는게 맞다. kkk 는 비밀번호에 해당한다. 다만 위의 방법은 plain password 방식이기때문에 비밀번호는 정상인데 다른 부분이 이상한 경우에 사용하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===결론===&lt;br /&gt;
&lt;br /&gt;
지금까지 이런저런 내용을 세팅해가며 postfix, dovecot, sqlite 의 연동에 대해 알아보았다. 사실 이 외에도 몇가지 신경써야 하는 부분이 아직 더 남아있을 수 있지만 지금까지의 내용만으로 독자가 원하는 email 작업을 하는데는 충분히 문제가 없다. 몇가지 주의점을 언급함으로서 이 문서를 마칠까 한다.&lt;br /&gt;
&lt;br /&gt;
# '''thunderbird''' 를 사용하는경우 암호화 방식을 '''암호화된 패스워드''' 로 사용하는 경우에는 서버에서 반드시 '''CRAM-MD5''' 를 지원해야한다.&lt;br /&gt;
# sqlite database 파일은 반드시 web 등에서 직접적으로 접근이 불가능한곳에 놓아야한다. postfix 로 owner 를 바꿔주는것 역시 잊지 말아야 한다.&lt;br /&gt;
# 서버상에 존재하는 virtual mailbox email directory 는 사실 sql 의 연동까지 다 끝나면 자동으로 생성되니 일일히 디렉토리를 생성해줘야할 필요는 없다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이렇게 세팅을 해서 만들어진 postfix 의 main.cf 파일에 대한 추가부분을 올려둔다. 필요한경우 참고하면 되겠다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#========================================================&lt;br /&gt;
# custom setting values&lt;br /&gt;
#========================================================&lt;br /&gt;
&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
mydomain = bbb.com&lt;br /&gt;
myhostname = mail.bbb.com&lt;br /&gt;
myorigin = $myhostname&lt;br /&gt;
mynetworks = 127.0.0.0/8, 172.16.1.0/24, 192.168.0.0/20&lt;br /&gt;
append_dot_mydomain = no&lt;br /&gt;
enable_long_queue_ids = yes&lt;br /&gt;
home_mailbox = Mail/&lt;br /&gt;
inet_protocols = ipv4&lt;br /&gt;
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain&lt;br /&gt;
#relay_domains = $mydestination&lt;br /&gt;
smtpd_banner = $myhostname ESMTP unknown&lt;br /&gt;
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, permit_inet_interfaces, reject_unauth_destination&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#========================================================&lt;br /&gt;
# custom setting values for dovecot and sqlite&lt;br /&gt;
#========================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mydestination = hash:/etc/postfix/mapdatas/mydestinations&lt;br /&gt;
relay_domains = hash:/etc/postfix/mapdatas/relaydomains&lt;br /&gt;
&lt;br /&gt;
query = sqlite:$config_directory/query&lt;br /&gt;
&lt;br /&gt;
virtual_mailbox_domains = $query/dom-vmbox.query&lt;br /&gt;
virtual_mailbox_maps = $query/maps-vmbox.query&lt;br /&gt;
virtual_uid_maps = $query/maps-vuid.query&lt;br /&gt;
virtual_gid_maps = $query/maps-vgid.query&lt;br /&gt;
virtual_mailbox_base = /home/virtualmailbox&lt;br /&gt;
virtual_minimum_uid = 100&lt;br /&gt;
$recipient_delimiter = '-';&lt;br /&gt;
&lt;br /&gt;
smtpd_sasl_auth_enable = yes&lt;br /&gt;
smtpd_sasl_authenticated_header = yes&lt;br /&gt;
smtpd_sasl_local_domain = $mydomain&lt;br /&gt;
smtpd_sasl_security_options = noanonymous&lt;br /&gt;
smtpd_sasl_path = private/auth&lt;br /&gt;
smtpd_sasl_type = dovecot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
부족한 문서를 읽어주셔서 감사드립니다. 해보니깐 보통이 아니군요. 대략 한달.. 넘게 걸린거같습니다. 문서에 대한 문의사항이 있으시다면 http://gentoo-kr.org 로 부탁드립니다. 감사합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==참고자료==&lt;br /&gt;
&lt;br /&gt;
* SQL 의 case 에 대한 설명 :: http://rtti.tistory.com/8&lt;br /&gt;
* hash 가 아닌 pcre 로 사용하는 경우에 대한 팁 :: http://serverfault.com/questions/133190/host-wildcard-subdomains-using-postfix&lt;br /&gt;
* SASL :: http://linuxism.tistory.com/368&lt;br /&gt;
* postfix 와 sql database 의 정보&lt;br /&gt;
** http://www.postfix.org/sqlite_table.5.html&lt;br /&gt;
** http://www.postfix.org/mysql_table.5.html&lt;br /&gt;
** http://www.postfix.org/pgsql_table.5.html&lt;br /&gt;
* Postfix 표준 설정 예제 :: http://sasuke.tistory.com/27&lt;br /&gt;
* Postfix + Dovecot + MySQL + Postfixadmin 종합세트 :: http://jo.centis1504.net/?p=37&lt;br /&gt;
* email 에서 사용하는 dsn 에 대한 정보&lt;br /&gt;
** http://tools.ietf.org/html/rfc1891&lt;br /&gt;
** http://blog.daum.net/seee50/15859312&lt;br /&gt;
** http://huypm.blogspot.jp/2009/12/postfix-dsn-status-script.html&lt;br /&gt;
** http://moonset.tistory.com/133&lt;br /&gt;
* http://technology.mattrude.com/2009/09/installing-postfix-with-sqlite-support/&lt;br /&gt;
* http://technology.mattrude.com/2009/12/installing-dovecot-using-sqlite/&lt;br /&gt;
* sqlite3 둘러보기 :: http://www.cocoadev.co.kr/212 - [[file:data_appdev_sqlite.docx]]&lt;br /&gt;
* [[file:postfix_dovecot_document.7z]]&lt;br /&gt;
* SQLite 로컬 데이터베이스/김용만 - [[file:sqlite_database.pdf]] &lt;br /&gt;
* postfix/365managed - [[file:365-postfix.pdf]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=1465</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=1465"/>
		<updated>2013-11-30T09:42:15Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 링크 표시이름 수정&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== from KLDP문서 (정리중) ==&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]] 원문주소 :: http://wiki.kldp.org/wiki.php/OpenAFS-Gentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]] - 원문주소 :: http://wiki.kldp.org/wiki.php/GentooPostfix&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]] - 원문주소 :: http://wiki.kldp.org/wiki.php/PostfixOnGentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL_On_Gentoo|PostgreSQL On Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/PostgreSQLOnGentoo&lt;br /&gt;
&lt;br /&gt;
[[Oracle11g_For_Gentoo|Oracle11g For Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/Oracle11g_For_Gentoo&lt;br /&gt;
&lt;br /&gt;
[[Oracle92_For_Gentoo|Oracle 9.2 For Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/Oracle9.2%20For%20Gentoo&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_IP_bonding|Gentoo Linux 에서의 IP bonding구축]] - 원문주소 :: http://wiki.kldp.org/wiki.php/GentooIPBonding&lt;br /&gt;
&lt;br /&gt;
== 자체 제작 문서==&lt;br /&gt;
&lt;br /&gt;
* [[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_mwlib|Gentoo-MediaWiki에서 사용할 수 있는 Collection Extension에 대한 렌더서버 구축하기]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_mwmath|Gentoo-MediaWiki에서 사용할 수 있는 Math Extension 솔루션 구축]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_Korean_Env|Gentoo Linux 에서 한글 환경 만들기]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_DateTime_HowTo|Gentoo Linux 에서 날짜 시간 올바르게 설정하기]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_postfix_dovecot_sqlite|Gentoo Linux 에서 postfix + dovecot + sqlite 사용하기]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Gentoo_postfix_dovecot_sqlite&amp;diff=1464</id>
		<title>Gentoo postfix dovecot sqlite</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Gentoo_postfix_dovecot_sqlite&amp;diff=1464"/>
		<updated>2013-11-30T09:41:47Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: Gentoo에서 postfix + dovecot + sqlite 사용하기 페이지 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==gentoo, postfix, dovecot, sqlite howto==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===개요===&lt;br /&gt;
&lt;br /&gt;
postfix 는 MTA(main transfer agent) 로서 qmail&amp;lt;ref name=&amp;quot;qmail&amp;quot;&amp;gt;http://www.qmail.org&amp;lt;/ref&amp;gt; 또는 exim&amp;lt;ref name=&amp;quot;exim&amp;quot;&amp;gt;http://www.exim.org&amp;lt;/ref&amp;gt; 및 전통적인 sendmail&amp;lt;ref name=&amp;quot;sendmail&amp;quot;&amp;gt;http://www.sendmail.org&amp;lt;/ref&amp;gt; 와 같은 역할을 하는 프로그램 집합이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dovecot 은 POP3 및 IMAP protocol 을 지원하는 서버로서 postfix 와 연동되어 사용되는 경우가 많은 범용서버이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sqlite 는 데이터베이스 당 단일파일로 구성된 sql database 엔진이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 문서는 위의 구성으로 email account 를 실계정이 아닌 가상 계정으로 세팅해서 사용하는 email system 을 구성하는 방법을 설명하는것이 목적이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===필요한 프로그램의 설치===&lt;br /&gt;
&lt;br /&gt;
postfix 설치는 아래와 같이 하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
USE=&amp;quot;doc sqlite mbox dovecot-sasl&amp;quot; emerge postfix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dovecot 의 설치는 아래와 같이 하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
USE=&amp;quot;imapc mbox mdbox sqlite&amp;quot; emerge dovecot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
console 환경에서 email 테스트를 진행하기 위해 mailx 를 설치한다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
emerge mailx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
console 환경에서 mail 을 테스트하고싶다면 mutt 을 설치하는것이 좋다. mutt 은 오래된 curses 기반의 email client 이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
emerge mutt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sqlite 데이터베이스의 초기화===&lt;br /&gt;
&lt;br /&gt;
먼저 sqlite 의 데이터베이스를 어디에 놓을지 위치를 결정해야한다. 이 문서에서는 '''/var/lib/postfix''' 를 경로로 사용한다.&lt;br /&gt;
&lt;br /&gt;
데이터베이스 파일의 절대경로는 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음과 같은 명령어를 통해서 데이터베이스를 생성한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
sqlite /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참고로 데이터베이스 안에 아무것도 집어넣지 않는다면 sqlite 는 파일을 생성하지 않는다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
파일이 제대로 생성된 이후에는 파일의 owner 및 group 을 postfix 로 변경한다. 이 문서에서 세팅되는 owner 는 모두 postfix 를 사용하게 될것이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
chown postfix.postfix /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sqlite 에 들어갈 sql 정보는 다른부분에서 별도로 언급하기로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===postfix 의 기본설정===&lt;br /&gt;
&lt;br /&gt;
postfix 의 설정파일은 다음의 디렉토리에 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/etc/postfix/main.cf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 이 아래 부분에서 설정을 진행하기전에 original 백업파일을 만들어놓는것을 잊지말자.&lt;br /&gt;
&lt;br /&gt;
이 아래에는 main.cf 에서 중요한 부분만 일단 언급하는것으로 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
mydomain = aaa.com&lt;br /&gt;
myhostname = mail.aaa.com&lt;br /&gt;
mynetworks = 127.0.0.0/8, 172.16.1.0/24, 192.168.0.0/20&lt;br /&gt;
append_dot_mydomain = no&lt;br /&gt;
enable_long_queue_ids = yes&lt;br /&gt;
home_mailbox = Mail/&lt;br /&gt;
inet_protocols = ipv4&lt;br /&gt;
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain&lt;br /&gt;
relay_domains = $mydestination&lt;br /&gt;
smtpd_banner = $myhostname ESMTP unknown&lt;br /&gt;
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, permit_inet_interfaces, reject_unauth_destination&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===postfix 의 기본설정을 테스트하기===&lt;br /&gt;
&lt;br /&gt;
아래의 명령어를 이용해서 세팅한 postfix 를 테스트해보기로 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
testaccount@localhost ~ $ telnet localhost 25&lt;br /&gt;
Trying 127.0.0.1...&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
220 mail.lookandwalk.com ESMTP unknown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위처럼 220 이라는 메세지가 나오면 일단 성공. 이제부터 테스트를 시작하도록 하자&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
EHLO aaa.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래와 같은 메시지를 확인할 수 있다면 성공.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
250-mail.aaa.com&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-SIZE 10240000&lt;br /&gt;
250-VRFY&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250 DSN&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 실제로 email 을 보내보기로 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
MAIL FROM:(내메일주소)&lt;br /&gt;
250 2.1.0 Ok&lt;br /&gt;
RCPT TO:(받는사람메일주소)&lt;br /&gt;
250 2.1.5 Ok&lt;br /&gt;
DATA(엔터키)&lt;br /&gt;
354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
SUBJECT:test email from new email server&lt;br /&gt;
sample email....&lt;br /&gt;
.&lt;br /&gt;
250 2.0.0 Ok: queued as 3dH3xl3cwgz9Kw7h7&lt;br /&gt;
^]  &lt;br /&gt;
telnet&amp;gt; quit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
받는쪽에 email 이 도착한다면 메일을 보내는데는 성공했다고 봐도된다. 받는쪽의 email 이 google 또는 hotmail 등의 서비스라면 '''스팸함''' 으로 들어가는경우도 있으니 꼼꼼히 확인하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 gmail 등에서 여러분이 만든 system 상의 real account 로 email 을 보내보도록 하자. 만약 메일이 안들어가는것 같다면 mail daemon 의 log를 확인하도록 한다. 다음과 같은 부분이 나온다면 system 상에서 alias 관련된 데이터베이스를 생성해야한다는 의미가 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Nov 10 01:52:03 [postfix/smtpd] warning: hash:/etc/mail/aliases is unavailable. open database /etc/mail/aliases.db: No such file or directory&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 아래의 명령어를 이용해서 alias db 를 생성해주도록 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
newaliases&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래의 경로에 파일이 존재한다면 정상적으로 alias db 가 생성된것이 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/etc/mail/aliases.db&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
자 이제 메일이 온것을 어디서 확인할 수 있을까? 만들어진 계정으로 login 해서 다음의 경로를 확인해보면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
~/Mail/new/blahblah.(hostname)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
파일이 존재한다면 외부 서버에서 정상적으로 email 이 들어온 것이라고 보면 된다.&lt;br /&gt;
&lt;br /&gt;
이렇게까지 된다면 postfix 의 기본기능은 세팅이 되었다고 판단해도 된다.&lt;br /&gt;
&lt;br /&gt;
물론 이 상태는 local 의 사용자끼리 email 을 주고받을 수 있는 상태이니 궁금하다면 테스트를 해봐도 좋다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 local 메일과 mutt 의 사용====&lt;br /&gt;
&lt;br /&gt;
아래의 주소를 참고한다&lt;br /&gt;
&lt;br /&gt;
* http://www.cmsimike.com/blog/2011/10/30/setting-up-local-mail-delivery-on-ubuntu-with-postfix-and-mutt/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
기본적으로 mutt 은 mail 을 spool directory 를 /var/spool/mail 에서 찾게되지만 postfix 는 각 계정의 Maildir 로 파일을 각각 넣어준다. 고로 mail spool 디렉터리를 별도로 지정해 주어야만 한다.&lt;br /&gt;
&lt;br /&gt;
local 계정의 ~/.muttrc 라는 파일에 다음과같은 내용을 넣어준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set mbox_type=Maildir&lt;br /&gt;
set folder=&amp;quot;~/Mail&amp;quot;&lt;br /&gt;
&lt;br /&gt;
set mask=&amp;quot;!^\\.[^.]&amp;quot;&lt;br /&gt;
set mbox=&amp;quot;~/Mail&amp;quot;&lt;br /&gt;
set record=&amp;quot;+.Sent&amp;quot;&lt;br /&gt;
set postponed=&amp;quot;+.Drafts&amp;quot;&lt;br /&gt;
set spoolfile=&amp;quot;~/Mail&amp;quot;&lt;br /&gt;
&lt;br /&gt;
set pager_index_lines=4&lt;br /&gt;
set pager_format = &amp;quot; %C - %[%H:%M] %.20v, %s%* %?H? [%H] ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
set menu_scroll=yes&lt;br /&gt;
&lt;br /&gt;
color attachment blue white&lt;br /&gt;
color error red white&lt;br /&gt;
color hdrdefault black white&lt;br /&gt;
color indicator white black&lt;br /&gt;
color normal blue white&lt;br /&gt;
color tilde blue white&lt;br /&gt;
color quoted red white&lt;br /&gt;
color quoted1 brightred white&lt;br /&gt;
color quoted2 brightmagenta white&lt;br /&gt;
color quoted3 brightmagenta white&lt;br /&gt;
color quoted4 brightmagenta white&lt;br /&gt;
color quoted5 brightmagenta white&lt;br /&gt;
color signature red white&lt;br /&gt;
color status brightyellow blue&lt;br /&gt;
color markers red white&lt;br /&gt;
color header red white Subject &lt;br /&gt;
color header red white From &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이후 mutt 을 실행하면 도착한 email 을 확인할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postfix 는 Maildir&amp;lt;ref name=&amp;quot;Maildir from wikipedia&amp;quot;&amp;gt;http://en.wikipedia.org/wiki/Maildir&amp;lt;/ref&amp;gt; 이라는 규격을 사용한다. 이 이전에는 mbox 라는 규격이 사용되었으며 qmail 을 만든 제작자가 nfs 등의 상황에서 좀 더 유동적으로 반응할 수 있도록 Maildir 이라는 규격을 만들었다. 이런 부분을 참고하면 메일세팅을 좀 더 자유자재로 할 수 있을듯 하다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 디버깅====&lt;br /&gt;
&lt;br /&gt;
postfix 의 동작을 좀 더 자세히 디버깅하기 위해서는 다음의 파일을 편집하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/etc/postfix/master.cf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 파일 내부에 다음과같은 line 이 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
smtp      inet  n       -       n       -       -       smtpd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이를 다음과같이 수정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
smtp      inet  n       -       n       -       -       smtpd -D&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이렇게하면 postfix 에 대해 보다 자세한 동작 log 를 얻을 수 있다.&lt;br /&gt;
&lt;br /&gt;
로그파일은 '''/var/log/mail/*''' 에 위치한다.(이 부분은 logger 에 따라 다를 수 있다. 본인은 metalog 를 사용한다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sqlite 를 이용한 postfix 와 dovecot 의 세팅을 위한 사전지식===&lt;br /&gt;
&lt;br /&gt;
이 문서가 작성된 기본적인 목적은 postfix, dovecot, sqlite 를 사용함으로서 virtual mailbox 를 사용하게 하는것에 있다. 물론 virtual mailbox 라고해도 실제 메일이 sqlite 에 들어가는것은 아니다. 기본적으로는 email account 에 대한 계정정보를 sqlite 를 통해서 postfix 와 dovecot 사이에서 공유하는것에 있으며 실제로 메일은 서버상의 디렉토리안쪽에 나뉘어 들어가게 된다. 다만 차이점이 있다면 이 디렉토리는 postfix permission 으로 작동하게 되며 real account 를 사용하지 않기 때문에 ssh 접속등의 보안적인 측면에서 보다 좋은 장점을 얻게 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 에서 취급하는 mailbox와 domain 대한 개념====&lt;br /&gt;
&lt;br /&gt;
참고주소&lt;br /&gt;
&lt;br /&gt;
* https://workaround.org/ispmail/wheezy/virtual-domains&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====local domain=====&lt;br /&gt;
&lt;br /&gt;
일반적으로 가상메일박스등을 쓰지 않는 경우를 의미한다.&lt;br /&gt;
&lt;br /&gt;
mydestination 의 값이 아래처럼 세팅되어있는 경우&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mydestination = example.org, example.com, example.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
system 의 johndoe 라는 계정을 생성하게되면 다음의 3 가지 email 주소는 같은 메일함으로 취급된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
johndoe@example.org&lt;br /&gt;
johndoe@example.com&lt;br /&gt;
johndoe@example.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
모두 /var/mail/johndoe 라는 위치의 메일함으로 들어가게 된다는 의미가 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Virtual mailbox domains=====&lt;br /&gt;
&lt;br /&gt;
이 경우는 email 의 account 가 /etc/passwd 의 영향을 받지 않는 상태를 의미한다.&lt;br /&gt;
&lt;br /&gt;
virtual_mailbox_domains 의 값이 아래와 같이 세팅되어있는경우&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = example.org example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
실제 email 이 들어가게되는건 아래와같은 경로로 들어가도록 취급된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
john@example.org  /var/vmail/example.org/john/Maildir&lt;br /&gt;
jack@example.org  /var/vmail/example.org/jack/Maildir&lt;br /&gt;
jack@example.com  /var/vmail/example.com/jack/Maildir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위처럼 사용하려는 경우에는 /etc/postfix/virtual_mailbox_domains 파일에 내용이 추가되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
example.org  OK&lt;br /&gt;
example.com  OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
각 domain 을 virtual mailbox 에서 허용한다는 의미가 되겠다.&lt;br /&gt;
&lt;br /&gt;
이렇게 파일에 내용을 넣는걸로 끝나면 편하겠지만 그렇게 쉽게 가주지는 않는다. 파일의 내용이 세팅을 원하는 내용대로 된다면 다음과같은 compile 과정을 거쳐줘야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
postmap /etc/postfix/virtual_mailbox_domains&lt;br /&gt;
postmap /etc/postfix/virtual_mailbox_users&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 이용해서 작업을 진행하면 '''.db''' 라는 확장자를 가진 파일을 만들어준다. postfix 는 이 과정을 자동으로 해주지는 않기때문에 이점에는 주의하는것이 좋다. 이렇게 만들어진 내용을 실제로 사용하기 위해서는 postfix 의 설정파일중 main.cf 에 다음과같은 내용을 추가해 주어야 한다.(hash라는 부분이 붙는것에 주의하는게 좋을듯 하다)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = hash:/etc/postfix/virtual_mailbox_domains&lt;br /&gt;
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_users&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다행히 database 를 사용하는 경우는 hash 를 사용하지않고 database 에서 값을 feedback 받기때문에 위와같은 복잡한 방법은 거치지 않아도 된다. 지금 작성하고 있는 이 부분에 대한 원문에서는 mysql 을 예로 들었지만 이 문서에서는 sqlite 를 사용하게 될것이기 때문에 이 부분에 대한 원래 문장은 인용하지 않는다. 다만 사용된 query 에 대해서는 간단하게 분석해봐야할 필요가 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
query = SELECT mailbox_path FROM virtual_users WHERE email_address='%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 아래의 페이지 2 개를 참고해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* http://www.postfix.org/SQLITE_README.html&lt;br /&gt;
* http://www.postfix.org/sqlite_table.5.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 위의 query 구문에서 %s 는 입력값을 의미한다. 뭐가 입력되는지 모르는경우, 일반적으로 그냥 사용하는것 같다. 위 query 의 내용을 간단히 살펴보면 virtual_users 라는 데이터베이스 테이블에서 email_address 를 기준으로 검색을 진행해서 mailbox_path 라는 필드의 값을 반환하고 있다. 결과적으로 위 query 의 내용은 사용자의 virtual mailbox 의 경로를 알아내는것이 그 목적이라 할 수 있다. 이제 이렇게 작업된 파일을 실제로 postfix 의 main.cf 파일에 넣어보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_maps = $query/maps-vmbox.query&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
원문의 경우는 여기서 mysql 이라는 부분을 사용했지만 여기서는 postfix 를 기준으로 하고있기때문에 해당 문서의 내용을 기준으로 변경해보았다. 그럼 maps-vmbox.query 라는 파일에는 대체 어떤 내용이 있는걸까?&lt;br /&gt;
&lt;br /&gt;
이 '''.query''' 파일을 살펴보기전에 postfix-sqlite 에 대해 설명한 내용의 main.cf 파일의 내용을 잠시 참고해야 할 필요가 있다. 해당 파일에는 다음과같은 내용이 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
query = sqlite:$config_directory/query&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오호..... mysql 대신 이미 sqlite 라는 driver 부분이 선언되어있다. 이후 main.cf 파일내에서 $query 를 사용하는 부분은 전부 공통적으로 적용이 가능하다는걸 알 수 있다. 물론 내용을 잘 살펴보면 별도로 특별한 기술이 있는게 아니라 postfix 의 실행시 string replace 수준으로 작용된다라는걸 알 수 있다. 이제 정말로 '''maps-vmbox.query''' 라는 파일의 내용을 살펴보도록 하겠다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
dbpath = /etc/postfix/private/mail.sqlite&lt;br /&gt;
query = SELECT coalesce(VM.home, 'vmail/%d/%u')&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS '%s'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
result_format = %s/Mail/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
첫번째줄에 sqlite 데이터베이스 파일의 path 부분이 정의되어있다.&lt;br /&gt;
&lt;br /&gt;
두번째 줄에는 query 문장이 들어가있다. 두번째 줄을 보다보면 익숙하지 않은 것이 보인다. 다음의 내용을 잠시 참고하도록 한다.&lt;br /&gt;
&lt;br /&gt;
* http://overoid.tistory.com/16&lt;br /&gt;
&lt;br /&gt;
'''coalesce(X,Y,...)''' coalesce() 함수는 Argument 중에서 첫번째로 Not Null 인 Argument 값을 리턴하는 함수입니다. 만일 모든 인자가 null 이면 null을 리턴합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오호.. 뭔말인지 모르겠다! 사실 원문을 직역한 수준이기는한데.... 원문&amp;lt;ref name=&amp;quot;sqlite core functions&amp;quot;&amp;gt;http://www.sqlite.org/lang_corefunc.html&amp;lt;/ref&amp;gt;을 보면 인수는 2 개 이상이어야 한다고 되어있다. 굳이 풀어보자면 VM.home 이라는 필드가 값이있으면 그걸 반환하고, VM.home 필드가 값을 가지고 있지 않으면 뒤에 나오는 ''''vmail/%d/%u'''' 이라는 값을 반환하게 되어있다.&lt;br /&gt;
&lt;br /&gt;
이제 쿼리의 흐름을 살펴보기로 하자.&lt;br /&gt;
&lt;br /&gt;
* VMailbox 테이블의 id 필드와 Address 라는 테이블의 id 필드가 일치하며&lt;br /&gt;
* Domain 이라는 테이블의 id 와 Address 라는 테이블의 domain 이라는 필드가 일치하는 데이터중&lt;br /&gt;
* (Address 라는 테이블의 localpart + '@'  + Domain 테이블의 name) 의 문자열 결합 결과가 '%s' 와 같으며&lt;br /&gt;
* VMailbox 의 active 필드의 값이 0 이 아닌 데이터의 메일박스 경로를 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 흐름에서 중요한간 localpart 가 곧 id 를 의미한다는것이 중요하다. 이 경우 인수로 주어지는 %s 는 '''&amp;quot;aaa@bbb.com&amp;quot;''' 정도의 값이 주어지게 되기때문에 id 와 domain 을 결합해서 해당되는 ID 의 virtual mailbox 값을 얻어내는것이 목적인 쿼리가 되겠다. 결과적으로 mysql 의 경우 얻는값과 별반 차이는 없다고 생각해도 무방하겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
세번째줄은 result_format 이라는 구문이 있다. 여기에도 %s 가 사용되는데 선택한 사용자의 virtual mailbox 값을 완성시키는 부분이라 보면 되곘다. 이후에 설명할 '''virtual_mailbox_base''' 의 값과 결합되면 다음과 같은 결과가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_base = /home&lt;br /&gt;
result_format = %s/Mail/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
final :: /home/aaa@bbb.com/Mail/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Virtual alias domains=====&lt;br /&gt;
&lt;br /&gt;
virtual mailbox 를 사용하는경우 에는 위에서 설명했다시피 local domain 을 사용하는것처럼 기본적으로 한개의 id 와 여러개의 domain 이 연결되지는 않는다. 이 경우 virtual alias domain 을 사용하게 된다. main.cf 파일 내에서는 virtual_alias_maps 라는것으로 설정되게 되는데 이 경우 인수의 처리 흐름은 왼쪽에서 오른쪽으로 가게 된다고 한다. 이런 기능은 다음과같은 3가지 경우를 대상으로 하게된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''하나''' : john@example.org 의 모든 email 을 jeff@example.com 로 포워딩 하는경우는 다음과같이 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
john@example.org   jeff@example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''둘''' : john@example.org 의 모든 email 을 jeff@example.com 로 포워딩 하지만 원래의 계정에도 이메일을 남겨놓는경우 다음과같이 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
john@example.org   john@example.org&lt;br /&gt;
john@example.org   jeff@example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
간단하게 한줄로 작성할 수도 있다. 이 경우 콤마(,) 를 사용하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
john@example.org   john@example.org, jeff@example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''셋''' : example.org 도메인의 모든 메일을 joe@example.com 계정으로 포워딩하려면 다음과같이 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@example.org   joe@example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
지금까지 기본적인 virtual mailbox 에 대한 내용을 살펴보았다. 이 이후부터는 postfix, dovecot, sqlite 에 대한 세팅에 직접적으로 관련된 내용을 알아보도록 하겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix, dovecot, sqlite 에 대한 자료====&lt;br /&gt;
&lt;br /&gt;
사실 sqlite 를 사용하지않는.... mysql 또는 postgreSQL 에 대한 내용은 인터넷상에서 심심치 않게 찾아볼 수 있다. 하지만 sqlite 를 기준으로 한 내용은 생각보다 많지않다. (사실 이 문서를 작성하기 시작한 원인이기도 하다) 현시점에서 가장 자료가 많은곳은 아래와 같다.&lt;br /&gt;
&lt;br /&gt;
* http://rob0.nodns4.us/&lt;br /&gt;
* http://rob0.nodns4.us/howto/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
기본적으로 postfix 로 컨설팅을 하시는분의 홈페이지다. 정말 자료는 잘 되어있는데... 사실 dovecot 의 경우는 그다지 내용이 어렵지않은데 postfix 의 경우 어떤 부분이 어떤 역할을 하는지에 대한 학습이 필요하다. 물론 예제 자료는 잘 되어있지만 사용자가 원하는대로 세팅을 하기 위해서는 sqlite 데이터베이스에 들어갈 테이블 구조에 대한 고찰이 필요하다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 rob 의 홈페이지에서는 이런부분에 대한 자세한 설명은 들어가 있지 않다. 본 문서에서는 이러한 부분에 대한 조금의 분석을 통해 원하는대로 데이터를 세팅하게 하는것을 목표로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 와 sqlite 연동을 위한 디렉토리 및 파일의 구성====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/etc/postfix/query/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postfix 에서 sqlite 의 연동을 위해 사용하는 query 들이 들어가있는 디렉토리가 된다. 어떤 query file 들이 들어가는지는 아래에서 자세히 살펴보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====smtpd restriction 에 대한 query 파일들=====&lt;br /&gt;
&lt;br /&gt;
main.cf 에서 사용되는 smtpd_restriction_classes 에 대한 내용은 기본적으로 아래의 주소를 참고하도록 한다.&lt;br /&gt;
&lt;br /&gt;
* http://brucekim.egloos.com/2993551&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
관련된 파일들의 정보는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
* access-bscat.query &amp;gt;&amp;gt; smtpd_restriction_classes 관련파일&lt;br /&gt;
* access-rcpt.query &amp;gt;&amp;gt; smtpd_recipient_restrictions 관련파일&lt;br /&gt;
* access-rcptDomain.query &amp;gt;&amp;gt; smtpd_recipient_restrictions 관련파일&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 문서에서는 필터링에 대한것을 다루는것이 주 목적이 아니기때문에 이 부분은 지금 언급하지 않도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====그외 설정들에 대한 query 파일들=====&lt;br /&gt;
&lt;br /&gt;
* dom-local.query &amp;gt;&amp;gt; mydestination 에 대한 쿼리파일&lt;br /&gt;
* dom-relay.query &amp;gt;&amp;gt; relay_domains 에 대한 쿼리파일&lt;br /&gt;
* dom-valias.query &amp;gt;&amp;gt; virtual_alias_domains 에 대한 쿼리파일&lt;br /&gt;
* dom-vmbox.query &amp;gt;&amp;gt; virtual_mailbox_domains 에 대한 쿼리파일&lt;br /&gt;
* maps-alias.query &amp;gt;&amp;gt; alias_maps 에 대한 쿼리파일&lt;br /&gt;
* maps-local.query &amp;gt;&amp;gt; local_recipient_maps 에 대한 쿼리파일. 모든 domain 을 sqlite 에서 제어하기 위해서는 사용해야하는 쿼리&lt;br /&gt;
* maps-relay.query &amp;gt;&amp;gt; relay_recipient_maps 에 대한 쿼리파일. relay_domains 를 사용하지 않는 경우에는 주석처리하면 된다&lt;br /&gt;
* maps-transport.query &amp;gt;&amp;gt; transport_maps 에 대한 쿼리파일. transport_maps 는 특정 domain 을 다른 smtp 등으로 보내는데 사용된다&amp;lt;ref name=&amp;quot;transport_maps&amp;quot;&amp;gt;http://www.postfix.org/STANDARD_CONFIGURATION_README.html 페이지의 '''Running Postfix behind a firewall''' 부분의 설정파일 참고&amp;lt;/ref&amp;gt;. 사용하지 않는다면 주석처리하면 된다&lt;br /&gt;
* maps-valias.query &amp;gt;&amp;gt; virtual_alias_maps 에 대한 쿼리파일. virtual mailbox 의 domain alias 와 관련이 있다.&lt;br /&gt;
* maps-vgid.query &amp;gt;&amp;gt; virtual_gid_maps 에 대한 쿼리파일. mailbox 의 email account 에 대한 gid 와 관련이 있다.&lt;br /&gt;
* maps-vmbox.query &amp;gt;&amp;gt; virtual_mailbox_maps 에 대한 쿼리파일. 직접적으로 virtual mailbox 에 대한 동작과 관련이 있다.&lt;br /&gt;
* maps-vuid.query &amp;gt;&amp;gt; virtual_uid_maps 에 대한 쿼리파일. mailbox 의 email account 에 대한 uid 와 관련이 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 와 query 파일에서 사용하게될 sqlite 의 데이터베이스 schema====&lt;br /&gt;
&lt;br /&gt;
이제부터의 내용은 다음의 schema 내용을 기준으로 진행된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Mentioned in the old TODO file was that I wanted to do away with the&lt;br /&gt;
-- ugly unique column names and use plain words instead. Also mentioned&lt;br /&gt;
-- was the desire to improve the Transport and Alias tables. This is the&lt;br /&gt;
-- result: what the new schema should be. It surprised me!&lt;br /&gt;
--&lt;br /&gt;
-- New revision 2012-02-16 for those who are following along at home:&lt;br /&gt;
-- This removes the RClass table and foreign key constraints thereto,&lt;br /&gt;
-- because it is useless unless main.cf reads restriction classes from&lt;br /&gt;
-- the database.&lt;br /&gt;
--&lt;br /&gt;
PRAGMA foreign_keys=ON;&lt;br /&gt;
BEGIN TRANSACTION;&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;Transport&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	active INTEGER DEFAULT 1, transport TEXT, nexthop INTEGER,&lt;br /&gt;
	mx INTEGER DEFAULT 1, port INTEGER,&lt;br /&gt;
	UNIQUE (transport,nexthop,mx,port));&lt;br /&gt;
-- Transport.nexthop would be a pointer to Domain.id, but without a&lt;br /&gt;
-- foreign key constraint because the Domain table has yet to be&lt;br /&gt;
-- created at this point.&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;Domain&amp;quot; (id INTEGER PRIMARY KEY, name TEXT,&lt;br /&gt;
	active INTEGER DEFAULT 1, class INTEGER DEFAULT 0,&lt;br /&gt;
	owner INTEGER DEFAULT 0, transport INTEGER,&lt;br /&gt;
	rclass INTEGER DEFAULT 30, UNIQUE (name),&lt;br /&gt;
	FOREIGN KEY(transport) REFERENCES Transport(id));&lt;br /&gt;
-- This revision removes the NOT NULL constraint from Domain.name; we&lt;br /&gt;
-- will insert a special record Domain.id=0 with Domain.name=NULL,&lt;br /&gt;
-- which thus maintains a defacto NOT NULL constraint for other rows.&lt;br /&gt;
INSERT INTO &amp;quot;Domain&amp;quot; VALUES(0,NULL,NULL,NULL,NULL,NULL,NULL);&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;Address&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	localpart TEXT NOT NULL, domain INTEGER NOT NULL,&lt;br /&gt;
	active INTEGER DEFAULT 1, transport INTEGER, rclass INTEGER,&lt;br /&gt;
	FOREIGN KEY(domain) REFERENCES Domain(id),&lt;br /&gt;
	FOREIGN KEY(transport) REFERENCES Transport(id),&lt;br /&gt;
	UNIQUE (localpart, domain));&lt;br /&gt;
-- We will insert a special record Address.id=0 with Address.domain=0&lt;br /&gt;
-- to differentiate aliases(5) commands, paths or includes from&lt;br /&gt;
-- address targets.&lt;br /&gt;
INSERT INTO &amp;quot;Address&amp;quot; VALUES(0,'root',0,NULL,NULL,NULL);&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;Alias&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	address INTEGER NOT NULL, active INTEGER DEFAULT 1,&lt;br /&gt;
	target INTEGER NOT NULL, extension TEXT,&lt;br /&gt;
	FOREIGN KEY(address) REFERENCES Address(id)&lt;br /&gt;
	FOREIGN KEY(target) REFERENCES Address(id)&lt;br /&gt;
	UNIQUE(address, target, extension));&lt;br /&gt;
-- This revision changes Alias.name to Alias.address, because INTEGER&lt;br /&gt;
-- fields should not be called &amp;quot;name&amp;quot; (to me that implies TEXT.) If&lt;br /&gt;
-- Alias.target=0, that tells us that the Alias.extension contains a&lt;br /&gt;
-- /file/name, or a |command, or an :include:/file/name. Otherwise,&lt;br /&gt;
-- Alias.extension contains an address extension.  Differentiation of&lt;br /&gt;
-- local(8) aliases(5) from virtual(5) is in the Address table, where&lt;br /&gt;
-- Address.domain=0, the special null record in the Domain table.&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;VMailbox&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	active INTEGER DEFAULT 1, uid INTEGER,&lt;br /&gt;
	gid INTEGER, home TEXT, password TEXT,&lt;br /&gt;
	FOREIGN KEY(id) REFERENCES Address(id));&lt;br /&gt;
--&lt;br /&gt;
CREATE TABLE &amp;quot;BScat&amp;quot; (id INTEGER PRIMARY KEY,&lt;br /&gt;
	sender TEXT NOT NULL, priority INTEGER,&lt;br /&gt;
	target TEXT NOT NULL, UNIQUE (sender, priority));&lt;br /&gt;
--&lt;br /&gt;
COMMIT;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
각 테이블에 대한 역할은 다음과같다.&lt;br /&gt;
&lt;br /&gt;
* '''Transport''' 테이블&lt;br /&gt;
** transport 기능을 사용하는 경우에 필요한 테이블&lt;br /&gt;
* '''Domain''' 테이블&lt;br /&gt;
** domain 에 대한 정보를 관리하는 테이블&lt;br /&gt;
* '''Address''' 테이블&lt;br /&gt;
** email account 와 domain 정보등을 연관지어 관리하는 테이블&lt;br /&gt;
** id(localpart) 와 domain 필드를 pair 로 unique 로 처리한다. 개별 필드내에서 중복값은 허용하는 경우가 된다.&lt;br /&gt;
* '''Alias''' 테이블&lt;br /&gt;
** virtual mailbox alias 기능을 정의할때 사용되는 테이블&lt;br /&gt;
** email주소(address), alias 처리할 대상(target), extenstion(alias 가 일어날때 별도로 동작시킬 수 있는 script등) 을 pair 로 unique 처리한다.&lt;br /&gt;
* '''VMailbox''' 테이블&lt;br /&gt;
** virtual mailbox 에 대한 email account 정보를 관리하는데 사용되는 테이블. email account 의 비밀번호, gid, uid 등이 이쪽에서 관리된다. ID 는 address 테이블에서 관리한다.&lt;br /&gt;
* BScat 테이블&lt;br /&gt;
** smtpd restriction 에 대한 정보를 담고있는 테이블&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 중요 query 파일 분석:map 관련 파일들====&lt;br /&gt;
&lt;br /&gt;
=====maps-alias.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
query = SELECT ALL&lt;br /&gt;
	  CASE WHEN Alias.target=0 THEN Alias.extension&lt;br /&gt;
	  ELSE TA.localpart ||&lt;br /&gt;
	    (CASE WHEN Alias.extension IS NOT NULL THEN '-'&lt;br /&gt;
	      || Alias.extension ELSE '' END) ||&lt;br /&gt;
	    (CASE WHEN TD.id=0 THEN '' ELSE '@' || TD.name END)&lt;br /&gt;
	  END&lt;br /&gt;
	FROM &amp;quot;Alias&amp;quot;&lt;br /&gt;
	JOIN &amp;quot;Address&amp;quot; AS TA ON Alias.target=TA.id&lt;br /&gt;
	JOIN &amp;quot;Domain&amp;quot; AS TD ON TA.domain=TD.id&lt;br /&gt;
	JOIN &amp;quot;Address&amp;quot; AS AA ON Alias.address=AA.id&lt;br /&gt;
	WHERE AA.localpart IS '%s'&lt;br /&gt;
	AND AA.domain=0 AND Alias.active!=0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 쿼리를 간단하게 분석해보자.&lt;br /&gt;
&lt;br /&gt;
* email 의 ID 부분을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Alias 테이블의 target 필드의 값이 Address 테이블의 id 와 같으며&lt;br /&gt;
* Alias 테이블의 domain 필드의 값이 Domain 테이블의 id 와 같으며&lt;br /&gt;
* Alias 테이블의 address 필드의 값이 Address 테이블의 id 와 같은 자료중에서&lt;br /&gt;
* Address 테이블의 domain 필드의 값이 0 이며&lt;br /&gt;
* Alias 테이블의 active 필드의 값이 0 이 아니며&lt;br /&gt;
* Address 테이블의 localpart 의 값과 %s 의 값이 일치하는 데이터에 대해&lt;br /&gt;
* 데이터의 Alias 테이블의 target 값이 0 인 경우는 Alias 테이블의 extension 필드의 값을 반환하고&lt;br /&gt;
* 데이터의 Alias 테이블의 target 값이 0 이 아닌 경우에는 문자열을 결합해서 반환한다&lt;br /&gt;
** Alias 테이블의 extentsion 이 공백이 아닌경우에는 ''''-' 문자 + extension''' 의 값을 반환&lt;br /&gt;
*** 공백이라면 '' 를 반환&lt;br /&gt;
** Domain 의 id 값이 0 이라면 공백을 반환.&lt;br /&gt;
*** 공백이 아니라면 ''''@' + domain 테이블의 name 필드''' 를 반환&lt;br /&gt;
** 간단하게 보면 아래와 같다&lt;br /&gt;
**# alias.extension 이 반환되거나&lt;br /&gt;
**# '''Address.localpart-Alias.extension''' 이 반환되거나&lt;br /&gt;
**# '''Address.localpart''' 이 반환되거나&lt;br /&gt;
**# '''Address.localpart-Alias.extension@Domain.name''' 이 반환되거나&lt;br /&gt;
**# '''Address.localpart@Domain.name''' 이 반환된다&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이정도의 내용이 되겠다. 이중에서 Alias 테이블의 extension 은 뭐하는놈인지를 아직 모르겠으니 나중에 살펴보도록 하다.&lt;br /&gt;
&lt;br /&gt;
결과적으로 위의 쿼리는 id 를 받아서 id 와 domain 이 연결된 주소를 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====maps-local.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT localpart FROM Address&lt;br /&gt;
	WHERE localpart is '%s' AND domain=0 AND active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오오 간단하다. 역시 분석해보자.&lt;br /&gt;
&lt;br /&gt;
* email 의 ID 부분을 검색용 인자로 받아서(%s)&lt;br /&gt;
* localpart 와 id 과 같고&lt;br /&gt;
* Address 테이블의 domain 값이 0 이며&lt;br /&gt;
* Address 테이블의 active 값이 0 이 아닌 데이터의&lt;br /&gt;
* localpart 필드를 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 입력받은 id 가 별도로 domain 을 사용하지않는 local 계정인지를 검색해서 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====maps-valias.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT TA.localpart || (CASE WHEN VA.extension IS NOT NULL&lt;br /&gt;
	  THEN '-' || VA.extension ELSE '' END) ||&lt;br /&gt;
	  (CASE WHEN TD.id=0 THEN '' ELSE '@' || TD.name END)&lt;br /&gt;
	FROM Alias AS VA&lt;br /&gt;
	  JOIN Address AS TA ON (VA.target = TA.id)&lt;br /&gt;
	  JOIN Domain AS TD ON (TA.domain = TD.id)&lt;br /&gt;
	  JOIN Address AS AA ON (VA.address = AA.id)&lt;br /&gt;
	  JOIN Domain AS AD ON (AA.domain = AD.id)&lt;br /&gt;
	WHERE AA.localpart || '@' || AD.name IS '%s'&lt;br /&gt;
	AND VA.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이번에는 조금 길다. 하지만 분석해보도록 하자. (와아아 case 가 쓰이셨다.......)&lt;br /&gt;
&lt;br /&gt;
* email 전체를(aaa@bbb.com) 검색용 인자로 받아서(%s)&lt;br /&gt;
* Alias 의 target 과 Address 의 id 가 같고&lt;br /&gt;
* Address 의 domain 과 Domain 의 id 가 같으며&lt;br /&gt;
* Alias 의 address 와 Address 의 id 가 같으며&lt;br /&gt;
* Address 의 domain 과 Domain 의 id 가 같은 자료중에서&lt;br /&gt;
* Address 의 localprt + '@' + domain.name 의 결합결과가 %s 와 같고&lt;br /&gt;
* Alias 의 active 가 0 이 아닌 데이터에 대해&lt;br /&gt;
* Alias.localpart 와 다른 문자열을 결합해서 반환한다&lt;br /&gt;
** TA.localpart 와&lt;br /&gt;
** Alias.extension 이 공백이 아닌경우 ''''-' + Alias.extension''' 과&lt;br /&gt;
** Domain 의 id 값이 이 아닌경우 ''''@' + domain.name''' 을 결합한다&lt;br /&gt;
** 간단하게 보면 아래와 같다&lt;br /&gt;
*** '''TA.localpart''' 가 반환되거나&lt;br /&gt;
*** '''TA.localpart-Alias.extension''' 이 반환되거나&lt;br /&gt;
*** '''TA.localpart@domain.name''' 이 반환되거나&lt;br /&gt;
*** '''TA.localpart-Alias.extension@domain.name''' 이 반환된다&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 email account 의 전체 주소를 받아서 id 또는 id@domain 을 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====maps-vmbox.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT coalesce(VM.home, 'vmail/%d/%u')&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS '%s'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이정도면 나름 준수한 편인거같다. 이 쿼리도 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* email account 전체를(aaa@bbb.com) 검색용 인자로 받아서(%s)&lt;br /&gt;
* Address 테이블의 id 필드와 VMailbox 의 id 필드가 같으며&lt;br /&gt;
* Address 테이블의 domain 필드와 Domain 테이블의 id 필드가 같은 자료중에서&lt;br /&gt;
* Address.localprt + '@' + Domain.name 의 결합결과가 %s 와 같으며&lt;br /&gt;
* VMailbox 의 active 가 0 이 아닌 데이터에 대해&lt;br /&gt;
* VMailbox.home 이 공백이 아니면 VMailbox.home 의 값을 반환하고&lt;br /&gt;
* VMailbox.home 이 공백이라면 'vmail/%d/%u' 를 반환한다&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 경우 %d 는 email 계정의 domain, %u 는 email 계정의 user 를 의미한다. aaa@bbb.com 의 경우&lt;br /&gt;
&lt;br /&gt;
* %u : aaa&lt;br /&gt;
* %d : bbb.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이런 결과가 된다. 이 쿼리는 입력된 사용자에 대한 mailbox 경로를 받아내는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 중요 query 파일 분석:그외 domain 관련 쿼리파일들====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====dom-vmbox.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class&amp;gt;800&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS '%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
쿼리는 상대적으로 간단하다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* domain 을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Domain.Class 가 800 이상이며&lt;br /&gt;
* Domain 테이블의 active 값이 0 이 아니며&lt;br /&gt;
* Domain 테이블의 name 이 %s 와 같은 결과의&lt;br /&gt;
* Domain.name 을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 입력된 domain 이 취급가능한 domain 인지를 조회해서 반환하는 역할을 하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
바로 아래쪽에서 살펴볼 dom-local.query 와 약간 비교되는데 Domain.clss 의 조건값이 틀리다. 결국 virtual domain 은 800 이상의 class 값을 가져야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====dom-local.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class=1&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS '%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
쿼리는 dom-vmbox.query 와 비슷하다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* domain 을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Domain.Class 가 1 이며&lt;br /&gt;
* Domain 테이블의 active 값이 0 이 아니며&lt;br /&gt;
* Domain 테이블의 name 이 %s 와 같은 결과의&lt;br /&gt;
* Domain.name 을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 main.cf 의 mydestination 부분에 사용된다. 일반적으로 mydestination 은 local domain 을 처리하는데 사용되며 이런 전제들을 살펴봤을때 local domain 으로 처리하기 위해서는 Domain.class 의 값은 1 이 되어야 하므로 local domain 은 데이터베이스 상에서 Domain.class 가 1 의 값을 가져야 한다는걸 알 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====dom-relay.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class=2&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS '%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
쿼리는 dom-local.query 와 비슷하다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* domain 을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Domain.Class 가 2 이며&lt;br /&gt;
* Domain 테이블의 active 값이 0 이 아니며&lt;br /&gt;
* Domain 테이블의 name 이 %s 와 같은 결과의&lt;br /&gt;
* Domain.name 을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 dom-local.query 와 동일한 조건에서 Domain.class 가 2 인 domain 을 반환한다. 결과적으로 relay 가능한 domain 은 Domain.class 가 2 의 값을 가져야 한다는걸 알 수 있다. 이 쿼리는 main.cf 의 relay_domains 의 값으로 사용된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====dom-valias.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class=3&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS '%s'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
쿼리는 dom-local.query 와 비슷하다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* domain 을 검색용 인자로 받아서(%s)&lt;br /&gt;
* Domain.Class 가 3 이며&lt;br /&gt;
* Domain 테이블의 active 값이 0 이 아니며&lt;br /&gt;
* Domain 테이블의 name 이 %s 와 같은 결과의&lt;br /&gt;
* Domain.name 을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 dom-local.query 와 동일한 조건에서 Domain.class 가 3 인 domain 을 반환한다. 결과적으로 alias 가 가능한 domain 은 Domain.class 가 3 의 값을 가져야 한다는걸 알 수 있다. 이 쿼리는 main.cf 의 virtual_alias_domains 의 값으로 사용된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 의 중요 query 파일 분석:uid 및 gid 관련 파일들====&lt;br /&gt;
&lt;br /&gt;
=====maps-vuid.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT coalesce(VM.uid, D1.class)&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS '%s'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
조건은 그리 복잡하지 않지만 조금 주의해야할 부분이 있을거같다. 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* email account 전체를(aaa@bbb.com) 검색 인자로 받아서(%s)&lt;br /&gt;
* VMailbox 테이블의 id 필드와 Address 의 id 가 같으며&lt;br /&gt;
* Address 테이블의 domain 필드와 Domain 테이블의 id 가 같은 자료중&lt;br /&gt;
* Address.localprt + '@' + Domain.name 의 결합결과가 %s 와 같으며&lt;br /&gt;
* VMailbox.active 의 값이 0 이 아닌 결과를 대상으로&lt;br /&gt;
* VMailbox.uid 가 공백이 아닌경우에는 VMailbox.uid 를 반환하고&lt;br /&gt;
* VMailbox.uid 가 공백인경우에는 Domain 의 class 필드의 값을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 요청된 email account 의 uid 값을 반환하는 쿼리로서 값이 지정되어있으면 지정된 uid 값을 반환하고, uid 값이 별도로 지정되어있지 않은 경우에는 Domain 의 class 값을 uid 로 사용하게 되어있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====maps-vgid.query=====&lt;br /&gt;
&lt;br /&gt;
이 파일에서 사용되는 쿼리는 다음과 같다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT coalesce(VM.gid, 800)&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS '%s'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 maps-vuid.query 와 비슷하지만 약간의 차이가 있다 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* email account 전체를(aaa@bbb.com) 검색 인자로 받아서(%s)&lt;br /&gt;
* VMailbox 테이블의 id 필드와 Address 의 id 가 같으며&lt;br /&gt;
* Address 테이블의 domain 필드와 Domain 테이블의 id 가 같은 자료중&lt;br /&gt;
* Address.localprt + '@' + Domain.name 의 결합결과가 %s 와 같으며&lt;br /&gt;
* VMailbox.active 의 값이 0 이 아닌 결과를 대상으로&lt;br /&gt;
* VMailbox.gid 가 공백이 아닌경우에는 VMailbox.gid 를 반환하고&lt;br /&gt;
* VMailbox.gid 가 공백인경우에는 800 이라는 값을 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 요청된 email account 의 gid 값을 반환하는 쿼리로서 값이 지정되어있으면 지정된 gid 값을 반환하고, gid 값이 별도로 지정되어있지 않은 경우에는 800 이라는 gui 값을 강제로 사용하게 되어있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sqlite 를 사용하기 위한 postfix 의 map file 테스트===&lt;br /&gt;
&lt;br /&gt;
이제 database 를 연동하기전에 postfix 의 main.cf 에서 사용하는 각 field 를 테스트함으로서 실제 sqlite 데이터베이스에 어던 데이터가 들어가야하는지를 사전 테스트를 먼저 해보는것으로 진행하려 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
하나하나 기존에 있던 option 들을 portmap 이라는 postfix 의 프로그램을 통해 파일로 뽑아서 어떤형식으로 데이터가 유지되어야 하는지를 알아보도록 하겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====mydestination, relay_domains====&lt;br /&gt;
&lt;br /&gt;
기존의 mydestination 값은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이걸 다음과 같이 변경한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mydestination = hash:/etc/postfix/mapdatas/mydestinations&lt;br /&gt;
relay_domains = hash:/etc/postfix/mapdatas/relaydomains&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 /etc/postfix/mapdatas/mydestinations 파일의 내용을 다음과 같이 편집한다.&amp;lt;ref name=&amp;quot;mydestinations 파일 형식&amp;quot;&amp;gt;http://www.irbs.net/internet/postfix/0401/1694.html&amp;lt;/ref&amp;gt;(mapdatas 디렉토리가 없다고? 그냥 만들면 된다. 규칙이 딱히 정해져있는건 아니다)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail.aaa.com    OK&lt;br /&gt;
localhost       OK&lt;br /&gt;
aaa.com         OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 /etc/postfix/mapdatas/relaydomains 파일의 내용을 다음과 같이 편집한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail.aaa.com    1&lt;br /&gt;
localhost       1&lt;br /&gt;
aaa.com         1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
편집이 끝나면 다음과 같은 명령을 실행해준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
postmap /etc/postfix/mapdatas/mydestinations&lt;br /&gt;
postmap /etc/postfix/mapdatas/relaydomains&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 외부에서 세팅한 서버로 email 을 보내보도록 한다.&lt;br /&gt;
&lt;br /&gt;
email 이 local 의 서버까지 도착했다는걸 확인하면 mydestination 에 대한 hash 파일로의 변경은 성공했다고 봐도 된다.&lt;br /&gt;
기본적으로 mydestination 하나만 변경해봤자 어차피 relay_domains 가 제대로 설정되어있지 않으면 메일은 안쪽으로 도착하지 않는다. 고로 relay_domains 까지 설정해주어야 하는게 중점. 다만 widcard(* 기호) 는 사용할 수 없으니 필요한 domain 은 주르륵 적어주어야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====virtual mailbox 에 대한 설정====&lt;br /&gt;
&lt;br /&gt;
이제부터 virtual mailbox 에 대한 세팅을 해보도록 한다. 순서대로 몇가지를 살펴보기로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 다음의 페이지를 참고한다.&lt;br /&gt;
&lt;br /&gt;
* http://postfixmail.com/blog/index.php/virtual-domain-aliases/&lt;br /&gt;
* http://www.postfix.org/VIRTUAL_README.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위 페이지의 내용을 기준으로 작업을 진행해보도록 하겠다. 추가로 참고해둘것이 있다.&lt;br /&gt;
&lt;br /&gt;
* virtual alias 계열은 내 서버내에서 alias 를 처리할때 쓰인다.&lt;br /&gt;
* virtual mailbox 계열은 내 서버내에서 virtual mailbox 의 메일을 처리할때 쓰인다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
차이점이 좀 미묘하지만.. 굳이 alias 를 사용하지 않을거라면 virtual_alias_* 는 사용하지 않아도 좋다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_alias_domains=====&lt;br /&gt;
&lt;br /&gt;
main.cf 에 다음과같은 내용을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_alias_domains = hash:/etc/postfix/mapdatas/virtualaliasdomains&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/mapdatas/virtualaliasdomains 파일의 내용에 다음을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail.aaa.com         20131112&lt;br /&gt;
aaa.com              20131112&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 실행해서 만든 파일의 hash db 파일을 생성해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_alias_maps=====&lt;br /&gt;
&lt;br /&gt;
위에서 이미 한번 언급했다시피 virtual mailbox 는 aaa@zzz.com 과 aaa@kkk.com 이 물리적으로 같은서버라고 하더라도 같은 계정으로 취급하지 않는다. 이 경우에 alias 를 사용해야 한다.&lt;br /&gt;
&lt;br /&gt;
main.cf 에 다음과같은 내용을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_alias_maps = hash:/etc/postfix/mapdatas/virtualaliasmaps&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/mapdatas/virtualaliasmaps 파일의 내용에 다음을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
aaa@zzz.com     aaa@kkk.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 실행해서 만든 파일의 hash db 파일을 생성해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 alias 를 별도로 사용하지 않을거라면 상관없다. 자세한 내용은 /etc/mail/aliases 관련된 내용을 검색해서 참고할것.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_mailbox_domains=====&lt;br /&gt;
&lt;br /&gt;
이제 virtual mailbox 를 사용하는 domain 을 세팅할 차례다.&lt;br /&gt;
&lt;br /&gt;
main.cf 에 다음과같은 내용을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = hash:/etc/postfix/mapdatas/virtualmailboxdomains&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/mapdatas/virtualmailboxdomains 파일의 내용에 다음을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
aaa.com     OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 실행해서 만든 파일의 hash db 파일을 생성해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_mailbox_maps=====&lt;br /&gt;
&lt;br /&gt;
이제 virtual mailbox 를 사용하는 계정(email account)에 대한 내용을 세팅해줄 차례다&lt;br /&gt;
&lt;br /&gt;
main.cf 에 다음과같은 내용을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_maps = hash:/etc/postfix/mapdatas/virtualmailboxmaps&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/mapdatas/virtualmailboxmaps 파일의 내용에 다음을 넣는다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
bbb@aaa.com     aaa.com/bbb/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 주의할점이 있다. '''aaa.com/bbb''' 가 되는경우는 bbb 라는 파일 자체가 수신한 email 파일이 되어버린다. 하지만 '''aaa.com/bbb/''' 라고 정의하면 그 아래쪽에 Maildir 형식으로 디렉토리등을 생성하고 파일을 넣는다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postmap 을 실행해서 만든 파일의 hash db 파일을 생성해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual_mailbox_base=====&lt;br /&gt;
&lt;br /&gt;
이제 virtual mailbox 의 파일들이 위치할 기본 디렉토리를 설정해줄 차례다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_base = /home/virtualmailbox&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 owner 를 변경해주어야 이후 메일폴더를 postfix 에서 생성할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
chown -R postfix.postfix /home/virtualmailbox&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====virtual mailbox 를 위한 uid, gid 등의 설정=====&lt;br /&gt;
&lt;br /&gt;
virtual mailbox 가 어떤 권한으로 유지되는지에 대한 설정이 필요하다. 왜냐하면 실제로 파일이 생성되기 때문이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래와같이 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_minimum_uid = 100&lt;br /&gt;
virtual_uid_maps = static:207&lt;br /&gt;
virtual_gid_maps = static:207&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 207 은 필자 머신의 postfix 의 uid 및 gid 되시겠다.&lt;br /&gt;
&lt;br /&gt;
어차피 나중에 postfix 와 dovecot 을 연동할때 dovecot 의 daemon 을 postfix owner 로 실행할거라 이렇게 하는게 속편할거라 생각한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====설정파일 점검 및 테스트=====&lt;br /&gt;
&lt;br /&gt;
위에서 살펴본 부분중 virtual mailbox 를 직접적으로 사용하기 위한 main.cf 내의 최소 내용은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = hash:/etc/postfix/mapdatas/virtualmailboxdomains&lt;br /&gt;
virtual_mailbox_maps = hash:/etc/postfix/mapdatas/virtualmailboxmaps&lt;br /&gt;
virtual_mailbox_base = /home/virtualmailbox&lt;br /&gt;
virtual_minimum_uid = 100&lt;br /&gt;
virtual_uid_maps = static:207&lt;br /&gt;
virtual_gid_maps = static:207&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기에 몇가지 추가사항이 더 붙어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$recipient_delimiter = '-';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위에서 설정한대로의 디렉토리를 생성해준다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mkdir /home/virtualmailbox/aaa.com/bbb/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 만들어진 directory 의 owner 를 postfix 변경해주는것을 잊지 말자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
외부에서 당신이 생성한 virtual mailbox 의 account 안쪽으로 email 이 들어오면 virtual mailbox 의 작업까지는 성공했다고 봐도 무방하다. 성공한경우에는 mail log 부분에 아래와같은게 표시된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Nov 12 17:37:48 [postfix/virtual] 3dJj5806Lwz9Kw6bY: to=&amp;lt;수신이메일주소&amp;gt;, relay=virtual, delay=1, delays=0.98/0/0/0.03, dsn=2.0.0, status=sent (delivered to maildir)&lt;br /&gt;
Nov 12 17:37:48 [postfix/qmgr] 3dJj5806Lwz9Kw6bY: removed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이로서 virtual mailbox 에 대한 hash 를 이용한 기본 테스트는 끝났다.&lt;br /&gt;
&lt;br /&gt;
이제부터는 dovecot 과 인증정보 연동을 위한 postfix 의 setting values 를 알아보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===postfix 와 dovecot 의 연동을 위한 설정 살펴보기===&lt;br /&gt;
&lt;br /&gt;
일단 http://rob0.nodns4.us/ 에서 제공되는 설정파일의 내용을 살펴보기로 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
submission_rcpt_restrictions = permit_sasl_authenticated,&lt;br /&gt;
	permit_mynetworks, reject&lt;br /&gt;
smtpd_sasl_path = private/auth&lt;br /&gt;
smtpd_sasl_type = dovecot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 내용에서 RCPT 는 메일서버를 통해 메일을 받는다는것에 대한 정보를 의미한다.(아마도 receipt 의 약어라고 생각되지만) 기본적으로 postfix 나 dovecot 이나 원래는 system 상에서 제공되는 pam 을 이용한 account auth 를 진행하지만 이 문서에서는 real account 가 아닌 virtual mail account 를 사용할것이기 때문에 pam 을 사용하는것은 의미가 없다.&lt;br /&gt;
&lt;br /&gt;
SASL 이란 Simple Authentication and Security Layer 의 약어로서 주로 메일 서버의 인증에 사용된다. postfix 도 마찬가지로 email 을 '''보내려는 사용자''' 에 대한 인증방법으로 sasl 을 사용할 수 있다. 위의 설정내용을 보면 알겠지만 sasl 의 type 으로 dovecot 을 지원하고 있다. 사용자에게서 인증요청이 postfix 를 대상으로 들어가면 postfix 는 dovecot 에게 요청해서 email account 인증을 지원한다는 의미가 된다. 고로 이건 mail receive 가 아니라 mail send(SMTP) 에 대한 설정이 되겠다 위와 같은 설정 하나만으로 postfix 를 이용한 SMTP 인증은 손쉽게 처리할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기까지의 작업만으로도, 당신은 postfix 를 이용해서 email 을 외부에서 수신하고 dovecot 을 이용한 연동을 하기위한 기본지식을 익힐 수가 있었다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===postfix 와의 연동을 위한 dovecot 의 설정 살펴보기===&lt;br /&gt;
&lt;br /&gt;
dovecot 은 1.x 에서 2.x 로 버전이 올라오면서 기본적인 설정파일의 틀이 많이 바뀐듯 하다. 여기서는 dovecot 2.x 를 기준으로 설명하기도 한다. 1.x 에 대한 내용이 필요하다면.............. 인터넷에서 재주껏 찾아보기 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dovecot 의 설정에 필요한 기본 파일 구성은 다음과같다.&lt;br /&gt;
&lt;br /&gt;
* /etc/dovecot/dovecot.conf &amp;gt;&amp;gt; 기본 설정파일&lt;br /&gt;
* /etc/dovecot/sql-deny.conf.ext &amp;gt;&amp;gt; dovecot 에서 deny=yes 로 세팅되어있는경우 사용되는 query 파일&lt;br /&gt;
* /etc/dovecot/dovecot-sql.conf.ext &amp;gt;&amp;gt; sql 인증을 위한 데이터 베이스 정보가 있는 파일&lt;br /&gt;
* /etc/dovecot/conf.d/10-auth.conf &amp;gt;&amp;gt; dovecot 을 통한 인증을 설정해주는 파일&lt;br /&gt;
* /etc/dovecot/conf.d/auth-sql.conf.ext &amp;gt;&amp;gt; sql 을 통한 인증에 대한 세팅정보를 담고있다. 10-auth.conf 에서 사용된다.&lt;br /&gt;
* /etc/dovecot/conf.d/auth-deny.conf.ext &amp;gt;&amp;gt; 10-auth.conf 에 include 되는 파일로서 사용자의 deny access 를 설정하는데 사용된다.&lt;br /&gt;
* /etc/dovecot/conf.d/10-logging.conf &amp;gt;&amp;gt; dovecot 에 대한 디버깅 세팅정보를 담고있다.&lt;br /&gt;
* /etc/dovecot/conf.d/10-mail.conf &amp;gt;&amp;gt; dovecot 에서 접근하게될 Maildir 에 대한 세팅정보를 가지고 있다.&lt;br /&gt;
* /etc/dovecot/conf.d/10-master.conf &amp;gt;&amp;gt; pop3, imap, postfix 에 대한 인증정보등을 세팅한다.&lt;br /&gt;
* /etc/dovecot/conf.d/10-ssl.conf &amp;gt;&amp;gt; ssl 인증서를 세팅하는 경우에 사용하면 된다.&lt;br /&gt;
* /etc/dovecot/conf.d/20-imap.conf &amp;gt;&amp;gt; dovecot 에서 서비스하게될 imap 에 대한 세팅정보가 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 문서에서는 imap 만을 세팅하는것을 대상으로 하며 필요한 파일에 대한 수정부분만 별도로 언급하기로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====10-auth.conf====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
!include auth-deny.conf.ext&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위부분의 주석을 해제한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''auth_mechanisms''' 부분에 '''cram-md5''' 를 추가해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====auth-deny.conf.ext====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
passdb {&lt;br /&gt;
  driver = passwd-file&lt;br /&gt;
  deny = yes&lt;br /&gt;
&lt;br /&gt;
  # File contains a list of usernames, one per line&lt;br /&gt;
  args = /etc/dovecot/deny-users&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위 부분을 추석처리한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
passdb {&lt;br /&gt;
  driver = sql&lt;br /&gt;
  deny = yes&lt;br /&gt;
&lt;br /&gt;
  args = /etc/dovecot/conf.d/sql-deny.conf.ext&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sql 과 관련된 부분을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====sql-deny.conf.ext====&lt;br /&gt;
&lt;br /&gt;
새로 파일을 만들고 아래의 내용을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
driver = sqlite&lt;br /&gt;
&lt;br /&gt;
connect = /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&lt;br /&gt;
### deny password_query&lt;br /&gt;
# The &amp;quot;deny=yes&amp;quot; passdb needs to handle either a &amp;quot;user@domain&amp;quot; or a&lt;br /&gt;
# plain &amp;quot;user&amp;quot; credential. In the former case, we look up the domain;&lt;br /&gt;
# latter case we use the special null domain, Domain.id=0. A simple glob&lt;br /&gt;
# expression to detect the &amp;quot;@&amp;quot; sign tells us which case we are in.&lt;br /&gt;
&lt;br /&gt;
password_query = SELECT '%u' FROM Address AS A1 \&lt;br /&gt;
        JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
        WHERE A1.localpart IS '%n' \&lt;br /&gt;
        AND (CASE WHEN '%u' GLOB '*@*' THEN \&lt;br /&gt;
                D1.name IS '%d' ELSE \&lt;br /&gt;
                D1.id=0 END) \&lt;br /&gt;
        AND A1.active=-1&lt;br /&gt;
&lt;br /&gt;
# This is the third state of the tristate Address.active column.&lt;br /&gt;
&lt;br /&gt;
# BUG: an &amp;quot;@&amp;quot; sign is permissible in an address localpart. This query&lt;br /&gt;
# works fine with SQL (virtual) users, because they have another &amp;quot;@&amp;quot; in&lt;br /&gt;
# their username anyway. But if your OS supports &amp;quot;@&amp;quot; in the username,&lt;br /&gt;
# this will break -- and you get to keep both pieces! I would not use&lt;br /&gt;
# &amp;quot;@&amp;quot; in system usernames, so I don't intend to fix this. :)&lt;br /&gt;
&lt;br /&gt;
# end of sql-deny.conf.ext&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====dovecot-sql.conf.ext====&lt;br /&gt;
&lt;br /&gt;
아래의 내용을 참고해서 파일을 편집한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
driver = sqlite&lt;br /&gt;
connect = /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
default_pass_scheme = MD5&lt;br /&gt;
&lt;br /&gt;
password_query = SELECT '%u' AS user, V1.password, \&lt;br /&gt;
	coalesce(V1.uid, D1.class) AS userdb_uid, \&lt;br /&gt;
	coalesce(V1.gid, 800) AS userdb_gid, \&lt;br /&gt;
	'/home/virtualmailbox/' || coalesce(V1.home, 'vmail/%d/%n') AS userdb_home \&lt;br /&gt;
	FROM VMailbox AS V1 \&lt;br /&gt;
	JOIN Address AS A1 ON (V1.id=A1.id) \&lt;br /&gt;
	JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
	WHERE A1.localpart IS '%n' \&lt;br /&gt;
	AND D1.name IS '%d' \&lt;br /&gt;
	AND V1.active!=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
user_query = SELECT coalesce(V1.uid, D1.class) AS uid, \&lt;br /&gt;
	coalesce(V1.gid, 800) AS gid, \&lt;br /&gt;
	'/home/virtualmailbox/' || coalesce(V1.home, 'vmail/%d/%n') AS home \&lt;br /&gt;
	FROM VMailbox AS V1 \&lt;br /&gt;
	JOIN Address AS A1 ON (v1.id=A1.id) \&lt;br /&gt;
	JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
	WHERE A1.localpart IS '%n' \&lt;br /&gt;
	AND D1.name IS '%d' \&lt;br /&gt;
	AND V1.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
윗부분에서 ''''/home/virtualmailbox/'''' 부분을 주의하도록 한다. postfix 에서 설정한 '''virtual_mailbox_base''' 와 같은 경로를 세팅해야 한다는것에 주의한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====10-mail.conf====&lt;br /&gt;
&lt;br /&gt;
아래의 내용을 참고해서 파일을 편집한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mail_location = maildir:~/Mail&lt;br /&gt;
&lt;br /&gt;
first_valid_uid = 207&lt;br /&gt;
last_valid_uid = 65535&lt;br /&gt;
&lt;br /&gt;
first_valid_gid = 100&lt;br /&gt;
last_valid_gid = 65535&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
원문과는 다르게 '''first_valid_uid''' 는 207 로 설정하였다. 왜냐하면 postfix 의 uid 를 사용하기 때문이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====10-master.conf====&lt;br /&gt;
&lt;br /&gt;
아래의 내용을 참고해서 파일을 편집한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
unix_listener /var/spool/postfix/private/auth {&lt;br /&gt;
  mode = 0666&lt;br /&gt;
  user = postfix&lt;br /&gt;
  group = postfix&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Auth process is run as this user.&lt;br /&gt;
user = root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====15-mailboxes.conf====&lt;br /&gt;
&lt;br /&gt;
중간쯤에 아래와 같은 부분을 추가해준다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
inbox = yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===dovecot 에서 사용하는 sql 살펴보기===&lt;br /&gt;
&lt;br /&gt;
dovecot 에서의 sql 을 분석하기위해서는 wiki 페이지를 참고하는것이 좋다.&lt;br /&gt;
&lt;br /&gt;
wiki 페이지를 참고할때 주의할점이 있다. dovecot 은 version 1 과 version 2 가 wiki 가 따로 나뉘어있다. 이 문서에서는 dovecot 2.x 를 기준으로 한다.&lt;br /&gt;
&lt;br /&gt;
* http://wiki2.dovecot.org/AuthDatabase/SQL&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
문서를 기준으로 다루는 쿼리의 인수에 대한 설명을 간단히 해보도록 하자. id 는 '''aaa@bbb.com''' 으로 기준해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
* %u :: 사용자 id 전체를 의미한다. - '''aaa@bbb.com'''&lt;br /&gt;
* %n :: 사용자의 id 를 의미한다. - '''aaa'''&lt;br /&gt;
* %d :: 사용자 id 중 domain 부분을 의미한다. - '''bbb.com'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====sql-deny.conf.ext 에서 사용하는 쿼리====&lt;br /&gt;
&lt;br /&gt;
이제 사용되는 쿼리를 알아보자. 이 쿼리의 경우는 active 값을 -1 로 세팅해서 사용 불가능하게 만든 계정에 대한 정보를 return 받는 작업을 진행한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
password_query = SELECT '%u' FROM Address AS A1 \&lt;br /&gt;
        JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
        WHERE A1.localpart IS '%n' \&lt;br /&gt;
        AND (CASE WHEN '%u' GLOB '*@*' THEN \&lt;br /&gt;
                D1.name IS '%d' ELSE \&lt;br /&gt;
                D1.id=0 END) \&lt;br /&gt;
        AND A1.active=-1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오호.... 어차피 데이터베이스 테이블은 postfix 의 테이블을 같이 사용하기 때문에 postfix 의 테이블을 기준으로 알아보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
인수로 주어진 것들을 기준으로 쿼리를 분석해 보면 다음과같다.&lt;br /&gt;
&lt;br /&gt;
* address 테이블의 domain 필드와 Domain 의 id 필드의 값이 같은 데이터를 대상으로&lt;br /&gt;
* Address 의 localpart 필드와 사용자 id(%n) 이 같으며&lt;br /&gt;
* %u(email account) 안에 '''@''' 문자가 있는지를 확인해서&lt;br /&gt;
** @ 문자가 있다면 domain 테이블의 name 필드에 domain 이 있는지를 확인하고&lt;br /&gt;
** @ 문자가 없다면 domain 테이블의 id 가 0 인 데이터를 확인하며&lt;br /&gt;
* Address 의 active 값이 -1 인경우를 확인해서&lt;br /&gt;
* 데이터가 있다면 email account id 를 그대로 반환한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 주의할점은 '''case when''' 에서 사용된 '''GLOB''' 이라는 연산자다. GLOB 이라는 연산자는 wildcard 를 사용해서 문자열 비교를 하는 유용한 함수다. LIKE 의 경우는 '%' 문자를 사용한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 사용자의 id 를 입력받아 id 안에 domain 이 있는지를 확인하고 id 안에 domain 이 있다면 관련된값을, domain 이 없다면 domain 테이블의 id 값이 0 이며 active 가 -1 인 계정이 있는지를 찾아서 있으면 반환한다. 결과적으로 Address 테이블에서 비활성화된 계정을 찾아서 입력받은 사용자가 비활성화 계정인지를 확인해주는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====dovecot-sql.conf.ext 에서 사용되는 쿼리====&lt;br /&gt;
&lt;br /&gt;
이 파일 내에서는 두개의 쿼리가 사용된다 쿼리별로 살펴보기로 하겠다. 원래 문서에는 password_query 다음에 user_query 가 명시되어있다. 왜냐하면 일단 password 인증을 하고나서 사용자 정보를 받아오는 순서가 되어야 하기 때문에 순서상으로는 그리 명시되어있다. 파일에서 명시한 순서대로 설명한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====password_query=====&lt;br /&gt;
&lt;br /&gt;
관련된 쿼리는 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
password_query = SELECT '%u' AS user, V1.password, \&lt;br /&gt;
	coalesce(V1.uid, D1.class) AS userdb_uid, \&lt;br /&gt;
	coalesce(V1.gid, 800) AS userdb_gid, \&lt;br /&gt;
	'/home/' || coalesce(V1.home, 'vmail/%d/%n') AS userdb_home \&lt;br /&gt;
	FROM VMailbox AS V1 \&lt;br /&gt;
	JOIN Address AS A1 ON (V1.id=A1.id) \&lt;br /&gt;
	JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
	WHERE A1.localpart IS '%n' \&lt;br /&gt;
	AND D1.name IS '%d' \&lt;br /&gt;
	AND V1.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이번에는 내용이 좀 길지만 실제 내용은 별거없다. 이번에는 간단하게 반환값, 관련테이블(join), 검색조건 등으로 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 반환값&lt;br /&gt;
** user 반환&lt;br /&gt;
*** 입력받은 email account id 를 그대로 user 로 반환한다.&lt;br /&gt;
** password 반환&lt;br /&gt;
*** Address.password 값을 반환한다.&lt;br /&gt;
** userdb_uid 반환&lt;br /&gt;
*** VMailbox.uid 값이 존재하면 그걸 userdb_uid 로 반환.&lt;br /&gt;
*** VMailbox.uid 값이 없다면 domain.class 를 userdb_uid 로 반환.&lt;br /&gt;
** userdb_gid 반환&lt;br /&gt;
*** VMailbox.gid 값이 존재하면 그걸 userdb_gid 로 반환.&lt;br /&gt;
*** VMailbox.gid 값이 없다면 800 이라는 값을 userdb_gid 로 반환.&lt;br /&gt;
** userdb_home 반환&lt;br /&gt;
*** VMailbox.home 값이 있다면 '/home/' + VMailbox.home 의 값을 userdb_home 으로 반환&lt;br /&gt;
*** VMailbox.home 값이 있다면 'vmail/%d/%n' + VMailbox.home 의 값을 userdb_home 으로 반환&lt;br /&gt;
* table join&lt;br /&gt;
** VMailbox.id 와 Address.id 가 일치하는 데이터와&lt;br /&gt;
** Address.domain 과 Domain.id 가 일치하는 데이터의&lt;br /&gt;
** VMailbox 테이블의 자료&lt;br /&gt;
* 검색조건&lt;br /&gt;
** Address.localpart 와 %n(id) 의 비교&lt;br /&gt;
** Domain.name 이 같아야함&lt;br /&gt;
** Address.active 값이 0 이 아니어야함&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서는 userid,password,uid,gid,virtual mailbox 경로값 등 5개값을 반환하는것을 확인할 수 있다. 다만 위에서 설명한 '''sql-deny.conf.ext 에서 사용되는 쿼리''' 부분의 조건을 감안한다면 사용제한된 사용자는 한번 걸러지기 때문에 실제 사용하는 계정을 대상으로 검색조건이 이루어진다고 판단하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 일치하는 사용자를 찾아서 그에 해당하는 password 값을 포함한 다른값들을 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====user_query=====&lt;br /&gt;
&lt;br /&gt;
관련된 쿼리는 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
user_query = SELECT coalesce(V1.uid, D1.class) AS uid, \&lt;br /&gt;
	coalesce(V1.gid, 800) AS gid, \&lt;br /&gt;
	'/home/' || coalesce(V1.home, 'vmail/%d/%n') AS home \&lt;br /&gt;
	FROM VMailbox AS V1 \&lt;br /&gt;
	JOIN Address AS A1 ON (v1.id=A1.id) \&lt;br /&gt;
	JOIN Domain AS D1 ON (A1.domain=D1.id) \&lt;br /&gt;
	WHERE A1.localpart IS '%n' \&lt;br /&gt;
	AND D1.name IS '%d' \&lt;br /&gt;
	AND V1.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 password_query 부분과 마찬가지로 반환값, 관련테이블(join), 검색조건 등으로 분석해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
* 반환값&lt;br /&gt;
** uid 반환&lt;br /&gt;
*** VMailbox.uid 값이 존재하면 그걸 uid 로 반환.&lt;br /&gt;
*** VMailbox.uid 값이 없다면 domain.class 를 uid 로 반환.&lt;br /&gt;
** gid 반환&lt;br /&gt;
*** VMailbox.gid 값이 존재하면 그걸 gid 로 반환.&lt;br /&gt;
*** VMailbox.gid 값이 없다면 800 이라는 값을 gid 로 반환.&lt;br /&gt;
** '''/home/''' 관련된 반환&lt;br /&gt;
*** VMailbox.home 값이 있다면 '/home/' + VMailbox.home 의 값을 home 으로 반환&lt;br /&gt;
*** VMailbox.home 값이 있다면 'vmail/%d/%n' + VMailbox.home 의 값을 home 으로 반환&lt;br /&gt;
* table join&lt;br /&gt;
** VMailbox.id 와 Address.id 가 일치하는 데이터와&lt;br /&gt;
** Address.domain 과 Domain.id 가 일치하는 데이터의&lt;br /&gt;
** VMailbox 테이블의 자료&lt;br /&gt;
* 검색조건&lt;br /&gt;
** Address.localpart 와 %n(id) 의 비교&lt;br /&gt;
** Domain.name 이 같아야함&lt;br /&gt;
** Address.active 값이 0 이 아니어야함&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 결과로 봤을때 Address 테이블의 active 값이 0 이 아닌 사용자 계정의 데이터는 모두 검색 대상이 된다는걸 알 수 있다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리는 id 와 domain 값이 같은 활성화된 사용자를 검색해서 일치하는 사용자의 uid, gid, virtual mailbox 의 경로값을 반환하는 쿼리가 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===sqlite 에 데이터는 어떻게 넣어야 하나요?===&lt;br /&gt;
&lt;br /&gt;
지금부터는 sqlite 테이블에 데이터를 넣어서 vmailbox 의 값들을 이전처럼 hash 가 아닌 sqlite 에서 얻어오게 세팅함으로서 postfix 와 dovecot 의 연동을 위한 기초준비를 해보도록 하겠다. 일단 '''postfix 와 query 파일에서 사용하게될 sqlite 의 데이터베이스 schema''' 부분에서 설명한 테이블 구조를 기준으로 중요한 필드들에 대해 어떤값이 사용되어야 하는가를 알아보고 사용하게될 예제 데이터를 어떻게 넣어야 하는지를 살펴보도록 하자.&lt;br /&gt;
&lt;br /&gt;
여기서는 모든 테이블의 값에 대해 언급하지는 않는다. 최소로 필요한 부분에 대해서만 조사하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====데이터베이스 테이블에 대한 필드 값의 의미====&lt;br /&gt;
&lt;br /&gt;
=====Address 테이블=====&lt;br /&gt;
&lt;br /&gt;
id :: 일반적으로 sql 에서 사용하는 seq 값의 의미다. Address 의 id 가 다른 테이블에서 큰 의미를 차지하는 경우는 없다.&lt;br /&gt;
&lt;br /&gt;
localpart :: email account id 를 ''aaa@bbb.com''' 이라고 했을때 aaa 부분에 해당된다&lt;br /&gt;
&lt;br /&gt;
domain :: email account id 를 ''aaa@bbb.com''' 이라고 했을때 bbb.com 부분에 해당된다. 다만 직접적으로 domain 이 들어가는것이 아니라 bbb.com 이라는 domain 은 이후에 언급할 domain 테이블에 들어가있게되며 이 값은 domain 테이블의 id 필드에 대해서 forign key 가 되므로 domain.id 의 값중에 하나가 되어야 한다. 모든 virtual mailbox 계정은 domain 값을 가지게 된다.&lt;br /&gt;
&lt;br /&gt;
active :: 계정의 활성화 상태를 나타낸다. 0 이면 미사용, -1 이면 block, 0 이상이면 사용가능으로 분류된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Domain 테이블=====&lt;br /&gt;
&lt;br /&gt;
id :: 다른테이블에서 forign key 로 사용된다.&lt;br /&gt;
&lt;br /&gt;
active :: domain 의 활성화 상태를 나타낸다. 0 이면 미사용, 0 이상이면 사용가능으로 분류한다.&lt;br /&gt;
&lt;br /&gt;
class :: 기본값은 0 이기는 한데..... virtual mailbox 에 사용되는 domain 들은 '''800''' 이상의 값을 가져야 한다. 고로 virtual mailbox 용 domain 은 801 부터의 값을 가지면 된다. 1 은 postfix 으 mydestination 에서, 2 는 relay_domains 에서 사용된다.&amp;lt;ref name=&amp;quot;domain.class 관련설명&amp;quot;&amp;gt;virtual mailbox 에 대한 부분은 dom-vmbox.query 설명 부분을 참고하도록 한다. local domain 에 대한 부분은 dom-local.query 부분을 참고한다.&amp;lt;/ref&amp;gt; &lt;br /&gt;
&lt;br /&gt;
name :: domain 의 이름이다. 실제 비교시에는 이 필드를 주로 참고하게 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Domain 테이블은 address 테이블에서 domain 에 대한 정보로 참조되기위해 존재한다. 참조의 기준은 id 필드의 값이 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====VMailbox 테이블=====&lt;br /&gt;
&lt;br /&gt;
id :: Account 테이블의 id 값과 같아야 한다. virtual mailbox 용으로 사용되기 위한 email account 는 Address.id 와 같은값의 VMailbox.id 데이터를 가지고 있어야 한다.&lt;br /&gt;
&lt;br /&gt;
active :: virtual mailbox 의 활성화 상태를 나타낸다. 0 이면 미사용, 0 이상이면 사용가능으로 분류한다.&lt;br /&gt;
&lt;br /&gt;
uid :: virtual mailbox 는 실제 unix 서버상의 폴더에 접근해야 하기때문에 uid 를 취급하게된다. postfix 에서는 Mailbox 형식에 맞춰 배달만 해주면 되기때문에 별로 까다로운 취급을 하지 않지만 dovecot 에서는 메일폴더에서 파일을 read/write 해야하기때문에 조금 더 관련이 깊다. dovecot 에서는 이 값이 지정되어있지 않은 경우에는 Domain 테이블의 class 값을 이 값으로 대체해서 사용한다. virtual mailbox 로 사용하기 원하는 account 라면 postfix 의 uid 와 통일시킬것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
gid :: 위의 uid 와 마찬가지 이유때문에 존재한다. dovecot 에서는 이 값이 지정되어있지 않는 경우 800 이라는 값을 강제로 사용한다. 이렇게하면 gid 값을 세팅하지 않은 email account 는 모두 800 이라는 그룹에 소속되게된다. 역시 가능하다면 postfix 의 gid 값을 사용해주는것이 좋겠다.&lt;br /&gt;
&lt;br /&gt;
home :: virtual mailbox 에서 수신되는 메일들이 놓일 경로를 의미한다. 이 문서는 위&amp;lt;ref name=&amp;quot;virtual_mailbox_maps 에 대한 테스트데이터&amp;quot;&amp;gt;virtual_mailbox_maps 부분을 참고한다.&amp;lt;/ref&amp;gt;에서 이미 postfix 의 기본 동작 테스트를 위해 이 값을 세팅한적이 있다. 위에서는 '''aaa.com/bbb/''' 라고 세팅한값이 이에 해당된다. 이 값은 virtual_mailbox_base 값과 같이 결합되어 반응한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
password :: 이 부분은 굳이 가자면 설명이 복잡해진다&amp;lt;ref name=&amp;quot;Authentication Mechanisms dovecot 2&amp;quot;&amp;gt;http://wiki2.dovecot.org/Authentication/PasswordSchemes 주소를 참고한다&amp;lt;/ref&amp;gt;. 일단 간편하게 가기위해서 이 문서는 '''{PLAIN}''' 으로 사용하는것을 기준으로 설명하도록 하겠다. 실제 지금까지 세팅한 dovecot 의 내용도 이 값을 기준으로 설명하고 있다. email account 의 비밀번호를 '''kkk''' 로 하고싶다면 이 필드의 값을 '''{PLAIN}kkk''' 로 세팅해주면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====테스트를 위한 sql 값의 세팅====&lt;br /&gt;
&lt;br /&gt;
이제 virtual mailbox 를 위한 sql 값을 세팅해보도록 한다. 세팅을 위한 기본 전제조건을 미리 정해놓고 세팅을 하는것이 좋다. 이제부터 전제조건의 예를 들어보자&lt;br /&gt;
&lt;br /&gt;
# aaa 라는 id 를 사용한다.&lt;br /&gt;
# bbb.com 이라는 domain 을 사용한다.&lt;br /&gt;
# kkk 라는 비밀번호를 사용한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 조건에 몇가지 더 추가조건을 다시 생각해보자. 물론 이 문서의 윗부분에서 다뤘던 내용을 다시한번 간단하게 정리하는것뿐이지 기억이 잘 나지 않는다면 위의 내용을 살펴보도록 하자.&lt;br /&gt;
&lt;br /&gt;
# virtual mailbox 로 사용할 domain 은 bbb.com 으로 정한다.&lt;br /&gt;
# virtual_mailbox_base 의 값은 /home/virtualmailbox 으로 정한다.&lt;br /&gt;
# virtual mailbox email account 의 실제 하드디스크상 위치는 '''/home/virtualmailbox/bbb.com/aaa''' 가 되는것으로 한다.&lt;br /&gt;
#* virtual mailbox 의 형식은 Maildir 이 된다.&lt;br /&gt;
#* 위에서 살펴본 query 파일중 '''maps-vmbox.query''' 파일을 기억하는가? 거기에는 '''result_format''' 이라는 항목이 있다.&lt;br /&gt;
#* 결과적으로 aaa@bbb.com 사용자의 email 배달 주소는 '''/home/virtualmailbox/bbb.com/aaa/Mail''' 이 된다. 참고하도록 하자&lt;br /&gt;
# system 에서 사용하는 postfix 의 uid 와 gid 는 207 로 정한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 두 종류의 조건을 가지고 실제 테스트에 사용할 sql 을 만들면 다음과 같은 결과가 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO &amp;quot;Domain&amp;quot; (id, name, active, class) VALUES (1,'bbb.com',1,801);&lt;br /&gt;
INSERT INTO &amp;quot;Address&amp;quot; (id, localpart, domain, active) VALUES (1, 'aaa', 1, 1);&lt;br /&gt;
INSERT INTO &amp;quot;VMailbox&amp;quot; (id, active, password, home, uid, gid) VALUES (&lt;br /&gt;
    (SELECT id FROM &amp;quot;Address&amp;quot; WHERE localpart IS 'aaa' AND domain=1),&lt;br /&gt;
    1,'{CRAM-MD5}445ee34964404bdba3d7d7fd1187839811699c8be7b71596f934141f721864d2','bbb.com/aaa',207,207);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 주의할 부분이 있다. ssl/tls 를 사용하지 않는경우 대부분의 imap 을 지원하는 email client 또는 서버는 PLANE 방식의 비밀번호를 지원하지 않는다. 때문에 '''doveadm''' 이라는 프로그램을 사용해서 비밀번호를 넣어주어야 한다. 간단한 예제를 들어보자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
localhost # doveadm pw -pkkk -s CRAM-MD5 -u aaa@bbb.com&lt;br /&gt;
{CRAM-MD5}445ee34964404bdba3d7d7fd1187839811699c8be7b71596f934141f721864d2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
형식은 그리 어렵지 않을거라 생각한다. dovocot 2 wiki 를 참고하기 바란다.&amp;lt;ref name=&amp;quot;dovecot 비밀번호 생성방법&amp;quot;&amp;gt;http://wiki2.dovecot.org/Tools/Doveadm/Pw 주소를 참고한다. 사용 가능한 비밀번호 암호화 방식의 종류는 http://wiki2.dovecot.org/Authentication/PasswordSchemes 주소를 참고한다.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 내용을 sqlite 데이터베이스에 넣는다. 데이터베이스의 위치는 이미 몇번을 설명했듯이 아래와 같은 위치가 되겠다.&lt;br /&gt;
&lt;br /&gt;
* /var/lib/postfix/postfix_database.sqlite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''sqlite 데이터베이스 파일의 위치를 postfix 의 각 쿼리파일 상단에 세팅해주는것을 잊지 말길 바란다!!!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====세팅된 sql 값에 대한 검증====&lt;br /&gt;
&lt;br /&gt;
지금까지 sqlite 를 사용하기위한 쿼리와 데이터들을 알아봤다. 이미 위에서 설명한 내용을 잠시 복습해보자. virtual mailbox 를 사용하기 위한 postfix 의 최소 설정항목은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
* virtual_mailbox_domains&lt;br /&gt;
* virtual_mailbox_maps&lt;br /&gt;
* virtual_mailbox_base&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
맞다. 위에서 postfix 의 virtual mailbox 테스트를 진행할때 hash 값을 사용했던 값이 대부분이다. 이중에서 virtual_mailbox_base 는 쿼리로 대체할 값이 아니니 무시하도록 한다. 여기서는 virtual_mailbox_domains 와 virtual_mailbox_maps 에 대한 쿼리를 이용해서 입력한 값을 검증해 보기로 한다&amp;lt;ref name=&amp;quot;query 테스트에 대한 참고사항&amp;quot;&amp;gt;물론 relay_domains 와 mydestination 에 대한 테스트도 같이 해주면 좋다&amp;lt;/ref&amp;gt;. 위에서 설명한 query 를 기반으로 테스트용 query 를 만들어보면 다음과같은 내용이 될것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이외에 테이블 설명을 참고로 다음의 항목을 설정해주면 좋다.&lt;br /&gt;
&lt;br /&gt;
* mydestination&lt;br /&gt;
* relay_domains&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====테스트용 dom-vmbox.query=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT Domain.name FROM Domain WHERE Domain.class&amp;gt;800&lt;br /&gt;
	AND Domain.active!=0 AND Domain.name IS 'bbb.com';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 쿼리의 테스트결과는 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
bbb.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====테스트용 maps-vmbox.query=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT coalesce(VM.home, 'vmail/%d/%u')&lt;br /&gt;
	FROM VMailbox AS VM&lt;br /&gt;
	JOIN Address AS A1 ON VM.id=A1.id&lt;br /&gt;
	JOIN Domain AS D1 ON A1.domain=D1.id&lt;br /&gt;
	WHERE A1.localpart || '@' || D1.name IS 'aaa@bbb.com'&lt;br /&gt;
	AND VM.active!=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 쿼리의 테스트결과는 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
bbb.com/aaa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 입력한 데이터가 원하는 작동을 한다는것을 알아냈다. 입력된 데이터도 정상이고 postfix 와 연동하는 쿼리를 수정없이 작동시켜도 이상이 없다는것을 확인했다. 이제 이 결과를 가지고 postfix 에서 sqlite 의 데이터베이스 연동이 정상인지를 확인해보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===마지막단계::순서대로 테스트하기===&lt;br /&gt;
&lt;br /&gt;
====postfix 와 sqlite 의 연동테스트====&lt;br /&gt;
&lt;br /&gt;
이 문서의 앞부분에서 postfix 의 virtual mailbox 연동을 위한 테스트를 했던걸 기억해보자. 일단 이전에 hash 로 세팅했던 값중에서 virtual_mailbox_domains 와 virtual_mailbox_maps 만 query 로 변경해서 적용해보도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
virtual_mailbox_domains = $query/dom-vmbox.query&lt;br /&gt;
virtual_mailbox_maps = $query/maps-vmbox.query&lt;br /&gt;
virtual_uid_maps = $query/maps-vuid.query&lt;br /&gt;
virtual_gid_maps = $query/maps-vgid.query&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 외부에서 email 을 보내보자. 당신이 세팅한 대로 '''/home/virtualmailbox/bbb.com/aaa/Mail''' 이라는 디렉토리 아래쪽에 email 이 제대로 들어오는것을 확인했다면 postfix 와 sqlite 의 연동은 제대로 된것으로 확인해도 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====postfix 와 dovecot 의 인증의 연동====&lt;br /&gt;
&lt;br /&gt;
이제 외부에서 postfix 로 email 이 들어오는것을 확인했으니 smtp 인증 연동을 작업해봐야 한다. 다음의 내용을 postfix 의 main.cf 에 추가해준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
smtpd_sasl_auth_enable = yes&lt;br /&gt;
smtpd_sasl_authenticated_header = yes&lt;br /&gt;
smtpd_sasl_local_domain = $mydomain&lt;br /&gt;
smtpd_sasl_security_options = noanonymous&lt;br /&gt;
smtpd_sasl_path = private/auth&lt;br /&gt;
smtpd_sasl_type = dovecot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postfix 를 재시작한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====dovecot 과 sqlite 의 연동테스트====&lt;br /&gt;
&lt;br /&gt;
dovecot 의 경우에는 애초에 sqlite 와 연동하는것을 목표로 세팅했기 때문에 별도로 테스트를 위해 세팅을 바꿔야 할것은 없다. thunderbird 등의 imap 을 지원하는 email client 를 준비하고 imap 연결을 준비한다. 그리고 postfix 에서 테스트할때 확인했던 메일이 email client 에서 보이는지를 확인한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 email client 프로그램을 이용해서 외부로 email 이 제대로 전송되는지도 확인한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====tip::telnet 으로 imap 을 테스트하자====&lt;br /&gt;
&lt;br /&gt;
dovecot 이 마음대로 되지 않는다고 판단될때.. 일반적인 email client 는 에레메시지를 명확하게 내뱉어주지도 않을뿐더러 별도의 smtp 를 준비하지않으면 smtp 오류인지 어떤 오류인지 테스트하기 좀 귀찮을때가 있다. 그럴때는 telnet 을 통해 다음과같이 간단한 테스트를 진행할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
telnet localhost 143&lt;br /&gt;
&lt;br /&gt;
1 login aaa@bbb.com kkk&lt;br /&gt;
&lt;br /&gt;
2 select INBOX&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 맨 앞부분의 숫자까지 입력을 해줘야하는게 맞다. kkk 는 비밀번호에 해당한다. 다만 위의 방법은 plain password 방식이기때문에 비밀번호는 정상인데 다른 부분이 이상한 경우에 사용하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===결론===&lt;br /&gt;
&lt;br /&gt;
지금까지 이런저런 내용을 세팅해가며 postfix, dovecot, sqlite 의 연동에 대해 알아보았다. 사실 이 외에도 몇가지 신경써야 하는 부분이 아직 더 남아있을 수 있지만 지금까지의 내용만으로 독자가 원하는 email 작업을 하는데는 충분히 문제가 없다. 몇가지 주의점을 언급함으로서 이 문서를 마칠까 한다.&lt;br /&gt;
&lt;br /&gt;
# '''thunderbird''' 를 사용하는경우 암호화 방식을 '''암호화된 패스워드''' 로 사용하는 경우에는 서버에서 반드시 '''CRAM-MD5''' 를 지원해야한다.&lt;br /&gt;
# sqlite database 파일은 반드시 web 등에서 직접적으로 접근이 불가능한곳에 놓아야한다. postfix 로 owner 를 바꿔주는것 역시 잊지 말아야 한다.&lt;br /&gt;
# 서버상에 존재하는 virtual mailbox email directory 는 사실 sql 의 연동까지 다 끝나면 자동으로 생성되니 일일히 디렉토리를 생성해줘야할 필요는 없다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이렇게 세팅을 해서 만들어진 postfix 의 main.cf 파일에 대한 추가부분을 올려둔다. 필요한경우 참고하면 되겠다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#========================================================&lt;br /&gt;
# custom setting values&lt;br /&gt;
#========================================================&lt;br /&gt;
&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
mydomain = bbb.com&lt;br /&gt;
myhostname = mail.bbb.com&lt;br /&gt;
myorigin = $myhostname&lt;br /&gt;
mynetworks = 127.0.0.0/8, 172.16.1.0/24, 192.168.0.0/20&lt;br /&gt;
append_dot_mydomain = no&lt;br /&gt;
enable_long_queue_ids = yes&lt;br /&gt;
home_mailbox = Mail/&lt;br /&gt;
inet_protocols = ipv4&lt;br /&gt;
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain&lt;br /&gt;
#relay_domains = $mydestination&lt;br /&gt;
smtpd_banner = $myhostname ESMTP unknown&lt;br /&gt;
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, permit_inet_interfaces, reject_unauth_destination&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#========================================================&lt;br /&gt;
# custom setting values for dovecot and sqlite&lt;br /&gt;
#========================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mydestination = hash:/etc/postfix/mapdatas/mydestinations&lt;br /&gt;
relay_domains = hash:/etc/postfix/mapdatas/relaydomains&lt;br /&gt;
&lt;br /&gt;
query = sqlite:$config_directory/query&lt;br /&gt;
&lt;br /&gt;
virtual_mailbox_domains = $query/dom-vmbox.query&lt;br /&gt;
virtual_mailbox_maps = $query/maps-vmbox.query&lt;br /&gt;
virtual_uid_maps = $query/maps-vuid.query&lt;br /&gt;
virtual_gid_maps = $query/maps-vgid.query&lt;br /&gt;
virtual_mailbox_base = /home/virtualmailbox&lt;br /&gt;
virtual_minimum_uid = 100&lt;br /&gt;
$recipient_delimiter = '-';&lt;br /&gt;
&lt;br /&gt;
smtpd_sasl_auth_enable = yes&lt;br /&gt;
smtpd_sasl_authenticated_header = yes&lt;br /&gt;
smtpd_sasl_local_domain = $mydomain&lt;br /&gt;
smtpd_sasl_security_options = noanonymous&lt;br /&gt;
smtpd_sasl_path = private/auth&lt;br /&gt;
smtpd_sasl_type = dovecot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
부족한 문서를 읽어주셔서 감사드립니다. 해보니깐 보통이 아니군요. 대략 한달.. 넘게 걸린거같습니다. 문서에 대한 문의사항이 있으시다면 http://gentoo-kr.org 로 부탁드립니다. 감사합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==참고자료==&lt;br /&gt;
&lt;br /&gt;
* SQL 의 case 에 대한 설명 :: http://rtti.tistory.com/8&lt;br /&gt;
* hash 가 아닌 pcre 로 사용하는 경우에 대한 팁 :: http://serverfault.com/questions/133190/host-wildcard-subdomains-using-postfix&lt;br /&gt;
* SASL :: http://linuxism.tistory.com/368&lt;br /&gt;
* postfix 와 sql database 의 정보&lt;br /&gt;
** http://www.postfix.org/sqlite_table.5.html&lt;br /&gt;
** http://www.postfix.org/mysql_table.5.html&lt;br /&gt;
** http://www.postfix.org/pgsql_table.5.html&lt;br /&gt;
* Postfix 표준 설정 예제 :: http://sasuke.tistory.com/27&lt;br /&gt;
* Postfix + Dovecot + MySQL + Postfixadmin 종합세트 :: http://jo.centis1504.net/?p=37&lt;br /&gt;
* email 에서 사용하는 dsn 에 대한 정보&lt;br /&gt;
** http://tools.ietf.org/html/rfc1891&lt;br /&gt;
** http://blog.daum.net/seee50/15859312&lt;br /&gt;
** http://huypm.blogspot.jp/2009/12/postfix-dsn-status-script.html&lt;br /&gt;
** http://moonset.tistory.com/133&lt;br /&gt;
* http://technology.mattrude.com/2009/09/installing-postfix-with-sqlite-support/&lt;br /&gt;
* http://technology.mattrude.com/2009/12/installing-dovecot-using-sqlite/&lt;br /&gt;
* sqlite3 둘러보기 :: http://www.cocoadev.co.kr/212 - [[file:data_appdev_sqlite.docx]]&lt;br /&gt;
* [[file:postfix_dovecot_document.7z]]&lt;br /&gt;
* SQLite 로컬 데이터베이스/김용만 - [[file:sqlite_database.pdf]] &lt;br /&gt;
* postfix/365managed - [[file:365-postfix.pdf]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=1463</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=1463"/>
		<updated>2013-11-30T09:41:15Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 링크추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== from KLDP문서 (정리중) ==&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]] 원문주소 :: http://wiki.kldp.org/wiki.php/OpenAFS-Gentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]] - 원문주소 :: http://wiki.kldp.org/wiki.php/GentooPostfix&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]] - 원문주소 :: http://wiki.kldp.org/wiki.php/PostfixOnGentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL_On_Gentoo|PostgreSQL On Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/PostgreSQLOnGentoo&lt;br /&gt;
&lt;br /&gt;
[[Oracle11g_For_Gentoo|Oracle11g For Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/Oracle11g_For_Gentoo&lt;br /&gt;
&lt;br /&gt;
[[Oracle92_For_Gentoo|Oracle 9.2 For Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/Oracle9.2%20For%20Gentoo&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_IP_bonding|Gentoo Linux 에서의 IP bonding구축]] - 원문주소 :: http://wiki.kldp.org/wiki.php/GentooIPBonding&lt;br /&gt;
&lt;br /&gt;
== 자체 제작 문서==&lt;br /&gt;
&lt;br /&gt;
* [[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_mwlib|Gentoo-MediaWiki에서 사용할 수 있는 Collection Extension에 대한 렌더서버 구축하기]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_mwmath|Gentoo-MediaWiki에서 사용할 수 있는 Math Extension 솔루션 구축]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_Korean_Env|Gentoo Linux 에서 한글 환경 만들기]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_DateTime_HowTo|Gentoo Linux 에서 날짜 시간 올바르게 설정하기]]&lt;br /&gt;
&lt;br /&gt;
* [[Gentoo_postfix_dovecot_sqlite|gentoo에서 postfix + dovecot + sqlite 사용하기]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Gentoo_mwlib&amp;diff=1252</id>
		<title>Gentoo mwlib</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Gentoo_mwlib&amp;diff=1252"/>
		<updated>2013-03-24T12:21:06Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 문구수정&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;MediaWiki에서 사용할 수 있는 Collection Extension에 대한 렌더서버 구축하기&lt;br /&gt;
&lt;br /&gt;
==적용범위 및 목적==&lt;br /&gt;
&lt;br /&gt;
이 문서는 Mediawiki에서 사용할 수 있는 Collection Extension에 대한 렌더서버를 Gentoo Linux 에서 구축하는것을 그 목적으로 한다.&lt;br /&gt;
&lt;br /&gt;
==용어정의==&lt;br /&gt;
&lt;br /&gt;
* Mediawiki :: Wiki System중 하나. php로 만들어져있으며 여러가지 DB Backend를 사용할 수 있다 - http://www.mediawiki.org/wiki/MediaWiki&lt;br /&gt;
* Collection :: Mediawiki의 extension중 하나. wiki페이지들을 모아서 원하는 양식으로 내보내기 할 수 있다 - http://www.mediawiki.org/wiki/Extension:Collection&lt;br /&gt;
* pip :: 파이선 패키지를 내려 받아 설치하는 프로그램. dpkg랑 비슷한 개념으로 보면 되겠다 - http://pypi.python.org/pypi/pip/&lt;br /&gt;
* mwlib :: Mediawiki의 내용을 다른 형식으로 내보내기 위한 도구들 - http://mwlib.readthedocs.org&lt;br /&gt;
&lt;br /&gt;
==기준내용==&lt;br /&gt;
&lt;br /&gt;
===시스템을 구성하기 위한 준비===&lt;br /&gt;
&lt;br /&gt;
일단 mwlib을 사용하기에 앞서 어느경우에 렌더서버를 구축해야하는지 생각해보도록 하자&lt;br /&gt;
&lt;br /&gt;
# pediapress서버와 통신이 느리거나 해서 제대로 파일을 생성할 수 없는경우&lt;br /&gt;
# 내부망에 mediawiki를 설치하는경우 외부의 pediapress 서버와 연결될 수 없는경우&lt;br /&gt;
# mediawiki를 비공개로 설정하여 pediapress 서버에서 대부분의 (또는 모든) 페이지에 대한 접근이 불가능할 경우&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 위의 3가지 경우 모두 다 Collection Extension을 사용하는것을 전제로 한다.&lt;br /&gt;
&lt;br /&gt;
Collection Extension을 Mediawiki에 설치하는 방법은 [http://trans.onionmixer.net/mediawiki/index.php?title=WikiTips::Collection_Extension 여기]를 참고하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
본 문서에서는 이미 서버에 Mediawiki정도는 어느 db가 되었든 세팅하고 문제없이 사용할 수 있는 사람들을 대상으로 설명을 진행하려 한다. 당연히 Collection 은 미리 설치되어있어야하며 사용법은 숙지하고 있어야 한다.&lt;br /&gt;
&lt;br /&gt;
===미리 읽어두면 좋을 내용들===&lt;br /&gt;
&lt;br /&gt;
* mwlib의 설치에 대해서 나와있다. 모두 pip를 사용한 설치를 진행하는것으로 기준이 잡혀있어 gentoo 에서 100% 다 사용할 수는 없지만 관련된 내용은 읽어두면 도움이 된다.&amp;lt;BR&amp;gt; http://mwlib.readthedocs.org/en/latest/installation.html&lt;br /&gt;
* mwlib의 구동방법에 대해 나와있다. 사실 자세히는 몰라도 되며 웬지는 모르겠지만 설치후 저 문서대로 동작하지는 않는다. 다만 띄우는 순서는 메모해놓을 필요가 있음.&amp;lt;BR&amp;gt; http://mwlib.readthedocs.org/en/latest/renderserver.html#mwlib-renderserver&lt;br /&gt;
* mwlib을 세팅한후 Mediawiki의 Collection Extension 을 세팅하는 방법에 대해 나와있다. 읽어두면 도움이 된다.&amp;lt;BR&amp;gt; http://mwlib.readthedocs.org/en/latest/collection.html&lt;br /&gt;
* 아직 테스트는 해보지 않았지만 Collection Extension 에 대한 새 버전의 wiki문서가 있다. 다음을 참고하도록 한다.&amp;lt;BR&amp;gt; http://www.mediawiki.org/wiki/Collection_Extension_2&lt;br /&gt;
&lt;br /&gt;
===pip 설치===&lt;br /&gt;
&lt;br /&gt;
''pip''는 이 글 중간부터 활용하는 파이선 패키지 설치 프로그램이다. 필요하니 반드시 설치해두도록 한다. emerge -s pip 로 검색하면 pip 패키지가 두개 나온다. 이름 충돌 문제가 있으므로&lt;br /&gt;
 # emerge dev-python/pip&lt;br /&gt;
&lt;br /&gt;
===mwlib의 설치===&lt;br /&gt;
&lt;br /&gt;
mwlib은 현재 opensource로서 이 글을 작성하는현재 0.15.3 버전이 나와있다. 물론 이것을 사용할 예정이다.&lt;br /&gt;
&lt;br /&gt;
{{Important|{{Blue|{{Bold|emerge -s mwlib}} }} 명령으로 버전을 반드시 확인하기 바란다.}}&lt;br /&gt;
&lt;br /&gt;
{{Note|tilde(~) 키워드를 사용하는 시스템(예: ~x86, ~amd64 등)에서는 나름 최신 버전을 사용할 수 있다. 하지만 포티지 트리 커미터가 제때 버전 범프를 안할 수가 있으므로 계속 진행하는 다음 설명을 따르는 것이 좋겠다}}&lt;br /&gt;
&lt;br /&gt;
다만 gentoo에서는 gentoo만의 방법이 있는법. emerge mwlib으로 설치하면 잘 될거같지만.............. 버전이 틀리므로 안된다.&lt;br /&gt;
&lt;br /&gt;
그럼 최신버전을 구해야겠지... 인터넷을 뒤져서 다음의 URL을 찾는다&lt;br /&gt;
&lt;br /&gt;
:http://code.google.com/p/gentoo-progress/source/detail?r=3266&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아 좋다. 역시 gentoo는 다르다. 삽질거리는 참 풍부하다.. 당연히 위의 파일을 받아서 사용하는 gentoo system의 overlay에 넣는다. 하지만.. manifest가 안된다. 안되는게 정상이다.. 수정할 부분이 있기 때문이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Copyright owners: Gentoo Foundation&lt;br /&gt;
#                   Arfrever Frehtes Taifersar Arahesis&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
&lt;br /&gt;
EAPI=&amp;quot;4&amp;quot;&lt;br /&gt;
PYTHON_MULTIPLE_ABIS=&amp;quot;1&amp;quot;&lt;br /&gt;
PYTHON_RESTRICTED_ABIS=&amp;quot;2.5 3.* *-jython *-pypy-*&amp;quot;&lt;br /&gt;
SUPPORT_PYTHON_ABIS=&amp;quot;1&amp;quot;&lt;br /&gt;
RESTRICT_PYTHON_ABIS=&amp;quot;3.* *-pypy-* *-jython&amp;quot;&lt;br /&gt;
DISTUTILS_SRC_TEST=&amp;quot;py.test&amp;quot;&lt;br /&gt;
PYTHON_NAMESPACES=&amp;quot;mwlib&amp;quot;&lt;br /&gt;
&lt;br /&gt;
inherit distutils eutils&lt;br /&gt;
&lt;br /&gt;
DESCRIPTION=&amp;quot;mediawiki parser and utility library&amp;quot;&lt;br /&gt;
HOMEPAGE=&amp;quot;http://pediapress.com/code/ https://github.com/pediapress/mwlib https://pypi.python.org/pypi/mwlib&amp;quot;&lt;br /&gt;
SRC_URI=&amp;quot;mirror://pypi/${PN:0:1}/${PN}/${P}.zip&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LICENSE=&amp;quot;BSD&amp;quot;&lt;br /&gt;
SLOT=&amp;quot;0&amp;quot;&lt;br /&gt;
KEYWORDS=&amp;quot;*&amp;quot;&lt;br /&gt;
IUSE=&amp;quot;doc latex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RDEPEND=&amp;quot;dev-lang/perl&lt;br /&gt;
     &amp;gt;=dev-python/apipkg-1.2&lt;br /&gt;
     dev-python/bottle&lt;br /&gt;
     dev-python/gevent&lt;br /&gt;
     dev-python/imaging&lt;br /&gt;
     dev-python/lxml&lt;br /&gt;
     =dev-python/odfpy-0.9*&lt;br /&gt;
     &amp;gt;=dev-python/py-1.4&lt;br /&gt;
     &amp;gt;=dev-python/pyPdf-1.12&lt;br /&gt;
     &amp;gt;=dev-python/pyparsing-1.4.11&lt;br /&gt;
     dev-python/roman&lt;br /&gt;
     &amp;gt;=dev-python/qserve-0.2.7&lt;br /&gt;
     dev-python/setuptools&lt;br /&gt;
     &amp;gt;=dev-python/simplejson-2.3&lt;br /&gt;
     dev-python/sqlite3dbm&lt;br /&gt;
     &amp;gt;=dev-python/timelib-0.2&lt;br /&gt;
     latex? ( virtual/latex-base )&amp;quot;&lt;br /&gt;
DEPEND=&amp;quot;${RDEPEND}&lt;br /&gt;
    doc? ( dev-python/sphinx )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
S=&amp;quot;${WORKDIR}/${P}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다운받은 ebuild파일의 상단부를 위와같이 싹 바꿔준다. 실제로 바꿀내용이 많은것은 아니니 뭐뭐를 바꿔야 하는지 궁굼한 사람들은 본인이 직접 비교해가면서 바꿔보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이후 해당되는 ebuild의 emerge를 진행하도록 한다. 본인이 이때 사용한 USE flag는 대략 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
USE=&amp;quot;-X -ipv6 -gtk -alsa -esd -svg raw openexr lcms fftw fpx hdri jbig lqr q8 i18n dbus udev hal unicode&lt;br /&gt;
 cjk bash-completion cscope ruby vim-pager vim-syntax mmx sse sse2 nptl nptlonly ctype ftp fastcgi&lt;br /&gt;
 spl xml soap cli jpeg jpeg2k python tiff gif png truetype corefonts xetex&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 본인의 경우니 적절히 가려가며 쓰도록 한다. 다만.... 그림파일 관련된 부분은 모조리 들어가주는것이 좋다.&lt;br /&gt;
&lt;br /&gt;
또한! python의 버전은 eselect python set 을 통해서 미리 맞춰놓도록 한다.&lt;br /&gt;
&lt;br /&gt;
:주의사항::가능하면 '''dev-python/imaging''' 과 '''dev-python/pygments''' 정도를 미리 설치하는것이 좋다. 이후 좀 덜 귀찮아진다.&lt;br /&gt;
&lt;br /&gt;
:주의사항::귀찮다고 ACCEPT_KEYWORDS 따위를 쓸생각은 하지말자. 사용하는 패키지중에 perl이 걸리면서 perl이 불안정버전으로 올라가는 경우가 생긴다. 이렇게되면 vi도 안뜨는 경우가 발생할 수 있기때문에 심히 곤란한 상황이 벌어진다. accept keyword가 필요한 패키지의 경우 gentoo만의 방법으로 하나하나 따로 설치해주길 바란다.&lt;br /&gt;
&lt;br /&gt;
:참고사항::왜인지 이유는 모르겠으나 texlive 2011버전이 r6는 gcc 4.5.3에서 설치가 잘 되지 않는다. texlive-core 2011 r6 이 잘 설치되지 않는 경우에는 r7을 설치하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이렇게 설치가 완료되면 이제 재대로 동작하는지 확인을 해봐야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====mwlib의 동작확인====&lt;br /&gt;
&lt;br /&gt;
간단하다. 별 이상 없으면 다음과같은 명령어를 진행해보자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# mw-render --list-write&lt;br /&gt;
odf	OpenDocument Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
윗줄은 명령어와 옵션이고 아랫줄은 출력결과물이다. 이야.. 일단 동작은 하게된거같다.&lt;br /&gt;
&lt;br /&gt;
위에서 odf가 나왔다는건 Mediawiki의 Collection extension을 이용해 pdf포맷으로 내용을 내보내기 할 수 있다는 의미가 된다.&lt;br /&gt;
&lt;br /&gt;
===mwlib.rl의 설치===&lt;br /&gt;
&lt;br /&gt;
mwlib.rl은 mwlib에서 pdf로 내보내기를 가능하게 해주는 모듈이다.&lt;br /&gt;
&lt;br /&gt;
[http://mwlib.readthedocs.org/en/latest/installation.html 이 페이지] 를 참고해서 mwlib.rl 을 설치하도록 한다.&lt;br /&gt;
&lt;br /&gt;
물론 pip를 사용해서 설치해줘야하며.. 이 문서를 제대로 읽고 왔다면 다른 추가패키지 설치없이 mwlib.rl 까지 설치가 진행된다.&lt;br /&gt;
&lt;br /&gt;
{{Note|pyfribidi 패키지는 옵션으로 설치해도 되는 것처럼 설명하지만, 반드시 설치해야 한다}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====mwlib.rl의 설치확인====&lt;br /&gt;
&lt;br /&gt;
다음과같은 명령어와 결과를 확인할 수 있으면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ mw-render --list-write&lt;br /&gt;
odf	OpenDocument Text&lt;br /&gt;
rl	PDF documents (using ReportLab)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
어.. 뭔가 늘었다. 맨 아랫줄을 확인하면 '''rl	PDF documents (using ReportLab)''' 이라는 부분이 있다. mwlib.rl 이 제대로 설치되었다. 그부분만 정상적으로 떠있으면 일단 제대로 작동된다고 생각하면 된다.&lt;br /&gt;
&lt;br /&gt;
===mwlib.epub의 설치===&lt;br /&gt;
&lt;br /&gt;
mwlib.epub은 mwlib에서 epub으로 내보내기를 가능하게 해주는 모듈이다.&lt;br /&gt;
렌더서버가 동작중이라면 렌더서버를 완전히 내리고 (/etc/init.d/blabla stop) 설정하는 것을 추천한다.&lt;br /&gt;
&lt;br /&gt;
설치하기 전에 다음의 의존성을 만족하는지 확인해본다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): mwlib.epub in /usr/lib64/python2.7/site-packages&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): mwlib in /usr/lib64/python2.7/site-packages (from mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): lxml in /usr/lib64/python2.7/site-packages (from mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): cssutils in /usr/lib64/python2.7/site-packages (from mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): ordereddict in /usr/lib64/python2.7/site-packages (from mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): pyparsing&amp;gt;=1.4.11,&amp;lt;1.6 in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): timelib&amp;gt;=0.2 in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): bottle&amp;gt;=0.10 in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): pyPdf&amp;gt;=1.12 in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): apipkg&amp;gt;=1.2 in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): qserve&amp;gt;=0.2.7 in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): py&amp;gt;=1.4 in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): sqlite3dbm in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): simplejson&amp;gt;=2.3 in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): roman in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): gevent in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): odfpy&amp;gt;=0.9,&amp;lt;0.10 in /usr/lib64/python2.7/site-packages (from mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
Requirement already satisfied (use --upgrade to upgrade): greenlet in /usr/lib64/python2.7/site-packages (from gevent-&amp;gt;mwlib-&amp;gt;mwlib.epub)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
다음 명령으로 mwlib.epub를 설치한다. (다행스럽게도 해당 서버에 mwlib.epub 모듈이 있다.)&lt;br /&gt;
&lt;br /&gt;
 # &amp;lt;nowiki&amp;gt;pip install -i http://pypi.pediapress.com/simple/ mwlib.epub&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
설치 과정중에 위의 의존성 표시처럼 오류 메시지 같은 내용이 뜨는데, 이미 의존성을 만족한다는 이야기니 안심해도 좋다.&lt;br /&gt;
설치가 끝났다면 다음과 같은 결과가 나오는지 확인해본다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ mw-render --list-write&lt;br /&gt;
odf	OpenDocument Text&lt;br /&gt;
rl	PDF documents (using ReportLab)&lt;br /&gt;
epub	epub Files&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
마지막 줄의 epub가 나와야 한다. 안나오면 도루묵이다.&lt;br /&gt;
&lt;br /&gt;
{mediawiki-root}/extensions/Collection/Collection.php 를 열어 다음과 같이 epub 관련 줄을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/** List of available download formats,&lt;br /&gt;
        as mapping of mwlib writer to format name */&lt;br /&gt;
$wgCollectionFormats = array(&lt;br /&gt;
    'rl' =&amp;gt; 'PDF',&lt;br /&gt;
    'odf' =&amp;gt; 'ODT',&lt;br /&gt;
    'epub' =&amp;gt; 'EPUB'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이제 렌더 서버를 재시작해보자. 그래도 안되면 위키 하단의 문제 해결에 클레임을 넣어주기 바란다.&lt;br /&gt;
&lt;br /&gt;
===mwlib을 서버로 띄우기===&lt;br /&gt;
&lt;br /&gt;
mwlib에서 핵심적인 4개 파일은 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
nserve.py&lt;br /&gt;
mw-qserve&lt;br /&gt;
nslave.py&lt;br /&gt;
postman&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|설치 방법에 따라서 .py 확장자가 안 붙어 있을 수도 있다.}}&lt;br /&gt;
&lt;br /&gt;
위의 4개파일이 순서대로 뜨면 일단 daemon은 제대로 구동이 되는거라고 보면 된다. 문제는.....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====gentoo에서 emerge로 설치했을때 문제가되는 2개의 파일====&lt;br /&gt;
&lt;br /&gt;
gentoo에서 mwlib을 서버로 띄우는데 2개정도의 문제가 되는 파일이 있다.&lt;br /&gt;
&lt;br /&gt;
'''nserve.py, nslave.py''' 이 두개 파일이 그것이다. 이 파일들은 대단히 엽기적인 동작을 보여주는데..&lt;br /&gt;
&lt;br /&gt;
(물론 nserve.py는 nserve-2.7 파일의 wrapper, nslave.py는 nslave-2.7의 wrapper되시겠다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래와 같이 실행하면 미묘한 결과가 나오면서 실행이 되지 않는다...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# /usr/bin/nserve-2.7 &lt;br /&gt;
This Python implementation (python2.7) is not supported by the script.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...................응? 이게 뭔소리지?&lt;br /&gt;
&lt;br /&gt;
이유는 잘 모르겠지만 /usr/bin 디렉토리에 있으면 실행이 안된다.&lt;br /&gt;
&lt;br /&gt;
그래서 본인은 따로 디렉토리를 만든후 그 안에 파일을 복사하고 실행한다.. 잘된다...-.-;&lt;br /&gt;
&lt;br /&gt;
{{Note| /usr/local/bin에 넣어도 된다. 하지만 실행할 때 nserve nslave와 같은 식으로 명령을 내리면 (복사했을 경우) /usr/bin의 파일을 실행하니, 반드시 절대 경로 ( /usr/local/bin/ ) 을 앞에 붙여서 실행해야 한다.}}&lt;br /&gt;
&lt;br /&gt;
대략 다음의 파일들을 복사하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/usr/bin/nslave.py&lt;br /&gt;
/usr/bin/nslave-2.7&lt;br /&gt;
/usr/bin/nserve.py&lt;br /&gt;
/usr/bin/nserve.2.7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이렇게 파일을 복사햐면 서버를 띄울 최소한의 준비가 된다.&lt;br /&gt;
&lt;br /&gt;
====mwlib 서버를 띄우는 방법====&lt;br /&gt;
&lt;br /&gt;
먼저 위의 파일이 복사된 디렉토리로 이동한다. 그리고 다음과 같은 내용으로 shell script를 하나 만든다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
./nserve.py &amp;amp;&lt;br /&gt;
mw-qserve &amp;amp;&lt;br /&gt;
./nslave.py --cachedir /var/log/cache/mediawiki/ &amp;amp;&lt;br /&gt;
postman&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 이후 '''screen''' 을 이용해서 별도의 session을 연다.&lt;br /&gt;
# 해당되는 shell script를 실행한다.&lt;br /&gt;
# 에러같지 않으며 idle 어쩌고..하는 메세지가 뜨면 daemon 기동 성공&lt;br /&gt;
&lt;br /&gt;
물론 screen 의 사용법은 이 문서에서 다루지 않겠다.&lt;br /&gt;
&lt;br /&gt;
====mwlib서버를 죽이는 방법====&lt;br /&gt;
&lt;br /&gt;
* 이전의 구동용 shell script를 만들 디렉토리로 이동해서 다음과같은 내용으로 shell script를 하나 더 만든다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
killall nserve.py&lt;br /&gt;
killall mw-qserve&lt;br /&gt;
killall nslave.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 서버 daemon을 종료하려는경우 사용하면 된다.&lt;br /&gt;
&lt;br /&gt;
====mwlib 서버 daemon의 테스트====&lt;br /&gt;
&lt;br /&gt;
telnet을 이용해서 아래와같은 방법으로 테스트를 진행하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# telnet localhost 8899&lt;br /&gt;
Trying 127.0.0.1...&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
물론 telnet이 깔려있어야 테스트가 가능하다. telnet이 깔려있는 다른 windows머신에서 테스트를 해보는 방법도 있겠다.&lt;br /&gt;
&lt;br /&gt;
===Mediawiki의 설정변경===&lt;br /&gt;
&lt;br /&gt;
Mediawiki의 Collection Extension 은 기본적으로 아무것도 설정하지 않은경우 pediabook 의 서버로 연결되게 된다. 이걸 바꿔야 직접 띄운 render서버로 연결이 되어 사용할 수 있게된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mediawiki의 LocalSettings.php 파일에 다음 부분을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgCollectionMWServeURL=&amp;quot;http://렌더링서버IP:8899&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이후 Collection Extension 기능을 사용해서 pdf 또는 odf 파일을 생성해보면 된다.&lt;br /&gt;
&lt;br /&gt;
파일이 제대로 생성되면 성공!&lt;br /&gt;
&lt;br /&gt;
=== rc-script 만들기 ===&lt;br /&gt;
머신을 시작하면서 렌더서버를 자동으로 돌아가게 하려면 다음 스크립트를 /etc/init.d/ 에 알아서 추가하도록 한다. 예를 들어 설명해보도록 하겠다&lt;br /&gt;
&lt;br /&gt;
만약 다음 명령을 실행하면 &lt;br /&gt;
&lt;br /&gt;
 root ~ # cd /etc/init.d&lt;br /&gt;
 root init.d # vi mwlib&lt;br /&gt;
&lt;br /&gt;
대강 다음과 비슷한 템플릿이 뜬다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/sbin/runscript&lt;br /&gt;
# Copyright 1999-2013 Gentoo Foundation&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# $Header: $&lt;br /&gt;
&lt;br /&gt;
depend() {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
start() {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
stop() {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 템플릿을 다음과 비슷하게 채워준다. 처음 네 줄을 제외한 나머지 주석은 넣지 않아도 된다. 내용 참고는 상단에서 했다. USERID의 user와 HOMEDIR의 user는 달라도 된다. 예제파일이기 때문에 입맛에 맞춰서 적당하게 바꿔주면 될듯 하다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/sbin/runscript&lt;br /&gt;
# Copyright 1999-2013 Gentoo Foundation&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# $Header: $&lt;br /&gt;
&lt;br /&gt;
USERID=&amp;quot;user&amp;quot; # 스크립트를 실행할 UserID. 본인의 경우에는 root로 했다. 실행 권한과 관련이 있는 변수값이다.&lt;br /&gt;
HOMEDIR=&amp;quot;/home/user/mwlib-script&amp;quot; # 스크립트가 들어있는 폴더(or 디렉터리)&lt;br /&gt;
&lt;br /&gt;
depend() {&lt;br /&gt;
    need net # 네트워크를 시작하지 않으면 무용지물.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
start() {&lt;br /&gt;
    ebegin &amp;quot;Starting mwlib document rendering server&amp;quot;&lt;br /&gt;
    /usr/bin/screen -dmS mwlib-screen su ${USERID} -c &amp;quot;${HOMEDIR}/mwlib-server.sh&amp;quot;&lt;br /&gt;
    # 문제가 있는 것 같으면 -L 옵션을 screen 명령 바로 다음에 추가하여 확인한다.&lt;br /&gt;
    # 로그 파일은 '/' 디렉터리에 screenlog.0 이라는 이름으로 생성된다.&lt;br /&gt;
    # 예 : /usr/bin/screen -L -dmS mwlib-screen su ${USERID} -c &amp;quot;${HOMEDIR}/mwlib-server.sh&amp;quot;&lt;br /&gt;
    eend $? &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
stop() {&lt;br /&gt;
    ebegin &amp;quot;Stopping mwlib document rendering server&amp;quot;&lt;br /&gt;
    local pid=`ps aux | grep mwlib-screen | grep SCREEN | awk -F ' ' '{print $2}'`&lt;br /&gt;
    killall postman&lt;br /&gt;
    killall nslave&lt;br /&gt;
    killall mw-qserve&lt;br /&gt;
    killall nserve&lt;br /&gt;
   &lt;br /&gt;
    /bin/kill -9 $pid&lt;br /&gt;
    sleep 1 # 이 줄을 안 넣으면 fail이 난다. 원인은 모름 -_-&lt;br /&gt;
&lt;br /&gt;
    eend $? &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
일단 저장하고 나와서 이번에는 rc-script로 돌릴 스크립트를 만들어보자. 위에 적어두었던 스크립트에서 실행 권한 부여 부분이 바뀐다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
USERID=&amp;quot;root&amp;quot;&lt;br /&gt;
su - ${USERID} -c '/usr/local/bin/nserve'&amp;amp;&lt;br /&gt;
su - ${USERID} -c '/usr/bin/mw-qserve'&amp;amp;&lt;br /&gt;
su - ${USERID} -c '/usr/local/bin/nslave --cachedir /var/log/cache/mediawiki/'&amp;amp;&lt;br /&gt;
su - ${USERID} -c 'postman'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
루트 권한으로 실행하도록 명령하는 것은 사실 {{Red|{{Bold|아주 위험한}} }} 명령이긴 하지만 이렇게 하지 않으면 퍼미션 문제가 발생한다.&lt;br /&gt;
root대신 apache를 넣으면 (apache를 넣어야 하는게 정상이지만) 가끔 not available 오류가 뜬다.&lt;br /&gt;
이 스크립트를 어딘가 잘 만들어서 rc-script에 지정한 디렉터리로 잘 복사해둔다. 물론 실행 퍼미션도 잊지 말고 부여하도록.&lt;br /&gt;
&lt;br /&gt;
그리고 마지막으로 넣으면 좋은 명령 한 줄.&lt;br /&gt;
&lt;br /&gt;
 root init.d # rc-update add mwlib default&lt;br /&gt;
&lt;br /&gt;
스크립트 이름을 rend-server 이런식으로 했다면 mwlib가 아니라 rend-server로 적어줘야 한다.&lt;br /&gt;
&lt;br /&gt;
일단 시작해보고&lt;br /&gt;
&lt;br /&gt;
 root init.d # ./mwlib start&lt;br /&gt;
&lt;br /&gt;
동작중인지 확인해본다&lt;br /&gt;
&lt;br /&gt;
 root init.d # screen -ls&lt;br /&gt;
&lt;br /&gt;
제대로 나온다면 아마 다음 처럼 나올 것이다.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;There are screens on:&lt;br /&gt;
	30672.mwlib-screen	(Detached)&lt;br /&gt;
 1 Sockets in /root/.screen.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
그리고 실제로 스크립트로 실행한 네가지 명령이 동작중인지 확인해봐야 한다&lt;br /&gt;
&lt;br /&gt;
 root init.d # ps aux | grep nserve;ps aux | grep nslave;ps aux | grep mw-qserve;ps aux | grep postman&lt;br /&gt;
&lt;br /&gt;
==참고사항==&lt;br /&gt;
&lt;br /&gt;
# 페이지수가 너무 많으면 pdf 파일의 경우생성을 제대로 못한다. 아마도 페이지에 들어있는 이미지의 개수와 상관이 있는듯. 이런경우에는 페이지수를 적게해서 pdf를 여러개 생성해야 한다&amp;lt;br/&amp;gt;&amp;lt;strike&amp;gt;{{lightgray|# 아마도 epub을 쓰려면...... python관련 library도 좀 올려야하는데.. ebuild가 없어서 근성부족으로 포기}}&amp;lt;/strike&amp;gt; (내용 추가로 삭제)&amp;lt;br/&amp;gt;&amp;lt;strike&amp;gt;{{lightgray|# pyfribidi는.. 설치하다가 ctrl+c를 눌러서 중지했더니... 설치가 똑바로 안되고있다... 역시 근성부족으로 포기}}&amp;lt;/strike&amp;gt; (아마도 망 문제인듯 하다)&lt;br /&gt;
# iptables를 설치했을 경우 포트가 막혀있을 경우가 있다. 그럴 경우 다음과 같이 명령을 실행한다&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT --protocol tcp --dport 8899 -j ACCEPT&lt;br /&gt;
# iptables -A INPUT --protocol tcp --dport 14311 -j ACCEPT&lt;br /&gt;
# iptables -L // tcp/8899 포트와 tcp/14311 포트가 제대로 추가 되었는지 확인&lt;br /&gt;
# /etc/init.d/iptables restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===문제 해결===&lt;br /&gt;
* 아래같은 이상한 오류 메시지가 뜨면서 1.00%에서 그냥 멈춰요 ㅠㅠ&lt;br /&gt;
 &amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td width = &amp;quot;100%&amp;quot; bgcolor=&amp;quot;#cfcfcf&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;RuntimeError: RuntimeError: command failed with returncode 256: ['mw-zip', '-o', '/var/log/cache/mediawiki/0a/0ad39576d7b62f5e/collection.zip', '-m', '/var/log/cache/mediawiki/0a/0ad39576d7b62f5e/metabook.json', '--status', 'qserve://localhost:14311/0ad39576d7b62f5e:makezip', '--template-blacklist', 'MediaWiki:PDF Template Blacklist', '--template-exclusion-category', u'\uc778\uc1c4\uc2dc \uc81c\uc678\ud560 \ubb38\uc11c', '--print-template-prefix', u'\uc778\uc1c4', '--print-template-pattern', u'$1/\uc778\uc1c4'] Last Output: 2013-03-23T22:53:08 mwlib.options.warn &amp;gt;&amp;gt; Both --print-template-pattern and --print-template-prefix (deprecated) specified. Using --print-template-pattern only. 1% creating nuwiki in u'/var/log/cache/mediawiki/0a/0ad39576d7b62f5e/tmp3RkWo0/nuwiki' removing tmpdir u'/var/log/cache/mediawiki/0a/0ad39576d7b62f5e/tmp3RkWo0' memory used: res=18.7 virt=249.1 1% error Traceback (most recent call last): File &amp;quot;/usr/bin/mw-zip-2.7&amp;quot;, line 9, in &amp;lt;module&amp;gt; load_entry_point('mwlib==0.15.3', 'console_scripts', 'mw-zip')() File &amp;quot;/usr/lib64/python2.7/site-packages/mwlib/apps/buildzip.py&amp;quot;, line 155, in main make_zip(output, options, env.metabook, podclient=podclient, status=status) File &amp;quot;/usr/lib64/python2.7/site-packages/mwlib/apps/buildzip.py&amp;quot;, line 50, in make_zip make_nuwiki(fsdir, metabook=metabook, options=options, podclient=podclient, status=status) File &amp;quot;/usr/lib64/python2.7/site-packages/mwlib/apps/make_nuwiki.py&amp;quot;, line 152, in make_nuwiki assert x.wikiident in id2wiki, &amp;quot;no wikiconf for %r (%s)&amp;quot; % (x.wikiident, x) AssertionError: no wikiconf for None (&amp;lt;article {'_env': &amp;lt;mwlib.wiki.Environment object at 0xaf1690&amp;gt;, 'title': u'Idea:myIdea', 'url': u'http://hostname/index.php/Idea:myIdea', 'timestamp': u'1363919027', 'currentVersion': 1, 'content_type': u'text/x-wiki', 'revision': u'43', 'type': 'article', 'latest': u'43'}&amp;gt;) in function system, file /usr/lib64/python2.7/site-packages/mwlib/nslave.py, line 64 in function qaddw, file /usr/lib64/python2.7/site-packages/qs/slave.py, line 66&amp;lt;/nowiki&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
먼저 LocalSettings.php를 열어 다음을 확인해본다&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgScriptPath = &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
여기서 {{Bold|&amp;lt;nowiki&amp;gt;$wgScriptPath = &amp;quot;&amp;quot;&amp;lt;/nowiki&amp;gt;}}가 아니라 마지막에 슬래시(/)가 빠진 자신의 위키 서버 주소가 들어가야 한다. 가령 예를 들면 다음과 같다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgScriptPath = &amp;quot;http://webhost/wiki&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
그 다음 다음 변수 존재 유무를 확인하고 없으면 추가한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgEnableAPI = &amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
다음 두 줄의 존재 유무를 다시 한번 확인한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgGroupPermissions['user']['collectionsaveascommunitypage'] = true;&lt;br /&gt;
$wgGroupPermissions['user']['collectionsaveasuserpage'] = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Green|{{Bold|비공개 위키를 사용하는 경우,}} }} 자신의 계정으로 접속하게 하도록 한다.&lt;br /&gt;
extensions/Collection/Collection.php를 열어 다음 변수의 내용을 null에서 다른 문자열 값으로 바꿔준다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgCollectionMWServeCredentials = &amp;quot;user:passwd&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Permission denied가 뜨네요. 왜죠?&lt;br /&gt;
 &amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td width=&amp;quot;100%&amp;quot; bgcolor=&amp;quot;#cfcfcf&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;error finish: 801a5c314495021a:makezip: &amp;quot;OSError: [Errno 13] Permission denied: '/var/log/cache/mediawiki/80/801a5c314495021a' in function doit, file /usr/lib64/python2.7/site-packages/mwlib/nslave.py, line 144&amp;quot;&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;/usr/lib64/python2.7/site-packages/qs/slave.py&amp;quot;, line 150, in handle_one_job&lt;br /&gt;
    result = workhandler(qs).dispatch(job)&lt;br /&gt;
  File &amp;quot;/usr/lib64/python2.7/site-packages/qs/slave.py&amp;quot;, line 50, in dispatch&lt;br /&gt;
    return m(**tmp)&lt;br /&gt;
  File &amp;quot;/usr/lib64/python2.7/site-packages/mwlib/nslave.py&amp;quot;, line 161, in rpc_makezip&lt;br /&gt;
    return doit(**params)&lt;br /&gt;
  File &amp;quot;/usr/lib64/python2.7/site-packages/mwlib/nslave.py&amp;quot;, line 144, in doit&lt;br /&gt;
    os.mkdir(dir)&lt;br /&gt;
OSError: [Errno 13] Permission denied: '/var/log/cache/mediawiki/80/801a5c314495021a'&lt;br /&gt;
error: OSError: [Errno 13] Permission denied: '/var/log/cache/mediawiki/80/801a5c314495021a' in function doit, file /usr/lib64/python2.7/site-packages/mwlib/nslave.py, line 144&amp;lt;/nowiki&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
실행 권한을 apache 또는 root로 주고 스크립트를 실행하면 문제가 해결된다.&lt;br /&gt;
&lt;br /&gt;
===참고문서===&lt;br /&gt;
&lt;br /&gt;
* pip의 사용법 :: http://www.ironbag.net/page/f0cdac78477145cbb5767e23f49496c9&lt;br /&gt;
* 여러개의 pdf문서를 합치는방법(linux-pdftk) :: http://blog.naver.com/PostView.nhn?blogId=skidsy&amp;amp;logNo=40071552769&amp;amp;redirect=Dlog&amp;amp;widgetTypeCall=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GentooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=WikiTestPage&amp;diff=998</id>
		<title>WikiTestPage</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=WikiTestPage&amp;diff=998"/>
		<updated>2013-03-20T04:53:30Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 테스트작성&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; 여기는 MediaWiki의 문법 테스트페이지 입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Template:InfoIcon|정보아이콘]]&lt;br /&gt;
{{InfoIcon}}이렇게 아이콘이 나오게 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
* [[Template:AttentionIcon|주의아이콘]]&lt;br /&gt;
{{AttentionIcon}}이렇게 아이콘이 나오게 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
* [[Template:ThumbupIcon|추천아이콘]]&lt;br /&gt;
{{ThumbupIcon}}이렇게 아이콘이 나오게 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
Program Types;&lt;br /&gt;
&lt;br /&gt;
{$mode objfpc}{$H+}&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
    {$IFDEF UNIX}{$IFDEF UseCThreads}&lt;br /&gt;
    cthreads,&lt;br /&gt;
    {$ENDIF}{$ENDIF}&lt;br /&gt;
    Classes&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    Writeln(‘Byte: Size = ’,  SizeOf(Byte),&lt;br /&gt;
   ‘, Minimum value = ‘, Low(Byte), ‘ Maximum value = ‘,&lt;br /&gt;
  High(Byte));&lt;br /&gt;
&lt;br /&gt;
  Writeln(‘Integer: Size = ’,  SizeOf(Integer),&lt;br /&gt;
   ‘, Minimum value = ‘, Low(Integer), ‘ Maximum value = ‘,&lt;br /&gt;
  High(Integer));&lt;br /&gt;
&lt;br /&gt;
    Write(‘Press enter key to close’);&lt;br /&gt;
    Readln;&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=995</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=995"/>
		<updated>2013-03-19T13:11:29Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 문서링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==from KLDP문서==&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]] 원문주소 :: http://wiki.kldp.org/wiki.php/OpenAFS-Gentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]] - 원문주소 :: http://wiki.kldp.org/wiki.php/GentooPostfix&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]] - 원문주소 :: http://wiki.kldp.org/wiki.php/PostfixOnGentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL_On_Gentoo|PostgreSQL On Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/PostgreSQLOnGentoo&lt;br /&gt;
&lt;br /&gt;
[[Oracle11g_For_Gentoo|Oracle11g For Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/Oracle11g_For_Gentoo&lt;br /&gt;
&lt;br /&gt;
[[Oracle92_For_Gentoo|Oracle 9.2 For Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/Oracle9.2%20For%20Gentoo&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_IP_bonding|Gentoo Linux 에서의 IP bonding구축]] - 원문주소 :: http://wiki.kldp.org/wiki.php/GentooIPBonding&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_distcc|젠투 distcc 문서]] - 원문주소 :: http://wiki.kldp.org/wiki.php/GentooDocList/GentooDistccDoc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==제작문서==&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_mwlib|Gentoo-MediaWiki에서 사용할 수 있는 Collection Extension에 대한 렌더서버 구축하기]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=994</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=994"/>
		<updated>2013-03-19T13:01:30Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: Gentoo Korea 국내 제작문서 페이지 수정 및 원문주소 명기&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==from KLDP문서==&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]] 원문주소 :: http://wiki.kldp.org/wiki.php/OpenAFS-Gentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]] - 원문주소 :: http://wiki.kldp.org/wiki.php/GentooPostfix&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]] - 원문주소 :: http://wiki.kldp.org/wiki.php/PostfixOnGentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL_On_Gentoo|PostgreSQL On Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/PostgreSQLOnGentoo&lt;br /&gt;
&lt;br /&gt;
[[Oracle11g_For_Gentoo|Oracle11g For Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/Oracle11g_For_Gentoo&lt;br /&gt;
&lt;br /&gt;
[[Oracle92_For_Gentoo|Oracle 9.2 For Gentoo]] - 원문주소 :: http://wiki.kldp.org/wiki.php/Oracle9.2%20For%20Gentoo&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_IP_bonding|Gentoo Linux 에서의 IP bonding구축]] - 원문주소 :: http://wiki.kldp.org/wiki.php/GentooIPBonding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==제작문서==&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_mwlib|Gentoo-MediaWiki에서 사용할 수 있는 Collection Extension에 대한 렌더서버 구축하기]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Gentoo_mwlib&amp;diff=993</id>
		<title>Gentoo mwlib</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Gentoo_mwlib&amp;diff=993"/>
		<updated>2013-03-19T12:56:08Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: Gentoo-MediaWiki에서 사용할 수 있는 Collection Extension에 대한 렌더서버 구축하기 문서 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;MediaWiki에서 사용할 수 있는 Collection Extension에 대한 렌더서버 구축하기&lt;br /&gt;
&lt;br /&gt;
==적용범위 및 목적==&lt;br /&gt;
&lt;br /&gt;
이 문서는 Mediawiki에서 사용할 수 있는 Collection Extension에 대한 렌더링 서버를 Gentoo Linux 에서 구축하는것을 그 목적으로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==용어정의==&lt;br /&gt;
&lt;br /&gt;
* Mediawiki :: Wiki System중 하나. php로 만들어져있으며 여러가지 DB Backend를 사용할 수 있다 - http://www.mediawiki.org/wiki/MediaWiki&lt;br /&gt;
* Collection :: Mediawiki의 extension중 하나. wiki페이지들을 모아서 원하는 양식으로 내보내기 할 수 있다 - http://www.mediawiki.org/wiki/Extension:Collection&lt;br /&gt;
* mwlib :: Mediawiki의 내용을 다른 형식으로 내보내기 위한 도구들 - http://mwlib.readthedocs.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==기준내용==&lt;br /&gt;
&lt;br /&gt;
===시스템을 구성하기 위한 준비===&lt;br /&gt;
&lt;br /&gt;
일단 mwlib을 사용하기에 앞서 어느경우에 렌더서버를 구축해야하는지 생각해보도록 하자&lt;br /&gt;
&lt;br /&gt;
# pediapress서버와 통신이 느리거나 해서 제대로 파일을 생성할 수 없는경우&lt;br /&gt;
# 내부망에 mediawiki를 설치하는경우 외부의 pediapress 서버와 연결될 수 없는경우&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 위의 2가지 경우 모두 다 Collection Extension을 사용하는것을 전제로 한다.&lt;br /&gt;
&lt;br /&gt;
Collection Extension을 Mediawiki에 설치하는 방법은 [http://trans.onionmixer.net/mediawiki/index.php?title=WikiTips::Collection_Extension 여기]를 참고하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
본 문서에서는 이미 서버에 Mediawiki정도는 어느 db가 되었든 세팅하고 문제없이 사용할 수 있는 사람들을 대상으로 설명을 진행하려 한다. 당연히 Collection 은 미리 설치되어있어야하며 사용법은 숙지하고 있어야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===미리 읽어두면 좋을 내용들===&lt;br /&gt;
&lt;br /&gt;
* mwlib의 설치에 대해서 나와있다. 모두 pip를 사용한 설치를 진행하는것으로 기준이 잡혀있어 gentoo 에서 100% 다 사용할 수는 없지만 관련된 내용은 읽어두면 도움이 된다.&amp;lt;BR&amp;gt; http://mwlib.readthedocs.org/en/latest/installation.html&lt;br /&gt;
* mwlib의 구동방법에 대해 나와있다. 사실 자세히는 몰라도 되며 웬지는 모르겠지만 설치후 저 문서대로 동작하지는 않는다. 다만 띄우는 순서는 메모해놓을 필요가 있음.&amp;lt;BR&amp;gt; http://mwlib.readthedocs.org/en/latest/renderserver.html#mwlib-renderserver&lt;br /&gt;
* mwlib을 세팅한후 Mediawiki의 Collection Extension 을 세팅하는 방법에 대해 나와있다. 읽어두면 도움이 된다.&amp;lt;BR&amp;gt; http://mwlib.readthedocs.org/en/latest/collection.html&lt;br /&gt;
* 아직 테스트는 해보지 않았지만 Collection Extension 에 대한 새 버전의 wiki문서가 있다. 다음을 참고하도록 한다.&amp;lt;BR&amp;gt; http://www.mediawiki.org/wiki/Collection_Extension_2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===mwlib의 설치===&lt;br /&gt;
&lt;br /&gt;
mwlib은 현재 opensource로서 이 글을 작성하는현재 0.15.3 버전이 나와있다. 물론 이것을 사용할 예정이다.&lt;br /&gt;
&lt;br /&gt;
다만 gentoo에서는 gentoo만의 방법이 있는법. emerge mwlib으로 설치하면 잘 될거같지만.............. 버전이 틀리므로 안된다.&lt;br /&gt;
&lt;br /&gt;
그럼 최신버전을 구해야겠지... 인터넷을 뒤져서 다음의 URL을 찾는다&lt;br /&gt;
&lt;br /&gt;
:http://code.google.com/p/gentoo-progress/source/detail?r=3266&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아 좋다. 역시 gentoo는 다르다. 삽질거리는 참 풍부하다.. 당연히 위의 파일을 받아서 사용하는 gentoo system의 overlay에 넣는다. 하지만.. manifest가 안된다. 안되는게 정상이다.. 수정할 부분이 있기 때문이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Copyright owners: Gentoo Foundation&lt;br /&gt;
#                   Arfrever Frehtes Taifersar Arahesis&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
&lt;br /&gt;
EAPI=&amp;quot;4&amp;quot;&lt;br /&gt;
PYTHON_MULTIPLE_ABIS=&amp;quot;1&amp;quot;&lt;br /&gt;
PYTHON_RESTRICTED_ABIS=&amp;quot;2.5 3.* *-jython *-pypy-*&amp;quot;&lt;br /&gt;
SUPPORT_PYTHON_ABIS=&amp;quot;1&amp;quot;&lt;br /&gt;
RESTRICT_PYTHON_ABIS=&amp;quot;3.* *-pypy-* *-jython&amp;quot;&lt;br /&gt;
DISTUTILS_SRC_TEST=&amp;quot;py.test&amp;quot;&lt;br /&gt;
PYTHON_NAMESPACES=&amp;quot;mwlib&amp;quot;&lt;br /&gt;
&lt;br /&gt;
inherit distutils eutils&lt;br /&gt;
&lt;br /&gt;
DESCRIPTION=&amp;quot;mediawiki parser and utility library&amp;quot;&lt;br /&gt;
HOMEPAGE=&amp;quot;http://pediapress.com/code/ https://github.com/pediapress/mwlib https://pypi.python.org/pypi/mwlib&amp;quot;&lt;br /&gt;
SRC_URI=&amp;quot;mirror://pypi/${PN:0:1}/${PN}/${P}.zip&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LICENSE=&amp;quot;BSD&amp;quot;&lt;br /&gt;
SLOT=&amp;quot;0&amp;quot;&lt;br /&gt;
KEYWORDS=&amp;quot;*&amp;quot;&lt;br /&gt;
IUSE=&amp;quot;doc latex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RDEPEND=&amp;quot;dev-lang/perl&lt;br /&gt;
     &amp;gt;=dev-python/apipkg-1.2&lt;br /&gt;
     dev-python/bottle&lt;br /&gt;
     dev-python/gevent&lt;br /&gt;
     dev-python/imaging&lt;br /&gt;
     dev-python/lxml&lt;br /&gt;
     =dev-python/odfpy-0.9*&lt;br /&gt;
     &amp;gt;=dev-python/py-1.4&lt;br /&gt;
     &amp;gt;=dev-python/pyPdf-1.12&lt;br /&gt;
     &amp;gt;=dev-python/pyparsing-1.4.11&lt;br /&gt;
     dev-python/roman&lt;br /&gt;
     &amp;gt;=dev-python/qserve-0.2.7&lt;br /&gt;
     dev-python/setuptools&lt;br /&gt;
     &amp;gt;=dev-python/simplejson-2.3&lt;br /&gt;
     dev-python/sqlite3dbm&lt;br /&gt;
     &amp;gt;=dev-python/timelib-0.2&lt;br /&gt;
     latex? ( virtual/latex-base )&amp;quot;&lt;br /&gt;
DEPEND=&amp;quot;${RDEPEND}&lt;br /&gt;
    doc? ( dev-python/sphinx )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
S=&amp;quot;${WORKDIR}/${P}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다운받은 ebuild파일의 상단부를 위와같이 싹 바꿔준다. 실제로 바꿀내용이 많은것은 아니니 뭐뭐를 바꿔야 하는지 궁굼한 사람들은 본인이 직접 비교해가면서 바꿔보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이후 해당되는 ebuild의 emerge를 진행하도록 한다. 본인이 이때 사용한 USE flag는 대략 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
USE=&amp;quot;-X -ipv6 -gtk -alsa -esd -svg raw openexr lcms fftw fpx hdri jbig lqr q8 i18n dbus udev hal unicode cjk bash-completion cscope ruby vim-pager vim-syntax mmx sse sse2 nptl nptlonly ctype ftp fastcgi spl xml soap cli jpeg jpeg2k python tiff gif png truetype corefonts xetex&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
물론 본인의 경우니 적절히 가려가며 쓰도록 한다. 다만.... 그림파일 관련된 부분은 몽조리 들어가주는것이 좋다.&lt;br /&gt;
&lt;br /&gt;
또한! python의 버전은 eselect python set 을 통해서 미리 맞춰놓도록 한다.&lt;br /&gt;
&lt;br /&gt;
:주의사항::가능하면 '''dev-python/imaging''' 과 '''dev-python/pygments''' 정도를 미리 설치하는것이 좋다. 이후 좀 덜 귀찮아진다.&lt;br /&gt;
&lt;br /&gt;
:주의사항::귀찮다고 ACCEPT_KEYWORDS 따위를 쓸생각은 하지말자. 사용하는 패키지중에 perl이 걸리면서 perl이 불안정버전으로 올라가는 경우가 생긴다. 이렇게되면 vi도 안뜨는 경우가 발생할 수 있기때문에 심히 곤란한 상황이 벌어진다. accept keyword가 필요한 패키지의 경우 gentoo만의 방법으로 하나하나 따로 설치해주길 바란다.&lt;br /&gt;
&lt;br /&gt;
:참고사항::왜인지 이유는 모르겠으나 texlive 2011버전이 r6는 gcc 4.5.3에서 설치가 잘 되지 않는다. texlive-core 2011 r6 이 잘 설치되지 않는 경우에는 r7을 설치하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이렇게 설치가 완료되면 이제 재대로 동작하는지 확인을 해봐야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====mwlib의 동작확인====&lt;br /&gt;
&lt;br /&gt;
간단하다. 별 이상 없으면 다음과같은 명령어를 진행해보자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# mw-render --list-write&lt;br /&gt;
odf	OpenDocument Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
윗줄은 명령어와 옵션이고 아랫줄은 출력결과물이다. 이야.. 일단 동작은 하게된거같다.&lt;br /&gt;
&lt;br /&gt;
위에서 odf가 나왔다는건 Mediawiki의 Collection extension을 이용해 pdf포맷으로 내용을 내보내기 할 수 있다는 의미가 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===mwlib.rl의 설치===&lt;br /&gt;
&lt;br /&gt;
mwlib.rl은 mwlib에서 pdf로 내보내기를 가능하게 해주는 모듈이다.&lt;br /&gt;
&lt;br /&gt;
[http://mwlib.readthedocs.org/en/latest/installation.html 이 페이지] 를 참고해서 mwlib.rl 을 설치하도록 한다.&lt;br /&gt;
&lt;br /&gt;
물론 pip를 사용해서 설치해줘야하며.. 이 문서를 제대로 읽고 왔다면 다른 추가패키지 설치없이 mwlib.rl 만 설치가 진행된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====mwlib.rl의 설치확인====&lt;br /&gt;
&lt;br /&gt;
다음과같은 명령어와 결과를 확인할 수 있으면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ mw-render --list-write&lt;br /&gt;
odf	OpenDocument Text&lt;br /&gt;
rl	PDF documents (using ReportLab)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
어.. 뭔가 늘었다. 맨 아랫줄을 확인하면 '''rl	PDF documents (using ReportLab)''' 이라는 부분이 있다. mwlib.rl 이 제대로 설치되었다. 그부분만 정상적으로 떠있으면 일단 제대로 작동된다고 생각하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===mwlib.epub의 설치===&lt;br /&gt;
&lt;br /&gt;
mwlib.epub은 mwlib에서 epub으로 내보내기를 가능하게 해주는 모듈이다.&lt;br /&gt;
&lt;br /&gt;
[https://pypi.python.org/pypi/mwlib.epub/0.14.2 이 페이지] 를 참고해서 mwlib.epub 을 설치하도록 한다.&lt;br /&gt;
&lt;br /&gt;
: 참고로 본인은 설치실패.....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===mwlib을 서버로 띄우기===&lt;br /&gt;
&lt;br /&gt;
mwlib에서 핵심적인 4개 파일은 다음과같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
nserve.py&lt;br /&gt;
mw-qserve&lt;br /&gt;
nslave.py&lt;br /&gt;
postman&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
위의 4개파일이 순서대로 뜨면 일단 daemon은 제대로 구동이 되는거라고 보면 된다. 문제는.....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====gentoo에서 emerge로 설치했을때 문제가되는 2개의 파일====&lt;br /&gt;
&lt;br /&gt;
gentoo에서 mwlib을 서버로 띄우는데 2개정도의 문제가 되는 파일이 있다.&lt;br /&gt;
&lt;br /&gt;
'''nserve.py, nslave.py''' 이 두개 파일이 그것이다. 이 파일들은 대단히 엽기적인 동작을 보여주는데..&lt;br /&gt;
&lt;br /&gt;
(물론 nserve.py는 nserve-2.7 파일의 wrapper, nslave.py는 nslave-2.7의 wrapper되시겠다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래와 같이 실행하면 미묘한 결과가 나오면서 실행이 되지 않는다...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# /usr/bin/nserve-2.7 &lt;br /&gt;
This Python implementation (python2.7) is not supported by the script.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...................응? 이게 뭔소리지?&lt;br /&gt;
&lt;br /&gt;
이유는 잘 모르겠지만 /usr/bin 디렉토리에 있으면 실행이 안된다.&lt;br /&gt;
&lt;br /&gt;
그래서 본인은 따로 디렉토리를 만든후 그 안에 파일을 복사하고 실행한다.. 잘된다...-.-;&lt;br /&gt;
&lt;br /&gt;
대략 다음의 파일들을 복사하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/usr/bin/nslave.py&lt;br /&gt;
/usr/bin/nslave-2.7&lt;br /&gt;
/usr/bin/nserve.py&lt;br /&gt;
/usr/bin/nserve.2.7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이렇게 파일을 복사햐면 서버를 띄울 최소한의 준비가 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====mwlib 서버를 띄우는 방법====&lt;br /&gt;
&lt;br /&gt;
# 먼저 위의 파일이 복사된 디렉토리로 이동한다. 그리고 다음과 같은 내용으로 shell script를 하나 만든다.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
./nserve.py &amp;amp;&lt;br /&gt;
mw-qserve &amp;amp;&lt;br /&gt;
./nslave.py --cachedir /var/log/cache/mediawiki/ &amp;amp;&lt;br /&gt;
postman&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 이후 '''screen''' 을 이용해서 별도의 session을 연다.&lt;br /&gt;
# 해당되는 shell script를 실행한다.&lt;br /&gt;
# 에러같지 않으며 idle 어쩌고..하는 메세지가 뜨면 daemon 기동 성공&lt;br /&gt;
&lt;br /&gt;
물론 screen 의 사용법은 이 문서에서 다루지 않겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====mwlib서버를 죽이는 방법====&lt;br /&gt;
&lt;br /&gt;
# 이전의 구동용 shell script를 만들 디렉토리로 이동해서 다음과같은 내용으로 shell script를 하나 더 만든다.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
killall nserve.py&lt;br /&gt;
killall mw-qserve&lt;br /&gt;
killall nslave.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 서버 daemon을 종료하려는경우 사용하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====mwlib 서버 daemon의 테스트====&lt;br /&gt;
&lt;br /&gt;
telnet을 이용해서 아래와같은 방법으로 테스트를 진행하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# telnet localhost 8899&lt;br /&gt;
Trying 127.0.0.1...&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
물론 telnet이 깔려있어야 테스트가 가능하다. telnet이 깔려있는 다른 windows머신에서 테스트를 해보는 방법도 있겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mediawiki의 설정변경===&lt;br /&gt;
&lt;br /&gt;
Mediawiki의 Collection Extension 은 기본적으로 아무것도 설정하지 않은경우 pediabook 의 서버로 연결되게 된다. 이걸 바꿔야 직접 띄운 render서버로 연결이 되어 사용할 수 있게된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mediawiki의 LocalSettings.php 파일에 다음 부분을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgCollectionMWServeURL=&amp;quot;http://렌더링서버IP:8899&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이후 Collection Extension 기능을 사용해서 pdf 또는 odf 파일을 생성해보면 된다.&lt;br /&gt;
&lt;br /&gt;
파일이 제대로 생성되면 성공!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==참고사항==&lt;br /&gt;
&lt;br /&gt;
# 페이지수가 너무 많으면 pdf 파일의 경우생성을 제대로 못한다. 아마도 페이지에 들어있는 이미지의 개수와 상관이 있는듯. 이런경우에는 페이지수를 적게해서 pdf를 여러개 생성해야 한다&lt;br /&gt;
# 아마도 epub을 쓰려면...... python관련 library도 좀 올려야하는데.. ebuild가 없어서 근성부족으로 포기&lt;br /&gt;
# pyfribidi는.. 설치하다가 ctrl+c를 눌러서 중지했더니... 설치가 똑바로 안되고있다... 역시 근성부족으로 포기&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===참고문서===&lt;br /&gt;
&lt;br /&gt;
* pip의 사용법 :: http://www.ironbag.net/page/f0cdac78477145cbb5767e23f49496c9&lt;br /&gt;
* 여러개의 pdf문서를 합치는방법(linux-pdftk) :: http://blog.naver.com/PostView.nhn?blogId=skidsy&amp;amp;logNo=40071552769&amp;amp;redirect=Dlog&amp;amp;widgetTypeCall=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=992</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=992"/>
		<updated>2013-03-19T12:55:05Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 문서링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]]&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]]&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL_On_Gentoo|PostgreSQL On Gentoo]]&lt;br /&gt;
&lt;br /&gt;
[[Oracle11g_For_Gentoo|Oracle11g For Gentoo]]&lt;br /&gt;
&lt;br /&gt;
[[Oracle92_For_Gentoo|Oracle 9.2 For Gentoo]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_IP_bonding|Gentoo Linux 에서의 IP bonding구축]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_mwlib|Gentoo-MediaWiki에서 사용할 수 있는 Collection Extension에 대한 렌더서버 구축하기]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Gentoo_IP_bonding&amp;diff=991</id>
		<title>Gentoo IP bonding</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Gentoo_IP_bonding&amp;diff=991"/>
		<updated>2013-03-19T12:51:49Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 스타일 수정&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;Gentoo Linux 에서의 IP bonding구축&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
'''Gentoo Linux 에서의 IP bonding구축'''&lt;br /&gt;
&lt;br /&gt;
* 작성자&amp;lt;BR&amp;gt;조재혁([mailto:minzkn@minzkn.com])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 고친과정&amp;lt;BR&amp;gt;2008년 4월 30일 : 처음씀&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IP bonding 이란? ==&lt;br /&gt;
&lt;br /&gt;
 간략히 설명하자면 '''여러장의 NIC를 마치 하나의 NIC로 묶어서 모든 트래픽을 각 NIC에 균등하게 일정한 규칙에 의해서 분산'''시키는 것을 말합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kernel 설정 ==&lt;br /&gt;
우선 저의 Gentoo Linux 환경에서 Linux kernel 2.6.12이하버젼에서는 IP bonding 을 사용하면 시스템이 굉장히 불안해졌습니다.&lt;br /&gt;
&lt;br /&gt;
이에 대해서 좀더 명확히 말씀드리고 싶지만 정신건강을 위해서 2.6.14 이상의 버젼에서 구축하시기를 권장합니다.&lt;br /&gt;
&lt;br /&gt;
Kernel에서 다음의 옵션이 Module 로 설정되어 있는지 확인합니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device Drivers/Network device support/Bonding driver support [M]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
IP bonding 에 대한 커널문서는 커널소스에서 &amp;quot;'''Documentation/networking/bonding.txt'''&amp;quot; 위치에 있으니 한번쯤 읽어보시면 좋겠습니다. 커널을 빌드하면 &amp;quot;'''bonding.ko'''&amp;quot; 모듈이 생겼을겁니다. 정상적으로 Gentoo 를 설치하여 사용중이라면 특별히 &amp;quot;'''/etc/modules.autoload.d/kernel-2.6'''&amp;quot; 에 추가해줄필요는 없을겁니다. 하지만 만약 bonding 모듈이 자동으로 올라가지 않으면 추가해주시면 되겠습니다. 그리고 bonding 에 대한 정책이 여러가지가 있는데 bonding 모듈을 올릴때 이러한 옵션을 지정해줄수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
기본 bonding 처리 정책을 세밀하게 설정하고 싶으시다면 &amp;quot;'''/etc/modules.d/bond'''&amp;quot;(파일이 없다면 아래와 같이 파일을 만드시면 됩니다.)에 적절히 module option을 설정하시고 &amp;quot;'''/sbin/update-modules'''&amp;quot;을 실행시켜준후에 시스템을 재부팅 하시면 됩니다. 주로 기본정책을 설정하는 '''mode'''와 감시주기를 설정하는 '''miimon'''값을 많이 다루게 되는데 여기서 mode는 보통 0또는 1을 많이들 사용하는것 같습니다. 0은 균등하게 배분하여 사용하는 방식으로 운용되며 1은 하나만 쓰다가 NIC가 사용불능이 되면 다른 NIC로 바꿔 사용합니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# read /usr/src/linux/Documentation/networking/bonding.txt for help!&lt;br /&gt;
&lt;br /&gt;
alias bond0 bonding&lt;br /&gt;
options bond0 mode=0 miimon=100&lt;br /&gt;
#alias bond1 bonding&lt;br /&gt;
#options bond1 -o bonding1 arp_interval=200 arp_ip_target=10.0.0.1&lt;br /&gt;
&lt;br /&gt;
# Parameters:&lt;br /&gt;
# arp_interval:arp interval in milliseconds (int)&lt;br /&gt;
# arp_ip_target:arp targets in n.n.n.n form (array of charp)&lt;br /&gt;
# arp_validate:validate src/dst of ARP probes: none (default), active, backup or all (charp)&lt;br /&gt;
# downdelay:Delay before considering link down, in milliseconds (int)&lt;br /&gt;
# lacp_rate:LACPDU tx rate to request from 802.3ad partner (slow/fast) (charp)&lt;br /&gt;
# max_bonds:Max number of bonded devices (int)&lt;br /&gt;
# miimon:Link check interval in milliseconds (int)&lt;br /&gt;
# mode:Mode of operation : 0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, 6 for balance-alb (charp)&lt;br /&gt;
# primary:Primary network device to use (charp)&lt;br /&gt;
# updelay:Delay before considering link up, in milliseconds (int)&lt;br /&gt;
# use_carrier:Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default) (int)&lt;br /&gt;
# xmit_hash_policy:XOR hashing method: 0 for layer 2 (default), 1 for layer 3+4 (charp)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ifenslave 설치 ==&lt;br /&gt;
&lt;br /&gt;
다음과 같이 하여 '''ifenslave 를 설치'''합니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bash# emerge ifenslave&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
또는 커널소스에 보시면 &amp;quot;'''Documentation/networking/ifenslave.c'''&amp;quot; 소스가 있는데 이것을 직접 컴파일하여 &amp;quot;'''/sbin/ifenslave'''&amp;quot; 에 저장하셔도 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Network configuration ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;'''/etc/conf.d/net'''&amp;quot; 에서 아래의 예제를 참조하시어 적절히 수정하시면 됩니다. 아래의 예제는 eth0 가 master가 되고 eth1 이 slave 가 되어 192.168.xx.xx 로 bond0 를 만들어 묶는 것입니다. 이때 eth0와 eth1은 보통 &amp;quot;'''null'''&amp;quot; 을 주시면 무난할겁니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config_eth0=(&amp;quot;null&amp;quot;)&lt;br /&gt;
config_eth1=(&amp;quot;null&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
slaves_bond0=&amp;quot;eth0 eth1&amp;quot;&lt;br /&gt;
config_bond0=(&amp;quot;192.168.xx.xx broadcast 192.168.xx.xx netmask 255.255.255.0&amp;quot;)&lt;br /&gt;
routes_bond0=(&amp;quot;default gw 192.168.xx.1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
depend_bond0() {&lt;br /&gt;
need net.eth0 net.eth1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IP bonding 을 사용해보고서 ==&lt;br /&gt;
&lt;br /&gt;
우선 eth0 또는 eth1 어느한쪽의 LAN cable 을 뽑아도 모든 Network 은 정상적으로 연결이 유지되는것을 보였습니다.&lt;br /&gt;
&lt;br /&gt;
하지만 경우에 따라서는 ping 의 경우 약간의 loss가 일시적으로 발생한 경우가 있기는 합니다.&lt;br /&gt;
&lt;br /&gt;
그리고 여러 호스트에 연결하여 많은 트래픽을 사용할때 약간의 체감속도가 빨라졌습니다.&lt;br /&gt;
&lt;br /&gt;
하지만 1:1 호스트간의 트래픽 향상은 없었습니다.&lt;br /&gt;
&lt;br /&gt;
즉, '''1 vs 다수의 host 연결시에 꽤 좋은 성능'''을 느낄수 있었습니다.&lt;br /&gt;
&lt;br /&gt;
정상적으로 설치가 되었으면 ifconfig 명령으로 다음과 같이 나오는것을 확인할수 있을겁니다.&lt;br /&gt;
&lt;br /&gt;
bond0, eth0, eth1 의 MAC 주소가 모두 같게 나오는것도 흥미로운 부분입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bond0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx&lt;br /&gt;
inet addr:192.168.xx.xx Bcast:192.168.xx.xx Mask:255.255.255.0&lt;br /&gt;
inet6 addr: fe80::20e:cff:fe5a:c405/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:10428636 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:8704619 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
collisions:0 txqueuelen:0&lt;br /&gt;
RX bytes:1987897250 (1895.8 Mb) TX bytes:1630747353 (1555.2 Mb)&lt;br /&gt;
&lt;br /&gt;
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx&lt;br /&gt;
inet6 addr: fe80::20e:cff:fe5a:c405/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:5612670 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:4352310 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
collisions:0 txqueuelen:1000&lt;br /&gt;
RX bytes:1033339780 (985.4 Mb) TX bytes:2955265436 (2818.3 Mb)&lt;br /&gt;
&lt;br /&gt;
eth1 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx&lt;br /&gt;
inet6 addr: fe80::20e:cff:fe5a:c405/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:4815966 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:4352309 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
collisions:0 txqueuelen:1000&lt;br /&gt;
RX bytes:954557470 (910.3 Mb) TX bytes:2970449213 (2832.8 Mb)&lt;br /&gt;
Interrupt:10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 참고문서 ==&lt;br /&gt;
* [^http://www.gentoo-wiki.com/index.php?title=HOWTO_Setup_Bonded_ethernet_adapters&amp;amp;redirect=no]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Gentoo_IP_bonding&amp;diff=990</id>
		<title>Gentoo IP bonding</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Gentoo_IP_bonding&amp;diff=990"/>
		<updated>2013-03-19T12:51:25Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: Gentoo Linux 에서의 IP bonding구축 문서추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;Gentoo Linux 에서의 IP bonding구축&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
Gentoo Linux 에서의 IP bonding구축 ==&lt;br /&gt;
&lt;br /&gt;
* 작성자&amp;lt;BR&amp;gt;조재혁([mailto:minzkn@minzkn.com])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 고친과정&amp;lt;BR&amp;gt;2008년 4월 30일 : 처음씀&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IP bonding 이란? ==&lt;br /&gt;
&lt;br /&gt;
 간략히 설명하자면 '''여러장의 NIC를 마치 하나의 NIC로 묶어서 모든 트래픽을 각 NIC에 균등하게 일정한 규칙에 의해서 분산'''시키는 것을 말합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kernel 설정 ==&lt;br /&gt;
우선 저의 Gentoo Linux 환경에서 Linux kernel 2.6.12이하버젼에서는 IP bonding 을 사용하면 시스템이 굉장히 불안해졌습니다.&lt;br /&gt;
&lt;br /&gt;
이에 대해서 좀더 명확히 말씀드리고 싶지만 정신건강을 위해서 2.6.14 이상의 버젼에서 구축하시기를 권장합니다.&lt;br /&gt;
&lt;br /&gt;
Kernel에서 다음의 옵션이 Module 로 설정되어 있는지 확인합니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Device Drivers/Network device support/Bonding driver support [M]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
IP bonding 에 대한 커널문서는 커널소스에서 &amp;quot;'''Documentation/networking/bonding.txt'''&amp;quot; 위치에 있으니 한번쯤 읽어보시면 좋겠습니다. 커널을 빌드하면 &amp;quot;'''bonding.ko'''&amp;quot; 모듈이 생겼을겁니다. 정상적으로 Gentoo 를 설치하여 사용중이라면 특별히 &amp;quot;'''/etc/modules.autoload.d/kernel-2.6'''&amp;quot; 에 추가해줄필요는 없을겁니다. 하지만 만약 bonding 모듈이 자동으로 올라가지 않으면 추가해주시면 되겠습니다. 그리고 bonding 에 대한 정책이 여러가지가 있는데 bonding 모듈을 올릴때 이러한 옵션을 지정해줄수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
기본 bonding 처리 정책을 세밀하게 설정하고 싶으시다면 &amp;quot;'''/etc/modules.d/bond'''&amp;quot;(파일이 없다면 아래와 같이 파일을 만드시면 됩니다.)에 적절히 module option을 설정하시고 &amp;quot;'''/sbin/update-modules'''&amp;quot;을 실행시켜준후에 시스템을 재부팅 하시면 됩니다. 주로 기본정책을 설정하는 '''mode'''와 감시주기를 설정하는 '''miimon'''값을 많이 다루게 되는데 여기서 mode는 보통 0또는 1을 많이들 사용하는것 같습니다. 0은 균등하게 배분하여 사용하는 방식으로 운용되며 1은 하나만 쓰다가 NIC가 사용불능이 되면 다른 NIC로 바꿔 사용합니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# read /usr/src/linux/Documentation/networking/bonding.txt for help!&lt;br /&gt;
&lt;br /&gt;
alias bond0 bonding&lt;br /&gt;
options bond0 mode=0 miimon=100&lt;br /&gt;
#alias bond1 bonding&lt;br /&gt;
#options bond1 -o bonding1 arp_interval=200 arp_ip_target=10.0.0.1&lt;br /&gt;
&lt;br /&gt;
# Parameters:&lt;br /&gt;
# arp_interval:arp interval in milliseconds (int)&lt;br /&gt;
# arp_ip_target:arp targets in n.n.n.n form (array of charp)&lt;br /&gt;
# arp_validate:validate src/dst of ARP probes: none (default), active, backup or all (charp)&lt;br /&gt;
# downdelay:Delay before considering link down, in milliseconds (int)&lt;br /&gt;
# lacp_rate:LACPDU tx rate to request from 802.3ad partner (slow/fast) (charp)&lt;br /&gt;
# max_bonds:Max number of bonded devices (int)&lt;br /&gt;
# miimon:Link check interval in milliseconds (int)&lt;br /&gt;
# mode:Mode of operation : 0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, 6 for balance-alb (charp)&lt;br /&gt;
# primary:Primary network device to use (charp)&lt;br /&gt;
# updelay:Delay before considering link up, in milliseconds (int)&lt;br /&gt;
# use_carrier:Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default) (int)&lt;br /&gt;
# xmit_hash_policy:XOR hashing method: 0 for layer 2 (default), 1 for layer 3+4 (charp)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ifenslave 설치 ==&lt;br /&gt;
&lt;br /&gt;
다음과 같이 하여 '''ifenslave 를 설치'''합니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bash# emerge ifenslave&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
또는 커널소스에 보시면 &amp;quot;'''Documentation/networking/ifenslave.c'''&amp;quot; 소스가 있는데 이것을 직접 컴파일하여 &amp;quot;'''/sbin/ifenslave'''&amp;quot; 에 저장하셔도 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Network configuration ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;'''/etc/conf.d/net'''&amp;quot; 에서 아래의 예제를 참조하시어 적절히 수정하시면 됩니다. 아래의 예제는 eth0 가 master가 되고 eth1 이 slave 가 되어 192.168.xx.xx 로 bond0 를 만들어 묶는 것입니다. 이때 eth0와 eth1은 보통 &amp;quot;'''null'''&amp;quot; 을 주시면 무난할겁니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config_eth0=(&amp;quot;null&amp;quot;)&lt;br /&gt;
config_eth1=(&amp;quot;null&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
slaves_bond0=&amp;quot;eth0 eth1&amp;quot;&lt;br /&gt;
config_bond0=(&amp;quot;192.168.xx.xx broadcast 192.168.xx.xx netmask 255.255.255.0&amp;quot;)&lt;br /&gt;
routes_bond0=(&amp;quot;default gw 192.168.xx.1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
depend_bond0() {&lt;br /&gt;
need net.eth0 net.eth1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IP bonding 을 사용해보고서 ==&lt;br /&gt;
&lt;br /&gt;
우선 eth0 또는 eth1 어느한쪽의 LAN cable 을 뽑아도 모든 Network 은 정상적으로 연결이 유지되는것을 보였습니다.&lt;br /&gt;
&lt;br /&gt;
하지만 경우에 따라서는 ping 의 경우 약간의 loss가 일시적으로 발생한 경우가 있기는 합니다.&lt;br /&gt;
&lt;br /&gt;
그리고 여러 호스트에 연결하여 많은 트래픽을 사용할때 약간의 체감속도가 빨라졌습니다.&lt;br /&gt;
&lt;br /&gt;
하지만 1:1 호스트간의 트래픽 향상은 없었습니다.&lt;br /&gt;
&lt;br /&gt;
즉, '''1 vs 다수의 host 연결시에 꽤 좋은 성능'''을 느낄수 있었습니다.&lt;br /&gt;
&lt;br /&gt;
정상적으로 설치가 되었으면 ifconfig 명령으로 다음과 같이 나오는것을 확인할수 있을겁니다.&lt;br /&gt;
&lt;br /&gt;
bond0, eth0, eth1 의 MAC 주소가 모두 같게 나오는것도 흥미로운 부분입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bond0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx&lt;br /&gt;
inet addr:192.168.xx.xx Bcast:192.168.xx.xx Mask:255.255.255.0&lt;br /&gt;
inet6 addr: fe80::20e:cff:fe5a:c405/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:10428636 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:8704619 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
collisions:0 txqueuelen:0&lt;br /&gt;
RX bytes:1987897250 (1895.8 Mb) TX bytes:1630747353 (1555.2 Mb)&lt;br /&gt;
&lt;br /&gt;
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx&lt;br /&gt;
inet6 addr: fe80::20e:cff:fe5a:c405/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:5612670 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:4352310 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
collisions:0 txqueuelen:1000&lt;br /&gt;
RX bytes:1033339780 (985.4 Mb) TX bytes:2955265436 (2818.3 Mb)&lt;br /&gt;
&lt;br /&gt;
eth1 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx&lt;br /&gt;
inet6 addr: fe80::20e:cff:fe5a:c405/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:4815966 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:4352309 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
collisions:0 txqueuelen:1000&lt;br /&gt;
RX bytes:954557470 (910.3 Mb) TX bytes:2970449213 (2832.8 Mb)&lt;br /&gt;
Interrupt:10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 참고문서 ==&lt;br /&gt;
* [^http://www.gentoo-wiki.com/index.php?title=HOWTO_Setup_Bonded_ethernet_adapters&amp;amp;redirect=no]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=989</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=989"/>
		<updated>2013-03-19T12:50:36Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 문서&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]]&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]]&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL_On_Gentoo|PostgreSQL On Gentoo]]&lt;br /&gt;
&lt;br /&gt;
[[Oracle11g_For_Gentoo|Oracle11g For Gentoo]]&lt;br /&gt;
&lt;br /&gt;
[[Oracle92_For_Gentoo|Oracle 9.2 For Gentoo]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_IP_bonding|Gentoo Linux 에서의 IP bonding구축]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Oracle92_For_Gentoo&amp;diff=988</id>
		<title>Oracle92 For Gentoo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Oracle92_For_Gentoo&amp;diff=988"/>
		<updated>2013-03-19T12:43:34Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: Oracle 9.2 For Gentoo 문서 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;Oracle 9.2 For Gentoo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oracle Installation(Gentoo + Oracle9.2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating Oracle User Accounts ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# groupadd dba        # group of users to be granted with SYSDBA system privilege&lt;br /&gt;
# groupadd oinstall     # group owner of Oracle files&lt;br /&gt;
# useradd -g oinstall -G dba -d /usr/oracle oracle&lt;br /&gt;
# passwd oracle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downgrade binutils ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge -pv binutils&lt;br /&gt;
&lt;br /&gt;
These are the packages that I would merge, in order:&lt;br /&gt;
&lt;br /&gt;
Calculating dependencies ...done!&lt;br /&gt;
[ebuild     U ] sys-devel/binutils-2.14.90.0.8-r1 [2.14.90.0.7-r4] -bootstrap -build +nls  10,777 kB&lt;br /&gt;
&lt;br /&gt;
Total size of downloads: 10,777 kB&lt;br /&gt;
&lt;br /&gt;
# emerge /usr/portage/sys-devel/binutils/binutils-2.13.90.0.18-r1.ebuild&lt;br /&gt;
# INSTALL 후에 원래대로 upgrade 한다(# emerge -u binutils)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 커널 파라미터 설정 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /proc/sys/kernel/shmmax&lt;br /&gt;
=&amp;gt;33554432&lt;br /&gt;
# echo `expr 1024 \* 1024 \* 1024` &amp;gt; /proc/sys/kernel/shmmax&lt;br /&gt;
# cat /proc/sys/kernel/shmmax&lt;br /&gt;
# vi /etc/sysctl.conf (영구적으로 설정)&lt;br /&gt;
kernel.shmmax=1073741824&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 다운 받은 파일 압축 풀기 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gunzip lnx_920_disk1.cpio.gz&lt;br /&gt;
# cpio -idmv &amp;lt; lnx_920_disk1.cpio&lt;br /&gt;
# disk2,3 도 동일하게 작업한다.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tomcat의 Port No 변경하기 ==&lt;br /&gt;
&lt;br /&gt;
Tomcat이 설치가 되어 있고 Port No를 8080으로 사용하고 있다면 Port No 를 변경해 주어야 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /opt/tomcat/conf/server.xml&lt;br /&gt;
&amp;lt;!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change port number for oracle http server 8080-&amp;gt;8088 by santana --&amp;gt;&lt;br /&gt;
    &amp;lt;Connector className=&amp;quot;org.apache.coyote.tomcat4.CoyoteConnector&amp;quot;&lt;br /&gt;
               port=&amp;quot;8088&amp;quot; minProcessors=&amp;quot;5&amp;quot; maxProcessors=&amp;quot;75&amp;quot;&lt;br /&gt;
               enableLookups=&amp;quot;true&amp;quot; redirectPort=&amp;quot;8443&amp;quot;&lt;br /&gt;
               acceptCount=&amp;quot;100&amp;quot; debug=&amp;quot;0&amp;quot; connectionTimeout=&amp;quot;20000&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== My .bash_profile For Oracle User ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export ORACLE_SID=ARIRANG&lt;br /&gt;
export ORACLE_BASE=/usr/oracle/db&lt;br /&gt;
export ORACLE_HOME=/usr/oracle/db&lt;br /&gt;
export ORACLE_TERM=xterm&lt;br /&gt;
export TNS_ADMIN=/usr/oracle/db/network/admin&lt;br /&gt;
export NLS_LANG=American_America.KO16KSC5601&lt;br /&gt;
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data&lt;br /&gt;
export ORACLE_OWNER=oracle&lt;br /&gt;
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/ucblib:/usr/X11/lib:/usr/local/lib&lt;br /&gt;
export PATH=/bin:/usr/bin:/usr/sbin:$ORACLE_HOME/bin:/usr/X11/bin:/usr/local/bin:/usr/X11R6/bin:$ORACLE_HOME/dba&lt;br /&gt;
#export DISPLAY=:0.0&lt;br /&gt;
export LANG=C&lt;br /&gt;
export EDITOR=vi&lt;br /&gt;
export TMPDIR=/tmp&lt;br /&gt;
export TMP=/tmp&lt;br /&gt;
export TEMP=/tmp&lt;br /&gt;
#export JAVA_HOME=/usr/java/jdk1.3.1_02&lt;br /&gt;
export JAVA_HOME=/opt/blackdown-jdk-1.4.1&lt;br /&gt;
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH&lt;br /&gt;
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib&lt;br /&gt;
export CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib&lt;br /&gt;
&lt;br /&gt;
alias ll='ls -la'&lt;br /&gt;
alias lx='ls -alxF'&lt;br /&gt;
alias oh='cd $ORACLE_HOME'&lt;br /&gt;
set -o vi&lt;br /&gt;
#PS1='($ORAPRD):/\W $ '&lt;br /&gt;
PS1='\[\033[01;32m\]\u@\h \[\033[01;34m\]\W \$ \[\033[00m\]'&lt;br /&gt;
cd db/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 설치 시작 ==&lt;br /&gt;
&lt;br /&gt;
0. 설치전 디스크의 공간&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
oracle@arirang oracle $ df -h&lt;br /&gt;
Filesystem            Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/hda2              28G  2.2G   24G   9% /&lt;br /&gt;
/dev/hda1              99M  9.4M   85M  10% /boot&lt;br /&gt;
/dev/hda5              19G  159M   18G   1% /var&lt;br /&gt;
/dev/hda6              64G  4.8G   56G   8% /data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. runInstaller 를 실행한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /data/Disk1/runInstaller &amp;amp;&lt;br /&gt;
$ Initializing Java Virtual Machine from /tmp/OraInstall2004-04-11_10-10-22PM/jre/bin/java.&lt;br /&gt;
Please wait... /tmp/OraInstall2004-04-11_10-10-22PM/jre/bin/i386/native_threads/java:&lt;br /&gt;
error while loading shared libraries: libstdc++-libc6.1-1.so.2:&lt;br /&gt;
cannot open shared object file: No such file or directory &lt;br /&gt;
[1]+  Done                    ./runInstaller&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: 상기와 같은 에러 발생시 아래의 패키지를 설치해야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge -pv lib-compat&lt;br /&gt;
&lt;br /&gt;
These are the packages that I would merge, in order:&lt;br /&gt;
&lt;br /&gt;
Calculating dependencies ...done!&lt;br /&gt;
[ebuild  N    ] sys-libs/lib-compat-1.3   3,076 kB&lt;br /&gt;
&lt;br /&gt;
Total size of downloads: 3,076 kB&lt;br /&gt;
&lt;br /&gt;
# emerge lib-compat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. 다시 한 번 runInstaller 를 실행한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ Initializing Java Virtual Machine from /tmp/OraInstall2004-04-11_10-20-11PM/jre/bin/java. Please wait...&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
Font specified in font.properties not found [--symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific]&lt;br /&gt;
&lt;br /&gt;
[1]+  Done                    ./runInstaller&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: 상기와 같은 에러가 나면서 화면의 폰트가 깨어져 보인다면 아래와 같이 한다.&lt;br /&gt;
&lt;br /&gt;
/data/ftp_data/comp/Linux/oracle/Disk1/stage/Components/oracle.swd.jre/1.3.1.0.0/1/DataFiles/Expanded/jre/linux/lib&lt;br /&gt;
에 있는 font.properties 를 수정한다.(또는 font.properties.ko 파일을 만들어 준다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
가장 확실한 방법은 그냥 영문으로 인스톨하는 것이다. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ unset LANG&lt;br /&gt;
$ unset LC_ALL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. OK 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5. Unix Group Name에 oinstall 입력 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6. root 로 /tmp/orainstRoot.sh 를 실행한 후 Contiune 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /tmp/orainstRoot.sh&lt;br /&gt;
Creating Oracle Inventory pointer file (/etc/oraInst.loc)&lt;br /&gt;
Changing groupname of /usr/oracle/db/oraInventory to oinstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Product Languages 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Korean 을 추가한 후 OK 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Oracle9i Database 9.2.0.1.0을 선택 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
11. Enterprise Edition (1.74GB)을 선택 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. General Purposef 를 선택 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13. Global Database Name과 SID를 입력 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
14. Database Performace를 위해 Database File의 위치는 다른 Disk로 하는 것이 좋다. 그러나 다른 Disk가 없다면 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
15. Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
16. Install 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
17. 설치가 시작된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
18. 설치중 아래와 같은 에러가 나면 다음과 같이 처리한 후 Retry 버튼을 누른다.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ vi $ORACLE_HOME/ctx/lib/env_ctx.mk를 열어서 1365라인정도에 있는 INSO_LINK에 $(LDLIBFLAG)dl 를 추가합니다.&lt;br /&gt;
&lt;br /&gt;
INSO_LINK = -L$(CTXLIB) $(LDLIBFLAG)m $(LDLIBFLAG)sc_ca $(LDLIBFLAG)dl $(LDLIBFLAG)sc_fa &lt;br /&gt;
$(LDLIBFLAG)sc_ex $(LDLIBFLAG)sc_da $(LDLIBFLAG)sc_ut $(LDLIBFLAG)sc_ch $(LDLIBFLAG)sc_fi &lt;br /&gt;
$(LLIBCTXHX) $(LDLIBFLAG)c -Wl,-rpath,$(CTXHOME)lib $(CORELIBS) $(COMPEOBJS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
19. 아래와 같은 메시지가 나오면 root로 /usr/oracle/db/root.sh를 실행한 후 OK버튼을 누른다 .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /usr/oracle/db/root.sh&lt;br /&gt;
Running Oracle9 root.sh script...&lt;br /&gt;
\nThe following environment variables are set as:&lt;br /&gt;
    ORACLE_OWNER= oracle&lt;br /&gt;
    ORACLE_HOME=  /usr/oracle/db&lt;br /&gt;
&lt;br /&gt;
Enter the full pathname of the local bin directory: [/usr/local/bin]:&lt;br /&gt;
   Copying dbhome to /usr/local/bin ...&lt;br /&gt;
   Copying oraenv to /usr/local/bin ...&lt;br /&gt;
   Copying coraenv to /usr/local/bin ...&lt;br /&gt;
&lt;br /&gt;
\nCreating /etc/oratab file...&lt;br /&gt;
Adding entry to /etc/oratab file...&lt;br /&gt;
Entries will be added to the /etc/oratab file as needed by&lt;br /&gt;
Database Configuration Assistant when a database is created&lt;br /&gt;
Finished running generic part of root.sh script.&lt;br /&gt;
Now product-specific root actions will be performed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
실행후에는 /usr/local/bin에 coraenv,dbhome,oraenv 3개의 파일이 생성된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
20. Oracle Database Configuration Assistant 설치에 실패하였다. (일단 SKIP)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ vi $ORACLE_HOME/bin/dbca 마지막 부분을 아래와 같이 수정한다.&lt;br /&gt;
#if [ -f /etc/rac_on ]; then&lt;br /&gt;
# Run DBCA&lt;br /&gt;
$JRE_DIR/bin/jre -native -DORACLE_HOME=$OH -DJDBC_PROTOCOL=thin -mx64m -classpath $CLASSPATH oracle.sysman.assistants.dbca.Dbca $ARGUMENTS&lt;br /&gt;
#else&lt;br /&gt;
# Run DBCA&lt;br /&gt;
#$JRE_DIR/bin/jre -DORACLE_HOME=$OH -DJDBC_PROTOCOL=thin -mx64m -classpath $CLASSPATH oracle.sysman.assistants.dbca.Dbca $ARGUMENTS&lt;br /&gt;
#fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21. 설치가 끝났다.  Exit 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
22. 20번에서 그냥 스킵했을 경우에는 $ORACLE_HOME/bin/dbca dbca를 실행한다. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dbca &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
23. Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
24. Create a database를 선택 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
25. General Purpose를 선택 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
26. Global Database Name과 SID를 입력 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
27. Dedicated Server Mode를 선택 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28. Archive탭에서 Archive Log Mode로 선택하고 Archive가 저장될 장소를 지정하고 이 외에 메모리나 캐릭터셋이나 DB Sizing을 적당히 조정한 후 Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
29. Next 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
30. Create Database를 선택 후 Finish 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
31. Summary 를 보여준다. OK 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
32. database 생성을 시작한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
33. SYS와 SYSTEM 유저의 패스워들를 입력 후 Exit 버튼을 누른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
34. 설치가 완료되었다. sqlplus로 접속하여 확인하여 보자.&lt;br /&gt;
&lt;br /&gt;
접속전 반드시 뒷부분의 tnsnames.ora 와 listener.ora 파일을 참조하여 2개의 파일의 설정을 확인한다. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sqlplus /nolog&lt;br /&gt;
&lt;br /&gt;
SQL*Plus: Release 9.2.0.1.0 - Production on Sun Apr 18 16:30:44 2004&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.&lt;br /&gt;
&lt;br /&gt;
SQL&amp;gt; connect / as sysdba&lt;br /&gt;
Connected.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; startup&lt;br /&gt;
ORA-01081: cannot start already-running ORACLE - shut it down first&lt;br /&gt;
SQL&amp;gt; select sysdate from dual;&lt;br /&gt;
&lt;br /&gt;
SYSDATE&lt;br /&gt;
---------&lt;br /&gt;
18-APR-04&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
35. 가장 많은 예제로 쓰이는 EMP, DEPT 테이블 예제를 만들어 본다. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd $ORALCE_HOME/sqlplus/demo&lt;br /&gt;
$ sqlplus /nolog&lt;br /&gt;
SQL&amp;gt; @demobld.sql&lt;br /&gt;
Building demonstration tables.  Please wait.&lt;br /&gt;
Demonstration table build is complete.&lt;br /&gt;
&lt;br /&gt;
SQL&amp;gt; select * from emp;&lt;br /&gt;
     EMPNO ENAME                JOB                       MGR HIREDATE         SAL       COMM     DEPTNO&lt;br /&gt;
---------- -------------------- ------------------ ---------- --------- ---------- ---------- ----------&lt;br /&gt;
      7369 SMITH                CLERK                    7902 17-DEC-80        800                     20&lt;br /&gt;
      7499 ALLEN                SALESMAN               7698 20-FEB-81       1600        300         30&lt;br /&gt;
      7521 WARD                SALESMAN               7698 22-FEB-81       1250        500         30&lt;br /&gt;
      7566 JONES               MANAGER                 7839 02-APR-81       2975                    20&lt;br /&gt;
      7654 MARTIN              SALESMAN                7698 28-SEP-81       1250       1400        30&lt;br /&gt;
      7698 BLAKE               MANAGER                 7839 01-MAY-81       2850                    30&lt;br /&gt;
      7782 CLARK               MANAGER                 7839 09-JUN-81       2450                    10&lt;br /&gt;
      7788 SCOTT              ANALYST                  7566 09-DEC-82       3000                    20&lt;br /&gt;
      7839 KING                 PRESIDENT                      17-NOV-81       5000                    10&lt;br /&gt;
      7844 TURNER              SALESMAN                7698 08-SEP-81      1500          0         30&lt;br /&gt;
      7876 ADAMS               CLERK                    7788 12-JAN-83       1100                    20&lt;br /&gt;
&lt;br /&gt;
     EMPNO ENAME                JOB                       MGR HIREDATE         SAL       COMM     DEPTNO&lt;br /&gt;
---------- -------------------- ------------------ ---------- --------- ---------- ---------- ----------&lt;br /&gt;
      7900 JAMES                CLERK                    7698 03-DEC-81        950                    30&lt;br /&gt;
      7902 FORD                 ANALYST                 7566 03-DEC-81        3000                   20&lt;br /&gt;
      7934 MILLER               CLERK                     7782 23-JAN-82       1300                    10&lt;br /&gt;
&lt;br /&gt;
14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
36. 설치 후 디스크 공간 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ df -h&lt;br /&gt;
Filesystem            Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/hda2              28G  7.2G   19G  28% /&lt;br /&gt;
/dev/hda1              99M  9.4M   85M  10% /boot&lt;br /&gt;
/dev/hda5              19G  187M   18G   2% /var&lt;br /&gt;
/dev/hda6              64G  4.8G   56G   8% /data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== My tnsnames.ora ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# TNSNAMES.ORA Network Configuration File: /usr/oracle/db/network/admin/tnsnames.ora&lt;br /&gt;
# Generated by Oracle configuration tools.&lt;br /&gt;
&lt;br /&gt;
ARIRANG =&lt;br /&gt;
  (DESCRIPTION =&lt;br /&gt;
    (ADDRESS_LIST =&lt;br /&gt;
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))&lt;br /&gt;
    )&lt;br /&gt;
    (CONNECT_DATA =&lt;br /&gt;
      (SERVER = DEDICATED)&lt;br /&gt;
      (SERVICE_NAME = ARIRANG)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
INST1_HTTP =&lt;br /&gt;
  (DESCRIPTION =&lt;br /&gt;
    (ADDRESS_LIST =&lt;br /&gt;
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))&lt;br /&gt;
    )&lt;br /&gt;
    (CONNECT_DATA =&lt;br /&gt;
      (SERVER = SHARED)&lt;br /&gt;
      (SERVICE_NAME = MODOSE)&lt;br /&gt;
      (PRESENTATION = http://HRService)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
EXTPROC_CONNECTION_DATA =&lt;br /&gt;
  (DESCRIPTION =&lt;br /&gt;
    (ADDRESS_LIST =&lt;br /&gt;
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))&lt;br /&gt;
    )&lt;br /&gt;
    (CONNECT_DATA =&lt;br /&gt;
      (SID = PLSExtProc)&lt;br /&gt;
      (PRESENTATION = RO)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== My listener.ora ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# LISTENER.ORA Network Configuration File: /usr/oracle/db/network/admin/listener.ora&lt;br /&gt;
# Generated by Oracle configuration tools.&lt;br /&gt;
&lt;br /&gt;
LISTENER =&lt;br /&gt;
  (DESCRIPTION_LIST =&lt;br /&gt;
    (DESCRIPTION =&lt;br /&gt;
      (ADDRESS_LIST =&lt;br /&gt;
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))&lt;br /&gt;
      )&lt;br /&gt;
      (ADDRESS_LIST =&lt;br /&gt;
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))&lt;br /&gt;
      )&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
SID_LIST_LISTENER =&lt;br /&gt;
  (SID_LIST =&lt;br /&gt;
    (SID_DESC =&lt;br /&gt;
      (SID_NAME = PLSExtProc)&lt;br /&gt;
      (ORACLE_HOME = /usr/oracle/db)&lt;br /&gt;
      (PROGRAM = extproc)&lt;br /&gt;
    )&lt;br /&gt;
    (SID_DESC =&lt;br /&gt;
      (GLOBAL_DBNAME = ARIRANG)&lt;br /&gt;
      (ORACLE_HOME = /usr/oracle/db)&lt;br /&gt;
      (SID_NAME = ARIRANG)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 참조 문서 ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.puschitz.com/InstallingOracle9i.shtml http://www.puschitz.com/InstallingOracle9i.shtml]&lt;br /&gt;
* [http://forums.gentoo.org http://forums.gentoo.org]&lt;br /&gt;
* [http://www.goole.com http://www.goole.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 문서 작성자들 ==&lt;br /&gt;
&lt;br /&gt;
* 최초 작성자: 2004/05/01 조시현&lt;br /&gt;
* 옮긴이: 2013/03/19 GentooKR 작업자&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 기 타 ==&lt;br /&gt;
&lt;br /&gt;
* Gentoo에서 오라클 사용하시는 분들의 많은 도움 부탁드립니다. -- 조시현&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=987</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=987"/>
		<updated>2013-03-19T12:32:53Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 문서링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]]&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]]&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL_On_Gentoo|PostgreSQL On Gentoo]]&lt;br /&gt;
&lt;br /&gt;
[[Oracle11g_For_Gentoo|Oracle11g For Gentoo]]&lt;br /&gt;
&lt;br /&gt;
[[Oracle92_For_Gentoo|Oracle 9.2 For Gentoo]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Oracle11g_For_Gentoo&amp;diff=986</id>
		<title>Oracle11g For Gentoo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Oracle11g_For_Gentoo&amp;diff=986"/>
		<updated>2013-03-19T10:52:56Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: Oracle11g For Gentoo 페이지 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;Oracle11g For Gentoo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Oracle11g For Gentoo ==&lt;br /&gt;
&lt;br /&gt;
* 실행 되는듯.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 참고 ==&lt;br /&gt;
&lt;br /&gt;
* http://gentoo-wiki.com/HOWTO_Install_Oracle_10g&lt;br /&gt;
* http://kekedie.tistory.com/tag/ubuntu&lt;br /&gt;
* http://zarick.blogspot.com/search/label/oracle&lt;br /&gt;
* http://ubuntuforums.org/showthread.php?t=592064&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 준비 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /opt/oracle/oraInventory -p&lt;br /&gt;
groupadd dba&lt;br /&gt;
groupadd oinstall&lt;br /&gt;
useradd -m oracle -g oinstall -G dba -s /bin/bash -d /opt/oracle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== /opt/oracle/env ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export ORACLE_BASE=/opt/oracle&lt;br /&gt;
export ORACLE_HOME=/opt/oracle/product/11.1.0.6.0&lt;br /&gt;
export ORACLE_SID=orcl11&lt;br /&gt;
export ORACLE_OWNER=oracle&lt;br /&gt;
export oraInventory=$ORACLE_HOME/oraInventory&lt;br /&gt;
export PATH=$PATH:$ORACLE_HOME/bin&lt;br /&gt;
export LANG=C&lt;br /&gt;
export LC_ALL=C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 권한 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /opt/oracle&lt;br /&gt;
chown -R oracle:oinstall .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== libstdc++.so.6 ===&lt;br /&gt;
&lt;br /&gt;
* 링크가 잘못되어 있다.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /usr/lib64&lt;br /&gt;
ln -sf /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.1/libstdc++.so.6 .&lt;br /&gt;
cd /usr/lib32&lt;br /&gt;
ln -sf /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.1/32/libstdc++.so.6 .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DISPLAY ===&lt;br /&gt;
&lt;br /&gt;
* 설치할 때만 필요하다.&lt;br /&gt;
* startx 에서 -no-listen tcp 를 뺀다. (X 재시동 필요)&amp;lt;pre&amp;gt;xhost +&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 설치 ==&lt;br /&gt;
&lt;br /&gt;
=== 실행 ===&lt;br /&gt;
&lt;br /&gt;
* 압축해제&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - oracle&lt;br /&gt;
cd unzipped directory&lt;br /&gt;
source /opt/oracle/env&lt;br /&gt;
export DISPLAY=:0.0&lt;br /&gt;
./runInstaller -ignoreSysPrereqs&amp;lt;/pre&amp;gt;&lt;br /&gt;
* http://kekedie.tistory.com/tag/ubuntu GUI 옵션 스샷참조&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 오류 ===&lt;br /&gt;
&lt;br /&gt;
* 오류가 발생하면 아래를 실행한 후 Retry 를 한다.&lt;br /&gt;
* 절대 GUI 를 종료하지 않는다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $ORACLE_HOME&lt;br /&gt;
sed -ie 's/$/ -lrt/' lib/sysliblist&lt;br /&gt;
sed -ie 's/$/ -lrt/' lib32/sysliblist&lt;br /&gt;
perl -pi -e 's/(LDFLAGS32=.*?@)/$1 -L\/usr\/lib32/g' ctx/lib/env_ctx.mk&lt;br /&gt;
perl -pi -e 's/(REDEFINES32=.*?@)/$1 -L\/usr\/lib32/g' rdbms/lib/env_rdbms.mk&lt;br /&gt;
perl -pi -e 's/(LD=&amp;quot;gcc.*?relax)/$1 ${USRLIB32}/g' bin/genclntsh&lt;br /&gt;
perl -pi -e 's/(LD=&amp;quot;gcc.*?relax)/$1 \${USRLIB32}/g' bin/genclntsh&lt;br /&gt;
perl -pi -e 's/(NON64_LDOPT=\n)/$1USRLIB32=\n/g' bin/genagtsh&lt;br /&gt;
perl -pi -e 's/(NON64_LDOPT=.*?&amp;quot;\n)/$1USRLIB32=-L\/usr\/lib32\n/g' bin/genagtsh&lt;br /&gt;
perl -pi -e 's/(LD=&amp;quot;gcc.*?shared)/$1 \${USRLIB32}/g' bin/genagtsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin/relink all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== init ==&lt;br /&gt;
&lt;br /&gt;
=== /etc/init.d/ora.database ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/sbin/runscript&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
# File:    /etc/init.d/ora.database&lt;br /&gt;
# Purpose:  Startup Oracle Database(s) defined in /etc/oratab&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
depend() {&lt;br /&gt;
	use logger&lt;br /&gt;
    need net hostname clock&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
start() {&lt;br /&gt;
	source /opt/oracle/env&lt;br /&gt;
&lt;br /&gt;
    if [ ! -f $ORACLE_HOME/bin/dbstart ]&lt;br /&gt;
    then&lt;br /&gt;
        ewarn &amp;quot;Oracle not started (no dbstart script)&amp;quot;&lt;br /&gt;
        return 1&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    ebegin &amp;quot;Starting Oracle&amp;quot;&lt;br /&gt;
    /bin/su - $ORACLE_OWNER -c &amp;quot;source /opt/oracle/env; $ORACLE_HOME/bin/dbstart&amp;quot; &amp;gt;&amp;gt; /dev/null&lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
stop() {&lt;br /&gt;
	source /opt/oracle/env&lt;br /&gt;
&lt;br /&gt;
    if [ ! -f $ORACLE_HOME/bin/dbshut ]&lt;br /&gt;
    then&lt;br /&gt;
        ewarn &amp;quot;Oracle not stopped (no dbshut script)&amp;quot;&lt;br /&gt;
        return 1&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    ebegin &amp;quot;Stopping Oracle&amp;quot;&lt;br /&gt;
    /bin/su - $ORACLE_OWNER -c &amp;quot;source /opt/oracle/env; $ORACLE_HOME/bin/dbshut&amp;quot; &amp;gt;&amp;gt; /dev/null&lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== /etc/init.d/ora.listener ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/sbin/runscript&lt;br /&gt;
#----------------------------------------------------------------------&lt;br /&gt;
# file /etc/init.d/ora.listener&lt;br /&gt;
# Startup Oracle Listeners&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
depend() {&lt;br /&gt;
    need net&lt;br /&gt;
    after ora.database&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
start() {&lt;br /&gt;
	source /opt/oracle/env&lt;br /&gt;
    ebegin &amp;quot;Start Oracle Listeners&amp;quot;&lt;br /&gt;
    /bin/su $ORACLE_OWNER -c &amp;quot;source /opt/oracle/env; $ORACLE_HOME/bin/lsnrctl start LISTENER&amp;quot; &amp;gt;&amp;gt; /dev/null&lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
stop() {&lt;br /&gt;
	source /opt/oracle/env&lt;br /&gt;
    ebegin &amp;quot;Stopping Oracle Listeners&amp;quot;&lt;br /&gt;
    /bin/su $ORACLE_OWNER -c &amp;quot;source /opt/oracle/env; $ORACLE_HOME/bin/lsnrctl stop LISTENER&amp;quot; &amp;gt;&amp;gt; /dev/null&lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== /etc/init.d/ora.console ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/sbin/runscript&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
# File:    /etc/init.d/ora.console&lt;br /&gt;
# Purpose:  Startup Oracle Enterprise Manager DB Console and ISQL&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
depend() {&lt;br /&gt;
    need net&lt;br /&gt;
    after ora.listener&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
start() {&lt;br /&gt;
	source /opt/oracle/env&lt;br /&gt;
    ebegin &amp;quot;Start Oracle Enterprise Manager DB Console&amp;quot;&lt;br /&gt;
    /bin/su $ORACLE_OWNER -c &amp;quot;source /opt/oracle/env; $ORACLE_HOME/bin/emctl start dbconsole&amp;quot; &amp;gt;&amp;gt; /dev/null&lt;br /&gt;
    #/bin/su $ORACLE_OWNER -c &amp;quot;$ORACLE_HOME/bin/isqlplusctl start&amp;quot;&lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
stop() {&lt;br /&gt;
	source /opt/oracle/env&lt;br /&gt;
    ebegin &amp;quot;Stopping Oracle Enterprise Manager DB Console&amp;quot;&lt;br /&gt;
    /bin/su $ORACLE_OWNER -c &amp;quot;source /opt/oracle/env; $ORACLE_HOME/bin/emctl stop dbconsole&amp;quot; &amp;gt;&amp;gt; /dev/null&lt;br /&gt;
    #/bin/su $ORACLE_OWNER -c &amp;quot;$ORACLE_HOME/bin/isqlplusctl stop&amp;quot;&lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== chmod ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x /etc/init.d/ora.*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== /etc/oratab ===&lt;br /&gt;
&lt;br /&gt;
* N 을 Y 로 수정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== web interface ==&lt;br /&gt;
* https://localhost:1158/em/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=985</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=985"/>
		<updated>2013-03-19T10:48:43Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 문서링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]]&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]]&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL_On_Gentoo|PostgreSQL On Gentoo]]&lt;br /&gt;
&lt;br /&gt;
[[Oracle11g_For_Gentoo|Oracle11g For Gentoo]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=PostgreSQL_On_Gentoo&amp;diff=984</id>
		<title>PostgreSQL On Gentoo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=PostgreSQL_On_Gentoo&amp;diff=984"/>
		<updated>2013-03-19T10:47:22Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 내용수정&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;PostgreSQL On Gentoo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 문서는 [[Gentoo Linux]] 에서 [http://wiki.kldp.org/wiki.php/PostgreSQL PostgreSQL]을 설치하기 위한 문서입니다. http://www.gentoo.org/doc/en/postgres-howto.xml 을 원본으로 하여 번역한 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 소개 ==&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL 소개 ===&lt;br /&gt;
&lt;br /&gt;
대부분의 개발자와 다른 데이터베이스 솔루션들에 대하여 대화를 나누어 보면, 두 가지 종류의 데이터베이스가 주로 대답으로 나옵니다. 하나는 [http://wiki.kldp.org/wiki.php/MySQL MySQL]이고 다른 하나는 이 문서에서 다루고자 하는 [http://wiki.kldp.org/wiki.php/PostgreSQL PostgreSQL] 입니다. 서로간의 장단점에 대해서 오랜 시간동안 논쟁이 있어 왔지만, PostgreSQL이 MySQL보다 진정한 관계형 데이터베이스 구조에는 더 확고하다는 말이 있습니다. FOREIGN KEY와 같은 대부분의 기본적인 특징들이 MySQL 5에서 추가되었습니다. 그러나 어떤 상황이 되든, 이 문서는 여러분이 PostgreSQL 을 사용할 데이터베이스로 선택했다고 가정합니다. 처음 해야 할 일은 emerge 과정을 시작하는 것입니다. 다음 섹션에서는 기본 설정 뿐만 아니라 emerge를 통한 설치 과정을 설명할 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL 설치하기 ===&lt;br /&gt;
&lt;br /&gt;
시작하려면 먼저 PostgreSQL 패키지를 emerge 해야 합니다. 이렇게 하려면 다음과 같은 코드로 옵션이 제대로 설정되어 있는지를 먼저 확인해야 합니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 1.1: PostgreSQL 빌드 옵션 확인&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge -pv postgresql&lt;br /&gt;
&lt;br /&gt;
These are the packages that I would merge, in order:&lt;br /&gt;
&lt;br /&gt;
Calculating dependencies ...done!&lt;br /&gt;
[ebuild  N    ] dev-db/postgresql-8.0.4  -doc -kerberos +libg++ +nls +pam +perl&lt;br /&gt;
-pg-hier -pg-intdatetime +python +readline (-selinux) +ssl -tcltk +xml2 +zlib 0 kB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기 서로 다른 빌드 옵션이 나타내는 것의 목록이 있습니다.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''USE 플래그'''||'''의미'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|doc||이 USE 플래그는 표준 man 페이지의 외부 문서 설치를 켜거나 끕니다. 공간이 적거나 문서를 얻을 수 있는 다른 방법(온라인 등)이 있으시면 이것을 끄시면 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|kerberos||데이터베이스에 이 옵션을 켜서 접속하면 admin이 데이터베이스로의 사용자/서비스를 검증할 때, kerberos를 사용하는 옵션을 갖습니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|libg++||이 옵션이 켜져 있으면 PostgreSQL의 C++ 바인딩이 설치됩니다. C++ 프로그래머가 연결할 수 있는 libpq++가 설치됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|nls||이 옵션이 켜져 있으면 영어를 사용하지 않는 사용자를 위하여 번역된 문자열을 쓸 수 있습니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|pam||이 옵션이 켜져 있고, admin이 PostgreSQL 설정 파일을 제대로 설정하면 사용자/서비스는 PAM(Pluggable Authentication Module)을 이용하여 PostgreSQL에 로그인 할 수 있게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|perl||이 옵션이 켜져 있으면 PostgreSQL의 펄 바인딩이 설치됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|pg-hier||이 옵션이 켜져 있으면 오라클 데이터베이스의 CONNECT 문에서 볼 수 있는 계층적 질의를 켜는 패치를 적용하게 됩니다. 오라클 참조 안내서에 계층적 질의에 대한 더 많은 정보가 있습니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|pg-intdatetime ||이 옵션이 켜져 있으면 PostgreSQL은 64비트 정수 날짜 형식을 지원하게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|python||이 옵션이 켜져 있으면, PostgreSQL은 파이썬 바인딩을 설치하게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|readline||이 옵션이 켜져 있으면, PostgreSQL은 readline 스타일의 명령줄 편집을 지원하게 됩니다. 이것은 명령 히스토리와 isearch 기능을 포함합니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|selinux||이 옵션이 켜져 있으면, PostgreSQL의 selinux 정책이 설치 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|ssl|| 이 옵션이 켜져 있으면, PostgreSQL은 OpenSSL 라이브러리로 PostgreSQL 클라이언트와 서버 사이의 트래픽을 암호화하게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|tcltk||이 옵션이 켜져 있으면, PostgreSQL은 tcl/tk 바인딩을 설치하게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|xml2||이 옵션이 켜져 있으면, XPATH 스타일 xml 지원이 설치되게 됩니다. PostgreSQL의 xml 지원에 대한 더 자세한 정보는 PostgreSQL과 XML에서 찾으실 수 있습니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|zlib||이것은 PostgreSQL 자체에서는 사용하지 않습니다만 pg_dump에서 생성하는 덤프를 압축합니다.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |빌드시점에서의 USE플래그와 의미&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''주의:''' pg-hier 패치 작성자는 패치 업무를 중단하였으며, 다음 버전에서는 삭제될 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PostgreSQL을 여러분의 필요에 따라서 커스터마이징 하였다면 계속 진행하여 emerge를 시작하십시오.&lt;br /&gt;
&lt;br /&gt;
코드 목록 1.2: PostgreSQL emerge 하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge postgresql&lt;br /&gt;
(Output shortened)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; /usr/lib/libecpg.so.5 -&amp;gt; libecpg.so.5.0&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; /usr/bin/postmaster -&amp;gt; postgres&lt;br /&gt;
 * Make sure the postgres user in /etc/passwd has an account setup with /bin/bash as the shell&lt;br /&gt;
 *&lt;br /&gt;
 * Execute the following command&lt;br /&gt;
 * emerge --config =postgresql-8.0.4&lt;br /&gt;
 * to setup the initial database environment.&lt;br /&gt;
 *&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Regenerating /etc/ld.so.cache...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dev-db/postgresql-8.0.4 merged.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
einfo 출력에서 나타났듯이, 설치 후에 해야 할 작업들이 있습니다. 다음 장에서 PostgreSQL의 실제 설정에 대해서 살펴볼 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PostgreSQL 설정하기 ==&lt;br /&gt;
&lt;br /&gt;
=== 초기 데이터베이스 환경 설정하기 ===&lt;br /&gt;
&lt;br /&gt;
이전의 emerge 출력에서 알려준 대로, 초기 데이터베이스 환경을 설정해야 합니다. 그러나 이것을 하기 전에 한 가지 고려해야 할 점이 있습니다. MySQL 같은 것과는 다르게, PostgreSQL의 &amp;quot;root&amp;quot; 패스워드는 실제 사용자의 패스워드라는 것입니다. 그러나 ebuild가 생성한 사용자는 패스워드가 설정되어 있지 않습니다. 따라서 시작하기 전에 postgres 사용자의 패스워드를 설정해야 합니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.1: 패스워드 설정&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# passwd postgres&lt;br /&gt;
New UNIX password:&lt;br /&gt;
Retype new UNIX password:&lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 설정이 되었고, 초기 데이터베이스를 생성할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.2: emerge --config로 데이터베이스 환경 설정하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge --config =postgresql-8.0.4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Configuring pkg...&lt;br /&gt;
&lt;br /&gt;
 * Creating the data directory ...&lt;br /&gt;
 * Initializing the database ...&lt;br /&gt;
The files belonging to this database system will be owned by user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
This user must also own the server process.&lt;br /&gt;
&lt;br /&gt;
The database cluster will be initialized with locale C.&lt;br /&gt;
&lt;br /&gt;
fixing permissions on existing directory /var/lib/postgresql/data ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/global ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_xlog ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_xlog/archive_status ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_clog ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_subtrans ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/base ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/base/1 ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_tblspc ... ok&lt;br /&gt;
selecting default max_connections ... 100&lt;br /&gt;
selecting default shared_buffers ... 1000&lt;br /&gt;
creating configuration files ... ok&lt;br /&gt;
creating template1 database in /var/lib/postgresql/data/base/1 ... ok&lt;br /&gt;
initializing pg_shadow ... ok&lt;br /&gt;
enabling unlimited row size for system tables ... ok&lt;br /&gt;
initializing pg_depend ... ok&lt;br /&gt;
creating system views ... ok&lt;br /&gt;
loading pg_description ... ok&lt;br /&gt;
creating conversions ... ok&lt;br /&gt;
setting privileges on built-in objects ... ok&lt;br /&gt;
creating information schema ... ok&lt;br /&gt;
vacuuming database template1 ... ok&lt;br /&gt;
copying template1 to template0 ... ok&lt;br /&gt;
&lt;br /&gt;
WARNING: enabling &amp;quot;trust&amp;quot; authentication for local connections&lt;br /&gt;
You can change this by editing pg_hba.conf or using the -A option the&lt;br /&gt;
next time you run initdb.&lt;br /&gt;
&lt;br /&gt;
Success. You can now start the database server using:&lt;br /&gt;
&lt;br /&gt;
    /usr/bin/postmaster -D /var/lib/postgresql/data&lt;br /&gt;
or&lt;br /&gt;
    /usr/bin/pg_ctl -D /var/lib/postgresql/data -l logfile start&lt;br /&gt;
&lt;br /&gt;
 *&lt;br /&gt;
 * You can use /etc/init.d/postgresql script to run PostgreSQL instead of pg_ctl.&lt;br /&gt;
 *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 초기 데이터베이스가 설정되었습니다. 다음 섹션에서는 설치를 검증하고 데이터베이스에 접근할 사용자를 설정하는 것을 하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL 데이터베이스 설정 ===&lt;br /&gt;
&lt;br /&gt;
이제 PostgreSQL이 설정되었습니다. 이제 설치를 검증해 보는 것이 좋을 것입니다. 먼저, 서비스가 제대로 시작되는지 확인해 봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.3: PostgreSQL 서비스 시작하기&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/init.d/postgresql start&lt;br /&gt;
* Starting PostgreSQL ...                                          [ ok ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이것이 제대로 동작하는지 확인이 되면, 부팅될 때마다 시작할 수 있도록 기본 runlevel에 추가해 주는 것이 좋을 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.4: 기본 runlevel에 추가하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# rc-update add postgresql default&lt;br /&gt;
* postgresql added to runlevel default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 서비스가 시작되었고 데이터베이스를 검사해 볼 시간입니다. 시작하려면 createdb 명령을 써서 test 데이터베이스를 만들어 봅시다. -U 옵션을 넘겨서 사용자 이름(넘기지 않으면 기본값으로 현재 사용자 이름이 됩니다)를 정하고, -W 옵션으로 이전에 만들었던 암호를 요청합니다. 결국 만들고자 하는 데이터베이스에 이름을 정해 주었습니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.5: createdb로 데이터베이스 생성하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ createdb -U postgres -W test&lt;br /&gt;
Password:&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
데이터베이스가 성공적으로 만들어졌으며, 데이터베이스가 기본적인 작업을 수행할 수 있는지 확인해 볼 수 있습니다. 계속해서 dropdb 명령으로 데이터베이스를 떨어뜨리고(지워버리고) 다음에 다시 쓸 데이터베이스를 생성할 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.6: dropdb로 데이터베이스 떨어뜨리기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dropdb -U postgres -W test&lt;br /&gt;
Password:&lt;br /&gt;
DROP DATABASE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, postgres 사용자만 명령을 수행할 수 있습니다. 분명히 다중 사용 환경은 설정의 일종은 아닙니다. 다음 섹션에서 사용자 계정에 대한 것을 살펴볼 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 데이터베이스 사용자 계정 설정하기 ===&lt;br /&gt;
&lt;br /&gt;
이미 언급했듯이, postgres 사용자로 로그인 해야 한다는 것은 다중 사용자 환경에서는 적합하지 않습니다. 대부분의 경우에 다양한 사용자와 서비스가 서버에 접근할 것이고 각각은 서로 다른 퍼미션이 필요할 것입니다. 따라서 이것을 다루려면 createuser 명령을 사용합니다. 이 명령은 몇몇 SQL 질의문을 수행하는 대신에 쓸 수 있고, admin의 관점에서 훨씬 더 유연합니다. 계속해서 두 명의 사용자, 즉 다른 사용자와 관리자를 추가할 수 있는 'superuser'와 일반 사용자를 생성할 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.7: superuser 설정하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(replace chris with the username you'd like to use)&lt;br /&gt;
$ createuser -a -d -P -E -U postgres -W chris&lt;br /&gt;
Enter password for new user:&lt;br /&gt;
Enter it again:&lt;br /&gt;
Password:&lt;br /&gt;
CREATE USER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 superuser를 생성하였습니다. 명령줄 옵션 -a는 다른 사용자를 추가할 수 있는 사용자라는 것을 나타냅니다. -d는 데이터베이스를 만들 수 있는 사용자라는 것을 의미합니다. -P는 이 사용자의 암호를 입력할 수 있게 해 주고, -E는 보안 목적을 위하여 그것을 암호화합니다. 이제 일반 사용자를 설정하면서 이 새로운 사용자의 퍼미션을 검사해 봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.8: 일반 사용자 설정하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(replace chris with the username you've just created)&lt;br /&gt;
$ createuser -A -D -P -E -U chris -W testuser&lt;br /&gt;
Enter password for new user:&lt;br /&gt;
Enter it again:&lt;br /&gt;
Password:&lt;br /&gt;
CREATE USER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
성공했습니다! 새 사용자를 이전에 만들었던 superuser를 통하여 만들었습니다. -A와 -D 옵션은 -a와 -d의 반대로써, 다른 사용자와 데이터베이스의 사용을 거부합니다. 이제 작업을 할 수 있는 사용자가 만들어졌고 새로운 데이터베이스가 만들어졌으므로 다음 장에서는 새 데이터베이스를 만드는 것을 살펴보겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PostgreSQL 사용하기 ==&lt;br /&gt;
&lt;br /&gt;
=== 퍼미션 설정하기 ===&lt;br /&gt;
&lt;br /&gt;
새 데이터베이스에 데이터베이스를 새로 만들고 다른 사용자를 추가할 수 있는 사용자가 있고 무엇이든 할 수 있는 메인 postgres 사용자가 있습니다. 이전에 만들었던 사용자는 현재 서버에 로그인할 수 있고, 그것에 대한 것입니다. 일반적으로 사용자는 데이터를 삽입하고 꺼낼 수 있어햐 하며, 때로는 다른 여러 작업을 할 수 있어야 합니다. 따라서 이 새 사용자가 어떤 것이든 할 수 있어야 하고, 적합한 퍼미션을 설정하여야 합니다. 이것은 -O 매개변수를 createdb에 넘겨주는 것으로 쉽게 할 수 있습니다. superuser로 MyDB라는 새 데이터베이스를 만들고 그것을 이전의 testuser의 소유로 만드는 것부터 시작할 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.1: MyDB 데이터베이스 만들기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ createdb -O testuser -U chris -W MyDB&lt;br /&gt;
Password:&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
되었습니다. 이제는 새 MyDB 데이터베이스를 만들었고, testuser가 그것에 접근할 수 있습니다. 이것을 검사하기 위하여 testuser로 이 새 MyDB 데이터베이스에 로그인하여 볼 것입니다. psql 프로그램으로 이것을 할 수 있습니다. 이 프로그램은 명령줄에서 PostgreSQL 데이터베이스로 연결하는데 사용하는 프로그램입니다. 따라서 새 데이터베이스에 이렇게 연결합니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.2: testuser로 MyDB 데이터베이스에 로그인하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ psql -U testuser -W MyDB&lt;br /&gt;
Password:&lt;br /&gt;
Welcome to psql 8.0.4, the PostgreSQL interactive terminal.&lt;br /&gt;
&lt;br /&gt;
Type:  \copyright for distribution terms&lt;br /&gt;
       \h for help with SQL commands&lt;br /&gt;
       \? for help with psql commands&lt;br /&gt;
       \g or terminate with semicolon to execute query&lt;br /&gt;
       \q to quit&lt;br /&gt;
&lt;br /&gt;
MyDB=&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 testuser로 데이터베이스에 로그인하였으며, 몇 가지 명령을 시작할 수 있습니다. PostgreSQL을 이용하는 느낌을 받으려면 다음 섹션에서 psql 클라이언트를 돌아다니는 기본 명령에 대하여 살펴보십시오.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 기본 PostgreSQL 명령과 테이블 작성하기 ===&lt;br /&gt;
&lt;br /&gt;
MySQL을 사용해 본 적이 있으신 분들을 위하여 꼭 읽어야 할 것이 있습니다. 여기서 PostgreSQL이 명령을 수행하는 것과 관련하여 독특한 무언가를 알 수 있을 것입니다. 시작하려면 여기에서 논의하고자 하는 명령의 목록을 보십시오.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''명령'''||'''사용법'''||'''동등한 MySQL 명령'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\connect DBNAME or USER||다른 데이터베이스에 연결한다||USE DATABASE&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\q||psql 클라이언트를 종료한다||quit&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\i FILE||FILE에서 명령을 수행한다||source FILE&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\o FILE||질의문의 결과를 FILE로 보낸다||INTO OUTFILE, but outputs everything (not just SELECTS)&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\d NAME||(다른 아이템도 물론이며) 데이터베이스나 테이블을 묘사한다||DESC(RIBE)&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\db PATTERN||PATTERN에 맞는 쓸 수 있는 테이블의 목록을 나열한다 (패턴을 주지 않으면 모든 테이블을 나열)||SHOW TABLES&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |기본적인 PostgreSQL 명령&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\connect 를 제외하고 모든 명령은 이 섹션의 뒤에서 보여줄 것입니다. 따라서 지금은 데이터베이스가 비어 있습니다. 그 말은 데이터를 삽입할 필요가 있다는 것입니다. 그러나 데이터를 삽입하는 첫 걸음은 테이블에 넣는 것입니다. 지금 현재로서는 테이블이 데이터베이스에 없으므로, 이것을 먼저 만들어야 합니다. CREATE TABLE 명령으로 이것을 할 수 있습니다. 항목의 테이블을 만들 것입니다. 상품 ID와 설명, 가격이 들어간 테이블을 만들 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.3: 상품 테이블 만들기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; CREATE TABLE products (&lt;br /&gt;
MyDB(&amp;gt;   product_id SERIAL,&lt;br /&gt;
MyDB(&amp;gt;   description TEXT,&lt;br /&gt;
MyDB(&amp;gt;   price DECIMAL&lt;br /&gt;
MyDB(&amp;gt; );&lt;br /&gt;
NOTICE:  CREATE TABLE will create implicit sequence &amp;quot;products_product_id_seq&amp;quot;&lt;br /&gt;
for serial column &amp;quot;products.product_id&amp;quot;&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTICE는 무시하여도 되고 완전히 무해합니다. 함수의 마지막 줄인 CREATE TABLE을 보면 명령이 성공적으로 이루어졌다는 것을 알 수 있습니다. 그러나 계속해서 테이블이 정말 성공적으로 만들어졌는지 \d 명령을 통하여 알아봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.4: 새로 작성한 테이블 살펴보기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; \d products&lt;br /&gt;
                                 Table &amp;quot;public.products&amp;quot;&lt;br /&gt;
   Column    |  Type   |                            Modifiers&lt;br /&gt;
-------------+---------+------------------------------------------------------------------&lt;br /&gt;
 product_id  | integer | not null default nextval('public.products_product_id_seq'::text)&lt;br /&gt;
 description | text    |&lt;br /&gt;
 price       | numeric |&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
정말로 테이블이 만들어졌습니다. 이제 테이블이 만들어졌으니 데이터를 집어넣어야 합니다. 다음 섹션에서 데이터베이스에 데이터를 집어넣는 것을 살펴볼 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 데이터를 데이터베이스에 삽입하기 ===&lt;br /&gt;
&lt;br /&gt;
이 섹션은 새로 만들어진 테이블에 데이터를 집어넣는 두 가지 방법을 살펴볼 것입니다. 첫 번째로 가장 기본적인 명령인 INSERT를 알아봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.5: INSERT 구문&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INSERT INTO [tablename] (column1,column2,column3) VALUES(value1,value2,value3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
테이블 이름은 데이터를 집어넣을 테이블의 이름을 포함합니다. (column1,column2,column3)은 특정 컬럼에 값을 넣을 수 있게 해 줍니다. VALUES(value,value2,value3)은 값의 나열입니다. 이 값들은 컬럼과 같은 순서(column1이 value1을 갖고, column2가 value2를 갖고, column3이 value3를 갖는다)가 됩니다. 이들의 수는 서로 같아야 합니다. 계속해서 항목을 테이블에 넣어 봅시다.&lt;br /&gt;
&lt;br /&gt;
:'''중요:''' 데이터베이스에서 오랫동안 작업하면서 개인적으로 INSERT 명령문을 위와 같이 정확하게 할 것을 추천합니다. 개발자들은 INSERT INTO에서 컬럼 이름을 명시하지 않고 실수로 종종 사용합니다. 새 컬럼이 데이터베이스에 추가될 수도 있어서 이것은 비생산적입니다. 값과 컬럼의 수가 서로 같지 않아서 에러가 발생할 수 있습니다. 새로운 컬럼을 추가할 것을 300% 확신하지 않는다면 항상 컬럼을 명시해 주세요.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.6: 테이블에 데이터를 삽입하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; INSERT INTO products (description,price) VALUES('A test product', 12.00);&lt;br /&gt;
INSERT 17273 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
마지막 줄은 약간 설명이 필요합니다. insert 명령의 반환값은 OID (객체 식별자)와 삽입된 줄의 수입니다. OID는 이 가이드의 범위를 조금 넘어선 것이고 PostgreSQL 매뉴얼에 좋은 정보가 있을 것입니다. 이제 20,000 상품을 가지고 있는 상황에서 이 insert 문은 조금 번거로울 수 있습니다. 그러나 모든 것을 잃는 것은 아닙니다. COPY 명령이 파일이나 stdin에서 테이블을 삽입할 수 있습니다. 이 예제에서는 csv(컴마로 구분된 값) 파일이 있다고 하고, 이것에 상품 id, 설명, 가격이 있다고 합시다. 파일은 다음과 같을 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.7: products.csv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2,meat,6.79&lt;br /&gt;
3,soup,0.69&lt;br /&gt;
4,soda,1.79&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 COPY 명령으로 데이터를 집어넣어 봅시다.&lt;br /&gt;
&lt;br /&gt;
:'''중요:''' postgres 사용자만이 파일에서 데이터를 집어넣을 수 있기 때문에 COPY FROM STDIN 명령을 사용하였습니다. (명백한 보안상의 이유)&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.8: COPY를 사용하여 상품 테이블에 집어넣는 모습&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; COPY products FROM STDIN WITH DELIMITER AS ',';&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself.&lt;br /&gt;
&amp;gt;&amp;gt; 2,meat,6.79&lt;br /&gt;
&amp;gt;&amp;gt; 3,soup,0.69&lt;br /&gt;
&amp;gt;&amp;gt; 4,soda,1.79&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
불행히도, 이 줄이 INSERT INTO 명령어와 같은 상태 정보를 보여주지는 않습니다. 데이터가 들어갔는지 어떻게 알 수 있을까요? 다음 섹션에서 데이터를 확인하기 위하여 실행하는 질의문을 살펴볼 것이빈다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL 질의 사용하기 ===&lt;br /&gt;
&lt;br /&gt;
이번 섹션에서는 테이블 내에 있는 정보를 보는 SELECT문에 대하여 설펴 볼 것입니다. 기본적인 SELECT 형식은 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.9: SELECT 구문&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT (column1,column2|*) FROM (table) [WHERE (conditionals)]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
컬럼을 선택하는 방법은 두 가지가 있습니다. 첫 번째 것은 *로 모든 컬럼을 선택하는 방법이고 두 번째는 보고자 하는 특정 컬럼의 목록을 명시하는 것입니다. 두 번째는 큰 목록을 보기보다는 특정 컬럼만 보려고 하는 경우에 꽤나 편리합니다. SELECT에 *로 모든 컬럼을 명시하는 것부터 시작해 봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.10: 상품 테이블 보기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; SELECT * FROM products;&lt;br /&gt;
 product_id |  description   | price&lt;br /&gt;
------------+----------------+-------&lt;br /&gt;
          1 | A test product | 12.00&lt;br /&gt;
          2 | meat           |  6.79&lt;br /&gt;
          3 | soup           |  0.69&lt;br /&gt;
          4 | soda           |  1.79&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 나타난 대로, 모든 데이터가 정말로 테이블에 들어갔습니다. 이제 설명과 가격만 보고자 한다고 하고, 상품 id는 보고 싶지 않다고 합시다. 이제 컬럼을 명시한 SELECT 형태를 사용할 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.11: 상품 테이블에서 특정 컬럼을 보기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; SELECT description,price FROM products;&lt;br /&gt;
  description   | price&lt;br /&gt;
----------------+-------&lt;br /&gt;
 A test product | 12.00&lt;br /&gt;
 meat           |  6.79&lt;br /&gt;
 soup           |  0.69&lt;br /&gt;
 soda           |  1.79&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 상품과 가격만 보이기 때문에 중요한 자료에 집중할 수 있게 되었습니다. 이제 $2.00이 넘는 항목만을 보고자 한다고 합시다. 여기 WHERE 절을 간편하게 쓸 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.12: 상품 테이블의 특정 행을 보기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; SELECT description,price FROM products WHERE price &amp;gt; 2.00;&lt;br /&gt;
  description   | price&lt;br /&gt;
----------------+-------&lt;br /&gt;
 A test product | 12.00&lt;br /&gt;
 meat           |  6.79&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 $2.00이 넘는 상품이 화면에 나타나서 더욱 집중할 수 있게 되었습니다. 정보 질의의 이런 형태는 아주 강력하고 극도로 유용한 보고를 만들 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 맺음말 ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL의 가이드가 여기서 끝이 납니다. 저의 질문에 대답을 해 주시어 도와주신 젠투 PostgreSQL 유지를 맡고 있는 마사도모 나가노씨에게 크게 감사합니다. 이 가이드에 어떤 제안이라도 있으시면 chriswhite@gentoo.org 에 보내 주십시오. 더 확장적인 문서를 원하시면 PostgreSQL 웹사이트를 보십시오.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=PostgreSQL_On_Gentoo&amp;diff=983</id>
		<title>PostgreSQL On Gentoo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=PostgreSQL_On_Gentoo&amp;diff=983"/>
		<updated>2013-03-19T10:47:11Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: PostgreSQL On Gentoo 페이지 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;PostgreSQL On Gentoo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 문서는 [[Gentoo Linux]]에서 [http://wiki.kldp.org/wiki.php/PostgreSQL PostgreSQL]을 설치하기 위한 문서입니다. http://www.gentoo.org/doc/en/postgres-howto.xml 을 원본으로 하여 번역한 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 소개 ==&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL 소개 ===&lt;br /&gt;
&lt;br /&gt;
대부분의 개발자와 다른 데이터베이스 솔루션들에 대하여 대화를 나누어 보면, 두 가지 종류의 데이터베이스가 주로 대답으로 나옵니다. 하나는 [http://wiki.kldp.org/wiki.php/MySQL MySQL]이고 다른 하나는 이 문서에서 다루고자 하는 [http://wiki.kldp.org/wiki.php/PostgreSQL PostgreSQL] 입니다. 서로간의 장단점에 대해서 오랜 시간동안 논쟁이 있어 왔지만, PostgreSQL이 MySQL보다 진정한 관계형 데이터베이스 구조에는 더 확고하다는 말이 있습니다. FOREIGN KEY와 같은 대부분의 기본적인 특징들이 MySQL 5에서 추가되었습니다. 그러나 어떤 상황이 되든, 이 문서는 여러분이 PostgreSQL 을 사용할 데이터베이스로 선택했다고 가정합니다. 처음 해야 할 일은 emerge 과정을 시작하는 것입니다. 다음 섹션에서는 기본 설정 뿐만 아니라 emerge를 통한 설치 과정을 설명할 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL 설치하기 ===&lt;br /&gt;
&lt;br /&gt;
시작하려면 먼저 PostgreSQL 패키지를 emerge 해야 합니다. 이렇게 하려면 다음과 같은 코드로 옵션이 제대로 설정되어 있는지를 먼저 확인해야 합니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 1.1: PostgreSQL 빌드 옵션 확인&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge -pv postgresql&lt;br /&gt;
&lt;br /&gt;
These are the packages that I would merge, in order:&lt;br /&gt;
&lt;br /&gt;
Calculating dependencies ...done!&lt;br /&gt;
[ebuild  N    ] dev-db/postgresql-8.0.4  -doc -kerberos +libg++ +nls +pam +perl&lt;br /&gt;
-pg-hier -pg-intdatetime +python +readline (-selinux) +ssl -tcltk +xml2 +zlib 0 kB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기 서로 다른 빌드 옵션이 나타내는 것의 목록이 있습니다.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''USE 플래그'''||'''의미'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|doc||이 USE 플래그는 표준 man 페이지의 외부 문서 설치를 켜거나 끕니다. 공간이 적거나 문서를 얻을 수 있는 다른 방법(온라인 등)이 있으시면 이것을 끄시면 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|kerberos||데이터베이스에 이 옵션을 켜서 접속하면 admin이 데이터베이스로의 사용자/서비스를 검증할 때, kerberos를 사용하는 옵션을 갖습니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|libg++||이 옵션이 켜져 있으면 PostgreSQL의 C++ 바인딩이 설치됩니다. C++ 프로그래머가 연결할 수 있는 libpq++가 설치됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|nls||이 옵션이 켜져 있으면 영어를 사용하지 않는 사용자를 위하여 번역된 문자열을 쓸 수 있습니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|pam||이 옵션이 켜져 있고, admin이 PostgreSQL 설정 파일을 제대로 설정하면 사용자/서비스는 PAM(Pluggable Authentication Module)을 이용하여 PostgreSQL에 로그인 할 수 있게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|perl||이 옵션이 켜져 있으면 PostgreSQL의 펄 바인딩이 설치됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|pg-hier||이 옵션이 켜져 있으면 오라클 데이터베이스의 CONNECT 문에서 볼 수 있는 계층적 질의를 켜는 패치를 적용하게 됩니다. 오라클 참조 안내서에 계층적 질의에 대한 더 많은 정보가 있습니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|pg-intdatetime ||이 옵션이 켜져 있으면 PostgreSQL은 64비트 정수 날짜 형식을 지원하게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|python||이 옵션이 켜져 있으면, PostgreSQL은 파이썬 바인딩을 설치하게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|readline||이 옵션이 켜져 있으면, PostgreSQL은 readline 스타일의 명령줄 편집을 지원하게 됩니다. 이것은 명령 히스토리와 isearch 기능을 포함합니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|selinux||이 옵션이 켜져 있으면, PostgreSQL의 selinux 정책이 설치 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|ssl|| 이 옵션이 켜져 있으면, PostgreSQL은 OpenSSL 라이브러리로 PostgreSQL 클라이언트와 서버 사이의 트래픽을 암호화하게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|tcltk||이 옵션이 켜져 있으면, PostgreSQL은 tcl/tk 바인딩을 설치하게 됩니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|xml2||이 옵션이 켜져 있으면, XPATH 스타일 xml 지원이 설치되게 됩니다. PostgreSQL의 xml 지원에 대한 더 자세한 정보는 PostgreSQL과 XML에서 찾으실 수 있습니다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|zlib||이것은 PostgreSQL 자체에서는 사용하지 않습니다만 pg_dump에서 생성하는 덤프를 압축합니다.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |빌드시점에서의 USE플래그와 의미&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''주의:''' pg-hier 패치 작성자는 패치 업무를 중단하였으며, 다음 버전에서는 삭제될 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PostgreSQL을 여러분의 필요에 따라서 커스터마이징 하였다면 계속 진행하여 emerge를 시작하십시오.&lt;br /&gt;
&lt;br /&gt;
코드 목록 1.2: PostgreSQL emerge 하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge postgresql&lt;br /&gt;
(Output shortened)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; /usr/lib/libecpg.so.5 -&amp;gt; libecpg.so.5.0&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; /usr/bin/postmaster -&amp;gt; postgres&lt;br /&gt;
 * Make sure the postgres user in /etc/passwd has an account setup with /bin/bash as the shell&lt;br /&gt;
 *&lt;br /&gt;
 * Execute the following command&lt;br /&gt;
 * emerge --config =postgresql-8.0.4&lt;br /&gt;
 * to setup the initial database environment.&lt;br /&gt;
 *&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Regenerating /etc/ld.so.cache...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dev-db/postgresql-8.0.4 merged.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
einfo 출력에서 나타났듯이, 설치 후에 해야 할 작업들이 있습니다. 다음 장에서 PostgreSQL의 실제 설정에 대해서 살펴볼 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PostgreSQL 설정하기 ==&lt;br /&gt;
&lt;br /&gt;
=== 초기 데이터베이스 환경 설정하기 ===&lt;br /&gt;
&lt;br /&gt;
이전의 emerge 출력에서 알려준 대로, 초기 데이터베이스 환경을 설정해야 합니다. 그러나 이것을 하기 전에 한 가지 고려해야 할 점이 있습니다. MySQL 같은 것과는 다르게, PostgreSQL의 &amp;quot;root&amp;quot; 패스워드는 실제 사용자의 패스워드라는 것입니다. 그러나 ebuild가 생성한 사용자는 패스워드가 설정되어 있지 않습니다. 따라서 시작하기 전에 postgres 사용자의 패스워드를 설정해야 합니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.1: 패스워드 설정&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# passwd postgres&lt;br /&gt;
New UNIX password:&lt;br /&gt;
Retype new UNIX password:&lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 설정이 되었고, 초기 데이터베이스를 생성할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.2: emerge --config로 데이터베이스 환경 설정하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge --config =postgresql-8.0.4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Configuring pkg...&lt;br /&gt;
&lt;br /&gt;
 * Creating the data directory ...&lt;br /&gt;
 * Initializing the database ...&lt;br /&gt;
The files belonging to this database system will be owned by user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
This user must also own the server process.&lt;br /&gt;
&lt;br /&gt;
The database cluster will be initialized with locale C.&lt;br /&gt;
&lt;br /&gt;
fixing permissions on existing directory /var/lib/postgresql/data ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/global ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_xlog ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_xlog/archive_status ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_clog ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_subtrans ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/base ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/base/1 ... ok&lt;br /&gt;
creating directory /var/lib/postgresql/data/pg_tblspc ... ok&lt;br /&gt;
selecting default max_connections ... 100&lt;br /&gt;
selecting default shared_buffers ... 1000&lt;br /&gt;
creating configuration files ... ok&lt;br /&gt;
creating template1 database in /var/lib/postgresql/data/base/1 ... ok&lt;br /&gt;
initializing pg_shadow ... ok&lt;br /&gt;
enabling unlimited row size for system tables ... ok&lt;br /&gt;
initializing pg_depend ... ok&lt;br /&gt;
creating system views ... ok&lt;br /&gt;
loading pg_description ... ok&lt;br /&gt;
creating conversions ... ok&lt;br /&gt;
setting privileges on built-in objects ... ok&lt;br /&gt;
creating information schema ... ok&lt;br /&gt;
vacuuming database template1 ... ok&lt;br /&gt;
copying template1 to template0 ... ok&lt;br /&gt;
&lt;br /&gt;
WARNING: enabling &amp;quot;trust&amp;quot; authentication for local connections&lt;br /&gt;
You can change this by editing pg_hba.conf or using the -A option the&lt;br /&gt;
next time you run initdb.&lt;br /&gt;
&lt;br /&gt;
Success. You can now start the database server using:&lt;br /&gt;
&lt;br /&gt;
    /usr/bin/postmaster -D /var/lib/postgresql/data&lt;br /&gt;
or&lt;br /&gt;
    /usr/bin/pg_ctl -D /var/lib/postgresql/data -l logfile start&lt;br /&gt;
&lt;br /&gt;
 *&lt;br /&gt;
 * You can use /etc/init.d/postgresql script to run PostgreSQL instead of pg_ctl.&lt;br /&gt;
 *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 초기 데이터베이스가 설정되었습니다. 다음 섹션에서는 설치를 검증하고 데이터베이스에 접근할 사용자를 설정하는 것을 하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL 데이터베이스 설정 ===&lt;br /&gt;
&lt;br /&gt;
이제 PostgreSQL이 설정되었습니다. 이제 설치를 검증해 보는 것이 좋을 것입니다. 먼저, 서비스가 제대로 시작되는지 확인해 봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.3: PostgreSQL 서비스 시작하기&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/init.d/postgresql start&lt;br /&gt;
* Starting PostgreSQL ...                                          [ ok ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이것이 제대로 동작하는지 확인이 되면, 부팅될 때마다 시작할 수 있도록 기본 runlevel에 추가해 주는 것이 좋을 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.4: 기본 runlevel에 추가하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# rc-update add postgresql default&lt;br /&gt;
* postgresql added to runlevel default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 서비스가 시작되었고 데이터베이스를 검사해 볼 시간입니다. 시작하려면 createdb 명령을 써서 test 데이터베이스를 만들어 봅시다. -U 옵션을 넘겨서 사용자 이름(넘기지 않으면 기본값으로 현재 사용자 이름이 됩니다)를 정하고, -W 옵션으로 이전에 만들었던 암호를 요청합니다. 결국 만들고자 하는 데이터베이스에 이름을 정해 주었습니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.5: createdb로 데이터베이스 생성하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ createdb -U postgres -W test&lt;br /&gt;
Password:&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
데이터베이스가 성공적으로 만들어졌으며, 데이터베이스가 기본적인 작업을 수행할 수 있는지 확인해 볼 수 있습니다. 계속해서 dropdb 명령으로 데이터베이스를 떨어뜨리고(지워버리고) 다음에 다시 쓸 데이터베이스를 생성할 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.6: dropdb로 데이터베이스 떨어뜨리기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dropdb -U postgres -W test&lt;br /&gt;
Password:&lt;br /&gt;
DROP DATABASE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, postgres 사용자만 명령을 수행할 수 있습니다. 분명히 다중 사용 환경은 설정의 일종은 아닙니다. 다음 섹션에서 사용자 계정에 대한 것을 살펴볼 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 데이터베이스 사용자 계정 설정하기 ===&lt;br /&gt;
&lt;br /&gt;
이미 언급했듯이, postgres 사용자로 로그인 해야 한다는 것은 다중 사용자 환경에서는 적합하지 않습니다. 대부분의 경우에 다양한 사용자와 서비스가 서버에 접근할 것이고 각각은 서로 다른 퍼미션이 필요할 것입니다. 따라서 이것을 다루려면 createuser 명령을 사용합니다. 이 명령은 몇몇 SQL 질의문을 수행하는 대신에 쓸 수 있고, admin의 관점에서 훨씬 더 유연합니다. 계속해서 두 명의 사용자, 즉 다른 사용자와 관리자를 추가할 수 있는 'superuser'와 일반 사용자를 생성할 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.7: superuser 설정하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(replace chris with the username you'd like to use)&lt;br /&gt;
$ createuser -a -d -P -E -U postgres -W chris&lt;br /&gt;
Enter password for new user:&lt;br /&gt;
Enter it again:&lt;br /&gt;
Password:&lt;br /&gt;
CREATE USER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 superuser를 생성하였습니다. 명령줄 옵션 -a는 다른 사용자를 추가할 수 있는 사용자라는 것을 나타냅니다. -d는 데이터베이스를 만들 수 있는 사용자라는 것을 의미합니다. -P는 이 사용자의 암호를 입력할 수 있게 해 주고, -E는 보안 목적을 위하여 그것을 암호화합니다. 이제 일반 사용자를 설정하면서 이 새로운 사용자의 퍼미션을 검사해 봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 2.8: 일반 사용자 설정하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(replace chris with the username you've just created)&lt;br /&gt;
$ createuser -A -D -P -E -U chris -W testuser&lt;br /&gt;
Enter password for new user:&lt;br /&gt;
Enter it again:&lt;br /&gt;
Password:&lt;br /&gt;
CREATE USER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
성공했습니다! 새 사용자를 이전에 만들었던 superuser를 통하여 만들었습니다. -A와 -D 옵션은 -a와 -d의 반대로써, 다른 사용자와 데이터베이스의 사용을 거부합니다. 이제 작업을 할 수 있는 사용자가 만들어졌고 새로운 데이터베이스가 만들어졌으므로 다음 장에서는 새 데이터베이스를 만드는 것을 살펴보겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PostgreSQL 사용하기 ==&lt;br /&gt;
&lt;br /&gt;
=== 퍼미션 설정하기 ===&lt;br /&gt;
&lt;br /&gt;
새 데이터베이스에 데이터베이스를 새로 만들고 다른 사용자를 추가할 수 있는 사용자가 있고 무엇이든 할 수 있는 메인 postgres 사용자가 있습니다. 이전에 만들었던 사용자는 현재 서버에 로그인할 수 있고, 그것에 대한 것입니다. 일반적으로 사용자는 데이터를 삽입하고 꺼낼 수 있어햐 하며, 때로는 다른 여러 작업을 할 수 있어야 합니다. 따라서 이 새 사용자가 어떤 것이든 할 수 있어야 하고, 적합한 퍼미션을 설정하여야 합니다. 이것은 -O 매개변수를 createdb에 넘겨주는 것으로 쉽게 할 수 있습니다. superuser로 MyDB라는 새 데이터베이스를 만들고 그것을 이전의 testuser의 소유로 만드는 것부터 시작할 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.1: MyDB 데이터베이스 만들기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ createdb -O testuser -U chris -W MyDB&lt;br /&gt;
Password:&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
되었습니다. 이제는 새 MyDB 데이터베이스를 만들었고, testuser가 그것에 접근할 수 있습니다. 이것을 검사하기 위하여 testuser로 이 새 MyDB 데이터베이스에 로그인하여 볼 것입니다. psql 프로그램으로 이것을 할 수 있습니다. 이 프로그램은 명령줄에서 PostgreSQL 데이터베이스로 연결하는데 사용하는 프로그램입니다. 따라서 새 데이터베이스에 이렇게 연결합니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.2: testuser로 MyDB 데이터베이스에 로그인하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ psql -U testuser -W MyDB&lt;br /&gt;
Password:&lt;br /&gt;
Welcome to psql 8.0.4, the PostgreSQL interactive terminal.&lt;br /&gt;
&lt;br /&gt;
Type:  \copyright for distribution terms&lt;br /&gt;
       \h for help with SQL commands&lt;br /&gt;
       \? for help with psql commands&lt;br /&gt;
       \g or terminate with semicolon to execute query&lt;br /&gt;
       \q to quit&lt;br /&gt;
&lt;br /&gt;
MyDB=&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 testuser로 데이터베이스에 로그인하였으며, 몇 가지 명령을 시작할 수 있습니다. PostgreSQL을 이용하는 느낌을 받으려면 다음 섹션에서 psql 클라이언트를 돌아다니는 기본 명령에 대하여 살펴보십시오.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 기본 PostgreSQL 명령과 테이블 작성하기 ===&lt;br /&gt;
&lt;br /&gt;
MySQL을 사용해 본 적이 있으신 분들을 위하여 꼭 읽어야 할 것이 있습니다. 여기서 PostgreSQL이 명령을 수행하는 것과 관련하여 독특한 무언가를 알 수 있을 것입니다. 시작하려면 여기에서 논의하고자 하는 명령의 목록을 보십시오.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''명령'''||'''사용법'''||'''동등한 MySQL 명령'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\connect DBNAME or USER||다른 데이터베이스에 연결한다||USE DATABASE&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\q||psql 클라이언트를 종료한다||quit&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\i FILE||FILE에서 명령을 수행한다||source FILE&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\o FILE||질의문의 결과를 FILE로 보낸다||INTO OUTFILE, but outputs everything (not just SELECTS)&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\d NAME||(다른 아이템도 물론이며) 데이터베이스나 테이블을 묘사한다||DESC(RIBE)&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|\db PATTERN||PATTERN에 맞는 쓸 수 있는 테이블의 목록을 나열한다 (패턴을 주지 않으면 모든 테이블을 나열)||SHOW TABLES&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |기본적인 PostgreSQL 명령&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\connect 를 제외하고 모든 명령은 이 섹션의 뒤에서 보여줄 것입니다. 따라서 지금은 데이터베이스가 비어 있습니다. 그 말은 데이터를 삽입할 필요가 있다는 것입니다. 그러나 데이터를 삽입하는 첫 걸음은 테이블에 넣는 것입니다. 지금 현재로서는 테이블이 데이터베이스에 없으므로, 이것을 먼저 만들어야 합니다. CREATE TABLE 명령으로 이것을 할 수 있습니다. 항목의 테이블을 만들 것입니다. 상품 ID와 설명, 가격이 들어간 테이블을 만들 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.3: 상품 테이블 만들기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; CREATE TABLE products (&lt;br /&gt;
MyDB(&amp;gt;   product_id SERIAL,&lt;br /&gt;
MyDB(&amp;gt;   description TEXT,&lt;br /&gt;
MyDB(&amp;gt;   price DECIMAL&lt;br /&gt;
MyDB(&amp;gt; );&lt;br /&gt;
NOTICE:  CREATE TABLE will create implicit sequence &amp;quot;products_product_id_seq&amp;quot;&lt;br /&gt;
for serial column &amp;quot;products.product_id&amp;quot;&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTICE는 무시하여도 되고 완전히 무해합니다. 함수의 마지막 줄인 CREATE TABLE을 보면 명령이 성공적으로 이루어졌다는 것을 알 수 있습니다. 그러나 계속해서 테이블이 정말 성공적으로 만들어졌는지 \d 명령을 통하여 알아봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.4: 새로 작성한 테이블 살펴보기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; \d products&lt;br /&gt;
                                 Table &amp;quot;public.products&amp;quot;&lt;br /&gt;
   Column    |  Type   |                            Modifiers&lt;br /&gt;
-------------+---------+------------------------------------------------------------------&lt;br /&gt;
 product_id  | integer | not null default nextval('public.products_product_id_seq'::text)&lt;br /&gt;
 description | text    |&lt;br /&gt;
 price       | numeric |&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
정말로 테이블이 만들어졌습니다. 이제 테이블이 만들어졌으니 데이터를 집어넣어야 합니다. 다음 섹션에서 데이터베이스에 데이터를 집어넣는 것을 살펴볼 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 데이터를 데이터베이스에 삽입하기 ===&lt;br /&gt;
&lt;br /&gt;
이 섹션은 새로 만들어진 테이블에 데이터를 집어넣는 두 가지 방법을 살펴볼 것입니다. 첫 번째로 가장 기본적인 명령인 INSERT를 알아봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.5: INSERT 구문&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INSERT INTO [tablename] (column1,column2,column3) VALUES(value1,value2,value3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
테이블 이름은 데이터를 집어넣을 테이블의 이름을 포함합니다. (column1,column2,column3)은 특정 컬럼에 값을 넣을 수 있게 해 줍니다. VALUES(value,value2,value3)은 값의 나열입니다. 이 값들은 컬럼과 같은 순서(column1이 value1을 갖고, column2가 value2를 갖고, column3이 value3를 갖는다)가 됩니다. 이들의 수는 서로 같아야 합니다. 계속해서 항목을 테이블에 넣어 봅시다.&lt;br /&gt;
&lt;br /&gt;
:'''중요:''' 데이터베이스에서 오랫동안 작업하면서 개인적으로 INSERT 명령문을 위와 같이 정확하게 할 것을 추천합니다. 개발자들은 INSERT INTO에서 컬럼 이름을 명시하지 않고 실수로 종종 사용합니다. 새 컬럼이 데이터베이스에 추가될 수도 있어서 이것은 비생산적입니다. 값과 컬럼의 수가 서로 같지 않아서 에러가 발생할 수 있습니다. 새로운 컬럼을 추가할 것을 300% 확신하지 않는다면 항상 컬럼을 명시해 주세요.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.6: 테이블에 데이터를 삽입하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; INSERT INTO products (description,price) VALUES('A test product', 12.00);&lt;br /&gt;
INSERT 17273 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
마지막 줄은 약간 설명이 필요합니다. insert 명령의 반환값은 OID (객체 식별자)와 삽입된 줄의 수입니다. OID는 이 가이드의 범위를 조금 넘어선 것이고 PostgreSQL 매뉴얼에 좋은 정보가 있을 것입니다. 이제 20,000 상품을 가지고 있는 상황에서 이 insert 문은 조금 번거로울 수 있습니다. 그러나 모든 것을 잃는 것은 아닙니다. COPY 명령이 파일이나 stdin에서 테이블을 삽입할 수 있습니다. 이 예제에서는 csv(컴마로 구분된 값) 파일이 있다고 하고, 이것에 상품 id, 설명, 가격이 있다고 합시다. 파일은 다음과 같을 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.7: products.csv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2,meat,6.79&lt;br /&gt;
3,soup,0.69&lt;br /&gt;
4,soda,1.79&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 COPY 명령으로 데이터를 집어넣어 봅시다.&lt;br /&gt;
&lt;br /&gt;
:'''중요:''' postgres 사용자만이 파일에서 데이터를 집어넣을 수 있기 때문에 COPY FROM STDIN 명령을 사용하였습니다. (명백한 보안상의 이유)&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.8: COPY를 사용하여 상품 테이블에 집어넣는 모습&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; COPY products FROM STDIN WITH DELIMITER AS ',';&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself.&lt;br /&gt;
&amp;gt;&amp;gt; 2,meat,6.79&lt;br /&gt;
&amp;gt;&amp;gt; 3,soup,0.69&lt;br /&gt;
&amp;gt;&amp;gt; 4,soda,1.79&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
불행히도, 이 줄이 INSERT INTO 명령어와 같은 상태 정보를 보여주지는 않습니다. 데이터가 들어갔는지 어떻게 알 수 있을까요? 다음 섹션에서 데이터를 확인하기 위하여 실행하는 질의문을 살펴볼 것이빈다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL 질의 사용하기 ===&lt;br /&gt;
&lt;br /&gt;
이번 섹션에서는 테이블 내에 있는 정보를 보는 SELECT문에 대하여 설펴 볼 것입니다. 기본적인 SELECT 형식은 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.9: SELECT 구문&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT (column1,column2|*) FROM (table) [WHERE (conditionals)]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
컬럼을 선택하는 방법은 두 가지가 있습니다. 첫 번째 것은 *로 모든 컬럼을 선택하는 방법이고 두 번째는 보고자 하는 특정 컬럼의 목록을 명시하는 것입니다. 두 번째는 큰 목록을 보기보다는 특정 컬럼만 보려고 하는 경우에 꽤나 편리합니다. SELECT에 *로 모든 컬럼을 명시하는 것부터 시작해 봅시다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.10: 상품 테이블 보기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; SELECT * FROM products;&lt;br /&gt;
 product_id |  description   | price&lt;br /&gt;
------------+----------------+-------&lt;br /&gt;
          1 | A test product | 12.00&lt;br /&gt;
          2 | meat           |  6.79&lt;br /&gt;
          3 | soup           |  0.69&lt;br /&gt;
          4 | soda           |  1.79&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서 나타난 대로, 모든 데이터가 정말로 테이블에 들어갔습니다. 이제 설명과 가격만 보고자 한다고 하고, 상품 id는 보고 싶지 않다고 합시다. 이제 컬럼을 명시한 SELECT 형태를 사용할 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.11: 상품 테이블에서 특정 컬럼을 보기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; SELECT description,price FROM products;&lt;br /&gt;
  description   | price&lt;br /&gt;
----------------+-------&lt;br /&gt;
 A test product | 12.00&lt;br /&gt;
 meat           |  6.79&lt;br /&gt;
 soup           |  0.69&lt;br /&gt;
 soda           |  1.79&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 상품과 가격만 보이기 때문에 중요한 자료에 집중할 수 있게 되었습니다. 이제 $2.00이 넘는 항목만을 보고자 한다고 합시다. 여기 WHERE 절을 간편하게 쓸 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
코드 목록 3.12: 상품 테이블의 특정 행을 보기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDB=&amp;gt; SELECT description,price FROM products WHERE price &amp;gt; 2.00;&lt;br /&gt;
  description   | price&lt;br /&gt;
----------------+-------&lt;br /&gt;
 A test product | 12.00&lt;br /&gt;
 meat           |  6.79&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 $2.00이 넘는 상품이 화면에 나타나서 더욱 집중할 수 있게 되었습니다. 정보 질의의 이런 형태는 아주 강력하고 극도로 유용한 보고를 만들 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 맺음말 ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL의 가이드가 여기서 끝이 납니다. 저의 질문에 대답을 해 주시어 도와주신 젠투 PostgreSQL 유지를 맡고 있는 마사도모 나가노씨에게 크게 감사합니다. 이 가이드에 어떤 제안이라도 있으시면 chriswhite@gentoo.org 에 보내 주십시오. 더 확장적인 문서를 원하시면 PostgreSQL 웹사이트를 보십시오.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=982</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=982"/>
		<updated>2013-03-19T10:30:30Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 문서링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]]&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]]&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL_On_Gentoo|PostgreSQL On Gentoo]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=PostfixOnGentoo-HOWTO&amp;diff=981</id>
		<title>PostfixOnGentoo-HOWTO</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=PostfixOnGentoo-HOWTO&amp;diff=981"/>
		<updated>2013-03-19T10:28:26Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: Postfix를 젠투에 설치하기 페이지 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;Postfix를 젠투에 설치하기&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 서문 ==&lt;br /&gt;
&lt;br /&gt;
[http://wiki.kldp.org/wiki.php/Postfix Postfix]와 SASL을 젠투 리눅스에서 설치하기 위한 가이드로써 [http://wiki.kldp.org/wiki.php/Postfix-SASL-HOWTO Postfix-SASL-HOWTO] 문서를 참고하여, [[Gentoo Linux]] 에서 설치하시는 분이 참고하실 수 있도록 하였습니다. Postfix 와 SASL 에 대해서는 다른 문서를 참고하십시오. 본문에서는 경어를 쓰지 않겠습니다.&lt;br /&gt;
&lt;br /&gt;
문서에서 잘못된 부분이나 보완할 점이 있고, 문서를 더 좋게 수정하실 수 있으시면 자유롭게 수정해 주세오. 처음 이 문서의 작성자는 [only2sea]이지만, 문서 수정에 허락을 받거나 할 필요는 전혀 없습니다. 문서 내용과는 따로, 문서의 맨 아래쪽에 토론 섹션에 문서에 관련된 내용을 토론할 수 있습니다. 문제점을 발견하셨지만 딱히 대안이 없는 경우 등 토론 섹션에 글을 쓰는 것이 더 좋을 경우에는 토론 섹션에 적당히 적어주셔도 됩니다.&lt;br /&gt;
&lt;br /&gt;
패키지 설치에 익숙하지 않으신 분들도 많으므로, 초보자가 더 접근하기 쉽게 문서를 발전시킬 수 있다면 발전시켜 주세요. 익숙하신 분들께 필요없어 보이는 설명들도 초보자에게는 필요할 수도 있으므로 익숙하신 분들께서 참아주세요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== postfix 설치하기 ==&lt;br /&gt;
&lt;br /&gt;
=== USE flag 설정하기 ===&lt;br /&gt;
&lt;br /&gt;
필요한 USE flag들을 켠다. '''sasl'''을 플래그를 켜면 SASL을 지원하며 의존성을 걸어서 함께 설치해 준다. '''vda'''는 쿼타를 지원할 수 있게 해 준다. 각 USE 플래그의 자세한 설명은 /usr/portage/profiles/use.desc 파일과 /usr/portage/profiles/use.local.desc 파일을 참조한다. 필요한 USE flag들을 /etc/portage/package.use 에 등록한다. 만약에 mailwrapper, postgres, mbox, vda, sasl, ssl에 대한 옵션을 켜려면 다음과 같이 입력한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mail-mta/postfix mailwrapper postgres mbox vda sasl ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 다른 MTA 제거 ===&lt;br /&gt;
&lt;br /&gt;
다른 MTA가 이미 설치되어 있는 경우에는 Blocked가 되어서 설치가 되지 않으므로 다른 MTA를 먼저 제거해 주어야 한다. 이것을 확인하려면 emerge -p 옵션을 이용하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge -p postfix&lt;br /&gt;
&lt;br /&gt;
These are the packages that I would merge, in order:&lt;br /&gt;
&lt;br /&gt;
Calculating dependencies ...done!&lt;br /&gt;
[blocks B     ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.1.5-r2)&lt;br /&gt;
[ebuild  N    ] dev-libs/cyrus-sasl-2.1.20&lt;br /&gt;
[ebuild  N    ] dev-libs/libpcre-5.0&lt;br /&gt;
[ebuild  N    ] mail-mta/postfix-2.1.5-r2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위에서는 mail-mta/ssmtp가 이미 설치되어 있어서 postfix의 설치를 막고 있다. 그렇다면 ssmtp를 제거해 주어야 한다. 만약에 다른 MTA가 설치를 막고 있으면 ssmtp 대신에 그 패키지를 제거하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge --unmerge ssmtp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Postfix emerge하기 ===&lt;br /&gt;
&lt;br /&gt;
이제 postfix를 설치할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge postfix&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dev-libs/cyrus-sasl 등의 관련 패키지들이 모두 설치된다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 설정파일 업데이트 ===&lt;br /&gt;
&lt;br /&gt;
이전에 postfix를 사용한 적이 있거나 해서 설정 파일이 바뀌는 경우에는 다음과 같은 메시지가 뜬다. 그럴 때는 etc-update를 해서 설정 파일을 확인하고 합쳐주면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 * IMPORTANT: 1 config files in /etc need updating.&lt;br /&gt;
 * Type emerge --help config to learn how to update config files.&lt;br /&gt;
&lt;br /&gt;
# etc-update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 설정을 하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== postfix 업그레이드하기 ==&lt;br /&gt;
&lt;br /&gt;
설치 메시지에 나타나는 내용이다.&lt;br /&gt;
&lt;br /&gt;
만일 호환성 없는 이전 버전에서 업그레이드를 하는 경우라면 설치 전에 postfix를 중단시켜야 한다. 서비스를 최대한 짧게 중단시켜야 한다면 다음과 같은 순서로 설치하면 최소의 시간만에 서비스를 재개할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FORCE_UPGRADE=1 emerge --buildpkgonly postfix&lt;br /&gt;
# /etc/init.d/postfix stop&lt;br /&gt;
# emerge --usepkgonly postfix&lt;br /&gt;
# etc-update&lt;br /&gt;
# dispatch-conf&lt;br /&gt;
# /etc/init.d/postfix start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 구동 및 설정하기 ==&lt;br /&gt;
&lt;br /&gt;
=== 설정을 생략하면... ===&lt;br /&gt;
&lt;br /&gt;
설정의 많은 부분들은 시스템이 제대로 설치되어 있다면 자동으로 해 준다. 예를 들어 호스트 이름을 설정하는 부분을 무시하고 건드리지 않는다면 postfix가 자동으로 gethostname()을 사용해서 호스트 이름을 설정한다.&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/main.cf 파일에 설정이 있고 각 설정에 대하여 주석이 충분히 달려 있으므로, 하나 하나 읽어보고 이 옵션에 대해서 알고 있고, 이것이 분명히 필요하다면 옵션을 수정하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 기본 설정으로 시도 ===&lt;br /&gt;
&lt;br /&gt;
기본 설정으로 사용하려면 아무 설정을 바꾸지 않고 다음을 시도해 본다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/init.d/postfix start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
문제없이 수행된다면 성공이다. 기본 설정으로 사용하는데 문제가 없고, 더 이상 설정하고 싶지 않다면 여기서 설치 성공이다. 시스템이 부팅할 때마다 이것이 자동으로 수행되도록 하려면 다음을 입력한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# rc-update add postfix default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
만약 문제가 있어서 /etc/init.d/postfix start가 되지 않았다면 설정을 바꾸어주어야 한다. 스크립트에서 메시지를 보이지 않게 해 놓았으므로 에러 메시지를 보기 위해서 다음을 수행해 본다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# postfix start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
나타나는 에러메시지에 따라서 설정을 수정하면 된다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 더 설정하기 ===&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/main.cf의 설정에 대한 더 자세한 내용은 [Postfix-SASL-HOWTO#s-4]를 참고한다. 설정을 변경하고 다시 적용시키려면&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/init.d/postfix restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
를 하면 재부팅 하지 않고도 설정을 적용시켜 볼 수 있다. 설정을 변경할 때에는 한꺼번에 많이 변경하지 말고 조금씩 변경해 보면서 postfix를 restart해 보는 것이 요령이다. 아울러 man 5 postconf를 쳐서 매뉴얼을 참조하면 각각의 패러미터들을 설명하고 있으므로 postfix를 설정하는데 많은 도움을 얻을 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 유용한 문서 ==&lt;br /&gt;
&lt;br /&gt;
참고할 수 있는 유용한 문서가 있으면 추가해 주세요. 혹은 이 문서를 쓰는데 참고한 문서도 써 주세요.&lt;br /&gt;
&lt;br /&gt;
* [http://wiki.kldp.org/wiki.php/Postfix-SASL-HOWTO Postfix-SASL-HOWTO]&lt;br /&gt;
* [http://en.gentoo-wiki.com/wiki/Postfix 젠투 위키 Postfix 설치 문서] (영문 페이지)&lt;br /&gt;
* [[Gentoo_Postfix]] - 위 문서를 한글로 번역한 것이라고 생각합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 토론 ==&lt;br /&gt;
&lt;br /&gt;
* 문서를 작성하고 보니 이미 젠투에서 postfix 설치하는 매뉴얼이 올라와 있었네요. 제가 검색을 제대로 안 한 결과네요. 유용한 문서 링크에 추가했습니다. -- [only2sea] [[DateTime(2007-01-11T09:59:57)]]&lt;br /&gt;
* 일단 사라인 문서에 대한 Link는 제거하거나 원본 링크로 수정했습니다&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=980</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=980"/>
		<updated>2013-03-19T10:21:50Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 문서링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]]&lt;br /&gt;
&lt;br /&gt;
[[PostfixOnGentoo-HOWTO|Postfix를 젠투에 설치하기]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Gentoo_Postfix&amp;diff=979</id>
		<title>Gentoo Postfix</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Gentoo_Postfix&amp;diff=979"/>
		<updated>2013-03-18T13:54:07Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: gentoo postfix 문서 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;Postfix를 이용한 가상 메일 호스팅 시스템 가이드-from kldp wiki&lt;br /&gt;
&lt;br /&gt;
== 1. 소개 ==&lt;br /&gt;
&lt;br /&gt;
대부분의 젠투리눅스 사용자들은 간단한 메일 클라이언트와 메일 저장기를 사용할 것입니다. 하지만, 만약 여러분의 시스템으로 도메인 호스팅을 하고 있다면, 단일화 된 MTA(Mail Transfer Agent, 메일 전송 대행자)를 필요로 할 것입니다. 그리고 여러개의 도메인을 호스팅하고 있는 중이라면, 확실히 여러분의 사용자들을 위한 모든 이메일을 제어하기 위해 힘 좋은것을 필요로 할 것입니다. 이 시스템(Postfix)은 이러한 문제에 대해 깔끔한 해결방법이 되도록 고안되었습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
가상 메일 시스템은 다양한 인터페이스로부터 많은 사용자들이 사용하는 수많은 도메인에 대한 이메일을 조정할 수 있어야 합니다. 예를들어, 다른 도메인을 갖고 있는 두 사용자가 같은 메일 계정 이름을 원한다면 어떻겠습니까? 만약 IMAP 접근과 smtp 인증을 제공한다면, 어떻게 다양한 인증 데몬들을 단일 시스템에 통합하겠습니까? 어떻게 수많은 요소에 대해 보안을 제공할 수 있습니까? 이 모든것을 어떻게 관리할 것입니까?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 Howto 문서는 여러분들에게 시스템상의 여러 도메인에 대한 메일 제어가 가능하고 쉘 계정이 필요하지 않는 가상 메일 사용자를 지원하며, 도메인마다 사용자 계정을 지정하고, 단일 데이타베이스에 웹, imap, smtp, pop3 클라이언트 인증을 할 수 있고, 전달 계층 보안을 위해 SSL을 사용할 수 있으며, 웹 인터페이스를 갖고, 어떠한 도메인에 대한 메일링 리스트들에 대해서도 성능좋고, 쉽고 중앙화된 mysql에 의해 제어하는 메일 시스템을 어떻게 설치하는지 보여줄 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
가상 메일호스팅 시스템을 설치하는 것에 대해 다양한 방법이 있습니다. 많은 옵션과 함께 다른 방법들은 여러분들의 필요에 따라 선택하십시오. 옵션을 알아보기 위해 http://www.qmail.org 와 http://www.exim.org 를 조사해보십시오.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음 패키지들은 설치에 사용됩니다. apache, courier-imap, courier-authlib postfix, mod_php, phpmyadmin, squirrelmail, cyrus-sasl, mysql, php, and mailman.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
패키지들을 컴파일 하기 전에 /etc/make.conf 에 있는 USE 환경 변수에 다음의 값들이 있는지 확인해 보십시오. USE=&amp;quot;mysql imap libwww maildir sasl ssl&amp;quot; 그렇지 않다면 모든 프로토콜에 대해 필요한 지원을 얻기 위해 대부분의 패키지들을 재컴파일해야만 합니다. 더욱이 다른 메일이나 ipv6같은 네트워크 변수들을 제외하시는 것이 좋습니다.&lt;br /&gt;
&lt;br /&gt;
* 중요: 이 howto 문서는 postfix-2.0.x 에 대해 쓰여졌습니다. 만약 postfix 버전이 2 버전 이하라면 이 문서에서 몇몇 변수는 다를 것입니다. 만약 이슈화된 내용을 실행중이시라면 패키지에 포함된 문서의 내용을 통해 조언을 받으십시오.&lt;br /&gt;
* 중요: 이 문서는 apache-1.3.x 를 사용합니다. Apache-2 는 포티지(portage)에서 stable(안정적임)로 표시되었습니다. 하지만 php 통합에 관한 몇몇 화두들이 아직 남아있습니다. apache-2.0.x 에서의 php 지원이 stable로 표시되기 전까지, 이 가이드는 1.3.x 버전을 계속 사용할 것입니다.&lt;br /&gt;
* 중요: 공개 메일 서버를 실행하기 위해 도메인 이름이 필요합니다. 혹은 적어도 도메인에 대한 MX 레코드가 필요합니다. 이상적으로 여러분의 가상 도메인에 대한 기능적인 이득을 얻기 위해서는 두 개 이상의 도메인을 갖고 있어야 합니다.&lt;br /&gt;
* 중요: /etc/hostname 이 여러분의 메일 서버에 대해 올바른 호스트이름으로 지정되었는지 확인하십시오. hostname 명령어로 여러분의 호스트 이름을 검증하십시오. 또한 /etc/hosts 에서 충돌되는 항목이 없는지도 확인하십시오.&lt;br /&gt;
* 주의: 먼저 이 문서 전체를 읽어보시길 권장합니다. 그리고 설치를 시도하기 전에 모든 단계에 익숙해지십시오. 만약 어떤 단계에 문제가 생겼다면 이 문서의 끝에 있는 '문제 해결 가이드'를 확인하십시오. 또한 언급된 모든 패키지들이 이번 설치에 꼭 필요한 것은 아닙니다. 설치 과정은 매우 유연합니다. 예를 들어, 만약 웹 인터페이스를 필요로 하지 않는다면, squirrelmail 부분은 그냥 넘어가십시오.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Postfix 기본 ==&lt;br /&gt;
&lt;br /&gt;
코드 리스트 2.1 : postfix 설치&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge postfix&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''경고''': ssmtp, exim, qmail과 같은 다른 MTA 프로그램이 설치되지 않았는지 확인하십시오. 그렇지 않다면 큰 문제를 가지고 있을것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
postfix 를 설치한 후, 설정을 할 차례입니다. /etc/postfix/main.cf 에서 다음 옵션을 변경하십시오.&lt;br /&gt;
&lt;br /&gt;
코드 리스트 2.2 : /etc/postfix/main.cf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myhostname = $host.domain.name&lt;br /&gt;
mydomain = $domain.name&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
mydestination = $myhostname, localhost.$mydomain $mydomain&lt;br /&gt;
mynetworks = my.ip.net.work/24, 127.0.0.0/8&lt;br /&gt;
home_mailbox=.maildir/&lt;br /&gt;
local_destination_concurrency_limit = 2&lt;br /&gt;
default_destination_concurrency_limit = 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음으로 /etc/postfix/master.cf 를 변경하십시오. 이것은 디버깅에 대한 출력을 하도록 변경한 것입니다.&lt;br /&gt;
&lt;br /&gt;
코드 리스트 2.3 : /etc/postfix/master.cf&lt;br /&gt;
&amp;lt;pre&amp;gt;{# service type private unpriv chroot wakeup maxproc command + args&lt;br /&gt;
#           (yes)   (yes)   (yes)   (never)   (50)&lt;br /&gt;
#&lt;br /&gt;
=====================================================================&lt;br /&gt;
(단순히 smtpd 뒤에 -v 옵션을 추가하십시오.)&lt;br /&gt;
smtp    inet    n       -       n       -       -       smtpd -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음으로 시스템 계정과 연결하기 위해 /etc/mail/aliases 를 편집하십시오. root 계정에 대해 적어도 root: your@email.address 와 같이 계정 연결이 있어야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
코드 리스트 2.4: 최초로 postfix 시작하기&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# /usr/bin/newaliases&lt;br /&gt;
(이것은 새로운 계정연결을 설치할 것입니다. 여러분은 계정연결을 새로 만들거나 갱신할 때에만 이것을 실행하실 필요가 있습니다.)&lt;br /&gt;
# /etc/init.d/postfix start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 postfix가 실행중입니다. 여러분의 자주 사용하는 메일 클라이언트를 실행시키고 여러분 자신에게 이메일을 전달해보십시오. postfix가 계정 사용자에게 메일을 배달중인지 확인하십시오. 확인이 된 후 다음 단계로 넘어갑니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
주의: 하우투 문서의 다음 단계로 넘어가기 전에기본적인 postfix 설정을 검증하길 추천합니다.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 3. Courier-imap ==&lt;br /&gt;
&lt;br /&gt;
코드 리스트 3.1 : courier-imap 과 courier-authlib 설치&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge courier-imap courier-authlib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
코드 리스트 3.2 : Courier-imap 설정&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /etc/courier-imap&lt;br /&gt;
(만약 courier-imap 이나 pop3 의 ssl 성능을 사용하기 원한다면, 이러한 목적을 위한 인증서를 만들 필요가 있을 것입니다. &lt;br /&gt;
이 단계는 추천합니다. SSL 을 사용하지 않길 원한다면, 이 단계를 넘어가십시오.)&lt;br /&gt;
&lt;br /&gt;
# nano -w pop3d.cnf&lt;br /&gt;
# nano -w imapd.cnf&lt;br /&gt;
(여러분의 서버에 맞는 C, ST, L, CN 과 이메일 파라메터들을 변경하십시오.)&lt;br /&gt;
&lt;br /&gt;
# mkpop3dcert&lt;br /&gt;
# mkimapdcert&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
코드 리스트 3.3 : 여러분이 원하시는 courier 서비스를 시작합니다.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/init.d/courier-imapd start&lt;br /&gt;
# /etc/init.d/courier-imapd-ssl start&lt;br /&gt;
# /etc/init.d/courier-pop3d- start&lt;br /&gt;
# /etc/init.d/courier-pop3d-ssl start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
자주 사용하는 메일 클라이언트를 시작하여 메일을 받고 보내는 것에 대해 시작한 동작의 모든 연결들을 확인하십시오. 이제 기본적인 동작을 한다면 남은 시스템의 전체를 구축할 것입니다. 진행하기 전에 여러분이 설치한 이메일 시스템에 대해 한 번 더 검증하시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=978</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=978"/>
		<updated>2013-03-18T13:51:55Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: gentoo postfix 링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;br /&gt;
&lt;br /&gt;
[[Gentoo_Postfix|Postfix를 이용한 가상 메일 호스팅 시스템 가이드]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Gentoo_redmine_nginix_git&amp;diff=977</id>
		<title>Gentoo redmine nginix git</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Gentoo_redmine_nginix_git&amp;diff=977"/>
		<updated>2013-03-18T09:43:18Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 태그 수정&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;Gentoo Linux에서 nginix, redmint, git 같이 사용하기-작성자_지구상의누군가&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==적용범위 및 목적==&lt;br /&gt;
&lt;br /&gt;
본 문서는 일반적으로 프로젝트의 진행 및 관리를 위해 Gentoo linux에서 DVCS프로그램인 git를 설치 하고 nginx웹서버 및 redmine을 설치하여 gitolite를 이용해 연동하는 법을 간단하게 기술하고 이를 이용해서 프로젝트를 진행하는 법을 간략하게 설명함을 목적으로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==용어정의==&lt;br /&gt;
&lt;br /&gt;
* git :: Distributed version control system(DVCS) Program&lt;br /&gt;
* redmine :: flexible project management system&lt;br /&gt;
* nginx :: web server daemon&lt;br /&gt;
* Gentoo linux :: linux distribution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==기준내용==&lt;br /&gt;
&lt;br /&gt;
===시스템을 구성하기 위한 준비===&lt;br /&gt;
&lt;br /&gt;
# Gentoo Linux를 대상으로 하는 문서인 만큼 Gentoo Linux가 설치된 서버시스템&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===git===&lt;br /&gt;
&lt;br /&gt;
git란 개발되고 있는 source에 대한 버전 관리 시스템(VCS) 중 한 종류로서 서버상의 저장소에 저장하며 관리할 수 있는 CVCS(Centralized VCS)의 기능에서 서버가 문제가 생기거나 네트워크가 연결되지 않았을 때 사용 할 수 없다는 단점을 보완한 DVCS(Distributed VCS)프로그램이다.&lt;br /&gt;
&lt;br /&gt;
git는 하나의 snapshot단위로 버전 관리를 하게 되며 하나의 snapshot이 만들어 지기까지 Working Directory, Staging Area, Git Directory 의 3가지 단계를 거치게 된다.&lt;br /&gt;
&lt;br /&gt;
* Git Directory :: Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말한다. Git Directory가 Git의 핵심이다. 다른 컴퓨터에 있는 저장소를 Clone 할 때 Git Directory가 만들어진다.&lt;br /&gt;
* Working Directory :: 프로젝트의 특정 버전을 Checkout 한 것이다. Git Directory는 지금 작업하는 디스크에 있고 그 Directory에 압축된 데이터베이스에서 파일을 가져와서 Working Directory를 만든다.&lt;br /&gt;
* Staging Area :: Git Directory에 있다. 단순한 파일이고 곧 Commit 할 파일에 대한 정보를 저장한다. 종종 인덱스라고 불리기도 하지만, Staging Area라는 명칭이 표준이 되어가고 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
snapshot을 만들어 Commit 하기 위해서는 아래의 순서를 따른다.&lt;br /&gt;
# Working Directory에서 파일을 수정한다.&lt;br /&gt;
# Staging Area에 파일을 Stage 해서 Commit 할 Snapshot을 만든다.&lt;br /&gt;
# Staging Area에 있는 파일들을 Commit 해서 Git Directory에 영구적인 Snapshot으로 저장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====git설치====&lt;br /&gt;
&lt;br /&gt;
Gentoo linux에서는 emerge git로 설치할 수 있다. 설치 시 git인증을 서포트 하는 gitolite를 같이 설치 하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge -q git gitolite-gentoo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Redmine===&lt;br /&gt;
&lt;br /&gt;
웹기반의 프로젝트 관리와 버그 추적 기능을 제공하는 도구이다. 프로젝트 관리에 도움이 되도록 달력과 Gantt chart를 제공하고 일정관리 기능을 제공한다. Redmine은 통합된 프로젝트관리 기능과 이슈추적, 여러가지 형상 관리 기능을 제공한다.&lt;br /&gt;
&lt;br /&gt;
Redmine의 디자인은 비슷한 기능을 가지는 오픈소스 프로그램인 Trac에 영향을 많이 받았으며 Ruby on Rails에 기반하여 작성되었고 멀티 플랫폼을 지원하며 여러가지 종류의 데이터베이스를 지원한다. 이중에서 우리는 SQLite를 사용 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Redmine설치====&lt;br /&gt;
&lt;br /&gt;
Redmine을 사용하기 위해서 필요한 일부 package들이 Gentoo linux 에선 기본적으로 mask 되어 있어 바로 설치가 되지 않기 때문에 필요한 package들의 mask를 풀어주는 설정이 필요 하다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래에서 thin이라는 패키지는 nginx와 redmine을 연동시켜 사용할수 있는 ruby용 범용 컨테이너 이다. ruby용 web application을 사용하려면 java의 tomcat처럼 중간에 broker를 필요로 하게되는데 thin은 그런 역할을 해준다.&lt;br /&gt;
&lt;br /&gt;
http daemon으로 apache를 사용한다면 mod passenger를 사용하는 방법&amp;lt;ref name=&amp;quot;주석1&amp;quot;&amp;gt;http://nkdk.tistory.com/entry/ubuntu-1104-or-1110-apache-%EC%97%90%EC%84%9C-%EB%A3%A8%EB%B9%84-%EB%8F%8C%EB%A6%AC%EA%B8%B0 페이지를 참고&amp;lt;/ref&amp;gt;도 있지만 여기서 언급할 사항은 아니기때문에 이상의 설명은 하지 않는다 않는다.&lt;br /&gt;
&lt;br /&gt;
thin은 기본적으로 ruby를 위한 proxy라고 생각해도 좋으며 그 자체로 http daemon없이 스스로 동작이 가능하다. 다만 여러가지 기술 및 효율의 문제로인해 독립적으로 사용하는것은 피하는것이 좋다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/portage/package.keywords&lt;br /&gt;
www-apps/redmine ~amd64&lt;br /&gt;
dev-ruby/ruby-net-ldap ~amd64&lt;br /&gt;
www-servers/thin ~amd64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
또한 설치에 필요한 USE flag도 미리 정의 해 놓자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/portage/package.use&lt;br /&gt;
www-apps/redmine imagemagick ldap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 rails-2.3에서는 rack-1.2 이상은 사용 할 수 없으니 mask 설정을 추가 한다. 또한 redmine-2.x 이하 버전으로 설치 할 것이므로 같이 추가 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/portage/package.mask&lt;br /&gt;
&amp;gt;=dev-ruby/rack-1.2&lt;br /&gt;
&amp;gt;=www-apps/redmine-2.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
문서 작성시점에서 ruby-1.9를 사용하는 rails-3.x에 대해 Gentoo linux에서는 mask가 되어 있으므로 ruby-1.8 버전만을 사용 하도록 make.conf 를 수정 추가 해 준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/portage/make.conf&lt;br /&gt;
RUBY_TARGETS=&amp;quot;ruby18&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 필요한 package를 설치해보자. 프로젝트에서 사용할 DB는 SQLite이며 웹서버는 nginx이므로 같이 설치한다. thin은 nginx와 redmine의 다리역할을 해줄 컨테이너 이며 bundler는 ruby용 package간 의존성 관리 툴이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge -q redmine thin bundler nginx dev-ruby/sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설치가 완료 되면 redmine의 DB 접속 설정파일을 작성한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /var/lib/redmine/config/database.yml&lt;br /&gt;
production:&lt;br /&gt;
  adapter: sqlite3&lt;br /&gt;
  database: db/redmine.db&lt;br /&gt;
&lt;br /&gt;
development:&lt;br /&gt;
  adapter: sqlite3&lt;br /&gt;
  database: db/redmine_dev.dbutf8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 redmine의 기본 환경설정 작업을 실행한다. 이번에 사용된 버전은 1.4.5 이며 버전은 변경 될 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge --config &amp;quot;=www-apps/redmine-1.4.5&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===redmint에 gitolite 연동 플러그인 설치===&lt;br /&gt;
&lt;br /&gt;
다음은 redmine에서 gitolite와 연동하기 위한 플러그인을 설치 한다.&lt;br /&gt;
&lt;br /&gt;
현재 설치된 remine은 1.4.5 이므로 해당되는 버전을 받아와 설치를 진행 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /var/lib/redmine/vendor/plugins&lt;br /&gt;
# git clone -n git://github.com/ivyl/redmine-gitolite.git redmine_gitolite&lt;br /&gt;
Cloning into 'redmine_gitolite'...&lt;br /&gt;
remote: Counting objects: 1109, done.&lt;br /&gt;
remote: Compressing objects: 100% (468/468), done.&lt;br /&gt;
remote: Total 1109 (delta 612), reused 1090 (delta 603)&lt;br /&gt;
Receiving objects: 100% (1109/1109), 122.46 KiB | 6 KiB/s, done.&lt;br /&gt;
Resolving deltas: 100% (612/612), done.&lt;br /&gt;
&lt;br /&gt;
# cd redmine_gitolite&lt;br /&gt;
# git checkout -b redmine14 6491be010f7893b292468808a85b5fb190c767db&lt;br /&gt;
# echo &amp;quot;source 'http://rubygems.org'&amp;quot; &amp;gt;&amp;gt; Gemfile&lt;br /&gt;
# bundle install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
플러그인이 설치 된 이후 환경설정 작업을 한번 더 실행한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# emerge --config &amp;quot;=www-apps/redmine-1.4.5&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
redmine에서 gitolite를 사용 하기 위해 redmine계정의 쉘을 /sbin/nologin 에서 /bin/bash 로 변경한다. 그리고 redmine계정 홈 디렉토리의 소유자를 변경한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sed -i 's/\/redmine\:\/sbin\/nologin$/\/redmine\:\/bin\/bash/g' /etc/passwd&lt;br /&gt;
# chown -Rf redmine:redmine /var/lib/redmine&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이후 작업은 redmine 계정에서 계속 진행해야 함으로 계정을 변경 한다. 그리고 redmine계정에서 ssh 접속 키를 만든다. 몇 가지 질문을 물어 보지만 모두 엔터를 입력하여 기본값으로 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - redmine&lt;br /&gt;
$ ssh-keygen -t rsa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gitolite에 redmine계정 연동 설정을 진행 한다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp .ssh/id_rsa.pub .ssh/redmine.pub&lt;br /&gt;
$ git config --global user.name redmine&lt;br /&gt;
$ git config --global user.email redmine@localhost&lt;br /&gt;
$ gl-setup .ssh/redmine.pub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
위의 마지막 명령을 실행하고 엔터로 진행하면 편집기가 열리면서 환경설정이 나타나는데 저장하지 말고 종료를 한다. (vi일때 esc키-&amp;gt;:q!엔터)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 ssh의 know_host를 저장 하기 위해 ssh접속을 시도 한다. 질문에 모두 yes로 답한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh redmine@localhost&lt;br /&gt;
$ ssh redmine@127.0.0.1&lt;br /&gt;
$ ssh redmine@&amp;lt;&amp;lt;SERVER_HOSTNAME&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설정이 정상인지 확인 하기 위해 테스트용으로 daemon을 실행 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ruby script/server thin -e production&lt;br /&gt;
=&amp;gt; Booting Thin&lt;br /&gt;
=&amp;gt; Rails 2.3.15 application starting on http://0.0.0.0:3000&lt;br /&gt;
………&lt;br /&gt;
=&amp;gt; Call with -d to detach&lt;br /&gt;
=&amp;gt; Ctrl-C to shutdown server&lt;br /&gt;
&amp;gt;&amp;gt; Thin web server (v1.3.1 codename Triple Espresso)&lt;br /&gt;
&amp;gt;&amp;gt; Maximum connections set to 1024&lt;br /&gt;
&amp;gt;&amp;gt; Listening on 0.0.0.0:3000, CTRL+C to stop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
웹브라우저로 http://&amp;lt;&amp;lt;SERVER_HOSTNAME 또는 IP&amp;gt;&amp;gt;:3000 에 접속하였을 때 다음과 같은 화면이 보인다면 정상이다.&lt;br /&gt;
&lt;br /&gt;
[[image:redmine_image1.png|none|800px|thumb|redmine을 설치한후의 초기화면]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===redmine과 gitolite연동 설정===&lt;br /&gt;
&lt;br /&gt;
http://&amp;lt;&amp;lt;SERVER_HOSTNAME 또는 IP&amp;gt;&amp;gt;:3000/settings/plugin/redmine_gitolite 로 접속한다.&lt;br /&gt;
&lt;br /&gt;
로그인 계정을 물어 보는데 기본 값은 admin // admin 이다.(설정을 진행하며 반드시 바꾸기 바란다)&lt;br /&gt;
&lt;br /&gt;
로그인을 하게 되면 아래와 같은 화면에 뜨는데 정해진 값으로 정보를 입력하고 적용(Apply)한다.&lt;br /&gt;
&lt;br /&gt;
[[image:redmine_image2.png|none|800px|thumb|redmine에서 gitorite를 설정하는 화면]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gitolite URL : redmine@localhost:gitolite-admin.git&lt;br /&gt;
Base path : /var/lib/redmine/repositories/&lt;br /&gt;
Developer base URL : git@&amp;lt;&amp;lt;SERVER_HOSTNAME 또는 IP&amp;gt;&amp;gt;:%{name}.git&lt;br /&gt;
Read-Only base URL : git@&amp;lt;&amp;lt;SERVER_HOSTNAME 또는 IP&amp;gt;&amp;gt;:%{name}.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설정이 완료되었으면 로그아웃(Sign out)을 하고 서버에서는 CTRL+C 로 테스트 daemon을 종료한 후 logout 명령어로 root 계정으로 돌아 간다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
^C&amp;gt;&amp;gt; Stopping ...&lt;br /&gt;
Exiting&lt;br /&gt;
$ logout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===thin에 redmine구동 설정===&lt;br /&gt;
&lt;br /&gt;
thin을 daemon 형태로 구동 하기 위한 설정을 진행 한다.&lt;br /&gt;
&lt;br /&gt;
먼저 /etc/thin/redmine.yml 파일을 만든다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/thin/redmine.yml&lt;br /&gt;
---&lt;br /&gt;
chdir: /var/lib/redmine&lt;br /&gt;
log: /var/log/thin/redmine.log&lt;br /&gt;
pid: /var/run/thin/redmine.pid&lt;br /&gt;
socket: /var/run/thin/redmine.sock&lt;br /&gt;
environment: production&lt;br /&gt;
daemonize: true&lt;br /&gt;
user: redmine&lt;br /&gt;
group: redmine&lt;br /&gt;
servers: 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 /etc/init.d/thin 스크립트를 patch하는 파일을 만든다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
# vi /tmp/thin_patch&lt;br /&gt;
--- /etc/init.d/thin&lt;br /&gt;
+++ /etc/init.d/thin&lt;br /&gt;
@@ -40,8 +40,10 @@&lt;br /&gt;
         checkconfig || return 1&lt;br /&gt;
&lt;br /&gt;
         if [ ${SERVER} = thin ]; then&lt;br /&gt;
+                mkdir -p /var/run/thin&lt;br /&gt;
+                chown redmine:redmine /var/run/thin&lt;br /&gt;
                 ebegin &amp;quot;$2 all thin servers in ${CONFIG}&amp;quot;&lt;br /&gt;
-                ${RUBY} /usr/bin/thin $1 $(buildargs) --all ${CONFIG}&lt;br /&gt;
+                sudo -i -u redmine ${RUBY} /usr/bin/thin $1 $(buildargs) --all ${CONFIG}&lt;br /&gt;
                 eend $?&lt;br /&gt;
         else&lt;br /&gt;
                 ebegin &amp;quot;$2 thin server ${SERVER}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
patch를 적용하고 thin이 사용할 log폴더를 만든다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# patch -p0 &amp;lt; /tmp/thin_patch&lt;br /&gt;
patching file /etc/init.d/thin&lt;br /&gt;
# rm -f /tmp/thin_patch&lt;br /&gt;
# mkdir -p /var/log/thin&lt;br /&gt;
# chown -Rf redmine:redmine /var/log/thin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
thin이 daemon 형태로 실행 되는지 확인 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/init.d/thin start&lt;br /&gt;
 * Starting all thin servers in /etc/thin/ ...&lt;br /&gt;
[start] /etc/thin//redmine.yml ...&lt;br /&gt;
Starting server on /var/run/thin/redmine.0.sock ... &lt;br /&gt;
Starting server on /var/run/thin/redmine.1.sock ... &lt;br /&gt;
Starting server on /var/run/thin/redmine.2.sock ... &lt;br /&gt;
Starting server on /var/run/thin/redmine.3.sock ...   [ ok ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===nginx에 thin구동 설정===&lt;br /&gt;
&lt;br /&gt;
nginx에서는 Ruby on Rails를 처리 하지 못하기 때문에 thin이 redmine을 서비스 하고 nginx는 그것을 중계 하도록 설정 해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저 /etc/nginx/proxy.include 파일을 작성 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/nginx/proxy.include&lt;br /&gt;
    proxy_set_header   Host $http_host;&lt;br /&gt;
    proxy_set_header   X-Real-IP $remote_addr;&lt;br /&gt;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Proto $scheme;&lt;br /&gt;
&lt;br /&gt;
    client_max_body_size       10m;&lt;br /&gt;
    client_body_buffer_size    128k;&lt;br /&gt;
&lt;br /&gt;
    proxy_connect_timeout      90;&lt;br /&gt;
    proxy_send_timeout         90;&lt;br /&gt;
    proxy_read_timeout         90;&lt;br /&gt;
&lt;br /&gt;
    proxy_buffer_size          4k;&lt;br /&gt;
    proxy_buffers              4 32k;&lt;br /&gt;
    proxy_busy_buffers_size    64k;&lt;br /&gt;
    proxy_temp_file_write_size 64k;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 /etc/nginx/nginx.conf 의 http section의 server section앞에 아래 항목을 추가 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	upstream redmine_cluster {&lt;br /&gt;
	 server unix:/var/run/thin/redmine.0.sock;&lt;br /&gt;
        server unix:/var/run/thin/redmine.1.sock;&lt;br /&gt;
        server unix:/var/run/thin/redmine.2.sock;&lt;br /&gt;
        server unix:/var/run/thin/redmine.3.sock;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
마지막으로 /etc/nginx/nginx.conf 의 server section을 추가 한다. 예제에서는 3000번 port를 사용 하고 있으나 이것 외 다른 port를 설정해도 상관없다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 3000;&lt;br /&gt;
	server_name redmine;&lt;br /&gt;
&lt;br /&gt;
	root /var/lib/redmine/public;&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/proxy.include;&lt;br /&gt;
	proxy_redirect off;&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
	try_files $uri/index.html $uri.html $uri @cluster;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @cluster {&lt;br /&gt;
	proxy_pass http://redmine_cluster;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nginx daemon을 시작 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/init.d/nginx start&lt;br /&gt;
 * Checking nginx' configuration ...           [ ok ]&lt;br /&gt;
 * Starting nginx ...                                    [ ok ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nginx.conf에 설정 하였던 port로 웹브라우저를 통하여 접속을 하였을 때 redmine의 정상적인  화면이 나타난다면 모두 완료이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==참고사항==&lt;br /&gt;
&lt;br /&gt;
# redmine에서는 식별자를 소문자밖에 사용하지 못한다. 대문자를 사용하고 싶다면 DB를 직접 편집할것 :: Projects.identifier 필드 참고&lt;br /&gt;
# redmine의 식별자대로 디렉토리를 생성해버린다. 고로 redmine에서 프로젝트의 식별자를 잘 정하는것은 대단히 중요. 참고로 redmine의 식별자규칙덕에 생성되는 repository이름은 모두 소문자&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==관련문서==&lt;br /&gt;
&lt;br /&gt;
* http://git-scm.com/book/ko :: Pro Git - git 가이드북&lt;br /&gt;
* http://bluewiz.tistory.com/446 :: 이것외의 다른 플러그인.. 이것도 괜찮은거같다&lt;br /&gt;
* http://whatwant.tistory.com/450 :: Redmine-Git repository연결하기&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==별첨==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Redmine_image2.png&amp;diff=976</id>
		<title>파일:Redmine image2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Redmine_image2.png&amp;diff=976"/>
		<updated>2013-03-18T09:42:23Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Redmine_image1.png&amp;diff=975</id>
		<title>파일:Redmine image1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Redmine_image1.png&amp;diff=975"/>
		<updated>2013-03-18T09:42:12Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=OpenAFS-Gentoo-HOWTO&amp;diff=974</id>
		<title>OpenAFS-Gentoo-HOWTO</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=OpenAFS-Gentoo-HOWTO&amp;diff=974"/>
		<updated>2013-03-17T14:09:19Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 스타일 오류 수정&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;OpenAFS-Gentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
==OpenAFS와 관련된 본 문서의 정의==&lt;br /&gt;
&lt;br /&gt;
분산 네트워크 파일 시스템인 Andrew File System 의 Implementation 중 OpenAFS 의 설치, 운용에 대한 전반적인 매뉴얼. 이 매뉴얼에서는 GentooLinux 배포판 기준으로, OpenAFS 를 운용하는데 '''고통없는''' 가이드를 목적으로 하고 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
사이트 :: http://www.openafs.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 이 문서에 대하여 ==&lt;br /&gt;
&lt;br /&gt;
버전 0.23&lt;br /&gt;
&lt;br /&gt;
갱신일 :: 2006년 11월 21일&lt;br /&gt;
&lt;br /&gt;
옮긴일 :: 2013년 3월 17일&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
저작자 2006 (C) 신종훈 (LunA_J`etch, email : luna.jetch_at_gmail_dot_com)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 매뉴얼은 [http://creativecommons.org/licenses/by-sa/2.5/ Creative Commons ShareAlike-2.5] 라이센스에 의한 보호를 받습니다. OpenAFS 는 IBM Public License의 보호를 받습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 서버를 구성하기 전에 알아야 할 사항들 ==&lt;br /&gt;
&lt;br /&gt;
대강의 추상적인 서비스 구조는 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:afs_networks_image.png|none|570px|thumb|OpenAFS의 추상적인 구조]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
서비스 하는 측면에서는, 다수의 Replica 를 구성하여 백업/분산의 용도로 확장하기 좋다.&lt;br /&gt;
&lt;br /&gt;
클라이언트 측면에서는, 다수의 볼륨을 일일이 마운트 해 줄 필요 없이, 셀(Cell) 설정 만으로 서버사이드에서 정한 대로 연결된 다수의 물리적 스토리지를 사용할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cell 은 네트워크 내 구성된 AFS 서비스를 한번에 묶는 이름의 의미로 사용되며, AFS가 인식하는 실제 물리적 파일시스템 공간을 파티션(partition), AFS에서 서비스를 할 때 사용되는 논리적인 파일시스템 공간을 볼륨(Volume) 이라고 부른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 이 매뉴얼에서 언급하는 시스템 환경에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
OpenAFS 서버를 구성하기 전에, 자신의 네트웍 환경과, 설치할 서버들, 그리고 사용할 클라이언트의 수 등을 고려하여 서버를 구성해야 하는 것은 당연한 일이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 예제에서 보여주는 환경은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
 * afsdisk1 컴퓨터 : OpenAFS 메인 DB 서버 인스턴스 + 파일 서버 인스턴스&lt;br /&gt;
 * afsdisk2 컴퓨터 : OpenAFS 파일 서버 인스턴스&lt;br /&gt;
 * 100명 이하의 클라이언트 인스턴스&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{InfoIcon}} 다수의 사용자를 관리해야 하는 입장이라면, 이 매뉴얼에서 사용하는 OpenAFS 기본 인증 서버(kaserver) 대신 Kerberos v5 + openssl + 계정 정보를 담은 백엔드(ldap, radius 등) 로 인증 서버를 구축할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 구축할 수 있는 서버 인스턴스들에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
구축할 수 있는 서버 인스턴스들의 목록은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''인스턴스'''||'''사용 용도'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''kaserver'''||인증 데이터베이스를 관리하기 위한 인증 서버. kerberos v5 기준에 만족하는 인증서버를 총칭하는 인스턴스 명.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''buserver'''||백업 데이터베이스를 관리하기 위한 백업 서버의 인스턴스 명.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''ptserver'''||프로텍션(Protection) 데이터베이스를 위한 프로텍션 서버.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''vlserver'''||VLDB(볼륨 위치 데이터베이스 : Volume Location Database)를 관리 하기 위한 볼륨 위치 서버(VLS). 각 셀을 구성하는 볼륨의 위치를 기억하고 관리하는, 대단히 중요한 구성품이다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''upserver'''||업데이트 서버. 서버의 설정/바이너리들을 다른 업데이트 클라이언트들에게 전파하는 역할을 한다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''fs'''||파일서버. 하나의 파일서버 인스턴스는 Fileserver (파일 서버), Volserver (볼륨서버), Salvager 로 구성된다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''upclientetc'''||클라이언트 부분의 업데이트 서버. 서버의 설정을 받아오는 인스턴스를 의미한다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''upclientbin'''||클라이언트 부분의 업데이트 서버. 서버의 AFS 관련 바이너리를 받아오는 인스턴스를 총칭.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''runntp'''||ntp 클라이언트에 해당하는 서버. ntp 서버로 부터 시간정보를 받아와 동기화하는 인스턴스.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |구축할 수 있는 서버 인스턴스들의 목록&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이것을 보고 생각해야 할 것은, 시스템의 구성에 따라 그 역할을 분산시킬 수 있기 때문이다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
하나의 '''OpenAFS 메인 서버'''는 최소한 '''인증(kaserver) / 백업(buserver) / 프로텍션(ptserver) / VLDB(vlserver) / (서버 부분의) 업데이트 서버(upserver)''' 에 대한 인스턴스를 가지고 있어야 하며, 메인 서버와 맞물려 스토리지를 제공하는 '''파일 서버'''의 경우 '''클라이언트 부분의 업데이트 서버(upclientetc) / 서버 부분의 업데이트 서버(upserver) / 파일 서버(fs)''' 인스턴스를 가져야 최소한의 동작 보증을 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
좀 더 네트웍/시스템 환경의 분산을 고려한다면 데이터베이스 서버를 Replication 하는 방식으로 여러대로 분산 시킬 수도 있다. 스토리지 역시 서버 레벨에서의 Replication을 제공하기 때문에 분산의 혜택을 받을 수 있는 것들 중 하나이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
충분히 고려한 후 서비스를 구성하여도 늦지 않다. 최소한, 고려하지 않고 변경에 따른 소요비용을 고려한다면 더욱 그러할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OpenAFS Database Server 구성 (최초구성) ==&lt;br /&gt;
&lt;br /&gt;
이 단락에서는 OpenAFS 서비스를 위한 메인 데이터베이스를 설치하고, 셀을 생성하고, 사용자 계정을 생성하는 부분을 언급할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 미리 준비해야 할 것들 ===&lt;br /&gt;
&lt;br /&gt;
OpenAFS를 설치, 운용할 서버가 필요함은 말할 것도 없다. OpenAFS를 사용하기 위해서는, 되도록 bind(named)를 사용하여 FQDN을 만족시켜 줄 필요가 있다. 현재 시스템이 참조하는 네임서버를 구성하던지 해서, hostname.domain.name 을 만족시켜야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서는 첫번째 서버를 '''afsdisk1.testbed.org''' 라고 칭하게 될 것이다. &lt;br /&gt;
&lt;br /&gt;
(두번째 서버는 '''afsdisk2.testbed.org''' 가 될 것이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kerberos + openssl 을 사용할 수 있다. 다만, 이 매뉴얼에서는 언급하지 않을 것이다. 필요시 OpenAFS 공식 문서를 참조하기 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
또한, 여러대의 AFS 서버 풀을 구성하려면, (최소한) 동등 셀은 같은 시간으로 동기화되어 있어야 한다. 이를 위해, 한대의 ntp 서버를 구성할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== OpenAFS 설치 ===&lt;br /&gt;
&lt;br /&gt;
먼저, OpenAFS를 설치해야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # emerge net-fs/openafs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령을 내리면, openafs-kernel 과 openafs 패키지가 설치 될 것이다. 위의 명령어를 통해 커널 모듈과 바이너리가 정상적으로 빌드될 것이다. 테스트를 해보자면,2.6.18 최신 커널에서도 무리없이 컴파일이 될 것이다.&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 공식 문서가 설치되길 원한다면, emerge app-doc/afsdoc 을 설치하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설치되는 장소는 OpenAFS가 Transarc 에서 IBM으로, 그리고 공개 되었을 때 변경되었다: 대강의 구조는 아래의 표를 참조하길 바란다:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''디렉토리'''||'''사용용도'''||'''Transarc'''||'''기본형태'''||'''Gentoo'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''viceetcdir'''|| 클라이언트 설정 || /usr/vice/etc || $(sysconfdir)/openafs || /etc/openafs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''unnamed'''|| 클라이언트 바이너리 || unspecified || $(bindir) || /usr/bin&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afsconfdir'''|| 서버 설정 || /usr/afs/etc || $(sysconfdir)/openafs/server || /etc/openafs/server&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afssrvdir'''|| 내부 서버 바이너리 || /usr/afs/bin (servers) || $(libexecdir)/openafs || /usr/libexec/openafs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afslocaldir'''|| 서버 상태 || /usr/afs/local || $(localstatedir)/openafs || /var/lib/openafs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afsdbdir'''|| 인증/서버리스트 등의 DB || /usr/afs/db || $(localstatedir)/openafs/db || /var/lib/openafs/db&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afslogdir'''|| 로그 || /usr/afs/logs || $(localstatedir)/openafs/logs || /var/lib/openafs/logs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afsbosconfig'''|| Overseer 설정 || $(afslocaldir)/BosConfig || $(afsconfdir)/BosConfig || /etc/openafs/BosConfig&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |설치 장소에 대한 내용&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} net-fs/openafs-legacy 를 설치하면, Transarc 디렉토리 형태로 소프트 링크를 만들어준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BOS (Basic Over Seer) Server 초기 구동 ===&lt;br /&gt;
&lt;br /&gt;
최초 설치의 경우 설정 디렉토리(/etc/openafs)를 보면 {{{CellServDB}}} 파일과 {{{ThisCell}}} 파일이 있는데, 이 파일을 들여다보면 잘못된(?) 초기화 내용을 담고 있다. 초기화를 위해, 가차없이 삭제하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # rm -f /etc/openafs/CellServDB&lt;br /&gt;
root@afsdisk1 # rm -f /etc/openafs/ThisCell&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ps. 기존에 afs를 설정한적이 있다면 /etc/openafs/BosConfig 파일도 삭제하도록한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, bosserver를 다음 명령을 통해 초기화하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bosserver -noauth &amp;amp;&amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} -noauth 옵션은 당신이 현재 admin 권한이 충분히 설정되어 있지 않기 때문에, 인증 절차를 무시하고 접근하기 위해 사용하는 것이다. 보안상으로 위험하므로, 습관상 -noauth를 붙여 유지보수를 하지 않도록 해야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령을 수행하면 /etc/openafs/server 디렉토리안에 이전의 {{{CellServDB}}} 파일과 {{{ThisCell}}} 파일이 생성되고, /etc/openafs 에 그 파일들에 소프트 링크가 걸려있을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Cell 이름 생성 ===&lt;br /&gt;
&lt;br /&gt;
물리적/논리적으로 분산되어 있는 Storage Pool 을 엮어주기 위해, 구간을 정하는 일을 해야 한다. OpenAFS 에서는 동일 Cell 이름으로 스토리지 풀을 구별한다. 이 매뉴얼에서는, '''''powercell''''' 을 사용할 것이다. :p 이 Cell 이름이 클라이언트가 마운트 해야 할 이름이기 때문에, 되도록이면 짧게 짓는 것이 좋을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} Cell 이름은 '''대문자를 포함하지 않는''' 조건과 함께 영문/숫자 64자로 제한되어 있다. 절대 대문자로 셀 이름을 정하지 말것.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cell 이름은 bos setcellname 명령어를 통해 구성할 수 있다. 용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
용법 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# bos setcellname &amp;lt;servername&amp;gt; &amp;lt;cell name&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래와 같이, afsdisk1.testbed.org에 powercell 이라는 셀 이름을 정해준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos setcellname afsdisk1.testbed.org powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 데이터베이스 서버의 시작 및 구성 ===&lt;br /&gt;
&lt;br /&gt;
다음에 해 줄 일은, '''bos create''' 명령어를 사용, {{{/etc/openafs/BosConfig}}} 설정 파일에 데이터베이스 서버 프로세스들을 위한 설정을 추가해주고, 서버를 실행하는 일이다. 아래의 4개 프로세스를 띄우는데, 이는 셀에 포함되는 스토리지 서버에 설정되는 것이 아니라, 단일 셀을 구성하는 데이터베이스 서버 머신에만 있으면 되는 사항이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''실행 파일'''||'''사용 용도'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''kaserver'''||인증 데이터베이스를 관리하기 위한 인증 서버다. 이는 Kerberos 5 인증 서버로 대체 가능하고, 기존에 Kerberos 인증 환경이 구축되어 있지 않다면 이를 사용하면 된다. (무리해서 Kerberos 를 구성할 필요가 없다는 뜻)&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''buserver'''||백업 데이터베이스를 관리하기 위한 백업 서버.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''ptserver'''||프로텍션(Protection) 데이터베이스를 위한 프로텍션 서버.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''vlserver'''||VLDB(볼륨 위치 데이터베이스 : Volume Location Database)를 관리 하기 위한 볼륨 위치 서버(VLS). 각 셀을 구성하는 볼륨의 위치를 기억하고 관리하는, 대단히 중요한 구성품이다.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |실행파일 및 사용용도&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 서버들을 구성하는 설정값을 갖추고 실행하기 위해, 다음의 용법을 사용해 설정한다:&lt;br /&gt;
&lt;br /&gt;
AttentionIcon&lt;br /&gt;
# bos create &amp;lt;{{{server name}}}&amp;gt; &amp;lt;{{{XXserver}}}&amp;gt; simple &amp;lt;{{{XXserver의 위치}}}&amp;gt; -cell &amp;lt;{{{cell name}}}&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
각 서버 프로세스의 위치는 afssrvdir (1.2 절의 디렉토리 목록표를 참조할것), 즉 '''''/usr/libexec/openafs''''' 디렉토리에 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 각 데이터베이스 서버 구성 및 실행 ====&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 위의 4가지 실행파일을 다 등록/실행하기 위해, 아래와 같이 실행하였다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org kaserver simple \&lt;br /&gt;
 /usr/libexec/openafs/kaserver -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org buserver simple \&lt;br /&gt;
 /usr/libexec/openafs/buserver -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org ptserver simple \&lt;br /&gt;
 /usr/libexec/openafs/ptserver -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org vlserver simple \&lt;br /&gt;
 /usr/libexec/openafs/vlserver -cell powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 최초 구성을 이미 한 상태라면, 상단의 '''create''' 대신 '''start'''를 넣으면 각 서버를 띄울 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 각 데이터베이스 서버 동작 확인 ====&lt;br /&gt;
&lt;br /&gt;
위의 설정으로 4개의 서버를 등록한 후, '''bos status''' 명령으로 현재 상태를 볼 수 있다. 다음의 명령을 통해 상태를 알아보자: 정상적이라면 아래처럼 메시지가 뜰 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos status afsdisk1.testbed.org -noauth&lt;br /&gt;
Instance kaserver, currently running normally.&lt;br /&gt;
Instance buserver, currently running normally.&lt;br /&gt;
Instance ptserver, currently running normally.&lt;br /&gt;
Instance vlserver, currently running normally.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 보안 메커니즘 초기화를 위한 (최초) 사용자 계정 생성 ===&lt;br /&gt;
&lt;br /&gt;
Cell 보안 메커니즘을 초기화하기 위해, 2개의 설정 엔트리를 인증 데이터베이스에 추가해야 한다. 하나는 메인 관리자 계정(admin)을 생성하는 것이고, 다른 하나는 AFS 프로세스를 위한, afs 라는 계정을 생성하는 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} afs 계정은 시스템 구성을 위해 반드시 생성해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== kas 를 사용한 사용자 계정 생성 ====&lt;br /&gt;
&lt;br /&gt;
이를 위해 kas 라는 사용자 명령행 툴을 사용한다. 최초 실행 용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# kas -cell &amp;lt;{{{cell name}}}&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
목표 달성을 위해, 상단의 용법을 토대로 kas 를 실행하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # kas -cell powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령을 실행하면, '''ka&amp;gt;''' 라는 프롬프트가 뜨게 될 것이다. '''create''' 명령을 사용하여 사용자 엔트리를 생성하고, '''examine''' 을 사용하여 생성된 엔트리를 검사한다. '''setfields''' 명령을 사용하여, admin 계정이 관리자임을 인식시키면 된다. 이제 아래와 같이 실행하도록 하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ka&amp;gt; create afs&lt;br /&gt;
initial_password:&lt;br /&gt;
Verifying, please re-enter initial_password:&lt;br /&gt;
ka&amp;gt; create admin&lt;br /&gt;
initial_password:&lt;br /&gt;
Verifying, please re-enter initial_password:&lt;br /&gt;
ka&amp;gt; examine afs&lt;br /&gt;
&lt;br /&gt;
User data for afs&lt;br /&gt;
key (0) cksum is 2651715259, last cpw: Mon Jun  4 20:49:30 2001&lt;br /&gt;
password will never expire.&lt;br /&gt;
An unlimited number of unsuccessful authentications is permitted.&lt;br /&gt;
entry never expires.  Max ticket lifetime 100.00 hours.&lt;br /&gt;
last mod on Mon Jun  4 20:49:30 2001 by &amp;lt;none&amp;gt;&lt;br /&gt;
permit password reuse&lt;br /&gt;
ka&amp;gt; setfields admin -flags admin&lt;br /&gt;
ka&amp;gt; examine admin&lt;br /&gt;
&lt;br /&gt;
User data for admin (ADMIN)&lt;br /&gt;
key (0) cksum is 2651715259, last cpw: Mon Jun  4 20:49:59 2001&lt;br /&gt;
password will never expire.&lt;br /&gt;
An unlimited number of unsuccessful authentications is permitted.&lt;br /&gt;
entry never expires.  Max ticket lifetime 25.00 hours.&lt;br /&gt;
last mod on Mon Jun  4 20:51:10 2001 by &amp;lt;none&amp;gt;&lt;br /&gt;
permit password reuse&lt;br /&gt;
ka&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 생성한 사용자를 사용자 리스트에 추가하는 방법 ====&lt;br /&gt;
&lt;br /&gt;
위 구간을 수행, kas를 통해 사용자 계정을 생성하였지만 계정을 사용자 리스트에 따로 추가해야 한다. admin 계정을 사용자 리스트({{{/etc/openafs/server/UserList}}})에 추가하도록 하자. 용법과 사용예는 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
용법:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# bos adduser &amp;lt;'''server name'''&amp;gt; &amp;lt;'''account name'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 기초로 아래의 명령을 수행, admin 계정을 사용자 리스트에 추가했다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos adduser afsdisk1.testbed.org admin -cell powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(admin 이외에도) 생성된 사용자는, 완전한 동작을 위해 ptserver에 마찬가지로 등록이 되어야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 서버 암호화 키를 생성하기 ===&lt;br /&gt;
&lt;br /&gt;
이제 AFS 서버의 암호화를 위한 키를 생성해야 한다. '''bos addkey''' 명령을 사용하여, 이 목적을 달성할 수 있다. 사용법은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# bos addkey &amp;lt;'''server name'''&amp;gt; -kvno 0 -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법대로 실행 할 경우, 암호 키를 집어넣으라고 하는데, 이 키의 값은 자신이 '''afs''' 계정을 생성할 때 사용한 키와 '''동일하게''' 넣어야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (ptserver) 프로텍션 데이터베이스에 admin 계정 연결하기 ===&lt;br /&gt;
&lt;br /&gt;
'''pts createuser''' 명령어를 사용해서, 프로텍션 데이터베이스에 admin 사용자를 위한 엔트리를 생성해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 기본적으로, 프로텍션 서버는 AFS UID(사용자 ID) 1을 관리자로 할당하는데, 이는 이제까지 생성한 기록상 첫번째 유저가 admin 이기 때문이다. 필요할 경우, -id 옵션을 사용해 조정할 수 있다. 문제는, UNIX 상에서의 실제 admin 유저의 UID를 필요로 한다는 것인데, 이를 위해서는 어쩔 수 없이(?) admin 계정을 만들어줘야 할 것이다. (혹은 기존의 bin 계정 - 즉 시스템의 UID가 1인 계정으로 AFS에 기록이 되는것을 보던지.) 이 admin 계정을 만들어 UID를 알아낸 후, -id 옵션을 붙여 UID를 매핑시켜주는데, admin 계정이나 기타 afs에서 사용할 계정이 반드시 로그인 되어야 할 필요는 없다는 뜻이다. (/bin/false 를 셸로 지정해도 된다는 뜻이다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
사용법은 아래와 같다:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pts createuser -name admin -cell &amp;lt;'''cell name'''&amp;gt; [-id &amp;lt;'''AFS UID'''&amp;gt;] -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 아래의 명령어를 수행했다: 계정 생성후, admin의 UID가 1002번이라면, -id 1002 를 붙여주는 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # pts createuser -name admin -id 1002 -cell powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 이 사용자가 system:administrators 그룹에 포함될 수 있도록, '''pts adduser''' 명령을 사용하여 그룹에 포함시키고, '''pts membership''' 명령을 통해 확인하도록 하자. 아래의 예를 알아서 적절하게 고쳐가면서 사용하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # pts adduser admin system:administrators -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # pts membership admin -cell powercell -noauth&lt;br /&gt;
Groups admin (id: 1002) is a member of:&lt;br /&gt;
system:administrators&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 서버 재시작 ===&lt;br /&gt;
&lt;br /&gt;
이제 상단의 설정이 끝났으면, 이제 까지 띄운 AFS의 모든 서버를 재시작 하도록 하자.&lt;br /&gt;
&lt;br /&gt;
서버의 재시작을 위한 용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# bos restart &amp;lt;'''server name'''&amp;gt; -all -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법대로, 아래와 같이 실행하여 AFS 서버를 재시작 하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos restart afsdisk1.testbed.org -all -cell powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fs 인스턴스 : 파일 서버, 볼륨 서버, 그리고 Salvager 프로세스의 구동 ===&lt;br /&gt;
&lt;br /&gt;
{{InfoIcon}} '''''이 단락은 실제로 서비스를 위한 스토리지가 담긴 물리적 서버에서 추가되어야 하는 인스턴스 이다. 이는 원래 메인 서버에 필수적인 요소가 아니지만, 대부분이 데이터베이스 서버와 파일 서버가 같은 물리적 서버에서 작동하게 만드는 것이 보통이므로, 순차적인 구성을 보여주기 위해서 Database 서버 구성 목록에 포함시킨것이다.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 '''bos create''' 명령을 다시 사용하여, 파일서버, 볼륨 서버, 그리고 Salvager를 등록하고, 구동해야 한다. 이들 3개의 프로세스는 다른 서버 프로세스와 마찬가지로 '''''/usr/libexec/openafs''''' 내에 있고, 각각 '''fileserver''', '''volserver''', '''salvager''' 라는 이름을 갖는다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
추가하는 방법은, 아래의 용법과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# bos create &amp;lt;'''server name'''&amp;gt; fs fs &amp;lt;'''파일서버 프로세스명'''&amp;gt; &amp;lt;'''볼륨서버 프로세스명'''&amp;gt; &amp;lt;'''salvager 프로세스명'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 아래의 명령문을 실행하면 된다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.ucsoft.org fs fs \&lt;br /&gt;
 /usr/libexec/openafs/fileserver /usr/libexec/openafs/volserver \&lt;br /&gt;
 /usr/libexec/openafs/salvager -cell powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OpenAFS 서버 프로세스에 대한 세부 상태 확인 ====&lt;br /&gt;
&lt;br /&gt;
이제까지의 과정으로 모든 서버 프로세스를 구성하였으면, 그 프로세스가 잘 떠 있는지 다음의 용법으로 확인 할 수 있다: 역시 마찬가지로 '''bos status''' 명령을 사용한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# bos status &amp;lt;server name&amp;gt; -long -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 사용하여, 실행하면 다음과 같은 화면이 나온다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos status afsdisk1.testbed.org -long -noauth&lt;br /&gt;
Instance kaserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:55:34 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/kaserver'&lt;br /&gt;
&lt;br /&gt;
Instance buserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:56:08 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/buserver'&lt;br /&gt;
&lt;br /&gt;
Instance ptserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:56:11 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/ptserver'&lt;br /&gt;
&lt;br /&gt;
Instance vlserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:56:17 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/vlserver'&lt;br /&gt;
&lt;br /&gt;
Instance fs, (type is fs) currently running normally.&lt;br /&gt;
    Auxiliary status is: file server running.&lt;br /&gt;
    Process last started at Sun Nov 19 00:55:34 2006 (4 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:55:34 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/fileserver'&lt;br /&gt;
    Command 2 is '/usr/libexec/openafs/volserver'&lt;br /&gt;
    Command 3 is '/usr/libexec/openafs/salvager'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 에러 발생으로 인한 종료의 경우, 종료시의 리턴값이 같이 나타나게 될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fileserver 의 UDP 리스닝 인터페이스 설정 ===&lt;br /&gt;
&lt;br /&gt;
afslocaldir (/var/lib/openafs) 에서 {{{NetInfo}}} 파일을 생성하는 것으로, 현재 서버 시스템의 네트웍 인터페이스가 여러개일 때는 이들을 등록해줘야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/openafs 디렉토리로 이동, {{{NetInfo}}} 라는 이름으로 텍스트 파일을 작성한다.&lt;br /&gt;
&lt;br /&gt;
입력 방식은 IP를 넣어주는데, 다음과 같이 한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.21&lt;br /&gt;
127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그런 다음, '''bos restart''' 명령을 사용, Fileserver를 재시작 하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 이제 무엇을 해야 하나? ===&lt;br /&gt;
&lt;br /&gt;
지금까지의 내용은 OpenAFS를 사용하기 위해, 최초로 서버를 구성하는 것에 대해서 다루었다. 서버를 구성했으면, 앞으로는 그 서버가 서비스할 셀을 제공하는 실제 스토리지 공간과 연결시켜줘야 하는 작업이 될 것이다. 그 작업을 위해, 다음 장인 OpenAFS Cell Volume 구성을 살펴보기 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OpenAFS Cell Volume 구성 ==&lt;br /&gt;
&lt;br /&gt;
OpenAFS 서버를 구성하기 위한 두번째, 셀의 구성품인 볼륨(Volume)을 생성/추가하는 단락이다. 위의 단락을 통해 이제까지 볼륨을 담을 수 있는 큰 상자를 만들었다면, 이제 큰 상자안에 담길 그릇들을 넣을 차례이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cell Volume 들을 처음 구성한다면, 다음 두가지를 기억하라. 첫번째는 최소한의 구동을 위해 '''root.afs''' 와 '''root.cell''' 이 '''반드시 필요하다'''는 사실을 기억해야 한다. 두번째는 다른 시스템에 단순 파일 서버를 구성하기 위해, 앞에서 해왔던 '''데이터베이스까지 다른 시스템에 구축할 필요는 없다'''는 사실이다. 반드시 기억해두고, 구성에 임해야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 디스크 준비 ===&lt;br /&gt;
&lt;br /&gt;
서비스를 할 디스크를 파티션을 쪼개던지, 물리 디스크를 한 파티션에 잡던지, 어떻게 하든 여분의 빈 파티션이 필요하다: AFS는 추가적인 디스크 캐싱을 하기 때문에, 파일 시스템은 ext2, 혹은 ext3을 사용할 것을 권장한다. 다른 파티션은 지원하지 않을 뿐 더러, 위험하기까지 하다. (reiserfs 의 경우, 에러 메시지를 출력하며 당신에게 경고를 할 것이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} Transarc / 구 버전의 OpenAFS 는 분리된 ext2 파티션에 디스크 캐싱을 위한 공간을 필요로 했다. 이 사항 역시 지금은 바뀌었고, 지금은 /etc/openafs/cacheinfo 에 캐싱된 용량 상태를 저장한다.&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} SGI XFS를 쓰고 싶다면, 또다른 AFS 구현체인 arla (http://www.stacken.kth.se/project/arla/) 를 사용할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서는, ''/dev/hda4'' 에 '''ext3'''으로 구성을 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
준비가 되었으면, 루트 디렉토리에 vicep'''X''' 디렉토리를 만들어야 한다. ('''X''' 위치에는 선호하는 값을 넣는다. a를 넣든 b를 넣든, 영문 소문자로 넣는다. 여기서는 vicepa 로 설정하겠다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 경험상 X 위치에 숫자가 들어가거나 하면 인식하지 못하는 문제가 생긴다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # mkdir /vicepa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 '''/etc/fstab''' 에 위 디렉토리로 파티션을 마운트하게 해 줘야 한다. /etc/fstab을 열고 아래의 줄을 추가해 줄 것이다: 아래의 내용을, 원하는 설정으로 고쳐서 사용하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; fstab&lt;br /&gt;
/dev/hda4               /vicepa        ext3            defaults        0 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, '''/etc/fstab'''에 설정해준 대로, 마운트를 하도록 하자. 아래의 명령을 내리면, /dev/hda4 는 /vicepa 디렉토리에 마운트 될 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # mount -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (최초 구성시) 볼륨 서버 데이터베이스에 볼륨 생성하기 ===&lt;br /&gt;
&lt;br /&gt;
이 부분은 첫번째 AFS 서버를 구성할 때 사용하는, '''''root.afs''''' 라는 '''첫번째''' AFS 볼륨을 생성하는 부분이다.&lt;br /&gt;
&lt;br /&gt;
사용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vos create &amp;lt;server name&amp;gt; &amp;lt;partition name&amp;gt; root.afs -cell &amp;lt;cell name&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 파티션 이름은, 실제 디바이스 파일 대신 앞에서 언급했던 파티션 이름을 사용해야 한다. (/vicep'''X''')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
앞에서 '''/vicepa''' 로 생성한 것과 위의 용법을 토대로, 다음을 실행한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # vos create afsdisk1.testbed.org /vicepa root.afs -cell powercell -noauth&lt;br /&gt;
Volume 536870912 created on partition /vicepa of afsdisk1.testbed.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
정상적으로 실행 될 경우, 해당 볼륨의 크기가 메시지에 포함될 것이다.&lt;br /&gt;
&lt;br /&gt;
'partition /vicep01 does not exist on the server' 라는 메시지가 나오면, 해당 파티션을 마운트 하고, '''bos restart''' 명령으로 서버를 재시작 한 후 재시도를 하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 서버 부분에서의 Update 서버 구성 ===&lt;br /&gt;
&lt;br /&gt;
셀에 포함된 다른 머신들에게 이들 디렉토리의 내용을 배포하기 위해, (서버 레벨에서의) Update 서버 (upserver 프로세스)를 시작해야 한다. 이들은 당신이 다른 서버 머신에서, 추가로 클라이언트 레벨의 Update Server를 구성할 때 활성화 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# bos create &amp;lt;server name&amp;gt; upserver simple &amp;quot;/usr/libexec/openafs/upserver \&lt;br /&gt;
-crypt /etc/openafs/server -clear /usr/libexec/openafs&amp;quot; -cell &amp;lt;cell name&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 서버레벨에서의 Update 서버를 구성하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org upserver simple \ &lt;br /&gt;
&amp;quot;/usr/libexec/openafs/upserver -crypt /etc/openafs/server -clear /usr/libexec/openafs&amp;quot; \&lt;br /&gt;
-cell powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 클라이언트 부분의 Update 서버 구성 ===&lt;br /&gt;
&lt;br /&gt;
이 부분을 접하면 이상하게 생각할 사항이, '''&amp;quot;왜 셀 볼륨만 있는 파일서버를 구성하는데 클라이언트 부분의 Update 서버가 필요한거지?&amp;quot;''' 가 될 것이다. 이 질문에 대한 대답은, '''&amp;quot;단순 파일서버 역시 메인 OpenAFS 서버로부터 설정들을 받아와야 하니까&amp;quot;''' 가 될 것이다. 따라서, OpenAFS 메인 서버 내에 만 파일 서비스를 추가하고 싶다면, 이 구간을 지나쳐도 될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
클라이언트 부분의 Update 서버는 2개로 나뉘어진다. 하나는 OpenAFS (Database) 서버로 부터 시스템 설정 사항을 받아오고(즉, /etc/openafs/server 설정을 배포하는 서버로 부터 설정을 받아오는), 동기화 하는 upclientetc 와, 바이너리 서버로부터 AFS 관련 바이너리를 동기화하는 upclientbin 이 있다. Thin Client 의 구성이 아니라면, 기본적으로는 upclientetc 만 설정하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
단순 셀 볼륨 파일 서버는 이 upclientetc 와 함께, 서버 부분에서의 Update 서버 (즉, upserver) 두가지를 필요로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
upclientetc 를 구성하는 용법은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # ./bos create  &amp;lt;'''machine name'''&amp;gt; upclientetc simple  \ &lt;br /&gt;
     &amp;quot;/usr/afs/bin/upclient &amp;lt;'''system control machine'''&amp;gt; [-t  &amp;lt;time&amp;gt;]  /usr/afs/etc&amp;quot; \&lt;br /&gt;
     -cell  &amp;lt;cell name&amp;gt;  -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 용법은 근거로, upclientetc를 구성해보자: OpenAFS 인증/백업/프로텍션/VLDB 가 구성된 데이터베이스 서버의 위치가 '''''afsdisk1.testbed.org''''' 일때, 단순 파일 서버의 역할만 하는 '''afsdisk2'''를 추가시켜주기 위해서는, 다음과 같이 명령을 실행하여 upclientetc를 구성할 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk2 # bos create afsdisk2.testbed.org upclientetc simple \&lt;br /&gt;
 &amp;quot;/usr/libexec/openafs/upclient afsdisk1.testbed.org /etc/openafs/server&amp;quot; \&lt;br /&gt;
 -cell powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Deprecated: AFS 가 제대로 작동하기 위한 시간 동기화 구성 ===&lt;br /&gt;
&lt;br /&gt;
{{AttentionIcon}} '''''이 단락 대신에, ntpclient + cron를 사용해 시간을 주기적으로 동기화를 하면 된다. GentooLinux 배포본의 openafs는 이 runntp가 들어가있지 않다.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, 이를 진행하기 전에 ntpd 서버가 구동중이어야 한다. (앞의 장에서 필요하다고 언급했던 것 처럼) 아니면, 최소한 외부의 ntp 서버 주소를 알고 있어야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 단락에서는 runntp 프로세스를 등록해, 서버간 시간을 동기화 하는 것에 대해 언급할 것이다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음의 용법을 사용하여 runntp 프로세스를 등록한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # bos create &amp;lt;'''machine name'''&amp;gt; runntp simple &amp;quot;runntp &amp;lt;'''ntp 서버 주소'''&amp;gt;+&amp;quot; -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 외부 ntp 서버가 없이, 로컬 시스템의 시간을 사용하려면, runntp 가 들어가는 부분에 ntp 서버 주소 대신 -localclock 옵션을 넣어주도록 한다. 만약 외부 ntp 서버 접근에 딜레이나 중단이 자주 있을 꺼라 판단하면, -localclock 옵션 뒤에 해당 ntp 서버 주소를 넣으면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법과 '''주의사항'''을 근거로 아래의 명령을 실행하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org runntp simple \&lt;br /&gt;
 &amp;quot;runntp afsdisk1.testbed.org&amp;quot; -cell powercell -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 실제 사용하게 될 루트 볼륨 구성하기 ===&lt;br /&gt;
&lt;br /&gt;
처음 AFS 서버를 구성하여, root.afs 를 생성한 경우에도 실제 사용할 루트 볼륨은 구성해야 한다. (구성하지 않고, root.afs만 구성되어 있다면, 클라이언트 사이드에서 접속한 후에 디렉토리를 접근할 경우 &amp;quot;접근할 장치가 없음&amp;quot; 이라는 메시지를 보게 될 것이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vos create &amp;lt;'''server name'''&amp;gt;&amp;lt;'''partition name'''&amp;gt; root.cell&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 근거로, root.cell 볼륨을 생성하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # vos create afsdisk1.testbed.org /vicepa root.cell&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fs 명령어를 사용, 디스크 쿼터 할당하기 ===&lt;br /&gt;
&lt;br /&gt;
위의 단계까지 잘 진행되었다면, 이 상태에서도 클라이언트가 OpenAFS 를 탐지하고 (인증을 받기 전) 마운트 상태까지 만들어 줄 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
문제는 클라이언트가 kaserver 인증을 받고 난 다음에, 조금 큰 파일을 올리려고 하다보면 얄짤 없이 디스크에 남은 공간이 없다고 하게 될 것이다. 이럴 경우를 위해, 최대 쿼터를 할당해야 한다. 단위는 {{{KByte}}}로 넣으면 된다. 아래의 예제는 /afs/powercell에 20{{{Gbyte}}}로 할당한 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@afsdisk1 # fs setquota /afs/powercell -max 20000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} '''fs mkmount''' 를 사용하여 위의 afs 파일시스템을 마운트 하던지, 아니면 클라이언트를 띄운 후 admin 계정에 접속해서 저 메시지를 날려야 할 것이다. 자세한 것은 OpenAFS Client 구성 부분을 참조하길 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OpenAFS Client 구성 ==&lt;br /&gt;
&lt;br /&gt;
위의 과정을 통해 구성한 서버와 셀 볼륨을 활용하기 위해서는 당연히 클라이언트가 필요하다. 이 단락에서는, 클라이언트를 설정하는 방법에 대해 언급할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, 클라이언트를 구성하기 위해서는 당연히, net-fs/openafs 패키지가 필요하다. 주저없이 입력하라:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@hostname # emerge net-fs/openafs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Client 설정파일 변경 ===&lt;br /&gt;
&lt;br /&gt;
먼저, '''/etc/openafs''' 디렉토리의 {{{CellServDB}}} 와 {{{ThisCell}}} 파일을 수정해야 한다. 수정하는 방법은, 서버의 IP와 Cell name을 가르키게 해야 하는데, 서버에 구성되어 있는 위 두개 파일을 참조해서 설정해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, {{{/etc/openafs/CellServDB}}} 파일을 잡는다. 이때 주의할 점은, # 뒤에 붙는 값이 '''절대''' 주석처리가 아니라는 사실이다. '''반드시''' '''''&amp;gt;Cellname''''' 이후에는 '''''#Cell name''''' 이라고 써줘야 한다. 그 아랫줄에는 IP를 기입하고, 다시 이후에 '''''#hostname(.domain.name)''''' 을 기입해줘야 한다는 사실이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;powercell     #Cell name&lt;br /&gt;
192.168.0.21   #afsdisk1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
::{{InfoIcon}} 띄워져 있는 공간은 '''Tab을 넣는 것이 아니라''', 스페이스 공백을 넣어야 한다. Tab을 사용할 경우, 잘못 인식한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 {{{/etc/openafs/ThisCell}}} 파일을 수정한다. 이 파일에는 단순히 포함하는 셀 명을 기입하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
powercell&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 클라이언트 기준에서의 캐시 설정 ===&lt;br /&gt;
&lt;br /&gt;
클라이언트에서도 AFS 캐시를 위해 로컬의 일정 부분에 캐싱을 하게 된다. 그 위치정보는 {{{/etc/openafs/cacheinfo}}} 에 저장되며, 기본값으로 {{{/var/cache/openafs}}} 아래 캐시가 저장되도록 되어 있다. 대강의 내용은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/afs:/var/cache/openafs:200000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
기본값은 {{{200MByte}}} 로, /afs 에 마운트되는 AFS 파일시스템을 위해 /var/cache/openafs 에 캐시를 구성하겠다고 되어 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{ThumbupIcon}} 권장 값은 {{{2GByte}}}로 잡는것이 좋다. 파일 억세스 속도가 느리다고 생각하면, 캐시를 크게 잡고, 그런 다음 '''''/etc/conf.d/openafs-client''''' 의 옵션에 chunksize를 조정하는 옵션을 붙여줘야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
현재 시스템이 '''Reiserfs'''나 '''SGI xfs''' 파일시스템을 쓰고 있다면, 불행하게도 이들 캐시를 위해 ext2/ext3 파티션을 할당해줘야 한다. xfs 같은 경우 파일시스템을 줄이는(shrink)것이 불가능 하므로, 이런 경우에는 ext2 이미지를 생성, loopback 마운트를 하여 사용하는 수 밖에 없다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{AttentionIcon}} '''이미 ext2/ext3 파일 시스템을 사용하고 있다면, 아래의 내용은 더 이상 살펴볼 필요가 없다.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, dd를 사용해서 일정 공간을 확보하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@hostname # dd if=/dev/zero of=/ext2part4afs.img bs=1024M count=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령어를 사용해서 2GB의 zero-filled 된 파일을 확보하면, mkfs를 사용해서 ext2 이미지를 생성하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@hostname # mkfs.ext2 /ext2part4afs.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
디바이스 파일이 아니라고 하면, 상큼하게 무시하고 계속 진행하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여하간, 다 만들어지면 이제 '''/etc/fstab''' 파일과, 캐시가 들어갈 디렉토리를 확보하도록 하자. 이미 /var/cache/openafs 디렉토리가 있을 테지만, 해당 디렉토리가 비어있도록 해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/fstab 파일에 다음의 내용을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; fstab&lt;br /&gt;
# AFS cache 를 위한 설정.&lt;br /&gt;
/ext2part4afs.img      /var/cache/openafs  ext2  loop,defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설정이 끝나면, '''mount -a''' 를 실행하여 해당 이미지를 loopback mount 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, '''/etc/openafs/cacheinfo''' 파일을 수정하자. ext2 파티션으로 바뀐 이미지는 실제 2GB 보다 작을 것이므로, 마운트 된 파일시스템의 용량을 확인하고 적절하게 넣어주자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/afs:/var/cache/openafs:1800000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
마운트가 끝나고 캐시를 넣을 공간을 확보하더라도, 반응속도등이 현저하게 떨어지는 문제가 있다. 이를 위해서 chunksize를 높게 잡아줘야 하는데, 이 값은 2^n 으로 증가시킬 수 있다. (옵션 입력값이 n이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''/etc/init.d/openafs-client'''의 세부사항을 보면, 현재의 캐시 크기에 맞춰서 옵션이 달라지도록 설계되어있음을 알 수 있다: 따라서, '''''/etc/conf.d/openafs-client''''' 파일을 열면, 자신의 캐시 사이즈에 맞는 변수를 찾아 고쳐줘야 할 것이다. (귀찮다면 모든 변수에 지정해도 된다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
구조상, 캐시사이즈에 따른 변수 채택은 다음과 같이 이루어진다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
128MB &amp;gt; 캐시사이즈 ==&amp;gt; $SMALL&lt;br /&gt;
512MB &amp;gt; 캐시사이즈 ==&amp;gt; $MEDIUM&lt;br /&gt;
1GB &amp;gt; 캐시사이즈 ==&amp;gt; $LARGE&lt;br /&gt;
2GB &amp;gt; 캐시사이즈 ==&amp;gt; $XLARGE&lt;br /&gt;
2GB &amp;lt; 캐시사이즈 ==&amp;gt; $XXLARGE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/conf.d/openafs-client 파일의 마지막을 보면,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; config&lt;br /&gt;
OPTIONS=&amp;quot;AUTOMATIC&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이라고 되어 있는데, 자신이 원하는 설정을 강제로 선택하게 하고 싶을 경우에는, SMALL / MEDIUM / LARGE / XLARGE / XXLARGE 등으로 잡아 놓을 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
중요한것은, chunksize를 지정해줘야 한다는 것인데, 이것의 기본값은 0이다.  값은 2^n 으로 계산하며, 캐시 사이즈 1GB~2GB 기준에 2^18 = 256 Kilobyte, 즉 '''-chunksize 18''' 로 잡아주는 것이 좋다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 설정으로는 $XLARGE가 선택될 것이므로, (대충 1.8GB 캐시) XLARGE 쪽의 변수 맨 끝에, '''-chunksize 18''' 을 추가해주자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; config&lt;br /&gt;
XLARGE=&amp;quot;-fakestat -stat 3600 -dcache 3600 -daemons 5 -volumes 196 -files 50000 -chunksize 18&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 정도만 해도, AFS에 연결하고 파일을 직접 접근하고 동영상을 재생해도, 무리가 없을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== openafs-client 서비스 시작 ===&lt;br /&gt;
&lt;br /&gt;
위의 설정이 끝나고, 캐시를 사용하는데 아무런 문제가 없으면, openafs-client 서비스를 시작해야 한다. 다음을 입력하여, openafs-client 서비스를 실행한다. 이것을 실행하면, 자동적으로 AFS 커널 모듈이 적재되고, /afs/'''''cellname''''' 이 생성될 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root # /etc/init.d/openafs-client start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 매번 시작시때 자동 적용을 하고 싶을 경우에는, ''''rc-update add openafs-client default'''' 명령을 수행하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== kaserver를 통해 로그인하는 방법 ===&lt;br /&gt;
&lt;br /&gt;
서비스가 시작해도, 막상 접근하면 퍼미션이 없다고 할 것이다. 이제는 '''klog''' 프로그램을 통해 kaserver의 인증을 거쳐 토큰을 받아내야 한다. 위의 설정이 잘 되고 서비스가 잘 시작되었다면, 사용법은 간단하다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
username@hostname &amp;gt; klog &amp;lt;AFS 사용자 명&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
정상적으로 인증이 되면, 그냥 아무말 없이 다시 프롬프트가 떨어질 것이다. 이제까지 admin 계정만 생성했었다면, AFS 사용자 명에 admin을 입력하면 될 것이다. 패스워드는 마찬가지로, 자신이 입력했던 패스워드를 사용하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
자, 이제 '''''/afs/cellname''''' 에 접근해 보자. 접근이 잘 된다면, OK다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 팁 / 관리 / 문제 해결 ==&lt;br /&gt;
&lt;br /&gt;
=== (선택사항) *NIX 시스템 로그인으로 AFS Login 이 동시에 가능하게 ===&lt;br /&gt;
&lt;br /&gt;
{{InfoIcon}} 선택사항이라고 하는 것은, '''klog''' 를 사용해서 로그인을 언제든지 할 수 있기 때문이다. 이 작업을 위해서는 계정의 UID 와 프로텍션 서버(ptserver)에 계정 생성시 들어가는 UID를 맞춰줘야 하는 귀찮은 작업이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AFS는 PAM과 연동을 할 수 있게 해준다. 이제부터 그 절차를 설명해 나갈 것이다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''/lib/security''' 디렉토리에는 pam 관련 라이브러리들이 들어있다. openafs 를 설치하면, 이 디렉토리에 pam_afs.so.1 과 pam_afs.krb.so.1 파일이 추가될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
우리가 수정해야 할 파일은 login 시 참조하는 '''/etc/pam.d/system-auth''' 와, su 등으로 권한을 이동할 때 참조하는 '''/etc/pam.d/su''' 등이 있다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''/etc/pam.d/system-auth''''' 를 다음과 같이 수정한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; pam.d&lt;br /&gt;
#%PAM-1.0&lt;br /&gt;
&lt;br /&gt;
auth       required     pam_env.so&lt;br /&gt;
auth       sufficient   pam_unix.so try_first_pass likeauth nullok&lt;br /&gt;
# AFS를 위해 추가한 부분은 아랫줄이다.&lt;br /&gt;
auth       sufficient   pam_afs.so.1 use_first_pass ignore_root&lt;br /&gt;
auth       required     pam_deny.so&lt;br /&gt;
&lt;br /&gt;
account    required     pam_unix.so&lt;br /&gt;
&lt;br /&gt;
password   required     pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 try_first_pass retry=3&lt;br /&gt;
password   sufficient   pam_unix.so try_first_pass use_authtok nullok md5 shadow&lt;br /&gt;
password   required     pam_deny.so&lt;br /&gt;
&lt;br /&gt;
session    required     pam_limits.so&lt;br /&gt;
session    required     pam_unix.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''/etc/pam.d/su''''' 의 내용을 아래와 같이 변경한다. (주석은 모두 삭제되었다. 적절하게 수정하자):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pam.d&lt;br /&gt;
#%PAM-1.0&lt;br /&gt;
&lt;br /&gt;
# AFS를 위해 추가된 부분은 바로 아랫줄이다.&lt;br /&gt;
auth       sufficient   pam_afs.so.1 ignore_uid 100&lt;br /&gt;
auth       sufficient   pam_rootok.so&lt;br /&gt;
auth       required     pam_wheel.so use_uid&lt;br /&gt;
auth       include              system-auth&lt;br /&gt;
account    include              system-auth&lt;br /&gt;
password   include              system-auth&lt;br /&gt;
session    include              system-auth&lt;br /&gt;
session    required     pam_env.so&lt;br /&gt;
session    optional             pam_xauth.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS의 계정 권한 (ACL) 변경 ===&lt;br /&gt;
&lt;br /&gt;
system:administrators 권한에서나, 혹은 ACL 변경 권한이 있는 계정으로, '''fs setacl''' 명령을 사용하여 변경하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fs setacl의 용법은 다음과 같다: 추가적인 옵션은, '''fs help setacl'''로 확인하기 바란다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fs setacl -dir &amp;lt;'''directory'''&amp;gt;+ -acl &amp;lt;'''access list entries'''&amp;gt;+ {{{[-clear] [-negative] [-id] [-if]}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
디렉토리는 마운트 포인트내 디렉토리(예: /afs/powercell)를 넣고, acl에는 다음과 같은 값을 넣을 수 있다:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''flag'''||'''의미'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''i'''||삽입(insert) 권한. 디렉토리에 파일을 추가하거나, 복사, 생성, 새 디렉토리 생성 여부가 포함된다. 새로만든 디렉토리에까지 앞의 권한이 확장되지는 않는다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''d'''||삭제(delete) 권한. 파일을 삭제, 혹은 이름을 바꾸거나, (i권한도 가지고있다는 전제하에)옮길 수 있다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''a'''||관리(administer) 권한. 각 파일/디렉토리의 권한 변경이 가능하다. system:administrators 그룹에 속한 사용자는 기본적으로 가지는 권한이다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''r'''||읽기(read) 권한. ls -l 등으로 보여지는 파일들을 검색하고, 내용을 읽을 수 있다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''w'''||쓰기(write) 권한. 해당 파일의 내용이나 chmod 같은 UNIX 퍼미션 비트등을 조절할 수 있다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''k'''||잠금(lock) 권한. 디렉토리/파일을 잠글 수 있게 하는 권한.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACL에서 적용가능한 값과 의미&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AFS는 추가적으로 정의되지 않은 사용자 권한 비트를 쓸 수 있게 해준다: 대문자 A, B, C, D, E, F, G, H - 총 8개 - 를 사용할 수 있다. AFS 기반의 프로그램을 개발할 때, 이들 flag에 대해 의미를 부여하고, 그에 따른 액션을 사용할 수 있게 해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''-clear''' 옵션은 ACL 리스트를 비워주는 옵션이고, '''-negative'''는 현재 할당된 권한의 반대로 플래그를 변화시켜준다. '''-id/-if''' 는 각각 디렉토리/파일에 대한 초기 권한 할당을 하는 옵션이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 볼륨 서버에 포함된 볼륨 리스트를 동기화하기 ===&lt;br /&gt;
&lt;br /&gt;
'''vos''' 명령행 도구는 볼륨 서버 / 볼륨 위치 데이터베이스에 관련된 작업을 하는 도구이다. 이를 이용하여, 같은 셀 내의 볼륨들에 대한 생성/삭제/리스트 동기화 등등을 할 수 있다. 이 단락에서 언급할 내용은, 각 서버에 잡혀있는 볼륨 리스트를 동기화 (sync VLDB) 하고, 볼륨 서버 동기화 (sync Server) 를 가능하게 하는 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VLDB/볼륨 서버 동기화는 다음과 같이 할 수 있다: 위의 것이 VLDB 동기화, 아래의 줄이 서버 동기화이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vos syncvldb &amp;lt;'''server name'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -localauth 또는 -noauth (현재 인증설정에 의존)&lt;br /&gt;
# vos syncserv &amp;lt;'''server name'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -localauth 또는 -noauth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참고로, 현재 vldb의 리스트는 다음과 같이 확인할 수 있다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vos listvldb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
클라이언트에서 실행하면, 현재 셀의 모든 볼륨에 대한 리스트를 볼 수 있을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 볼륨의 남은 공간 보기 ===&lt;br /&gt;
&lt;br /&gt;
볼륨의 남은 공간은, 다음의 명령을 통해 알 수 있다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fs diskfree&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
현재 Quota의 값이라던지, 다른 세부사항을 볼 때는 '''fs examine'''을 사용하면 된다. 마운트 포인트에 대한 모든 사항을, '''fs''' 명령어로 확인할 수 있기 때문에, '''fs help''' 를 사용하여 쓸 수 있는 명령어를 알아두는 것이 좋을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 너무 느리다 : 캐시 설정 이후에도, 파일을 가져오거나 리스팅에 지연(delay) 발생시 ===&lt;br /&gt;
&lt;br /&gt;
==== klog 인증시의 지연(delay) ====&lt;br /&gt;
&lt;br /&gt;
klog로 접속하는데 딜레이가 생긴다면, 일단 설정을 먼저 확인해보라. {{{/etc/openafs/CellServDB}}}가 접속 장애의 첫번째 이유가 될 수 있고, 그 다음은 서버의 인스턴스가 전부 작동하는지 '''bos status''' 명령으로 확인해보길 바란다. 단순히 init.d 스크립트로 구동했을 때, 모든 인스턴스 역시 실행될 거라는 보장은 아무도 못한다. (init.d의 구동 스크립트 는 bos 서버가 잘 뜨는지만 확인할 수 있을 뿐이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== VLDB 리스팅시의 지연 ====&lt;br /&gt;
&lt;br /&gt;
Kerberos 인증에는 아무런 문제가 없었으나, '''vos listvldb''' 를 통해 현재 클라이언트가 인식한 VLDB 의 구조를 가져오는데 지연이 발생할 수 있다. 이 문제는 대부분 네임 서버를 통해 질의, 해당 OpenAFS 볼륨 서버/파일 서버로 접근할 때 발생한다. '''/etc/resolv.conf''' 가 네임서버를 정확하게 가르키고 있는지, 혹시 hostname 만으로 찾는다면 동등 domainname 을 자동으로 넣는지 등을 확인해 봐야 할 것이다. 필요하면, NSCD(Name Server Caching Daemon)을 재시작 하거나 시동시 자동으로 등록되게끔 하는 방법도 추가할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 그래도 접속/파일 접근/전송이 느리다면 ====&lt;br /&gt;
&lt;br /&gt;
# 방화벽 문제를 의심한다.&amp;lt;BR&amp;gt; OpenAFS 서버는 최소 7000~7010 까지의 UDP를 필수적으로 요구한다. 클라이언트 역시 7000~7010 UDP 포트를 열어두기를 권장한다.&lt;br /&gt;
# 동등 네트워크에 존재하는지 (동일 클래스인지) 검사해보라.&amp;lt;BR&amp;gt;사무실에서 구성할 경우, 무선 네트웍/DHCP 접속자는 200번대 이후로 IP를 발급했는데, DHCP 접속자가 유달리 접속/전송 속도가 느렸던 문제를 경험하였다.&lt;br /&gt;
# {{{/etc/openafs/CellServDB}}} 파일의 설정을 의심해보라. &amp;lt;BR&amp;gt;뒤의 주석이라고 생각될 만한 '''#Cell name''' 이나 '''#hostname.domain.name''' 역시 설정 파일에 들어가야할 내용이다. 없을 경우, 접속 속도나 전송에 지연현상을 겪었다. 그리고, 이 파일에는 셀에 포함된 모든 파일 서버까지 목록에 들어가는 것이 아니라, OpenAFS 데이터베이스 서버의 위치만 들어가야 한다. VLDB 서버가 없는 단일 파일서버가 이 목록에 포함되어 있을 경우, 역시 지연현상이 생길 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 벤치마크에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
구성된 AFS 의 성능을 검사하기 위해, 여러가지 툴을 사용할 수 있다: 권장하는 것들로는 다음과 같은 것이 있다.&lt;br /&gt;
&lt;br /&gt;
* [http://www.citi.umich.edu/projects/linux-scalability/tools.html Andrew Benchmark] 가 있다.&lt;br /&gt;
* bonnie++ 을 사용하는 방법도 있다.&lt;br /&gt;
* 이것도 저것도 귀찮다면 dd 를 사용하라. 읽기 때는 /dev/null 로 보내고, 쓸 때는 /dev/zero 에서 가져오라. 이 때, 동등 파일을 여러번 실시하게 되면, afsd가 캐시를 이용하게 되어 테스트 결과가 혼란스럽게 나올 것이다. 정상적인 표본은, 절대 현재 네트워크의 한계속도를 뛰어넘을 수 없다.&lt;br /&gt;
* 지속적으로 가져올 수 있는지, 혹은 접근 반응등을 살펴보고 싶다면 AFS를 마운트 후 mplayer 와 같은 미디어 플레이어로 재생 능력을 테스트해보길 권장한다. bonnie++ 과 dd로는 알 수 없는 사항들을 몸소 느낄 수 있을것이다. 이 때도 역시, 캐시로 인해 정확한 판단이 불가능 할 수 있으므로, 파일을 먼저 AFS로 전송 후 AFS 클라이언트를 중지, 이후 캐시를 지우고 openafs-client 를 재시작하여 테스트 할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== JAFS (Java API for AFS) 에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
기본적으로 GentooLinux 에서나, 다른 배포판에서나 Java API (JNI로 만들어진) 패키지를 따로 찾을 수가 없다는 것이다. 하지만 존재한다: 소스를 풀어보고, ./configure 를 실행하라. 그리고, make jafs 를 하면 jafs 라이브러리가 생성될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이때, 되도록이면 openafs를 emerge 할 때 갖가지 configure 설정을 그대로 유지하도록 하라. 그냥 ./configure 로 openafs를 구성하면, 각 배포판에서의 sysconfdir 같은 옵션으로 인해 openafs의 설정파일 위치가 다르기 때문에 토큰을 받아오는 가장 기본적인 API 사용도 불가능하게 될 수 있다. (Cell Database를 못찾는다던지...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 참고할만한, 그리고 이 문서를 작성하는데 도움을 준 문서들 ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.openafs.org/doc/index.htm OpenAFS 공식 Document]&lt;br /&gt;
* [http://www.angelfire.com/hi/plutonic/afs-faq.html AFS Frequently Asked Questions]&lt;br /&gt;
* [https://www-s.acm.uiuc.edu/wiki/space/Setting+up+your+computer+as+an+AFS+client ACM@UUIC Wiki : Setting up your computer as an afs clients]&lt;br /&gt;
* [http://www.captain.at/programming/openafs/ Captains Universe : OpenAFS on Solaris 9 x86]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Afs_networks_image.png&amp;diff=973</id>
		<title>파일:Afs networks image.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Afs_networks_image.png&amp;diff=973"/>
		<updated>2013-03-17T14:06:44Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=OpenAFS-Gentoo-HOWTO&amp;diff=972</id>
		<title>OpenAFS-Gentoo-HOWTO</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=OpenAFS-Gentoo-HOWTO&amp;diff=972"/>
		<updated>2013-03-17T14:06:32Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 템플릿 오타수정&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;OpenAFS-Gentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
==OpenAFS와 관련된 본 문서의 정의==&lt;br /&gt;
&lt;br /&gt;
분산 네트워크 파일 시스템인 Andrew File System 의 Implementation 중 OpenAFS 의 설치, 운용에 대한 전반적인 매뉴얼. 이 매뉴얼에서는 GentooLinux 배포판 기준으로, OpenAFS 를 운용하는데 '''고통없는''' 가이드를 목적으로 하고 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
사이트 :: http://www.openafs.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 이 문서에 대하여 ==&lt;br /&gt;
&lt;br /&gt;
버전 0.23&lt;br /&gt;
&lt;br /&gt;
갱신일 :: 2006년 11월 21일&lt;br /&gt;
&lt;br /&gt;
옮긴일 :: 2013년 3월 17일&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
저작자 2006 (C) 신종훈 (LunA_J`etch, email : luna.jetch_at_gmail_dot_com)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 매뉴얼은 [http://creativecommons.org/licenses/by-sa/2.5/ Creative Commons ShareAlike-2.5] 라이센스에 의한 보호를 받습니다. OpenAFS 는 IBM Public License의 보호를 받습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 서버를 구성하기 전에 알아야 할 사항들 ==&lt;br /&gt;
&lt;br /&gt;
대강의 추상적인 서비스 구조는 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:afs_networks_image.png|none|570px|thumb|OpenAFS의 추상적인 구조]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
서비스 하는 측면에서는, 다수의 Replica 를 구성하여 백업/분산의 용도로 확장하기 좋다.&lt;br /&gt;
&lt;br /&gt;
클라이언트 측면에서는, 다수의 볼륨을 일일이 마운트 해 줄 필요 없이, 셀(Cell) 설정 만으로 서버사이드에서 정한 대로 연결된 다수의 물리적 스토리지를 사용할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cell 은 네트워크 내 구성된 AFS 서비스를 한번에 묶는 이름의 의미로 사용되며, AFS가 인식하는 실제 물리적 파일시스템 공간을 파티션(partition), AFS에서 서비스를 할 때 사용되는 논리적인 파일시스템 공간을 볼륨(Volume) 이라고 부른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 이 매뉴얼에서 언급하는 시스템 환경에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
OpenAFS 서버를 구성하기 전에, 자신의 네트웍 환경과, 설치할 서버들, 그리고 사용할 클라이언트의 수 등을 고려하여 서버를 구성해야 하는 것은 당연한 일이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 예제에서 보여주는 환경은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
 * afsdisk1 컴퓨터 : OpenAFS 메인 DB 서버 인스턴스 + 파일 서버 인스턴스&lt;br /&gt;
 * afsdisk2 컴퓨터 : OpenAFS 파일 서버 인스턴스&lt;br /&gt;
 * 100명 이하의 클라이언트 인스턴스&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{InfoIcon}} 다수의 사용자를 관리해야 하는 입장이라면, 이 매뉴얼에서 사용하는 OpenAFS 기본 인증 서버(kaserver) 대신 Kerberos v5 + openssl + 계정 정보를 담은 백엔드(ldap, radius 등) 로 인증 서버를 구축할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 구축할 수 있는 서버 인스턴스들에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
구축할 수 있는 서버 인스턴스들의 목록은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''인스턴스'''||'''사용 용도'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''kaserver'''||인증 데이터베이스를 관리하기 위한 인증 서버. kerberos v5 기준에 만족하는 인증서버를 총칭하는 인스턴스 명.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''buserver'''||백업 데이터베이스를 관리하기 위한 백업 서버의 인스턴스 명.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''ptserver'''||프로텍션(Protection) 데이터베이스를 위한 프로텍션 서버.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''vlserver'''||VLDB(볼륨 위치 데이터베이스 : Volume Location Database)를 관리 하기 위한 볼륨 위치 서버(VLS). 각 셀을 구성하는 볼륨의 위치를 기억하고 관리하는, 대단히 중요한 구성품이다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''upserver'''||업데이트 서버. 서버의 설정/바이너리들을 다른 업데이트 클라이언트들에게 전파하는 역할을 한다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''fs'''||파일서버. 하나의 파일서버 인스턴스는 Fileserver (파일 서버), Volserver (볼륨서버), Salvager 로 구성된다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''upclientetc'''||클라이언트 부분의 업데이트 서버. 서버의 설정을 받아오는 인스턴스를 의미한다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''upclientbin'''||클라이언트 부분의 업데이트 서버. 서버의 AFS 관련 바이너리를 받아오는 인스턴스를 총칭.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''runntp'''||ntp 클라이언트에 해당하는 서버. ntp 서버로 부터 시간정보를 받아와 동기화하는 인스턴스.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |구축할 수 있는 서버 인스턴스들의 목록&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이것을 보고 생각해야 할 것은, 시스템의 구성에 따라 그 역할을 분산시킬 수 있기 때문이다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
하나의 '''OpenAFS 메인 서버'''는 최소한 '''인증(kaserver) / 백업(buserver) / 프로텍션(ptserver) / VLDB(vlserver) / (서버 부분의) 업데이트 서버(upserver)''' 에 대한 인스턴스를 가지고 있어야 하며, 메인 서버와 맞물려 스토리지를 제공하는 '''파일 서버'''의 경우 '''클라이언트 부분의 업데이트 서버(upclientetc) / 서버 부분의 업데이트 서버(upserver) / 파일 서버(fs)''' 인스턴스를 가져야 최소한의 동작 보증을 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
좀 더 네트웍/시스템 환경의 분산을 고려한다면 데이터베이스 서버를 Replication 하는 방식으로 여러대로 분산 시킬 수도 있다. 스토리지 역시 서버 레벨에서의 Replication을 제공하기 때문에 분산의 혜택을 받을 수 있는 것들 중 하나이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
충분히 고려한 후 서비스를 구성하여도 늦지 않다. 최소한, 고려하지 않고 변경에 따른 소요비용을 고려한다면 더욱 그러할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OpenAFS Database Server 구성 (최초구성) ==&lt;br /&gt;
&lt;br /&gt;
이 단락에서는 OpenAFS 서비스를 위한 메인 데이터베이스를 설치하고, 셀을 생성하고, 사용자 계정을 생성하는 부분을 언급할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 미리 준비해야 할 것들 ===&lt;br /&gt;
&lt;br /&gt;
OpenAFS를 설치, 운용할 서버가 필요함은 말할 것도 없다. OpenAFS를 사용하기 위해서는, 되도록 bind(named)를 사용하여 FQDN을 만족시켜 줄 필요가 있다. 현재 시스템이 참조하는 네임서버를 구성하던지 해서, hostname.domain.name 을 만족시켜야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서는 첫번째 서버를 '''afsdisk1.testbed.org''' 라고 칭하게 될 것이다. &lt;br /&gt;
&lt;br /&gt;
(두번째 서버는 '''afsdisk2.testbed.org''' 가 될 것이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kerberos + openssl 을 사용할 수 있다. 다만, 이 매뉴얼에서는 언급하지 않을 것이다. 필요시 OpenAFS 공식 문서를 참조하기 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
또한, 여러대의 AFS 서버 풀을 구성하려면, (최소한) 동등 셀은 같은 시간으로 동기화되어 있어야 한다. 이를 위해, 한대의 ntp 서버를 구성할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== OpenAFS 설치 ===&lt;br /&gt;
&lt;br /&gt;
먼저, OpenAFS를 설치해야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # emerge net-fs/openafs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령을 내리면, openafs-kernel 과 openafs 패키지가 설치 될 것이다. 위의 명령어를 통해 커널 모듈과 바이너리가 정상적으로 빌드될 것이다. 테스트를 해보자면,2.6.18 최신 커널에서도 무리없이 컴파일이 될 것이다.&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 공식 문서가 설치되길 원한다면, emerge app-doc/afsdoc 을 설치하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설치되는 장소는 OpenAFS가 Transarc 에서 IBM으로, 그리고 공개 되었을 때 변경되었다: 대강의 구조는 아래의 표를 참조하길 바란다:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''디렉토리'''||'''사용용도'''||'''Transarc'''||'''기본형태'''||'''Gentoo'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''viceetcdir'''|| 클라이언트 설정 || /usr/vice/etc || $(sysconfdir)/openafs || /etc/openafs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''unnamed'''|| 클라이언트 바이너리 || unspecified || $(bindir) || /usr/bin&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afsconfdir'''|| 서버 설정 || /usr/afs/etc || $(sysconfdir)/openafs/server || /etc/openafs/server&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afssrvdir'''|| 내부 서버 바이너리 || /usr/afs/bin (servers) || $(libexecdir)/openafs || /usr/libexec/openafs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afslocaldir'''|| 서버 상태 || /usr/afs/local || $(localstatedir)/openafs || /var/lib/openafs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afsdbdir'''|| 인증/서버리스트 등의 DB || /usr/afs/db || $(localstatedir)/openafs/db || /var/lib/openafs/db&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afslogdir'''|| 로그 || /usr/afs/logs || $(localstatedir)/openafs/logs || /var/lib/openafs/logs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afsbosconfig'''|| Overseer 설정 || $(afslocaldir)/BosConfig || $(afsconfdir)/BosConfig || /etc/openafs/BosConfig&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |설치 장소에 대한 내용&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} net-fs/openafs-legacy 를 설치하면, Transarc 디렉토리 형태로 소프트 링크를 만들어준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BOS (Basic Over Seer) Server 초기 구동 ===&lt;br /&gt;
&lt;br /&gt;
최초 설치의 경우 설정 디렉토리(/etc/openafs)를 보면 {{{CellServDB}}} 파일과 {{{ThisCell}}} 파일이 있는데, 이 파일을 들여다보면 잘못된(?) 초기화 내용을 담고 있다. 초기화를 위해, 가차없이 삭제하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # rm -f /etc/openafs/CellServDB&lt;br /&gt;
root@afsdisk1 # rm -f /etc/openafs/ThisCell&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ps. 기존에 afs를 설정한적이 있다면 /etc/openafs/BosConfig 파일도 삭제하도록한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, bosserver를 다음 명령을 통해 초기화하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bosserver -noauth &amp;amp;&amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} -noauth 옵션은 당신이 현재 admin 권한이 충분히 설정되어 있지 않기 때문에, 인증 절차를 무시하고 접근하기 위해 사용하는 것이다. 보안상으로 위험하므로, 습관상 -noauth를 붙여 유지보수를 하지 않도록 해야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령을 수행하면 /etc/openafs/server 디렉토리안에 이전의 {{{CellServDB}}} 파일과 {{{ThisCell}}} 파일이 생성되고, /etc/openafs 에 그 파일들에 소프트 링크가 걸려있을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Cell 이름 생성 ===&lt;br /&gt;
&lt;br /&gt;
물리적/논리적으로 분산되어 있는 Storage Pool 을 엮어주기 위해, 구간을 정하는 일을 해야 한다. OpenAFS 에서는 동일 Cell 이름으로 스토리지 풀을 구별한다. 이 매뉴얼에서는, '''''powercell''''' 을 사용할 것이다. :p 이 Cell 이름이 클라이언트가 마운트 해야 할 이름이기 때문에, 되도록이면 짧게 짓는 것이 좋을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} Cell 이름은 '''대문자를 포함하지 않는''' 조건과 함께 영문/숫자 64자로 제한되어 있다. 절대 대문자로 셀 이름을 정하지 말것.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cell 이름은 bos setcellname 명령어를 통해 구성할 수 있다. 용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
용법 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos setcellname &amp;lt;servername&amp;gt; &amp;lt;cell name&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래와 같이, afsdisk1.testbed.org에 powercell 이라는 셀 이름을 정해준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos setcellname afsdisk1.testbed.org powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 데이터베이스 서버의 시작 및 구성 ===&lt;br /&gt;
&lt;br /&gt;
다음에 해 줄 일은, '''bos create''' 명령어를 사용, {{{/etc/openafs/BosConfig}}} 설정 파일에 데이터베이스 서버 프로세스들을 위한 설정을 추가해주고, 서버를 실행하는 일이다. 아래의 4개 프로세스를 띄우는데, 이는 셀에 포함되는 스토리지 서버에 설정되는 것이 아니라, 단일 셀을 구성하는 데이터베이스 서버 머신에만 있으면 되는 사항이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''실행 파일'''||'''사용 용도'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''kaserver'''||인증 데이터베이스를 관리하기 위한 인증 서버다. 이는 Kerberos 5 인증 서버로 대체 가능하고, 기존에 Kerberos 인증 환경이 구축되어 있지 않다면 이를 사용하면 된다. (무리해서 Kerberos 를 구성할 필요가 없다는 뜻)&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''buserver'''||백업 데이터베이스를 관리하기 위한 백업 서버.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''ptserver'''||프로텍션(Protection) 데이터베이스를 위한 프로텍션 서버.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''vlserver'''||VLDB(볼륨 위치 데이터베이스 : Volume Location Database)를 관리 하기 위한 볼륨 위치 서버(VLS). 각 셀을 구성하는 볼륨의 위치를 기억하고 관리하는, 대단히 중요한 구성품이다.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |실행파일 및 사용용도&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 서버들을 구성하는 설정값을 갖추고 실행하기 위해, 다음의 용법을 사용해 설정한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos create &amp;lt;{{{server name}}}&amp;gt; &amp;lt;{{{XXserver}}}&amp;gt; simple &amp;lt;{{{XXserver의 위치}}}&amp;gt; -cell &amp;lt;{{{cell name}}}&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
각 서버 프로세스의 위치는 afssrvdir (1.2 절의 디렉토리 목록표를 참조할것), 즉 '''''/usr/libexec/openafs''''' 디렉토리에 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 각 데이터베이스 서버 구성 및 실행 ====&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 위의 4가지 실행파일을 다 등록/실행하기 위해, 아래와 같이 실행하였다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org kaserver simple \&lt;br /&gt;
 /usr/libexec/openafs/kaserver -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org buserver simple \&lt;br /&gt;
 /usr/libexec/openafs/buserver -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org ptserver simple \&lt;br /&gt;
 /usr/libexec/openafs/ptserver -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org vlserver simple \&lt;br /&gt;
 /usr/libexec/openafs/vlserver -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 최초 구성을 이미 한 상태라면, 상단의 '''create''' 대신 '''start'''를 넣으면 각 서버를 띄울 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 각 데이터베이스 서버 동작 확인 ====&lt;br /&gt;
&lt;br /&gt;
위의 설정으로 4개의 서버를 등록한 후, '''bos status''' 명령으로 현재 상태를 볼 수 있다. 다음의 명령을 통해 상태를 알아보자: 정상적이라면 아래처럼 메시지가 뜰 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos status afsdisk1.testbed.org -noauth&lt;br /&gt;
Instance kaserver, currently running normally.&lt;br /&gt;
Instance buserver, currently running normally.&lt;br /&gt;
Instance ptserver, currently running normally.&lt;br /&gt;
Instance vlserver, currently running normally.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 보안 메커니즘 초기화를 위한 (최초) 사용자 계정 생성 ===&lt;br /&gt;
&lt;br /&gt;
Cell 보안 메커니즘을 초기화하기 위해, 2개의 설정 엔트리를 인증 데이터베이스에 추가해야 한다. 하나는 메인 관리자 계정(admin)을 생성하는 것이고, 다른 하나는 AFS 프로세스를 위한, afs 라는 계정을 생성하는 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} afs 계정은 시스템 구성을 위해 반드시 생성해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== kas 를 사용한 사용자 계정 생성 ====&lt;br /&gt;
&lt;br /&gt;
이를 위해 kas 라는 사용자 명령행 툴을 사용한다. 최초 실행 용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# kas -cell &amp;lt;{{{cell name}}}&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
목표 달성을 위해, 상단의 용법을 토대로 kas 를 실행하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # kas -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령을 실행하면, '''ka&amp;gt;''' 라는 프롬프트가 뜨게 될 것이다. '''create''' 명령을 사용하여 사용자 엔트리를 생성하고, '''examine''' 을 사용하여 생성된 엔트리를 검사한다. '''setfields''' 명령을 사용하여, admin 계정이 관리자임을 인식시키면 된다. 이제 아래와 같이 실행하도록 하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ka&amp;gt; create afs&lt;br /&gt;
initial_password:&lt;br /&gt;
Verifying, please re-enter initial_password:&lt;br /&gt;
ka&amp;gt; create admin&lt;br /&gt;
initial_password:&lt;br /&gt;
Verifying, please re-enter initial_password:&lt;br /&gt;
ka&amp;gt; examine afs&lt;br /&gt;
&lt;br /&gt;
User data for afs&lt;br /&gt;
key (0) cksum is 2651715259, last cpw: Mon Jun  4 20:49:30 2001&lt;br /&gt;
password will never expire.&lt;br /&gt;
An unlimited number of unsuccessful authentications is permitted.&lt;br /&gt;
entry never expires.  Max ticket lifetime 100.00 hours.&lt;br /&gt;
last mod on Mon Jun  4 20:49:30 2001 by &amp;lt;none&amp;gt;&lt;br /&gt;
permit password reuse&lt;br /&gt;
ka&amp;gt; setfields admin -flags admin&lt;br /&gt;
ka&amp;gt; examine admin&lt;br /&gt;
&lt;br /&gt;
User data for admin (ADMIN)&lt;br /&gt;
key (0) cksum is 2651715259, last cpw: Mon Jun  4 20:49:59 2001&lt;br /&gt;
password will never expire.&lt;br /&gt;
An unlimited number of unsuccessful authentications is permitted.&lt;br /&gt;
entry never expires.  Max ticket lifetime 25.00 hours.&lt;br /&gt;
last mod on Mon Jun  4 20:51:10 2001 by &amp;lt;none&amp;gt;&lt;br /&gt;
permit password reuse&lt;br /&gt;
ka&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 생성한 사용자를 사용자 리스트에 추가하는 방법 ====&lt;br /&gt;
&lt;br /&gt;
위 구간을 수행, kas를 통해 사용자 계정을 생성하였지만 계정을 사용자 리스트에 따로 추가해야 한다. admin 계정을 사용자 리스트({{{/etc/openafs/server/UserList}}})에 추가하도록 하자. 용법과 사용예는 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
용법:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos adduser &amp;lt;'''server name'''&amp;gt; &amp;lt;'''account name'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 기초로 아래의 명령을 수행, admin 계정을 사용자 리스트에 추가했다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos adduser afsdisk1.testbed.org admin -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(admin 이외에도) 생성된 사용자는, 완전한 동작을 위해 ptserver에 마찬가지로 등록이 되어야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 서버 암호화 키를 생성하기 ===&lt;br /&gt;
&lt;br /&gt;
이제 AFS 서버의 암호화를 위한 키를 생성해야 한다. '''bos addkey''' 명령을 사용하여, 이 목적을 달성할 수 있다. 사용법은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos addkey &amp;lt;'''server name'''&amp;gt; -kvno 0 -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법대로 실행 할 경우, 암호 키를 집어넣으라고 하는데, 이 키의 값은 자신이 '''afs''' 계정을 생성할 때 사용한 키와 '''동일하게''' 넣어야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (ptserver) 프로텍션 데이터베이스에 admin 계정 연결하기 ===&lt;br /&gt;
&lt;br /&gt;
'''pts createuser''' 명령어를 사용해서, 프로텍션 데이터베이스에 admin 사용자를 위한 엔트리를 생성해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 기본적으로, 프로텍션 서버는 AFS UID(사용자 ID) 1을 관리자로 할당하는데, 이는 이제까지 생성한 기록상 첫번째 유저가 admin 이기 때문이다. 필요할 경우, -id 옵션을 사용해 조정할 수 있다. 문제는, UNIX 상에서의 실제 admin 유저의 UID를 필요로 한다는 것인데, 이를 위해서는 어쩔 수 없이(?) admin 계정을 만들어줘야 할 것이다. (혹은 기존의 bin 계정 - 즉 시스템의 UID가 1인 계정으로 AFS에 기록이 되는것을 보던지.) 이 admin 계정을 만들어 UID를 알아낸 후, -id 옵션을 붙여 UID를 매핑시켜주는데, admin 계정이나 기타 afs에서 사용할 계정이 반드시 로그인 되어야 할 필요는 없다는 뜻이다. (/bin/false 를 셸로 지정해도 된다는 뜻이다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
사용법은 아래와 같다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# pts createuser -name admin -cell &amp;lt;'''cell name'''&amp;gt; [-id &amp;lt;'''AFS UID'''&amp;gt;] -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 아래의 명령어를 수행했다: 계정 생성후, admin의 UID가 1002번이라면, -id 1002 를 붙여주는 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # pts createuser -name admin -id 1002 -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 이 사용자가 system:administrators 그룹에 포함될 수 있도록, '''pts adduser''' 명령을 사용하여 그룹에 포함시키고, '''pts membership''' 명령을 통해 확인하도록 하자. 아래의 예를 알아서 적절하게 고쳐가면서 사용하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # pts adduser admin system:administrators -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # pts membership admin -cell powercell -noauth&lt;br /&gt;
Groups admin (id: 1002) is a member of:&lt;br /&gt;
system:administrators&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 서버 재시작 ===&lt;br /&gt;
&lt;br /&gt;
이제 상단의 설정이 끝났으면, 이제 까지 띄운 AFS의 모든 서버를 재시작 하도록 하자.&lt;br /&gt;
&lt;br /&gt;
서버의 재시작을 위한 용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos restart &amp;lt;'''server name'''&amp;gt; -all -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법대로, 아래와 같이 실행하여 AFS 서버를 재시작 하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos restart afsdisk1.testbed.org -all -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fs 인스턴스 : 파일 서버, 볼륨 서버, 그리고 Salvager 프로세스의 구동 ===&lt;br /&gt;
&lt;br /&gt;
{{InfoIcon}} '''''이 단락은 실제로 서비스를 위한 스토리지가 담긴 물리적 서버에서 추가되어야 하는 인스턴스 이다. 이는 원래 메인 서버에 필수적인 요소가 아니지만, 대부분이 데이터베이스 서버와 파일 서버가 같은 물리적 서버에서 작동하게 만드는 것이 보통이므로, 순차적인 구성을 보여주기 위해서 Database 서버 구성 목록에 포함시킨것이다.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 '''bos create''' 명령을 다시 사용하여, 파일서버, 볼륨 서버, 그리고 Salvager를 등록하고, 구동해야 한다. 이들 3개의 프로세스는 다른 서버 프로세스와 마찬가지로 '''''/usr/libexec/openafs''''' 내에 있고, 각각 '''fileserver''', '''volserver''', '''salvager''' 라는 이름을 갖는다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
추가하는 방법은, 아래의 용법과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos create &amp;lt;'''server name'''&amp;gt; fs fs &amp;lt;'''파일서버 프로세스명'''&amp;gt; &amp;lt;'''볼륨서버 프로세스명'''&amp;gt; &amp;lt;'''salvager 프로세스명'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 아래의 명령문을 실행하면 된다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.ucsoft.org fs fs \&lt;br /&gt;
 /usr/libexec/openafs/fileserver /usr/libexec/openafs/volserver \&lt;br /&gt;
 /usr/libexec/openafs/salvager -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OpenAFS 서버 프로세스에 대한 세부 상태 확인 ====&lt;br /&gt;
&lt;br /&gt;
이제까지의 과정으로 모든 서버 프로세스를 구성하였으면, 그 프로세스가 잘 떠 있는지 다음의 용법으로 확인 할 수 있다: 역시 마찬가지로 '''bos status''' 명령을 사용한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos status &amp;lt;server name&amp;gt; -long -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 사용하여, 실행하면 다음과 같은 화면이 나온다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos status afsdisk1.testbed.org -long -noauth&lt;br /&gt;
Instance kaserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:55:34 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/kaserver'&lt;br /&gt;
&lt;br /&gt;
Instance buserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:56:08 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/buserver'&lt;br /&gt;
&lt;br /&gt;
Instance ptserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:56:11 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/ptserver'&lt;br /&gt;
&lt;br /&gt;
Instance vlserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:56:17 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/vlserver'&lt;br /&gt;
&lt;br /&gt;
Instance fs, (type is fs) currently running normally.&lt;br /&gt;
    Auxiliary status is: file server running.&lt;br /&gt;
    Process last started at Sun Nov 19 00:55:34 2006 (4 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:55:34 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/fileserver'&lt;br /&gt;
    Command 2 is '/usr/libexec/openafs/volserver'&lt;br /&gt;
    Command 3 is '/usr/libexec/openafs/salvager'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 에러 발생으로 인한 종료의 경우, 종료시의 리턴값이 같이 나타나게 될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fileserver 의 UDP 리스닝 인터페이스 설정 ===&lt;br /&gt;
&lt;br /&gt;
afslocaldir (/var/lib/openafs) 에서 {{{NetInfo}}} 파일을 생성하는 것으로, 현재 서버 시스템의 네트웍 인터페이스가 여러개일 때는 이들을 등록해줘야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/openafs 디렉토리로 이동, {{{NetInfo}}} 라는 이름으로 텍스트 파일을 작성한다.&lt;br /&gt;
&lt;br /&gt;
입력 방식은 IP를 넣어주는데, 다음과 같이 한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
192.168.0.21&lt;br /&gt;
127.0.0.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그런 다음, '''bos restart''' 명령을 사용, Fileserver를 재시작 하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 이제 무엇을 해야 하나? ===&lt;br /&gt;
&lt;br /&gt;
지금까지의 내용은 OpenAFS를 사용하기 위해, 최초로 서버를 구성하는 것에 대해서 다루었다. 서버를 구성했으면, 앞으로는 그 서버가 서비스할 셀을 제공하는 실제 스토리지 공간과 연결시켜줘야 하는 작업이 될 것이다. 그 작업을 위해, 다음 장인 OpenAFS Cell Volume 구성을 살펴보기 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OpenAFS Cell Volume 구성 ==&lt;br /&gt;
&lt;br /&gt;
OpenAFS 서버를 구성하기 위한 두번째, 셀의 구성품인 볼륨(Volume)을 생성/추가하는 단락이다. 위의 단락을 통해 이제까지 볼륨을 담을 수 있는 큰 상자를 만들었다면, 이제 큰 상자안에 담길 그릇들을 넣을 차례이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cell Volume 들을 처음 구성한다면, 다음 두가지를 기억하라. 첫번째는 최소한의 구동을 위해 '''root.afs''' 와 '''root.cell''' 이 '''반드시 필요하다'''는 사실을 기억해야 한다. 두번째는 다른 시스템에 단순 파일 서버를 구성하기 위해, 앞에서 해왔던 '''데이터베이스까지 다른 시스템에 구축할 필요는 없다'''는 사실이다. 반드시 기억해두고, 구성에 임해야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 디스크 준비 ===&lt;br /&gt;
&lt;br /&gt;
서비스를 할 디스크를 파티션을 쪼개던지, 물리 디스크를 한 파티션에 잡던지, 어떻게 하든 여분의 빈 파티션이 필요하다: AFS는 추가적인 디스크 캐싱을 하기 때문에, 파일 시스템은 ext2, 혹은 ext3을 사용할 것을 권장한다. 다른 파티션은 지원하지 않을 뿐 더러, 위험하기까지 하다. (reiserfs 의 경우, 에러 메시지를 출력하며 당신에게 경고를 할 것이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} Transarc / 구 버전의 OpenAFS 는 분리된 ext2 파티션에 디스크 캐싱을 위한 공간을 필요로 했다. 이 사항 역시 지금은 바뀌었고, 지금은 /etc/openafs/cacheinfo 에 캐싱된 용량 상태를 저장한다.&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} SGI XFS를 쓰고 싶다면, 또다른 AFS 구현체인 arla (http://www.stacken.kth.se/project/arla/) 를 사용할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서는, ''/dev/hda4'' 에 '''ext3'''으로 구성을 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
준비가 되었으면, 루트 디렉토리에 vicep'''X''' 디렉토리를 만들어야 한다. ('''X''' 위치에는 선호하는 값을 넣는다. a를 넣든 b를 넣든, 영문 소문자로 넣는다. 여기서는 vicepa 로 설정하겠다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 경험상 X 위치에 숫자가 들어가거나 하면 인식하지 못하는 문제가 생긴다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # mkdir /vicepa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 '''/etc/fstab''' 에 위 디렉토리로 파티션을 마운트하게 해 줘야 한다. /etc/fstab을 열고 아래의 줄을 추가해 줄 것이다: 아래의 내용을, 원하는 설정으로 고쳐서 사용하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; fstab&lt;br /&gt;
/dev/hda4               /vicepa        ext3            defaults        0 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, '''/etc/fstab'''에 설정해준 대로, 마운트를 하도록 하자. 아래의 명령을 내리면, /dev/hda4 는 /vicepa 디렉토리에 마운트 될 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # mount -a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (최초 구성시) 볼륨 서버 데이터베이스에 볼륨 생성하기 ===&lt;br /&gt;
&lt;br /&gt;
이 부분은 첫번째 AFS 서버를 구성할 때 사용하는, '''''root.afs''''' 라는 '''첫번째''' AFS 볼륨을 생성하는 부분이다.&lt;br /&gt;
&lt;br /&gt;
사용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vos create &amp;lt;server name&amp;gt; &amp;lt;partition name&amp;gt; root.afs -cell &amp;lt;cell name&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 파티션 이름은, 실제 디바이스 파일 대신 앞에서 언급했던 파티션 이름을 사용해야 한다. (/vicep'''X''')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
앞에서 '''/vicepa''' 로 생성한 것과 위의 용법을 토대로, 다음을 실행한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # vos create afsdisk1.testbed.org /vicepa root.afs -cell powercell -noauth&lt;br /&gt;
Volume 536870912 created on partition /vicepa of afsdisk1.testbed.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
정상적으로 실행 될 경우, 해당 볼륨의 크기가 메시지에 포함될 것이다.&lt;br /&gt;
&lt;br /&gt;
'partition /vicep01 does not exist on the server' 라는 메시지가 나오면, 해당 파티션을 마운트 하고, '''bos restart''' 명령으로 서버를 재시작 한 후 재시도를 하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 서버 부분에서의 Update 서버 구성 ===&lt;br /&gt;
&lt;br /&gt;
셀에 포함된 다른 머신들에게 이들 디렉토리의 내용을 배포하기 위해, (서버 레벨에서의) Update 서버 (upserver 프로세스)를 시작해야 한다. 이들은 당신이 다른 서버 머신에서, 추가로 클라이언트 레벨의 Update Server를 구성할 때 활성화 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos create &amp;lt;server name&amp;gt; upserver simple &amp;quot;/usr/libexec/openafs/upserver \&lt;br /&gt;
-crypt /etc/openafs/server -clear /usr/libexec/openafs&amp;quot; -cell &amp;lt;cell name&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 서버레벨에서의 Update 서버를 구성하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org upserver simple \ &lt;br /&gt;
&amp;quot;/usr/libexec/openafs/upserver -crypt /etc/openafs/server -clear /usr/libexec/openafs&amp;quot; \&lt;br /&gt;
-cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 클라이언트 부분의 Update 서버 구성 ===&lt;br /&gt;
&lt;br /&gt;
이 부분을 접하면 이상하게 생각할 사항이, '''&amp;quot;왜 셀 볼륨만 있는 파일서버를 구성하는데 클라이언트 부분의 Update 서버가 필요한거지?&amp;quot;''' 가 될 것이다. 이 질문에 대한 대답은, '''&amp;quot;단순 파일서버 역시 메인 OpenAFS 서버로부터 설정들을 받아와야 하니까&amp;quot;''' 가 될 것이다. 따라서, OpenAFS 메인 서버 내에 만 파일 서비스를 추가하고 싶다면, 이 구간을 지나쳐도 될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
클라이언트 부분의 Update 서버는 2개로 나뉘어진다. 하나는 OpenAFS (Database) 서버로 부터 시스템 설정 사항을 받아오고(즉, /etc/openafs/server 설정을 배포하는 서버로 부터 설정을 받아오는), 동기화 하는 upclientetc 와, 바이너리 서버로부터 AFS 관련 바이너리를 동기화하는 upclientbin 이 있다. Thin Client 의 구성이 아니라면, 기본적으로는 upclientetc 만 설정하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
단순 셀 볼륨 파일 서버는 이 upclientetc 와 함께, 서버 부분에서의 Update 서버 (즉, upserver) 두가지를 필요로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
upclientetc 를 구성하는 용법은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 # ./bos create  &amp;lt;'''machine name'''&amp;gt; upclientetc simple  \ &lt;br /&gt;
     &amp;quot;/usr/afs/bin/upclient &amp;lt;'''system control machine'''&amp;gt; [-t  &amp;lt;time&amp;gt;]  /usr/afs/etc&amp;quot; \&lt;br /&gt;
     -cell  &amp;lt;cell name&amp;gt;  -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 용법은 근거로, upclientetc를 구성해보자: OpenAFS 인증/백업/프로텍션/VLDB 가 구성된 데이터베이스 서버의 위치가 '''''afsdisk1.testbed.org''''' 일때, 단순 파일 서버의 역할만 하는 '''afsdisk2'''를 추가시켜주기 위해서는, 다음과 같이 명령을 실행하여 upclientetc를 구성할 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk2 # bos create afsdisk2.testbed.org upclientetc simple \&lt;br /&gt;
 &amp;quot;/usr/libexec/openafs/upclient afsdisk1.testbed.org /etc/openafs/server&amp;quot; \&lt;br /&gt;
 -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Deprecated: AFS 가 제대로 작동하기 위한 시간 동기화 구성 ===&lt;br /&gt;
&lt;br /&gt;
{{AttentionIcon}} '''''이 단락 대신에, ntpclient + cron를 사용해 시간을 주기적으로 동기화를 하면 된다. GentooLinux 배포본의 openafs는 이 runntp가 들어가있지 않다.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, 이를 진행하기 전에 ntpd 서버가 구동중이어야 한다. (앞의 장에서 필요하다고 언급했던 것 처럼) 아니면, 최소한 외부의 ntp 서버 주소를 알고 있어야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 단락에서는 runntp 프로세스를 등록해, 서버간 시간을 동기화 하는 것에 대해 언급할 것이다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음의 용법을 사용하여 runntp 프로세스를 등록한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 # bos create &amp;lt;'''machine name'''&amp;gt; runntp simple &amp;quot;runntp &amp;lt;'''ntp 서버 주소'''&amp;gt;+&amp;quot; -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 외부 ntp 서버가 없이, 로컬 시스템의 시간을 사용하려면, runntp 가 들어가는 부분에 ntp 서버 주소 대신 -localclock 옵션을 넣어주도록 한다. 만약 외부 ntp 서버 접근에 딜레이나 중단이 자주 있을 꺼라 판단하면, -localclock 옵션 뒤에 해당 ntp 서버 주소를 넣으면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법과 '''주의사항'''을 근거로 아래의 명령을 실행하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org runntp simple \&lt;br /&gt;
 &amp;quot;runntp afsdisk1.testbed.org&amp;quot; -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 실제 사용하게 될 루트 볼륨 구성하기 ===&lt;br /&gt;
&lt;br /&gt;
처음 AFS 서버를 구성하여, root.afs 를 생성한 경우에도 실제 사용할 루트 볼륨은 구성해야 한다. (구성하지 않고, root.afs만 구성되어 있다면, 클라이언트 사이드에서 접속한 후에 디렉토리를 접근할 경우 &amp;quot;접근할 장치가 없음&amp;quot; 이라는 메시지를 보게 될 것이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vos create &amp;lt;'''server name'''&amp;gt;&amp;lt;'''partition name'''&amp;gt; root.cell&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 근거로, root.cell 볼륨을 생성하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # vos create afsdisk1.testbed.org /vicepa root.cell&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fs 명령어를 사용, 디스크 쿼터 할당하기 ===&lt;br /&gt;
&lt;br /&gt;
위의 단계까지 잘 진행되었다면, 이 상태에서도 클라이언트가 OpenAFS 를 탐지하고 (인증을 받기 전) 마운트 상태까지 만들어 줄 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
문제는 클라이언트가 kaserver 인증을 받고 난 다음에, 조금 큰 파일을 올리려고 하다보면 얄짤 없이 디스크에 남은 공간이 없다고 하게 될 것이다. 이럴 경우를 위해, 최대 쿼터를 할당해야 한다. 단위는 {{{KByte}}}로 넣으면 된다. 아래의 예제는 /afs/powercell에 20{{{Gbyte}}}로 할당한 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # fs setquota /afs/powercell -max 20000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} '''fs mkmount''' 를 사용하여 위의 afs 파일시스템을 마운트 하던지, 아니면 클라이언트를 띄운 후 admin 계정에 접속해서 저 메시지를 날려야 할 것이다. 자세한 것은 OpenAFS Client 구성 부분을 참조하길 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OpenAFS Client 구성 ==&lt;br /&gt;
&lt;br /&gt;
위의 과정을 통해 구성한 서버와 셀 볼륨을 활용하기 위해서는 당연히 클라이언트가 필요하다. 이 단락에서는, 클라이언트를 설정하는 방법에 대해 언급할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, 클라이언트를 구성하기 위해서는 당연히, net-fs/openafs 패키지가 필요하다. 주저없이 입력하라:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@hostname # emerge net-fs/openafs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Client 설정파일 변경 ===&lt;br /&gt;
&lt;br /&gt;
먼저, '''/etc/openafs''' 디렉토리의 {{{CellServDB}}} 와 {{{ThisCell}}} 파일을 수정해야 한다. 수정하는 방법은, 서버의 IP와 Cell name을 가르키게 해야 하는데, 서버에 구성되어 있는 위 두개 파일을 참조해서 설정해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, {{{/etc/openafs/CellServDB}}} 파일을 잡는다. 이때 주의할 점은, # 뒤에 붙는 값이 '''절대''' 주석처리가 아니라는 사실이다. '''반드시''' '''''&amp;gt;Cellname''''' 이후에는 '''''#Cell name''''' 이라고 써줘야 한다. 그 아랫줄에는 IP를 기입하고, 다시 이후에 '''''#hostname(.domain.name)''''' 을 기입해줘야 한다는 사실이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;powercell     #Cell name&lt;br /&gt;
192.168.0.21   #afsdisk1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
::{{InfoIcon}} 띄워져 있는 공간은 '''Tab을 넣는 것이 아니라''', 스페이스 공백을 넣어야 한다. Tab을 사용할 경우, 잘못 인식한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 {{{/etc/openafs/ThisCell}}} 파일을 수정한다. 이 파일에는 단순히 포함하는 셀 명을 기입하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
powercell&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 클라이언트 기준에서의 캐시 설정 ===&lt;br /&gt;
&lt;br /&gt;
클라이언트에서도 AFS 캐시를 위해 로컬의 일정 부분에 캐싱을 하게 된다. 그 위치정보는 {{{/etc/openafs/cacheinfo}}} 에 저장되며, 기본값으로 {{{/var/cache/openafs}}} 아래 캐시가 저장되도록 되어 있다. 대강의 내용은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/afs:/var/cache/openafs:200000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
기본값은 {{{200MByte}}} 로, /afs 에 마운트되는 AFS 파일시스템을 위해 /var/cache/openafs 에 캐시를 구성하겠다고 되어 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{ThumbupIcon}} 권장 값은 {{{2GByte}}}로 잡는것이 좋다. 파일 억세스 속도가 느리다고 생각하면, 캐시를 크게 잡고, 그런 다음 '''''/etc/conf.d/openafs-client''''' 의 옵션에 chunksize를 조정하는 옵션을 붙여줘야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
현재 시스템이 '''Reiserfs'''나 '''SGI xfs''' 파일시스템을 쓰고 있다면, 불행하게도 이들 캐시를 위해 ext2/ext3 파티션을 할당해줘야 한다. xfs 같은 경우 파일시스템을 줄이는(shrink)것이 불가능 하므로, 이런 경우에는 ext2 이미지를 생성, loopback 마운트를 하여 사용하는 수 밖에 없다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{AttentionIcon}} '''이미 ext2/ext3 파일 시스템을 사용하고 있다면, 아래의 내용은 더 이상 살펴볼 필요가 없다.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, dd를 사용해서 일정 공간을 확보하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@hostname # dd if=/dev/zero of=/ext2part4afs.img bs=1024M count=2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령어를 사용해서 2GB의 zero-filled 된 파일을 확보하면, mkfs를 사용해서 ext2 이미지를 생성하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@hostname # mkfs.ext2 /ext2part4afs.img&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
디바이스 파일이 아니라고 하면, 상큼하게 무시하고 계속 진행하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여하간, 다 만들어지면 이제 '''/etc/fstab''' 파일과, 캐시가 들어갈 디렉토리를 확보하도록 하자. 이미 /var/cache/openafs 디렉토리가 있을 테지만, 해당 디렉토리가 비어있도록 해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/fstab 파일에 다음의 내용을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; fstab&lt;br /&gt;
# AFS cache 를 위한 설정.&lt;br /&gt;
/ext2part4afs.img      /var/cache/openafs  ext2  loop,defaults 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설정이 끝나면, '''mount -a''' 를 실행하여 해당 이미지를 loopback mount 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, '''/etc/openafs/cacheinfo''' 파일을 수정하자. ext2 파티션으로 바뀐 이미지는 실제 2GB 보다 작을 것이므로, 마운트 된 파일시스템의 용량을 확인하고 적절하게 넣어주자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/afs:/var/cache/openafs:1800000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
마운트가 끝나고 캐시를 넣을 공간을 확보하더라도, 반응속도등이 현저하게 떨어지는 문제가 있다. 이를 위해서 chunksize를 높게 잡아줘야 하는데, 이 값은 2^n 으로 증가시킬 수 있다. (옵션 입력값이 n이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''/etc/init.d/openafs-client'''의 세부사항을 보면, 현재의 캐시 크기에 맞춰서 옵션이 달라지도록 설계되어있음을 알 수 있다: 따라서, '''''/etc/conf.d/openafs-client''''' 파일을 열면, 자신의 캐시 사이즈에 맞는 변수를 찾아 고쳐줘야 할 것이다. (귀찮다면 모든 변수에 지정해도 된다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
구조상, 캐시사이즈에 따른 변수 채택은 다음과 같이 이루어진다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
128MB &amp;gt; 캐시사이즈 ==&amp;gt; $SMALL&lt;br /&gt;
512MB &amp;gt; 캐시사이즈 ==&amp;gt; $MEDIUM&lt;br /&gt;
1GB &amp;gt; 캐시사이즈 ==&amp;gt; $LARGE&lt;br /&gt;
2GB &amp;gt; 캐시사이즈 ==&amp;gt; $XLARGE&lt;br /&gt;
2GB &amp;lt; 캐시사이즈 ==&amp;gt; $XXLARGE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/conf.d/openafs-client 파일의 마지막을 보면,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; config&lt;br /&gt;
OPTIONS=&amp;quot;AUTOMATIC&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이라고 되어 있는데, 자신이 원하는 설정을 강제로 선택하게 하고 싶을 경우에는, SMALL / MEDIUM / LARGE / XLARGE / XXLARGE 등으로 잡아 놓을 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
중요한것은, chunksize를 지정해줘야 한다는 것인데, 이것의 기본값은 0이다.  값은 2^n 으로 계산하며, 캐시 사이즈 1GB~2GB 기준에 2^18 = 256 Kilobyte, 즉 '''-chunksize 18''' 로 잡아주는 것이 좋다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 설정으로는 $XLARGE가 선택될 것이므로, (대충 1.8GB 캐시) XLARGE 쪽의 변수 맨 끝에, '''-chunksize 18''' 을 추가해주자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; config&lt;br /&gt;
XLARGE=&amp;quot;-fakestat -stat 3600 -dcache 3600 -daemons 5 -volumes 196 -files 50000 -chunksize 18&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 정도만 해도, AFS에 연결하고 파일을 직접 접근하고 동영상을 재생해도, 무리가 없을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== openafs-client 서비스 시작 ===&lt;br /&gt;
&lt;br /&gt;
위의 설정이 끝나고, 캐시를 사용하는데 아무런 문제가 없으면, openafs-client 서비스를 시작해야 한다. 다음을 입력하여, openafs-client 서비스를 실행한다. 이것을 실행하면, 자동적으로 AFS 커널 모듈이 적재되고, /afs/'''''cellname''''' 이 생성될 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root # /etc/init.d/openafs-client start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 매번 시작시때 자동 적용을 하고 싶을 경우에는, ''''rc-update add openafs-client default'''' 명령을 수행하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== kaserver를 통해 로그인하는 방법 ===&lt;br /&gt;
&lt;br /&gt;
서비스가 시작해도, 막상 접근하면 퍼미션이 없다고 할 것이다. 이제는 '''klog''' 프로그램을 통해 kaserver의 인증을 거쳐 토큰을 받아내야 한다. 위의 설정이 잘 되고 서비스가 잘 시작되었다면, 사용법은 간단하다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
username@hostname &amp;gt; klog &amp;lt;AFS 사용자 명&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
정상적으로 인증이 되면, 그냥 아무말 없이 다시 프롬프트가 떨어질 것이다. 이제까지 admin 계정만 생성했었다면, AFS 사용자 명에 admin을 입력하면 될 것이다. 패스워드는 마찬가지로, 자신이 입력했던 패스워드를 사용하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
자, 이제 '''''/afs/cellname''''' 에 접근해 보자. 접근이 잘 된다면, OK다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 팁 / 관리 / 문제 해결 ==&lt;br /&gt;
&lt;br /&gt;
=== (선택사항) *NIX 시스템 로그인으로 AFS Login 이 동시에 가능하게 ===&lt;br /&gt;
&lt;br /&gt;
{{InfoIcon}} 선택사항이라고 하는 것은, '''klog''' 를 사용해서 로그인을 언제든지 할 수 있기 때문이다. 이 작업을 위해서는 계정의 UID 와 프로텍션 서버(ptserver)에 계정 생성시 들어가는 UID를 맞춰줘야 하는 귀찮은 작업이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AFS는 PAM과 연동을 할 수 있게 해준다. 이제부터 그 절차를 설명해 나갈 것이다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''/lib/security''' 디렉토리에는 pam 관련 라이브러리들이 들어있다. openafs 를 설치하면, 이 디렉토리에 pam_afs.so.1 과 pam_afs.krb.so.1 파일이 추가될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
우리가 수정해야 할 파일은 login 시 참조하는 '''/etc/pam.d/system-auth''' 와, su 등으로 권한을 이동할 때 참조하는 '''/etc/pam.d/su''' 등이 있다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''/etc/pam.d/system-auth''''' 를 다음과 같이 수정한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; pam.d&lt;br /&gt;
#%PAM-1.0&lt;br /&gt;
&lt;br /&gt;
auth       required     pam_env.so&lt;br /&gt;
auth       sufficient   pam_unix.so try_first_pass likeauth nullok&lt;br /&gt;
# AFS를 위해 추가한 부분은 아랫줄이다.&lt;br /&gt;
auth       sufficient   pam_afs.so.1 use_first_pass ignore_root&lt;br /&gt;
auth       required     pam_deny.so&lt;br /&gt;
&lt;br /&gt;
account    required     pam_unix.so&lt;br /&gt;
&lt;br /&gt;
password   required     pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 try_first_pass retry=3&lt;br /&gt;
password   sufficient   pam_unix.so try_first_pass use_authtok nullok md5 shadow&lt;br /&gt;
password   required     pam_deny.so&lt;br /&gt;
&lt;br /&gt;
session    required     pam_limits.so&lt;br /&gt;
session    required     pam_unix.so&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''/etc/pam.d/su''''' 의 내용을 아래와 같이 변경한다. (주석은 모두 삭제되었다. 적절하게 수정하자):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
pam.d&lt;br /&gt;
#%PAM-1.0&lt;br /&gt;
&lt;br /&gt;
# AFS를 위해 추가된 부분은 바로 아랫줄이다.&lt;br /&gt;
auth       sufficient   pam_afs.so.1 ignore_uid 100&lt;br /&gt;
auth       sufficient   pam_rootok.so&lt;br /&gt;
auth       required     pam_wheel.so use_uid&lt;br /&gt;
auth       include              system-auth&lt;br /&gt;
account    include              system-auth&lt;br /&gt;
password   include              system-auth&lt;br /&gt;
session    include              system-auth&lt;br /&gt;
session    required     pam_env.so&lt;br /&gt;
session    optional             pam_xauth.so&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS의 계정 권한 (ACL) 변경 ===&lt;br /&gt;
&lt;br /&gt;
system:administrators 권한에서나, 혹은 ACL 변경 권한이 있는 계정으로, '''fs setacl''' 명령을 사용하여 변경하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fs setacl의 용법은 다음과 같다: 추가적인 옵션은, '''fs help setacl'''로 확인하기 바란다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
fs setacl -dir &amp;lt;'''directory'''&amp;gt;+ -acl &amp;lt;'''access list entries'''&amp;gt;+ {{{[-clear] [-negative] [-id] [-if]}}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
디렉토리는 마운트 포인트내 디렉토리(예: /afs/powercell)를 넣고, acl에는 다음과 같은 값을 넣을 수 있다:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''flag'''||'''의미'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''i'''||삽입(insert) 권한. 디렉토리에 파일을 추가하거나, 복사, 생성, 새 디렉토리 생성 여부가 포함된다. 새로만든 디렉토리에까지 앞의 권한이 확장되지는 않는다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''d'''||삭제(delete) 권한. 파일을 삭제, 혹은 이름을 바꾸거나, (i권한도 가지고있다는 전제하에)옮길 수 있다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''a'''||관리(administer) 권한. 각 파일/디렉토리의 권한 변경이 가능하다. system:administrators 그룹에 속한 사용자는 기본적으로 가지는 권한이다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''r'''||읽기(read) 권한. ls -l 등으로 보여지는 파일들을 검색하고, 내용을 읽을 수 있다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''w'''||쓰기(write) 권한. 해당 파일의 내용이나 chmod 같은 UNIX 퍼미션 비트등을 조절할 수 있다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''k'''||잠금(lock) 권한. 디렉토리/파일을 잠글 수 있게 하는 권한.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACL에서 적용가능한 값과 의미&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AFS는 추가적으로 정의되지 않은 사용자 권한 비트를 쓸 수 있게 해준다: 대문자 A, B, C, D, E, F, G, H - 총 8개 - 를 사용할 수 있다. AFS 기반의 프로그램을 개발할 때, 이들 flag에 대해 의미를 부여하고, 그에 따른 액션을 사용할 수 있게 해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''-clear''' 옵션은 ACL 리스트를 비워주는 옵션이고, '''-negative'''는 현재 할당된 권한의 반대로 플래그를 변화시켜준다. '''-id/-if''' 는 각각 디렉토리/파일에 대한 초기 권한 할당을 하는 옵션이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 볼륨 서버에 포함된 볼륨 리스트를 동기화하기 ===&lt;br /&gt;
&lt;br /&gt;
'''vos''' 명령행 도구는 볼륨 서버 / 볼륨 위치 데이터베이스에 관련된 작업을 하는 도구이다. 이를 이용하여, 같은 셀 내의 볼륨들에 대한 생성/삭제/리스트 동기화 등등을 할 수 있다. 이 단락에서 언급할 내용은, 각 서버에 잡혀있는 볼륨 리스트를 동기화 (sync VLDB) 하고, 볼륨 서버 동기화 (sync Server) 를 가능하게 하는 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VLDB/볼륨 서버 동기화는 다음과 같이 할 수 있다: 위의 것이 VLDB 동기화, 아래의 줄이 서버 동기화이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vos syncvldb &amp;lt;'''server name'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -localauth 또는 -noauth (현재 인증설정에 의존)&lt;br /&gt;
# vos syncserv &amp;lt;'''server name'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -localauth 또는 -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참고로, 현재 vldb의 리스트는 다음과 같이 확인할 수 있다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vos listvldb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
클라이언트에서 실행하면, 현재 셀의 모든 볼륨에 대한 리스트를 볼 수 있을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 볼륨의 남은 공간 보기 ===&lt;br /&gt;
&lt;br /&gt;
볼륨의 남은 공간은, 다음의 명령을 통해 알 수 있다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# fs diskfree&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
현재 Quota의 값이라던지, 다른 세부사항을 볼 때는 '''fs examine'''을 사용하면 된다. 마운트 포인트에 대한 모든 사항을, '''fs''' 명령어로 확인할 수 있기 때문에, '''fs help''' 를 사용하여 쓸 수 있는 명령어를 알아두는 것이 좋을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 너무 느리다 : 캐시 설정 이후에도, 파일을 가져오거나 리스팅에 지연(delay) 발생시 ===&lt;br /&gt;
&lt;br /&gt;
==== klog 인증시의 지연(delay) ====&lt;br /&gt;
&lt;br /&gt;
klog로 접속하는데 딜레이가 생긴다면, 일단 설정을 먼저 확인해보라. {{{/etc/openafs/CellServDB}}}가 접속 장애의 첫번째 이유가 될 수 있고, 그 다음은 서버의 인스턴스가 전부 작동하는지 '''bos status''' 명령으로 확인해보길 바란다. 단순히 init.d 스크립트로 구동했을 때, 모든 인스턴스 역시 실행될 거라는 보장은 아무도 못한다. (init.d의 구동 스크립트 는 bos 서버가 잘 뜨는지만 확인할 수 있을 뿐이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== VLDB 리스팅시의 지연 ====&lt;br /&gt;
&lt;br /&gt;
Kerberos 인증에는 아무런 문제가 없었으나, '''vos listvldb''' 를 통해 현재 클라이언트가 인식한 VLDB 의 구조를 가져오는데 지연이 발생할 수 있다. 이 문제는 대부분 네임 서버를 통해 질의, 해당 OpenAFS 볼륨 서버/파일 서버로 접근할 때 발생한다. '''/etc/resolv.conf''' 가 네임서버를 정확하게 가르키고 있는지, 혹시 hostname 만으로 찾는다면 동등 domainname 을 자동으로 넣는지 등을 확인해 봐야 할 것이다. 필요하면, NSCD(Name Server Caching Daemon)을 재시작 하거나 시동시 자동으로 등록되게끔 하는 방법도 추가할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 그래도 접속/파일 접근/전송이 느리다면 ====&lt;br /&gt;
&lt;br /&gt;
# 방화벽 문제를 의심한다.&amp;lt;BR&amp;gt; OpenAFS 서버는 최소 7000~7010 까지의 UDP를 필수적으로 요구한다. 클라이언트 역시 7000~7010 UDP 포트를 열어두기를 권장한다.&lt;br /&gt;
# 동등 네트워크에 존재하는지 (동일 클래스인지) 검사해보라.&amp;lt;BR&amp;gt;사무실에서 구성할 경우, 무선 네트웍/DHCP 접속자는 200번대 이후로 IP를 발급했는데, DHCP 접속자가 유달리 접속/전송 속도가 느렸던 문제를 경험하였다.&lt;br /&gt;
# {{{/etc/openafs/CellServDB}}} 파일의 설정을 의심해보라. &amp;lt;BR&amp;gt;뒤의 주석이라고 생각될 만한 '''#Cell name''' 이나 '''#hostname.domain.name''' 역시 설정 파일에 들어가야할 내용이다. 없을 경우, 접속 속도나 전송에 지연현상을 겪었다. 그리고, 이 파일에는 셀에 포함된 모든 파일 서버까지 목록에 들어가는 것이 아니라, OpenAFS 데이터베이스 서버의 위치만 들어가야 한다. VLDB 서버가 없는 단일 파일서버가 이 목록에 포함되어 있을 경우, 역시 지연현상이 생길 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 벤치마크에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
구성된 AFS 의 성능을 검사하기 위해, 여러가지 툴을 사용할 수 있다: 권장하는 것들로는 다음과 같은 것이 있다.&lt;br /&gt;
&lt;br /&gt;
* [http://www.citi.umich.edu/projects/linux-scalability/tools.html Andrew Benchmark] 가 있다.&lt;br /&gt;
* bonnie++ 을 사용하는 방법도 있다.&lt;br /&gt;
* 이것도 저것도 귀찮다면 dd 를 사용하라. 읽기 때는 /dev/null 로 보내고, 쓸 때는 /dev/zero 에서 가져오라. 이 때, 동등 파일을 여러번 실시하게 되면, afsd가 캐시를 이용하게 되어 테스트 결과가 혼란스럽게 나올 것이다. 정상적인 표본은, 절대 현재 네트워크의 한계속도를 뛰어넘을 수 없다.&lt;br /&gt;
* 지속적으로 가져올 수 있는지, 혹은 접근 반응등을 살펴보고 싶다면 AFS를 마운트 후 mplayer 와 같은 미디어 플레이어로 재생 능력을 테스트해보길 권장한다. bonnie++ 과 dd로는 알 수 없는 사항들을 몸소 느낄 수 있을것이다. 이 때도 역시, 캐시로 인해 정확한 판단이 불가능 할 수 있으므로, 파일을 먼저 AFS로 전송 후 AFS 클라이언트를 중지, 이후 캐시를 지우고 openafs-client 를 재시작하여 테스트 할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== JAFS (Java API for AFS) 에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
기본적으로 GentooLinux 에서나, 다른 배포판에서나 Java API (JNI로 만들어진) 패키지를 따로 찾을 수가 없다는 것이다. 하지만 존재한다: 소스를 풀어보고, ./configure 를 실행하라. 그리고, make jafs 를 하면 jafs 라이브러리가 생성될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이때, 되도록이면 openafs를 emerge 할 때 갖가지 configure 설정을 그대로 유지하도록 하라. 그냥 ./configure 로 openafs를 구성하면, 각 배포판에서의 sysconfdir 같은 옵션으로 인해 openafs의 설정파일 위치가 다르기 때문에 토큰을 받아오는 가장 기본적인 API 사용도 불가능하게 될 수 있다. (Cell Database를 못찾는다던지...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 참고할만한, 그리고 이 문서를 작성하는데 도움을 준 문서들 ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.openafs.org/doc/index.htm OpenAFS 공식 Document]&lt;br /&gt;
* [http://www.angelfire.com/hi/plutonic/afs-faq.html AFS Frequently Asked Questions]&lt;br /&gt;
* [https://www-s.acm.uiuc.edu/wiki/space/Setting+up+your+computer+as+an+AFS+client ACM@UUIC Wiki : Setting up your computer as an afs clients]&lt;br /&gt;
* [http://www.captain.at/programming/openafs/ Captains Universe : OpenAFS on Solaris 9 x86]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=WikiTestPage&amp;diff=971</id>
		<title>WikiTestPage</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=WikiTestPage&amp;diff=971"/>
		<updated>2013-03-17T14:05:43Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 테스트 템플릿 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; 여기는 MediaWiki의 문법 테스트페이지 입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Template:InfoIcon|정보아이콘]]&lt;br /&gt;
{{InfoIcon}}이렇게 아이콘이 나오게 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
* [[Template:AttentionIcon|주의아이콘]]&lt;br /&gt;
{{AttentionIcon}}이렇게 아이콘이 나오게 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
* [[Template:ThumbupIcon|추천아이콘]]&lt;br /&gt;
{{ThumbupIcon}}이렇게 아이콘이 나오게 할 수 있습니다.&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%ED%8B%80:ThumbupIcon&amp;diff=970</id>
		<title>틀:ThumbupIcon</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8B%80:ThumbupIcon&amp;diff=970"/>
		<updated>2013-03-17T14:05:32Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: thumb-up icon 템플릿 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[image:thumb-up.png]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Thumb-up.png&amp;diff=969</id>
		<title>파일:Thumb-up.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Thumb-up.png&amp;diff=969"/>
		<updated>2013-03-17T14:05:28Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%ED%8B%80:AttentionIcon&amp;diff=968</id>
		<title>틀:AttentionIcon</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8B%80:AttentionIcon&amp;diff=968"/>
		<updated>2013-03-17T14:04:59Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: attention icon 템플릿 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[image:attention.png]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Attention.png&amp;diff=967</id>
		<title>파일:Attention.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Attention.png&amp;diff=967"/>
		<updated>2013-03-17T14:04:43Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%ED%8B%80:InfoIcon&amp;diff=966</id>
		<title>틀:InfoIcon</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8B%80:InfoIcon&amp;diff=966"/>
		<updated>2013-03-17T14:01:31Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: iconinfo 템플릿추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[image:icon-info.png]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Icon-info.png&amp;diff=965</id>
		<title>파일:Icon-info.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%ED%8C%8C%EC%9D%BC:Icon-info.png&amp;diff=965"/>
		<updated>2013-03-17T14:01:17Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Gentoo_redmine_nginix_git&amp;diff=964</id>
		<title>Gentoo redmine nginix git</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Gentoo_redmine_nginix_git&amp;diff=964"/>
		<updated>2013-03-17T13:36:44Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: gentoo-redmine nginx git 문서추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;Gentoo Linux에서 nginix, redmint, git 같이 사용하기-작성자_지구상의누군가&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==적용범위 및 목적==&lt;br /&gt;
&lt;br /&gt;
본 문서는 일반적으로 프로젝트의 진행 및 관리를 위해 Gentoo linux에서 DVCS프로그램인 git를 설치 하고 nginx웹서버 및 redmine을 설치하여 gitolite를 이용해 연동하는 법을 간단하게 기술하고 이를 이용해서 프로젝트를 진행하는 법을 간략하게 설명함을 목적으로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==용어정의==&lt;br /&gt;
&lt;br /&gt;
* git :: Distributed version control system(DVCS) Program&lt;br /&gt;
* redmine :: flexible project management system&lt;br /&gt;
* nginx :: web server daemon&lt;br /&gt;
* Gentoo linux :: linux distribution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==기준내용==&lt;br /&gt;
&lt;br /&gt;
===시스템을 구성하기 위한 준비===&lt;br /&gt;
&lt;br /&gt;
# Gentoo Linux를 대상으로 하는 문서인 만큼 Gentoo Linux가 설치된 서버시스템&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===git===&lt;br /&gt;
&lt;br /&gt;
git란 개발되고 있는 source에 대한 버전 관리 시스템(VCS) 중 한 종류로서 서버상의 저장소에 저장하며 관리할 수 있는 CVCS(Centralized VCS)의 기능에서 서버가 문제가 생기거나 네트워크가 연결되지 않았을 때 사용 할 수 없다는 단점을 보완한 DVCS(Distributed VCS)프로그램이다.&lt;br /&gt;
&lt;br /&gt;
git는 하나의 snapshot단위로 버전 관리를 하게 되며 하나의 snapshot이 만들어 지기까지 Working Directory, Staging Area, Git Directory 의 3가지 단계를 거치게 된다.&lt;br /&gt;
&lt;br /&gt;
* Git Directory :: Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말한다. Git Directory가 Git의 핵심이다. 다른 컴퓨터에 있는 저장소를 Clone 할 때 Git Directory가 만들어진다.&lt;br /&gt;
* Working Directory :: 프로젝트의 특정 버전을 Checkout 한 것이다. Git Directory는 지금 작업하는 디스크에 있고 그 Directory에 압축된 데이터베이스에서 파일을 가져와서 Working Directory를 만든다.&lt;br /&gt;
* Staging Area :: Git Directory에 있다. 단순한 파일이고 곧 Commit 할 파일에 대한 정보를 저장한다. 종종 인덱스라고 불리기도 하지만, Staging Area라는 명칭이 표준이 되어가고 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
snapshot을 만들어 Commit 하기 위해서는 아래의 순서를 따른다.&lt;br /&gt;
# Working Directory에서 파일을 수정한다.&lt;br /&gt;
# Staging Area에 파일을 Stage 해서 Commit 할 Snapshot을 만든다.&lt;br /&gt;
# Staging Area에 있는 파일들을 Commit 해서 Git Directory에 영구적인 Snapshot으로 저장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====git설치====&lt;br /&gt;
&lt;br /&gt;
Gentoo linux에서는 emerge git로 설치할 수 있다. 설치 시 git인증을 서포트 하는 gitolite를 같이 설치 하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# emerge -q git gitolite-gentoo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Redmine===&lt;br /&gt;
&lt;br /&gt;
웹기반의 프로젝트 관리와 버그 추적 기능을 제공하는 도구이다. 프로젝트 관리에 도움이 되도록 달력과 Gantt chart를 제공하고 일정관리 기능을 제공한다. Redmine은 통합된 프로젝트관리 기능과 이슈추적, 여러가지 형상 관리 기능을 제공한다.&lt;br /&gt;
&lt;br /&gt;
Redmine의 디자인은 비슷한 기능을 가지는 오픈소스 프로그램인 Trac에 영향을 많이 받았으며 Ruby on Rails에 기반하여 작성되었고 멀티 플랫폼을 지원하며 여러가지 종류의 데이터베이스를 지원한다. 이중에서 우리는 SQLite를 사용 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Redmine설치====&lt;br /&gt;
&lt;br /&gt;
Redmine을 사용하기 위해서 필요한 일부 package들이 Gentoo linux 에선 기본적으로 mask 되어 있어 바로 설치가 되지 않기 때문에 필요한 package들의 mask를 풀어주는 설정이 필요 하다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래에서 thin이라는 패키지는 nginx와 redmine을 연동시켜 사용할수 있는 ruby용 범용 컨테이너 이다. ruby용 web application을 사용하려면 java의 tomcat처럼 중간에 broker를 필요로 하게되는데 thin은 그런 역할을 해준다.&lt;br /&gt;
&lt;br /&gt;
http daemon으로 apache를 사용한다면 mod passenger를 사용하는 방법&amp;lt;ref name=&amp;quot;주석1&amp;quot;&amp;gt;http://nkdk.tistory.com/entry/ubuntu-1104-or-1110-apache-%EC%97%90%EC%84%9C-%EB%A3%A8%EB%B9%84-%EB%8F%8C%EB%A6%AC%EA%B8%B0 페이지를 참고&amp;lt;/ref&amp;gt;도 있지만 여기서 언급할 사항은 아니기때문에 이상의 설명은 하지 않는다 않는다.&lt;br /&gt;
&lt;br /&gt;
thin은 기본적으로 ruby를 위한 proxy라고 생각해도 좋으며 그 자체로 http daemon없이 스스로 동작이 가능하다. 다만 여러가지 기술 및 효율의 문제로인해 독립적으로 사용하는것은 피하는것이 좋다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vi /etc/portage/package.keywords&lt;br /&gt;
www-apps/redmine ~amd64&lt;br /&gt;
dev-ruby/ruby-net-ldap ~amd64&lt;br /&gt;
www-servers/thin ~amd64&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
또한 설치에 필요한 USE flag도 미리 정의 해 놓자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vi /etc/portage/package.use&lt;br /&gt;
www-apps/redmine imagemagick ldap&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 rails-2.3에서는 rack-1.2 이상은 사용 할 수 없으니 mask 설정을 추가 한다. 또한 redmine-2.x 이하 버전으로 설치 할 것이므로 같이 추가 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vi /etc/portage/package.mask&lt;br /&gt;
&amp;gt;=dev-ruby/rack-1.2&lt;br /&gt;
&amp;gt;=www-apps/redmine-2.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
문서 작성시점에서 ruby-1.9를 사용하는 rails-3.x에 대해 Gentoo linux에서는 mask가 되어 있으므로 ruby-1.8 버전만을 사용 하도록 make.conf 를 수정 추가 해 준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vi /etc/portage/make.conf&lt;br /&gt;
RUBY_TARGETS=&amp;quot;ruby18&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 필요한 package를 설치해보자. 프로젝트에서 사용할 DB는 SQLite이며 웹서버는 nginx이므로 같이 설치한다. thin은 nginx와 redmine의 다리역할을 해줄 컨테이너 이며 bundler는 ruby용 package간 의존성 관리 툴이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# emerge -q redmine thin bundler nginx dev-ruby/sqlite3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설치가 완료 되면 redmine의 DB 접속 설정파일을 작성한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vi /var/lib/redmine/config/database.yml&lt;br /&gt;
production:&lt;br /&gt;
  adapter: sqlite3&lt;br /&gt;
  database: db/redmine.db&lt;br /&gt;
&lt;br /&gt;
development:&lt;br /&gt;
  adapter: sqlite3&lt;br /&gt;
  database: db/redmine_dev.dbutf8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 redmine의 기본 환경설정 작업을 실행한다. 이번에 사용된 버전은 1.4.5 이며 버전은 변경 될 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# emerge --config &amp;quot;=www-apps/redmine-1.4.5&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===redmint에 gitolite 연동 플러그인 설치===&lt;br /&gt;
&lt;br /&gt;
다음은 redmine에서 gitolite와 연동하기 위한 플러그인을 설치 한다.&lt;br /&gt;
&lt;br /&gt;
현재 설치된 remine은 1.4.5 이므로 해당되는 버전을 받아와 설치를 진행 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# cd /var/lib/redmine/vendor/plugins&lt;br /&gt;
# git clone -n git://github.com/ivyl/redmine-gitolite.git redmine_gitolite&lt;br /&gt;
Cloning into 'redmine_gitolite'...&lt;br /&gt;
remote: Counting objects: 1109, done.&lt;br /&gt;
remote: Compressing objects: 100% (468/468), done.&lt;br /&gt;
remote: Total 1109 (delta 612), reused 1090 (delta 603)&lt;br /&gt;
Receiving objects: 100% (1109/1109), 122.46 KiB | 6 KiB/s, done.&lt;br /&gt;
Resolving deltas: 100% (612/612), done.&lt;br /&gt;
&lt;br /&gt;
# cd redmine_gitolite&lt;br /&gt;
# git checkout -b redmine14 6491be010f7893b292468808a85b5fb190c767db&lt;br /&gt;
# echo &amp;quot;source 'http://rubygems.org'&amp;quot; &amp;gt;&amp;gt; Gemfile&lt;br /&gt;
# bundle install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
플러그인이 설치 된 이후 환경설정 작업을 한번 더 실행한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# emerge --config &amp;quot;=www-apps/redmine-1.4.5&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
redmine에서 gitolite를 사용 하기 위해 redmine계정의 쉘을 /sbin/nologin 에서 /bin/bash 로 변경한다. 그리고 redmine계정 홈 디렉토리의 소유자를 변경한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# sed -i 's/\/redmine\:\/sbin\/nologin$/\/redmine\:\/bin\/bash/g' /etc/passwd&lt;br /&gt;
# chown -Rf redmine:redmine /var/lib/redmine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이후 작업은 redmine 계정에서 계속 진행해야 함으로 계정을 변경 한다. 그리고 redmine계정에서 ssh 접속 키를 만든다. 몇 가지 질문을 물어 보지만 모두 엔터를 입력하여 기본값으로 설정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# su - redmine&lt;br /&gt;
$ ssh-keygen -t rsa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gitolite에 redmine계정 연동 설정을 진행 한다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ cp .ssh/id_rsa.pub .ssh/redmine.pub&lt;br /&gt;
$ git config --global user.name redmine&lt;br /&gt;
$ git config --global user.email redmine@localhost&lt;br /&gt;
$ gl-setup .ssh/redmine.pub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
위의 마지막 명령을 실행하고 엔터로 진행하면 편집기가 열리면서 환경설정이 나타나는데 저장하지 말고 종료를 한다. (vi일때 esc키-&amp;gt;:q!엔터)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 ssh의 know_host를 저장 하기 위해 ssh접속을 시도 한다. 질문에 모두 yes로 답한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ ssh redmine@localhost&lt;br /&gt;
$ ssh redmine@127.0.0.1&lt;br /&gt;
$ ssh redmine@&amp;lt;&amp;lt;SERVER_HOSTNAME&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설정이 정상인지 확인 하기 위해 테스트용으로 daemon을 실행 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ ruby script/server thin -e production&lt;br /&gt;
=&amp;gt; Booting Thin&lt;br /&gt;
=&amp;gt; Rails 2.3.15 application starting on http://0.0.0.0:3000&lt;br /&gt;
………&lt;br /&gt;
=&amp;gt; Call with -d to detach&lt;br /&gt;
=&amp;gt; Ctrl-C to shutdown server&lt;br /&gt;
&amp;gt;&amp;gt; Thin web server (v1.3.1 codename Triple Espresso)&lt;br /&gt;
&amp;gt;&amp;gt; Maximum connections set to 1024&lt;br /&gt;
&amp;gt;&amp;gt; Listening on 0.0.0.0:3000, CTRL+C to stop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
웹브라우저로 http://&amp;lt;&amp;lt;SERVER_HOSTNAME 또는 IP&amp;gt;&amp;gt;:3000 에 접속하였을 때 다음과 같은 화면이 보인다면 정상이다.&lt;br /&gt;
&lt;br /&gt;
[[image:redmine_image1.png|none|800px|thumb|redmine을 설치한후의 초기화면]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===redmine과 gitolite연동 설정===&lt;br /&gt;
&lt;br /&gt;
http://&amp;lt;&amp;lt;SERVER_HOSTNAME 또는 IP&amp;gt;&amp;gt;:3000/settings/plugin/redmine_gitolite 로 접속한다.&lt;br /&gt;
&lt;br /&gt;
로그인 계정을 물어 보는데 기본 값은 admin // admin 이다.(설정을 진행하며 반드시 바꾸기 바란다)&lt;br /&gt;
&lt;br /&gt;
로그인을 하게 되면 아래와 같은 화면에 뜨는데 정해진 값으로 정보를 입력하고 적용(Apply)한다.&lt;br /&gt;
&lt;br /&gt;
[[image:redmine_image2.png|none|800px|thumb|redmine에서 gitorite를 설정하는 화면]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Gitolite URL : redmine@localhost:gitolite-admin.git&lt;br /&gt;
Base path : /var/lib/redmine/repositories/&lt;br /&gt;
Developer base URL : git@&amp;lt;&amp;lt;SERVER_HOSTNAME 또는 IP&amp;gt;&amp;gt;:%{name}.git&lt;br /&gt;
Read-Only base URL : git@&amp;lt;&amp;lt;SERVER_HOSTNAME 또는 IP&amp;gt;&amp;gt;:%{name}.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설정이 완료되었으면 로그아웃(Sign out)을 하고 서버에서는 CTRL+C 로 테스트 daemon을 종료한 후 logout 명령어로 root 계정으로 돌아 간다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
^C&amp;gt;&amp;gt; Stopping ...&lt;br /&gt;
Exiting&lt;br /&gt;
$ logout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===thin에 redmine구동 설정===&lt;br /&gt;
&lt;br /&gt;
thin을 daemon 형태로 구동 하기 위한 설정을 진행 한다.&lt;br /&gt;
&lt;br /&gt;
먼저 /etc/thin/redmine.yml 파일을 만든다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vi /etc/thin/redmine.yml&lt;br /&gt;
---&lt;br /&gt;
chdir: /var/lib/redmine&lt;br /&gt;
log: /var/log/thin/redmine.log&lt;br /&gt;
pid: /var/run/thin/redmine.pid&lt;br /&gt;
socket: /var/run/thin/redmine.sock&lt;br /&gt;
environment: production&lt;br /&gt;
daemonize: true&lt;br /&gt;
user: redmine&lt;br /&gt;
group: redmine&lt;br /&gt;
servers: 4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 /etc/init.d/thin 스크립트를 patch하는 파일을 만든다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
# vi /tmp/thin_patch&lt;br /&gt;
--- /etc/init.d/thin&lt;br /&gt;
+++ /etc/init.d/thin&lt;br /&gt;
@@ -40,8 +40,10 @@&lt;br /&gt;
         checkconfig || return 1&lt;br /&gt;
&lt;br /&gt;
         if [ ${SERVER} = thin ]; then&lt;br /&gt;
+                mkdir -p /var/run/thin&lt;br /&gt;
+                chown redmine:redmine /var/run/thin&lt;br /&gt;
                 ebegin &amp;quot;$2 all thin servers in ${CONFIG}&amp;quot;&lt;br /&gt;
-                ${RUBY} /usr/bin/thin $1 $(buildargs) --all ${CONFIG}&lt;br /&gt;
+                sudo -i -u redmine ${RUBY} /usr/bin/thin $1 $(buildargs) --all ${CONFIG}&lt;br /&gt;
                 eend $?&lt;br /&gt;
         else&lt;br /&gt;
                 ebegin &amp;quot;$2 thin server ${SERVER}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
patch를 적용하고 thin이 사용할 log폴더를 만든다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# patch -p0 &amp;lt; /tmp/thin_patch&lt;br /&gt;
patching file /etc/init.d/thin&lt;br /&gt;
# rm -f /tmp/thin_patch&lt;br /&gt;
# mkdir -p /var/log/thin&lt;br /&gt;
# chown -Rf redmine:redmine /var/log/thin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
thin이 daemon 형태로 실행 되는지 확인 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# /etc/init.d/thin start&lt;br /&gt;
 * Starting all thin servers in /etc/thin/ ...&lt;br /&gt;
[start] /etc/thin//redmine.yml ...&lt;br /&gt;
Starting server on /var/run/thin/redmine.0.sock ... &lt;br /&gt;
Starting server on /var/run/thin/redmine.1.sock ... &lt;br /&gt;
Starting server on /var/run/thin/redmine.2.sock ... &lt;br /&gt;
Starting server on /var/run/thin/redmine.3.sock ...   [ ok ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===nginx에 thin구동 설정===&lt;br /&gt;
&lt;br /&gt;
nginx에서는 Ruby on Rails를 처리 하지 못하기 때문에 thin이 redmine을 서비스 하고 nginx는 그것을 중계 하도록 설정 해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저 /etc/nginx/proxy.include 파일을 작성 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vi /etc/nginx/proxy.include&lt;br /&gt;
    proxy_set_header   Host $http_host;&lt;br /&gt;
    proxy_set_header   X-Real-IP $remote_addr;&lt;br /&gt;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
    proxy_set_header   X-Forwarded-Proto $scheme;&lt;br /&gt;
&lt;br /&gt;
    client_max_body_size       10m;&lt;br /&gt;
    client_body_buffer_size    128k;&lt;br /&gt;
&lt;br /&gt;
    proxy_connect_timeout      90;&lt;br /&gt;
    proxy_send_timeout         90;&lt;br /&gt;
    proxy_read_timeout         90;&lt;br /&gt;
&lt;br /&gt;
    proxy_buffer_size          4k;&lt;br /&gt;
    proxy_buffers              4 32k;&lt;br /&gt;
    proxy_busy_buffers_size    64k;&lt;br /&gt;
    proxy_temp_file_write_size 64k;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 /etc/nginx/nginx.conf 의 http section의 server section앞에 아래 항목을 추가 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
	upstream redmine_cluster {&lt;br /&gt;
	 server unix:/var/run/thin/redmine.0.sock;&lt;br /&gt;
        server unix:/var/run/thin/redmine.1.sock;&lt;br /&gt;
        server unix:/var/run/thin/redmine.2.sock;&lt;br /&gt;
        server unix:/var/run/thin/redmine.3.sock;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
마지막으로 /etc/nginx/nginx.conf 의 server section을 추가 한다. 예제에서는 3000번 port를 사용 하고 있으나 이것 외 다른 port를 설정해도 상관없다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
	listen 3000;&lt;br /&gt;
	server_name redmine;&lt;br /&gt;
&lt;br /&gt;
	root /var/lib/redmine/public;&lt;br /&gt;
&lt;br /&gt;
	include /etc/nginx/proxy.include;&lt;br /&gt;
	proxy_redirect off;&lt;br /&gt;
&lt;br /&gt;
	location / {&lt;br /&gt;
	try_files $uri/index.html $uri.html $uri @cluster;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	location @cluster {&lt;br /&gt;
	proxy_pass http://redmine_cluster;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nginx daemon을 시작 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# /etc/init.d/nginx start&lt;br /&gt;
 * Checking nginx' configuration ...           [ ok ]&lt;br /&gt;
 * Starting nginx ...                                    [ ok ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nginx.conf에 설정 하였던 port로 웹브라우저를 통하여 접속을 하였을 때 redmine의 정상적인  화면이 나타난다면 모두 완료이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==참고사항==&lt;br /&gt;
&lt;br /&gt;
# redmine에서는 식별자를 소문자밖에 사용하지 못한다. 대문자를 사용하고 싶다면 DB를 직접 편집할것 :: Projects.identifier 필드 참고&lt;br /&gt;
# redmine의 식별자대로 디렉토리를 생성해버린다. 고로 redmine에서 프로젝트의 식별자를 잘 정하는것은 대단히 중요. 참고로 redmine의 식별자규칙덕에 생성되는 repository이름은 모두 소문자&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==관련문서==&lt;br /&gt;
&lt;br /&gt;
* http://git-scm.com/book/ko :: Pro Git - git 가이드북&lt;br /&gt;
* http://bluewiz.tistory.com/446 :: 이것외의 다른 플러그인.. 이것도 괜찮은거같다&lt;br /&gt;
* http://whatwant.tistory.com/450 :: Redmine-Git repository연결하기&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==별첨==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=963</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=963"/>
		<updated>2013-03-17T13:35:23Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 문서링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[gentoo_redmine_nginix_git|Gentoo linux에서 redmine과 nginx, 그리고 git를 같이 사용하기]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=OpenAFS-Gentoo-HOWTO&amp;diff=960</id>
		<title>OpenAFS-Gentoo-HOWTO</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=OpenAFS-Gentoo-HOWTO&amp;diff=960"/>
		<updated>2013-03-17T13:31:41Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: OpenAFS-Gentoo-HOWTO 문서 내용 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;OpenAFS-Gentoo-HOWTO&lt;br /&gt;
&lt;br /&gt;
==OpenAFS와 관련된 본 문서의 정의==&lt;br /&gt;
&lt;br /&gt;
분산 네트워크 파일 시스템인 Andrew File System 의 Implementation 중 OpenAFS 의 설치, 운용에 대한 전반적인 매뉴얼. 이 매뉴얼에서는 GentooLinux 배포판 기준으로, OpenAFS 를 운용하는데 '''고통없는''' 가이드를 목적으로 하고 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
사이트 :: http://www.openafs.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 이 문서에 대하여 ==&lt;br /&gt;
&lt;br /&gt;
버전 0.23&lt;br /&gt;
&lt;br /&gt;
갱신일 :: 2006년 11월 21일&lt;br /&gt;
&lt;br /&gt;
옮긴일 :: 2013년 3월 17일&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
저작자 2006 (C) 신종훈 (LunA_J`etch, email : luna.jetch_at_gmail_dot_com)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 매뉴얼은 [http://creativecommons.org/licenses/by-sa/2.5/ Creative Commons ShareAlike-2.5] 라이센스에 의한 보호를 받습니다. OpenAFS 는 IBM Public License의 보호를 받습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 서버를 구성하기 전에 알아야 할 사항들 ==&lt;br /&gt;
&lt;br /&gt;
대강의 추상적인 서비스 구조는 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:afs_networks_image.png|none|570px|thumb|OpenAFS의 추상적인 구조]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
서비스 하는 측면에서는, 다수의 Replica 를 구성하여 백업/분산의 용도로 확장하기 좋다.&lt;br /&gt;
&lt;br /&gt;
클라이언트 측면에서는, 다수의 볼륨을 일일이 마운트 해 줄 필요 없이, 셀(Cell) 설정 만으로 서버사이드에서 정한 대로 연결된 다수의 물리적 스토리지를 사용할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cell 은 네트워크 내 구성된 AFS 서비스를 한번에 묶는 이름의 의미로 사용되며, AFS가 인식하는 실제 물리적 파일시스템 공간을 파티션(partition), AFS에서 서비스를 할 때 사용되는 논리적인 파일시스템 공간을 볼륨(Volume) 이라고 부른다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 이 매뉴얼에서 언급하는 시스템 환경에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
OpenAFS 서버를 구성하기 전에, 자신의 네트웍 환경과, 설치할 서버들, 그리고 사용할 클라이언트의 수 등을 고려하여 서버를 구성해야 하는 것은 당연한 일이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 예제에서 보여주는 환경은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
 * afsdisk1 컴퓨터 : OpenAFS 메인 DB 서버 인스턴스 + 파일 서버 인스턴스&lt;br /&gt;
 * afsdisk2 컴퓨터 : OpenAFS 파일 서버 인스턴스&lt;br /&gt;
 * 100명 이하의 클라이언트 인스턴스&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{InfoIcon}} 다수의 사용자를 관리해야 하는 입장이라면, 이 매뉴얼에서 사용하는 OpenAFS 기본 인증 서버(kaserver) 대신 Kerberos v5 + openssl + 계정 정보를 담은 백엔드(ldap, radius 등) 로 인증 서버를 구축할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 구축할 수 있는 서버 인스턴스들에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
구축할 수 있는 서버 인스턴스들의 목록은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''인스턴스'''||'''사용 용도'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''kaserver'''||인증 데이터베이스를 관리하기 위한 인증 서버. kerberos v5 기준에 만족하는 인증서버를 총칭하는 인스턴스 명.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''buserver'''||백업 데이터베이스를 관리하기 위한 백업 서버의 인스턴스 명.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''ptserver'''||프로텍션(Protection) 데이터베이스를 위한 프로텍션 서버.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''vlserver'''||VLDB(볼륨 위치 데이터베이스 : Volume Location Database)를 관리 하기 위한 볼륨 위치 서버(VLS). 각 셀을 구성하는 볼륨의 위치를 기억하고 관리하는, 대단히 중요한 구성품이다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''upserver'''||업데이트 서버. 서버의 설정/바이너리들을 다른 업데이트 클라이언트들에게 전파하는 역할을 한다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''fs'''||파일서버. 하나의 파일서버 인스턴스는 Fileserver (파일 서버), Volserver (볼륨서버), Salvager 로 구성된다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''upclientetc'''||클라이언트 부분의 업데이트 서버. 서버의 설정을 받아오는 인스턴스를 의미한다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''upclientbin'''||클라이언트 부분의 업데이트 서버. 서버의 AFS 관련 바이너리를 받아오는 인스턴스를 총칭.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''runntp'''||ntp 클라이언트에 해당하는 서버. ntp 서버로 부터 시간정보를 받아와 동기화하는 인스턴스.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |구축할 수 있는 서버 인스턴스들의 목록&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이것을 보고 생각해야 할 것은, 시스템의 구성에 따라 그 역할을 분산시킬 수 있기 때문이다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
하나의 '''OpenAFS 메인 서버'''는 최소한 '''인증(kaserver) / 백업(buserver) / 프로텍션(ptserver) / VLDB(vlserver) / (서버 부분의) 업데이트 서버(upserver)''' 에 대한 인스턴스를 가지고 있어야 하며, 메인 서버와 맞물려 스토리지를 제공하는 '''파일 서버'''의 경우 '''클라이언트 부분의 업데이트 서버(upclientetc) / 서버 부분의 업데이트 서버(upserver) / 파일 서버(fs)''' 인스턴스를 가져야 최소한의 동작 보증을 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
좀 더 네트웍/시스템 환경의 분산을 고려한다면 데이터베이스 서버를 Replication 하는 방식으로 여러대로 분산 시킬 수도 있다. 스토리지 역시 서버 레벨에서의 Replication을 제공하기 때문에 분산의 혜택을 받을 수 있는 것들 중 하나이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
충분히 고려한 후 서비스를 구성하여도 늦지 않다. 최소한, 고려하지 않고 변경에 따른 소요비용을 고려한다면 더욱 그러할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OpenAFS Database Server 구성 (최초구성) ==&lt;br /&gt;
&lt;br /&gt;
이 단락에서는 OpenAFS 서비스를 위한 메인 데이터베이스를 설치하고, 셀을 생성하고, 사용자 계정을 생성하는 부분을 언급할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 미리 준비해야 할 것들 ===&lt;br /&gt;
&lt;br /&gt;
OpenAFS를 설치, 운용할 서버가 필요함은 말할 것도 없다. OpenAFS를 사용하기 위해서는, 되도록 bind(named)를 사용하여 FQDN을 만족시켜 줄 필요가 있다. 현재 시스템이 참조하는 네임서버를 구성하던지 해서, hostname.domain.name 을 만족시켜야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서는 첫번째 서버를 '''afsdisk1.testbed.org''' 라고 칭하게 될 것이다. &lt;br /&gt;
&lt;br /&gt;
(두번째 서버는 '''afsdisk2.testbed.org''' 가 될 것이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kerberos + openssl 을 사용할 수 있다. 다만, 이 매뉴얼에서는 언급하지 않을 것이다. 필요시 OpenAFS 공식 문서를 참조하기 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
또한, 여러대의 AFS 서버 풀을 구성하려면, (최소한) 동등 셀은 같은 시간으로 동기화되어 있어야 한다. 이를 위해, 한대의 ntp 서버를 구성할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== OpenAFS 설치 ===&lt;br /&gt;
&lt;br /&gt;
먼저, OpenAFS를 설치해야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # emerge net-fs/openafs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령을 내리면, openafs-kernel 과 openafs 패키지가 설치 될 것이다. 위의 명령어를 통해 커널 모듈과 바이너리가 정상적으로 빌드될 것이다. 테스트를 해보자면,2.6.18 최신 커널에서도 무리없이 컴파일이 될 것이다.&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 공식 문서가 설치되길 원한다면, emerge app-doc/afsdoc 을 설치하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설치되는 장소는 OpenAFS가 Transarc 에서 IBM으로, 그리고 공개 되었을 때 변경되었다: 대강의 구조는 아래의 표를 참조하길 바란다:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''디렉토리'''||'''사용용도'''||'''Transarc'''||'''기본형태'''||'''Gentoo'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''viceetcdir'''|| 클라이언트 설정 || /usr/vice/etc || $(sysconfdir)/openafs || /etc/openafs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''unnamed'''|| 클라이언트 바이너리 || unspecified || $(bindir) || /usr/bin&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afsconfdir'''|| 서버 설정 || /usr/afs/etc || $(sysconfdir)/openafs/server || /etc/openafs/server&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afssrvdir'''|| 내부 서버 바이너리 || /usr/afs/bin (servers) || $(libexecdir)/openafs || /usr/libexec/openafs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afslocaldir'''|| 서버 상태 || /usr/afs/local || $(localstatedir)/openafs || /var/lib/openafs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afsdbdir'''|| 인증/서버리스트 등의 DB || /usr/afs/db || $(localstatedir)/openafs/db || /var/lib/openafs/db&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afslogdir'''|| 로그 || /usr/afs/logs || $(localstatedir)/openafs/logs || /var/lib/openafs/logs&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''afsbosconfig'''|| Overseer 설정 || $(afslocaldir)/BosConfig || $(afsconfdir)/BosConfig || /etc/openafs/BosConfig&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |설치 장소에 대한 내용&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} net-fs/openafs-legacy 를 설치하면, Transarc 디렉토리 형태로 소프트 링크를 만들어준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BOS (Basic Over Seer) Server 초기 구동 ===&lt;br /&gt;
&lt;br /&gt;
최초 설치의 경우 설정 디렉토리(/etc/openafs)를 보면 {{{CellServDB}}} 파일과 {{{ThisCell}}} 파일이 있는데, 이 파일을 들여다보면 잘못된(?) 초기화 내용을 담고 있다. 초기화를 위해, 가차없이 삭제하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # rm -f /etc/openafs/CellServDB&lt;br /&gt;
root@afsdisk1 # rm -f /etc/openafs/ThisCell&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ps. 기존에 afs를 설정한적이 있다면 /etc/openafs/BosConfig 파일도 삭제하도록한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, bosserver를 다음 명령을 통해 초기화하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bosserver -noauth &amp;amp;&amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} -noauth 옵션은 당신이 현재 admin 권한이 충분히 설정되어 있지 않기 때문에, 인증 절차를 무시하고 접근하기 위해 사용하는 것이다. 보안상으로 위험하므로, 습관상 -noauth를 붙여 유지보수를 하지 않도록 해야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령을 수행하면 /etc/openafs/server 디렉토리안에 이전의 {{{CellServDB}}} 파일과 {{{ThisCell}}} 파일이 생성되고, /etc/openafs 에 그 파일들에 소프트 링크가 걸려있을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Cell 이름 생성 ===&lt;br /&gt;
&lt;br /&gt;
물리적/논리적으로 분산되어 있는 Storage Pool 을 엮어주기 위해, 구간을 정하는 일을 해야 한다. OpenAFS 에서는 동일 Cell 이름으로 스토리지 풀을 구별한다. 이 매뉴얼에서는, '''''powercell''''' 을 사용할 것이다. :p 이 Cell 이름이 클라이언트가 마운트 해야 할 이름이기 때문에, 되도록이면 짧게 짓는 것이 좋을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} Cell 이름은 '''대문자를 포함하지 않는''' 조건과 함께 영문/숫자 64자로 제한되어 있다. 절대 대문자로 셀 이름을 정하지 말것.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cell 이름은 bos setcellname 명령어를 통해 구성할 수 있다. 용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
용법 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos setcellname &amp;lt;servername&amp;gt; &amp;lt;cell name&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래와 같이, afsdisk1.testbed.org에 powercell 이라는 셀 이름을 정해준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos setcellname afsdisk1.testbed.org powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 데이터베이스 서버의 시작 및 구성 ===&lt;br /&gt;
&lt;br /&gt;
다음에 해 줄 일은, '''bos create''' 명령어를 사용, {{{/etc/openafs/BosConfig}}} 설정 파일에 데이터베이스 서버 프로세스들을 위한 설정을 추가해주고, 서버를 실행하는 일이다. 아래의 4개 프로세스를 띄우는데, 이는 셀에 포함되는 스토리지 서버에 설정되는 것이 아니라, 단일 셀을 구성하는 데이터베이스 서버 머신에만 있으면 되는 사항이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''실행 파일'''||'''사용 용도'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''kaserver'''||인증 데이터베이스를 관리하기 위한 인증 서버다. 이는 Kerberos 5 인증 서버로 대체 가능하고, 기존에 Kerberos 인증 환경이 구축되어 있지 않다면 이를 사용하면 된다. (무리해서 Kerberos 를 구성할 필요가 없다는 뜻)&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''buserver'''||백업 데이터베이스를 관리하기 위한 백업 서버.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''ptserver'''||프로텍션(Protection) 데이터베이스를 위한 프로텍션 서버.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''vlserver'''||VLDB(볼륨 위치 데이터베이스 : Volume Location Database)를 관리 하기 위한 볼륨 위치 서버(VLS). 각 셀을 구성하는 볼륨의 위치를 기억하고 관리하는, 대단히 중요한 구성품이다.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |실행파일 및 사용용도&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 서버들을 구성하는 설정값을 갖추고 실행하기 위해, 다음의 용법을 사용해 설정한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos create &amp;lt;{{{server name}}}&amp;gt; &amp;lt;{{{XXserver}}}&amp;gt; simple &amp;lt;{{{XXserver의 위치}}}&amp;gt; -cell &amp;lt;{{{cell name}}}&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
각 서버 프로세스의 위치는 afssrvdir (1.2 절의 디렉토리 목록표를 참조할것), 즉 '''''/usr/libexec/openafs''''' 디렉토리에 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 각 데이터베이스 서버 구성 및 실행 ====&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 위의 4가지 실행파일을 다 등록/실행하기 위해, 아래와 같이 실행하였다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org kaserver simple \&lt;br /&gt;
 /usr/libexec/openafs/kaserver -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org buserver simple \&lt;br /&gt;
 /usr/libexec/openafs/buserver -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org ptserver simple \&lt;br /&gt;
 /usr/libexec/openafs/ptserver -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org vlserver simple \&lt;br /&gt;
 /usr/libexec/openafs/vlserver -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 최초 구성을 이미 한 상태라면, 상단의 '''create''' 대신 '''start'''를 넣으면 각 서버를 띄울 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 각 데이터베이스 서버 동작 확인 ====&lt;br /&gt;
&lt;br /&gt;
위의 설정으로 4개의 서버를 등록한 후, '''bos status''' 명령으로 현재 상태를 볼 수 있다. 다음의 명령을 통해 상태를 알아보자: 정상적이라면 아래처럼 메시지가 뜰 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos status afsdisk1.testbed.org -noauth&lt;br /&gt;
Instance kaserver, currently running normally.&lt;br /&gt;
Instance buserver, currently running normally.&lt;br /&gt;
Instance ptserver, currently running normally.&lt;br /&gt;
Instance vlserver, currently running normally.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 보안 메커니즘 초기화를 위한 (최초) 사용자 계정 생성 ===&lt;br /&gt;
&lt;br /&gt;
Cell 보안 메커니즘을 초기화하기 위해, 2개의 설정 엔트리를 인증 데이터베이스에 추가해야 한다. 하나는 메인 관리자 계정(admin)을 생성하는 것이고, 다른 하나는 AFS 프로세스를 위한, afs 라는 계정을 생성하는 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} afs 계정은 시스템 구성을 위해 반드시 생성해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== kas 를 사용한 사용자 계정 생성 ====&lt;br /&gt;
&lt;br /&gt;
이를 위해 kas 라는 사용자 명령행 툴을 사용한다. 최초 실행 용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# kas -cell &amp;lt;{{{cell name}}}&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
목표 달성을 위해, 상단의 용법을 토대로 kas 를 실행하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # kas -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령을 실행하면, '''ka&amp;gt;''' 라는 프롬프트가 뜨게 될 것이다. '''create''' 명령을 사용하여 사용자 엔트리를 생성하고, '''examine''' 을 사용하여 생성된 엔트리를 검사한다. '''setfields''' 명령을 사용하여, admin 계정이 관리자임을 인식시키면 된다. 이제 아래와 같이 실행하도록 하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ka&amp;gt; create afs&lt;br /&gt;
initial_password:&lt;br /&gt;
Verifying, please re-enter initial_password:&lt;br /&gt;
ka&amp;gt; create admin&lt;br /&gt;
initial_password:&lt;br /&gt;
Verifying, please re-enter initial_password:&lt;br /&gt;
ka&amp;gt; examine afs&lt;br /&gt;
&lt;br /&gt;
User data for afs&lt;br /&gt;
key (0) cksum is 2651715259, last cpw: Mon Jun  4 20:49:30 2001&lt;br /&gt;
password will never expire.&lt;br /&gt;
An unlimited number of unsuccessful authentications is permitted.&lt;br /&gt;
entry never expires.  Max ticket lifetime 100.00 hours.&lt;br /&gt;
last mod on Mon Jun  4 20:49:30 2001 by &amp;lt;none&amp;gt;&lt;br /&gt;
permit password reuse&lt;br /&gt;
ka&amp;gt; setfields admin -flags admin&lt;br /&gt;
ka&amp;gt; examine admin&lt;br /&gt;
&lt;br /&gt;
User data for admin (ADMIN)&lt;br /&gt;
key (0) cksum is 2651715259, last cpw: Mon Jun  4 20:49:59 2001&lt;br /&gt;
password will never expire.&lt;br /&gt;
An unlimited number of unsuccessful authentications is permitted.&lt;br /&gt;
entry never expires.  Max ticket lifetime 25.00 hours.&lt;br /&gt;
last mod on Mon Jun  4 20:51:10 2001 by &amp;lt;none&amp;gt;&lt;br /&gt;
permit password reuse&lt;br /&gt;
ka&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 생성한 사용자를 사용자 리스트에 추가하는 방법 ====&lt;br /&gt;
&lt;br /&gt;
위 구간을 수행, kas를 통해 사용자 계정을 생성하였지만 계정을 사용자 리스트에 따로 추가해야 한다. admin 계정을 사용자 리스트({{{/etc/openafs/server/UserList}}})에 추가하도록 하자. 용법과 사용예는 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
용법:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos adduser &amp;lt;'''server name'''&amp;gt; &amp;lt;'''account name'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 기초로 아래의 명령을 수행, admin 계정을 사용자 리스트에 추가했다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos adduser afsdisk1.testbed.org admin -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(admin 이외에도) 생성된 사용자는, 완전한 동작을 위해 ptserver에 마찬가지로 등록이 되어야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 서버 암호화 키를 생성하기 ===&lt;br /&gt;
&lt;br /&gt;
이제 AFS 서버의 암호화를 위한 키를 생성해야 한다. '''bos addkey''' 명령을 사용하여, 이 목적을 달성할 수 있다. 사용법은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos addkey &amp;lt;'''server name'''&amp;gt; -kvno 0 -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법대로 실행 할 경우, 암호 키를 집어넣으라고 하는데, 이 키의 값은 자신이 '''afs''' 계정을 생성할 때 사용한 키와 '''동일하게''' 넣어야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (ptserver) 프로텍션 데이터베이스에 admin 계정 연결하기 ===&lt;br /&gt;
&lt;br /&gt;
'''pts createuser''' 명령어를 사용해서, 프로텍션 데이터베이스에 admin 사용자를 위한 엔트리를 생성해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 기본적으로, 프로텍션 서버는 AFS UID(사용자 ID) 1을 관리자로 할당하는데, 이는 이제까지 생성한 기록상 첫번째 유저가 admin 이기 때문이다. 필요할 경우, -id 옵션을 사용해 조정할 수 있다. 문제는, UNIX 상에서의 실제 admin 유저의 UID를 필요로 한다는 것인데, 이를 위해서는 어쩔 수 없이(?) admin 계정을 만들어줘야 할 것이다. (혹은 기존의 bin 계정 - 즉 시스템의 UID가 1인 계정으로 AFS에 기록이 되는것을 보던지.) 이 admin 계정을 만들어 UID를 알아낸 후, -id 옵션을 붙여 UID를 매핑시켜주는데, admin 계정이나 기타 afs에서 사용할 계정이 반드시 로그인 되어야 할 필요는 없다는 뜻이다. (/bin/false 를 셸로 지정해도 된다는 뜻이다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
사용법은 아래와 같다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# pts createuser -name admin -cell &amp;lt;'''cell name'''&amp;gt; [-id &amp;lt;'''AFS UID'''&amp;gt;] -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 아래의 명령어를 수행했다: 계정 생성후, admin의 UID가 1002번이라면, -id 1002 를 붙여주는 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # pts createuser -name admin -id 1002 -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 이 사용자가 system:administrators 그룹에 포함될 수 있도록, '''pts adduser''' 명령을 사용하여 그룹에 포함시키고, '''pts membership''' 명령을 통해 확인하도록 하자. 아래의 예를 알아서 적절하게 고쳐가면서 사용하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # pts adduser admin system:administrators -cell powercell -noauth&lt;br /&gt;
root@afsdisk1 # pts membership admin -cell powercell -noauth&lt;br /&gt;
Groups admin (id: 1002) is a member of:&lt;br /&gt;
system:administrators&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 서버 재시작 ===&lt;br /&gt;
&lt;br /&gt;
이제 상단의 설정이 끝났으면, 이제 까지 띄운 AFS의 모든 서버를 재시작 하도록 하자.&lt;br /&gt;
&lt;br /&gt;
서버의 재시작을 위한 용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos restart &amp;lt;'''server name'''&amp;gt; -all -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법대로, 아래와 같이 실행하여 AFS 서버를 재시작 하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos restart afsdisk1.testbed.org -all -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fs 인스턴스 : 파일 서버, 볼륨 서버, 그리고 Salvager 프로세스의 구동 ===&lt;br /&gt;
&lt;br /&gt;
{{InfoIcon}} '''''이 단락은 실제로 서비스를 위한 스토리지가 담긴 물리적 서버에서 추가되어야 하는 인스턴스 이다. 이는 원래 메인 서버에 필수적인 요소가 아니지만, 대부분이 데이터베이스 서버와 파일 서버가 같은 물리적 서버에서 작동하게 만드는 것이 보통이므로, 순차적인 구성을 보여주기 위해서 Database 서버 구성 목록에 포함시킨것이다.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 '''bos create''' 명령을 다시 사용하여, 파일서버, 볼륨 서버, 그리고 Salvager를 등록하고, 구동해야 한다. 이들 3개의 프로세스는 다른 서버 프로세스와 마찬가지로 '''''/usr/libexec/openafs''''' 내에 있고, 각각 '''fileserver''', '''volserver''', '''salvager''' 라는 이름을 갖는다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
추가하는 방법은, 아래의 용법과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos create &amp;lt;'''server name'''&amp;gt; fs fs &amp;lt;'''파일서버 프로세스명'''&amp;gt; &amp;lt;'''볼륨서버 프로세스명'''&amp;gt; &amp;lt;'''salvager 프로세스명'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 아래의 명령문을 실행하면 된다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.ucsoft.org fs fs \&lt;br /&gt;
 /usr/libexec/openafs/fileserver /usr/libexec/openafs/volserver \&lt;br /&gt;
 /usr/libexec/openafs/salvager -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OpenAFS 서버 프로세스에 대한 세부 상태 확인 ====&lt;br /&gt;
&lt;br /&gt;
이제까지의 과정으로 모든 서버 프로세스를 구성하였으면, 그 프로세스가 잘 떠 있는지 다음의 용법으로 확인 할 수 있다: 역시 마찬가지로 '''bos status''' 명령을 사용한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos status &amp;lt;server name&amp;gt; -long -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 사용하여, 실행하면 다음과 같은 화면이 나온다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos status afsdisk1.testbed.org -long -noauth&lt;br /&gt;
Instance kaserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:55:34 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/kaserver'&lt;br /&gt;
&lt;br /&gt;
Instance buserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:56:08 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/buserver'&lt;br /&gt;
&lt;br /&gt;
Instance ptserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:56:11 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/ptserver'&lt;br /&gt;
&lt;br /&gt;
Instance vlserver, (type is simple) currently running normally.&lt;br /&gt;
    Process last started at Sun Nov 19 00:56:17 2006 (14 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:52:08 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/vlserver'&lt;br /&gt;
&lt;br /&gt;
Instance fs, (type is fs) currently running normally.&lt;br /&gt;
    Auxiliary status is: file server running.&lt;br /&gt;
    Process last started at Sun Nov 19 00:55:34 2006 (4 proc starts)&lt;br /&gt;
    Last exit at Sun Nov 19 00:55:34 2006&lt;br /&gt;
    Command 1 is '/usr/libexec/openafs/fileserver'&lt;br /&gt;
    Command 2 is '/usr/libexec/openafs/volserver'&lt;br /&gt;
    Command 3 is '/usr/libexec/openafs/salvager'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 에러 발생으로 인한 종료의 경우, 종료시의 리턴값이 같이 나타나게 될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fileserver 의 UDP 리스닝 인터페이스 설정 ===&lt;br /&gt;
&lt;br /&gt;
afslocaldir (/var/lib/openafs) 에서 {{{NetInfo}}} 파일을 생성하는 것으로, 현재 서버 시스템의 네트웍 인터페이스가 여러개일 때는 이들을 등록해줘야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/openafs 디렉토리로 이동, {{{NetInfo}}} 라는 이름으로 텍스트 파일을 작성한다.&lt;br /&gt;
&lt;br /&gt;
입력 방식은 IP를 넣어주는데, 다음과 같이 한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
192.168.0.21&lt;br /&gt;
127.0.0.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그런 다음, '''bos restart''' 명령을 사용, Fileserver를 재시작 하도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 이제 무엇을 해야 하나? ===&lt;br /&gt;
&lt;br /&gt;
지금까지의 내용은 OpenAFS를 사용하기 위해, 최초로 서버를 구성하는 것에 대해서 다루었다. 서버를 구성했으면, 앞으로는 그 서버가 서비스할 셀을 제공하는 실제 스토리지 공간과 연결시켜줘야 하는 작업이 될 것이다. 그 작업을 위해, 다음 장인 OpenAFS Cell Volume 구성을 살펴보기 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OpenAFS Cell Volume 구성 ==&lt;br /&gt;
&lt;br /&gt;
OpenAFS 서버를 구성하기 위한 두번째, 셀의 구성품인 볼륨(Volume)을 생성/추가하는 단락이다. 위의 단락을 통해 이제까지 볼륨을 담을 수 있는 큰 상자를 만들었다면, 이제 큰 상자안에 담길 그릇들을 넣을 차례이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cell Volume 들을 처음 구성한다면, 다음 두가지를 기억하라. 첫번째는 최소한의 구동을 위해 '''root.afs''' 와 '''root.cell''' 이 '''반드시 필요하다'''는 사실을 기억해야 한다. 두번째는 다른 시스템에 단순 파일 서버를 구성하기 위해, 앞에서 해왔던 '''데이터베이스까지 다른 시스템에 구축할 필요는 없다'''는 사실이다. 반드시 기억해두고, 구성에 임해야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 디스크 준비 ===&lt;br /&gt;
&lt;br /&gt;
서비스를 할 디스크를 파티션을 쪼개던지, 물리 디스크를 한 파티션에 잡던지, 어떻게 하든 여분의 빈 파티션이 필요하다: AFS는 추가적인 디스크 캐싱을 하기 때문에, 파일 시스템은 ext2, 혹은 ext3을 사용할 것을 권장한다. 다른 파티션은 지원하지 않을 뿐 더러, 위험하기까지 하다. (reiserfs 의 경우, 에러 메시지를 출력하며 당신에게 경고를 할 것이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} Transarc / 구 버전의 OpenAFS 는 분리된 ext2 파티션에 디스크 캐싱을 위한 공간을 필요로 했다. 이 사항 역시 지금은 바뀌었고, 지금은 /etc/openafs/cacheinfo 에 캐싱된 용량 상태를 저장한다.&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} SGI XFS를 쓰고 싶다면, 또다른 AFS 구현체인 arla (http://www.stacken.kth.se/project/arla/) 를 사용할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서는, ''/dev/hda4'' 에 '''ext3'''으로 구성을 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
준비가 되었으면, 루트 디렉토리에 vicep'''X''' 디렉토리를 만들어야 한다. ('''X''' 위치에는 선호하는 값을 넣는다. a를 넣든 b를 넣든, 영문 소문자로 넣는다. 여기서는 vicepa 로 설정하겠다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 경험상 X 위치에 숫자가 들어가거나 하면 인식하지 못하는 문제가 생긴다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # mkdir /vicepa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 '''/etc/fstab''' 에 위 디렉토리로 파티션을 마운트하게 해 줘야 한다. /etc/fstab을 열고 아래의 줄을 추가해 줄 것이다: 아래의 내용을, 원하는 설정으로 고쳐서 사용하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; fstab&lt;br /&gt;
/dev/hda4               /vicepa        ext3            defaults        0 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, '''/etc/fstab'''에 설정해준 대로, 마운트를 하도록 하자. 아래의 명령을 내리면, /dev/hda4 는 /vicepa 디렉토리에 마운트 될 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # mount -a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (최초 구성시) 볼륨 서버 데이터베이스에 볼륨 생성하기 ===&lt;br /&gt;
&lt;br /&gt;
이 부분은 첫번째 AFS 서버를 구성할 때 사용하는, '''''root.afs''''' 라는 '''첫번째''' AFS 볼륨을 생성하는 부분이다.&lt;br /&gt;
&lt;br /&gt;
사용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vos create &amp;lt;server name&amp;gt; &amp;lt;partition name&amp;gt; root.afs -cell &amp;lt;cell name&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 파티션 이름은, 실제 디바이스 파일 대신 앞에서 언급했던 파티션 이름을 사용해야 한다. (/vicep'''X''')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
앞에서 '''/vicepa''' 로 생성한 것과 위의 용법을 토대로, 다음을 실행한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # vos create afsdisk1.testbed.org /vicepa root.afs -cell powercell -noauth&lt;br /&gt;
Volume 536870912 created on partition /vicepa of afsdisk1.testbed.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
정상적으로 실행 될 경우, 해당 볼륨의 크기가 메시지에 포함될 것이다.&lt;br /&gt;
&lt;br /&gt;
'partition /vicep01 does not exist on the server' 라는 메시지가 나오면, 해당 파티션을 마운트 하고, '''bos restart''' 명령으로 서버를 재시작 한 후 재시도를 하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 서버 부분에서의 Update 서버 구성 ===&lt;br /&gt;
&lt;br /&gt;
셀에 포함된 다른 머신들에게 이들 디렉토리의 내용을 배포하기 위해, (서버 레벨에서의) Update 서버 (upserver 프로세스)를 시작해야 한다. 이들은 당신이 다른 서버 머신에서, 추가로 클라이언트 레벨의 Update Server를 구성할 때 활성화 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# bos create &amp;lt;server name&amp;gt; upserver simple &amp;quot;/usr/libexec/openafs/upserver \&lt;br /&gt;
-crypt /etc/openafs/server -clear /usr/libexec/openafs&amp;quot; -cell &amp;lt;cell name&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 토대로, 서버레벨에서의 Update 서버를 구성하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org upserver simple \ &lt;br /&gt;
&amp;quot;/usr/libexec/openafs/upserver -crypt /etc/openafs/server -clear /usr/libexec/openafs&amp;quot; \&lt;br /&gt;
-cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 클라이언트 부분의 Update 서버 구성 ===&lt;br /&gt;
&lt;br /&gt;
이 부분을 접하면 이상하게 생각할 사항이, '''&amp;quot;왜 셀 볼륨만 있는 파일서버를 구성하는데 클라이언트 부분의 Update 서버가 필요한거지?&amp;quot;''' 가 될 것이다. 이 질문에 대한 대답은, '''&amp;quot;단순 파일서버 역시 메인 OpenAFS 서버로부터 설정들을 받아와야 하니까&amp;quot;''' 가 될 것이다. 따라서, OpenAFS 메인 서버 내에 만 파일 서비스를 추가하고 싶다면, 이 구간을 지나쳐도 될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
클라이언트 부분의 Update 서버는 2개로 나뉘어진다. 하나는 OpenAFS (Database) 서버로 부터 시스템 설정 사항을 받아오고(즉, /etc/openafs/server 설정을 배포하는 서버로 부터 설정을 받아오는), 동기화 하는 upclientetc 와, 바이너리 서버로부터 AFS 관련 바이너리를 동기화하는 upclientbin 이 있다. Thin Client 의 구성이 아니라면, 기본적으로는 upclientetc 만 설정하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
단순 셀 볼륨 파일 서버는 이 upclientetc 와 함께, 서버 부분에서의 Update 서버 (즉, upserver) 두가지를 필요로 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
upclientetc 를 구성하는 용법은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 # ./bos create  &amp;lt;'''machine name'''&amp;gt; upclientetc simple  \ &lt;br /&gt;
     &amp;quot;/usr/afs/bin/upclient &amp;lt;'''system control machine'''&amp;gt; [-t  &amp;lt;time&amp;gt;]  /usr/afs/etc&amp;quot; \&lt;br /&gt;
     -cell  &amp;lt;cell name&amp;gt;  -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 용법은 근거로, upclientetc를 구성해보자: OpenAFS 인증/백업/프로텍션/VLDB 가 구성된 데이터베이스 서버의 위치가 '''''afsdisk1.testbed.org''''' 일때, 단순 파일 서버의 역할만 하는 '''afsdisk2'''를 추가시켜주기 위해서는, 다음과 같이 명령을 실행하여 upclientetc를 구성할 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk2 # bos create afsdisk2.testbed.org upclientetc simple \&lt;br /&gt;
 &amp;quot;/usr/libexec/openafs/upclient afsdisk1.testbed.org /etc/openafs/server&amp;quot; \&lt;br /&gt;
 -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Deprecated: AFS 가 제대로 작동하기 위한 시간 동기화 구성 ===&lt;br /&gt;
&lt;br /&gt;
{{AttensionIcon}} '''''이 단락 대신에, ntpclient + cron를 사용해 시간을 주기적으로 동기화를 하면 된다. GentooLinux 배포본의 openafs는 이 runntp가 들어가있지 않다.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, 이를 진행하기 전에 ntpd 서버가 구동중이어야 한다. (앞의 장에서 필요하다고 언급했던 것 처럼) 아니면, 최소한 외부의 ntp 서버 주소를 알고 있어야 할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 단락에서는 runntp 프로세스를 등록해, 서버간 시간을 동기화 하는 것에 대해 언급할 것이다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음의 용법을 사용하여 runntp 프로세스를 등록한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 # bos create &amp;lt;'''machine name'''&amp;gt; runntp simple &amp;quot;runntp &amp;lt;'''ntp 서버 주소'''&amp;gt;+&amp;quot; -cell &amp;lt;'''cell name'''&amp;gt; -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 외부 ntp 서버가 없이, 로컬 시스템의 시간을 사용하려면, runntp 가 들어가는 부분에 ntp 서버 주소 대신 -localclock 옵션을 넣어주도록 한다. 만약 외부 ntp 서버 접근에 딜레이나 중단이 자주 있을 꺼라 판단하면, -localclock 옵션 뒤에 해당 ntp 서버 주소를 넣으면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법과 '''주의사항'''을 근거로 아래의 명령을 실행하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # bos create afsdisk1.testbed.org runntp simple \&lt;br /&gt;
 &amp;quot;runntp afsdisk1.testbed.org&amp;quot; -cell powercell -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 실제 사용하게 될 루트 볼륨 구성하기 ===&lt;br /&gt;
&lt;br /&gt;
처음 AFS 서버를 구성하여, root.afs 를 생성한 경우에도 실제 사용할 루트 볼륨은 구성해야 한다. (구성하지 않고, root.afs만 구성되어 있다면, 클라이언트 사이드에서 접속한 후에 디렉토리를 접근할 경우 &amp;quot;접근할 장치가 없음&amp;quot; 이라는 메시지를 보게 될 것이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
용법은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vos create &amp;lt;'''server name'''&amp;gt;&amp;lt;'''partition name'''&amp;gt; root.cell&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 용법을 근거로, root.cell 볼륨을 생성하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # vos create afsdisk1.testbed.org /vicepa root.cell&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fs 명령어를 사용, 디스크 쿼터 할당하기 ===&lt;br /&gt;
&lt;br /&gt;
위의 단계까지 잘 진행되었다면, 이 상태에서도 클라이언트가 OpenAFS 를 탐지하고 (인증을 받기 전) 마운트 상태까지 만들어 줄 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
문제는 클라이언트가 kaserver 인증을 받고 난 다음에, 조금 큰 파일을 올리려고 하다보면 얄짤 없이 디스크에 남은 공간이 없다고 하게 될 것이다. 이럴 경우를 위해, 최대 쿼터를 할당해야 한다. 단위는 {{{KByte}}}로 넣으면 된다. 아래의 예제는 /afs/powercell에 20{{{Gbyte}}}로 할당한 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@afsdisk1 # fs setquota /afs/powercell -max 20000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} '''fs mkmount''' 를 사용하여 위의 afs 파일시스템을 마운트 하던지, 아니면 클라이언트를 띄운 후 admin 계정에 접속해서 저 메시지를 날려야 할 것이다. 자세한 것은 OpenAFS Client 구성 부분을 참조하길 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OpenAFS Client 구성 ==&lt;br /&gt;
&lt;br /&gt;
위의 과정을 통해 구성한 서버와 셀 볼륨을 활용하기 위해서는 당연히 클라이언트가 필요하다. 이 단락에서는, 클라이언트를 설정하는 방법에 대해 언급할 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, 클라이언트를 구성하기 위해서는 당연히, net-fs/openafs 패키지가 필요하다. 주저없이 입력하라:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@hostname # emerge net-fs/openafs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Client 설정파일 변경 ===&lt;br /&gt;
&lt;br /&gt;
먼저, '''/etc/openafs''' 디렉토리의 {{{CellServDB}}} 와 {{{ThisCell}}} 파일을 수정해야 한다. 수정하는 방법은, 서버의 IP와 Cell name을 가르키게 해야 하는데, 서버에 구성되어 있는 위 두개 파일을 참조해서 설정해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, {{{/etc/openafs/CellServDB}}} 파일을 잡는다. 이때 주의할 점은, # 뒤에 붙는 값이 '''절대''' 주석처리가 아니라는 사실이다. '''반드시''' '''''&amp;gt;Cellname''''' 이후에는 '''''#Cell name''''' 이라고 써줘야 한다. 그 아랫줄에는 IP를 기입하고, 다시 이후에 '''''#hostname(.domain.name)''''' 을 기입해줘야 한다는 사실이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;powercell     #Cell name&lt;br /&gt;
192.168.0.21   #afsdisk1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
::{{InfoIcon}} 띄워져 있는 공간은 '''Tab을 넣는 것이 아니라''', 스페이스 공백을 넣어야 한다. Tab을 사용할 경우, 잘못 인식한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 {{{/etc/openafs/ThisCell}}} 파일을 수정한다. 이 파일에는 단순히 포함하는 셀 명을 기입하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
powercell&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 클라이언트 기준에서의 캐시 설정 ===&lt;br /&gt;
&lt;br /&gt;
클라이언트에서도 AFS 캐시를 위해 로컬의 일정 부분에 캐싱을 하게 된다. 그 위치정보는 {{{/etc/openafs/cacheinfo}}} 에 저장되며, 기본값으로 {{{/var/cache/openafs}}} 아래 캐시가 저장되도록 되어 있다. 대강의 내용은 아래와 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/afs:/var/cache/openafs:200000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
기본값은 {{{200MByte}}} 로, /afs 에 마운트되는 AFS 파일시스템을 위해 /var/cache/openafs 에 캐시를 구성하겠다고 되어 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{ThumbupIcon}} 권장 값은 {{{2GByte}}}로 잡는것이 좋다. 파일 억세스 속도가 느리다고 생각하면, 캐시를 크게 잡고, 그런 다음 '''''/etc/conf.d/openafs-client''''' 의 옵션에 chunksize를 조정하는 옵션을 붙여줘야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
현재 시스템이 '''Reiserfs'''나 '''SGI xfs''' 파일시스템을 쓰고 있다면, 불행하게도 이들 캐시를 위해 ext2/ext3 파티션을 할당해줘야 한다. xfs 같은 경우 파일시스템을 줄이는(shrink)것이 불가능 하므로, 이런 경우에는 ext2 이미지를 생성, loopback 마운트를 하여 사용하는 수 밖에 없다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{AttensionIcon}} '''이미 ext2/ext3 파일 시스템을 사용하고 있다면, 아래의 내용은 더 이상 살펴볼 필요가 없다.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, dd를 사용해서 일정 공간을 확보하도록 하자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@hostname # dd if=/dev/zero of=/ext2part4afs.img bs=1024M count=2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 명령어를 사용해서 2GB의 zero-filled 된 파일을 확보하면, mkfs를 사용해서 ext2 이미지를 생성하자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root@hostname # mkfs.ext2 /ext2part4afs.img&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
디바이스 파일이 아니라고 하면, 상큼하게 무시하고 계속 진행하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여하간, 다 만들어지면 이제 '''/etc/fstab''' 파일과, 캐시가 들어갈 디렉토리를 확보하도록 하자. 이미 /var/cache/openafs 디렉토리가 있을 테지만, 해당 디렉토리가 비어있도록 해야 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/fstab 파일에 다음의 내용을 추가한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; fstab&lt;br /&gt;
# AFS cache 를 위한 설정.&lt;br /&gt;
/ext2part4afs.img      /var/cache/openafs  ext2  loop,defaults 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
설정이 끝나면, '''mount -a''' 를 실행하여 해당 이미지를 loopback mount 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제, '''/etc/openafs/cacheinfo''' 파일을 수정하자. ext2 파티션으로 바뀐 이미지는 실제 2GB 보다 작을 것이므로, 마운트 된 파일시스템의 용량을 확인하고 적절하게 넣어주자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/afs:/var/cache/openafs:1800000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
마운트가 끝나고 캐시를 넣을 공간을 확보하더라도, 반응속도등이 현저하게 떨어지는 문제가 있다. 이를 위해서 chunksize를 높게 잡아줘야 하는데, 이 값은 2^n 으로 증가시킬 수 있다. (옵션 입력값이 n이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''/etc/init.d/openafs-client'''의 세부사항을 보면, 현재의 캐시 크기에 맞춰서 옵션이 달라지도록 설계되어있음을 알 수 있다: 따라서, '''''/etc/conf.d/openafs-client''''' 파일을 열면, 자신의 캐시 사이즈에 맞는 변수를 찾아 고쳐줘야 할 것이다. (귀찮다면 모든 변수에 지정해도 된다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
구조상, 캐시사이즈에 따른 변수 채택은 다음과 같이 이루어진다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
128MB &amp;gt; 캐시사이즈 ==&amp;gt; $SMALL&lt;br /&gt;
512MB &amp;gt; 캐시사이즈 ==&amp;gt; $MEDIUM&lt;br /&gt;
1GB &amp;gt; 캐시사이즈 ==&amp;gt; $LARGE&lt;br /&gt;
2GB &amp;gt; 캐시사이즈 ==&amp;gt; $XLARGE&lt;br /&gt;
2GB &amp;lt; 캐시사이즈 ==&amp;gt; $XXLARGE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/conf.d/openafs-client 파일의 마지막을 보면,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; config&lt;br /&gt;
OPTIONS=&amp;quot;AUTOMATIC&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이라고 되어 있는데, 자신이 원하는 설정을 강제로 선택하게 하고 싶을 경우에는, SMALL / MEDIUM / LARGE / XLARGE / XXLARGE 등으로 잡아 놓을 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
중요한것은, chunksize를 지정해줘야 한다는 것인데, 이것의 기본값은 0이다.  값은 2^n 으로 계산하며, 캐시 사이즈 1GB~2GB 기준에 2^18 = 256 Kilobyte, 즉 '''-chunksize 18''' 로 잡아주는 것이 좋다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 설정으로는 $XLARGE가 선택될 것이므로, (대충 1.8GB 캐시) XLARGE 쪽의 변수 맨 끝에, '''-chunksize 18''' 을 추가해주자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; config&lt;br /&gt;
XLARGE=&amp;quot;-fakestat -stat 3600 -dcache 3600 -daemons 5 -volumes 196 -files 50000 -chunksize 18&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 정도만 해도, AFS에 연결하고 파일을 직접 접근하고 동영상을 재생해도, 무리가 없을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== openafs-client 서비스 시작 ===&lt;br /&gt;
&lt;br /&gt;
위의 설정이 끝나고, 캐시를 사용하는데 아무런 문제가 없으면, openafs-client 서비스를 시작해야 한다. 다음을 입력하여, openafs-client 서비스를 실행한다. 이것을 실행하면, 자동적으로 AFS 커널 모듈이 적재되고, /afs/'''''cellname''''' 이 생성될 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
root # /etc/init.d/openafs-client start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{{InfoIcon}} 매번 시작시때 자동 적용을 하고 싶을 경우에는, ''''rc-update add openafs-client default'''' 명령을 수행하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== kaserver를 통해 로그인하는 방법 ===&lt;br /&gt;
&lt;br /&gt;
서비스가 시작해도, 막상 접근하면 퍼미션이 없다고 할 것이다. 이제는 '''klog''' 프로그램을 통해 kaserver의 인증을 거쳐 토큰을 받아내야 한다. 위의 설정이 잘 되고 서비스가 잘 시작되었다면, 사용법은 간단하다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
username@hostname &amp;gt; klog &amp;lt;AFS 사용자 명&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
정상적으로 인증이 되면, 그냥 아무말 없이 다시 프롬프트가 떨어질 것이다. 이제까지 admin 계정만 생성했었다면, AFS 사용자 명에 admin을 입력하면 될 것이다. 패스워드는 마찬가지로, 자신이 입력했던 패스워드를 사용하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
자, 이제 '''''/afs/cellname''''' 에 접근해 보자. 접근이 잘 된다면, OK다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 팁 / 관리 / 문제 해결 ==&lt;br /&gt;
&lt;br /&gt;
=== (선택사항) *NIX 시스템 로그인으로 AFS Login 이 동시에 가능하게 ===&lt;br /&gt;
&lt;br /&gt;
{{InfoIcon}} 선택사항이라고 하는 것은, '''klog''' 를 사용해서 로그인을 언제든지 할 수 있기 때문이다. 이 작업을 위해서는 계정의 UID 와 프로텍션 서버(ptserver)에 계정 생성시 들어가는 UID를 맞춰줘야 하는 귀찮은 작업이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AFS는 PAM과 연동을 할 수 있게 해준다. 이제부터 그 절차를 설명해 나갈 것이다:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''/lib/security''' 디렉토리에는 pam 관련 라이브러리들이 들어있다. openafs 를 설치하면, 이 디렉토리에 pam_afs.so.1 과 pam_afs.krb.so.1 파일이 추가될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
우리가 수정해야 할 파일은 login 시 참조하는 '''/etc/pam.d/system-auth''' 와, su 등으로 권한을 이동할 때 참조하는 '''/etc/pam.d/su''' 등이 있다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''/etc/pam.d/system-auth''''' 를 다음과 같이 수정한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; pam.d&lt;br /&gt;
#%PAM-1.0&lt;br /&gt;
&lt;br /&gt;
auth       required     pam_env.so&lt;br /&gt;
auth       sufficient   pam_unix.so try_first_pass likeauth nullok&lt;br /&gt;
# AFS를 위해 추가한 부분은 아랫줄이다.&lt;br /&gt;
auth       sufficient   pam_afs.so.1 use_first_pass ignore_root&lt;br /&gt;
auth       required     pam_deny.so&lt;br /&gt;
&lt;br /&gt;
account    required     pam_unix.so&lt;br /&gt;
&lt;br /&gt;
password   required     pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 try_first_pass retry=3&lt;br /&gt;
password   sufficient   pam_unix.so try_first_pass use_authtok nullok md5 shadow&lt;br /&gt;
password   required     pam_deny.so&lt;br /&gt;
&lt;br /&gt;
session    required     pam_limits.so&lt;br /&gt;
session    required     pam_unix.so&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''/etc/pam.d/su''''' 의 내용을 아래와 같이 변경한다. (주석은 모두 삭제되었다. 적절하게 수정하자):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
pam.d&lt;br /&gt;
#%PAM-1.0&lt;br /&gt;
&lt;br /&gt;
# AFS를 위해 추가된 부분은 바로 아랫줄이다.&lt;br /&gt;
auth       sufficient   pam_afs.so.1 ignore_uid 100&lt;br /&gt;
auth       sufficient   pam_rootok.so&lt;br /&gt;
auth       required     pam_wheel.so use_uid&lt;br /&gt;
auth       include              system-auth&lt;br /&gt;
account    include              system-auth&lt;br /&gt;
password   include              system-auth&lt;br /&gt;
session    include              system-auth&lt;br /&gt;
session    required     pam_env.so&lt;br /&gt;
session    optional             pam_xauth.so&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS의 계정 권한 (ACL) 변경 ===&lt;br /&gt;
&lt;br /&gt;
system:administrators 권한에서나, 혹은 ACL 변경 권한이 있는 계정으로, '''fs setacl''' 명령을 사용하여 변경하면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fs setacl의 용법은 다음과 같다: 추가적인 옵션은, '''fs help setacl'''로 확인하기 바란다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
fs setacl -dir &amp;lt;'''directory'''&amp;gt;+ -acl &amp;lt;'''access list entries'''&amp;gt;+ {{{[-clear] [-negative] [-id] [-if]}}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
디렉토리는 마운트 포인트내 디렉토리(예: /afs/powercell)를 넣고, acl에는 다음과 같은 값을 넣을 수 있다:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: 1px solid black;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|'''flag'''||'''의미'''&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''i'''||삽입(insert) 권한. 디렉토리에 파일을 추가하거나, 복사, 생성, 새 디렉토리 생성 여부가 포함된다. 새로만든 디렉토리에까지 앞의 권한이 확장되지는 않는다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''d'''||삭제(delete) 권한. 파일을 삭제, 혹은 이름을 바꾸거나, (i권한도 가지고있다는 전제하에)옮길 수 있다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''a'''||관리(administer) 권한. 각 파일/디렉토리의 권한 변경이 가능하다. system:administrators 그룹에 속한 사용자는 기본적으로 가지는 권한이다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''r'''||읽기(read) 권한. ls -l 등으로 보여지는 파일들을 검색하고, 내용을 읽을 수 있다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''w'''||쓰기(write) 권한. 해당 파일의 내용이나 chmod 같은 UNIX 퍼미션 비트등을 조절할 수 있다.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|'''k'''||잠금(lock) 권한. 디렉토리/파일을 잠글 수 있게 하는 권한.&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACL에서 적용가능한 값과 의미&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AFS는 추가적으로 정의되지 않은 사용자 권한 비트를 쓸 수 있게 해준다: 대문자 A, B, C, D, E, F, G, H - 총 8개 - 를 사용할 수 있다. AFS 기반의 프로그램을 개발할 때, 이들 flag에 대해 의미를 부여하고, 그에 따른 액션을 사용할 수 있게 해준다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''-clear''' 옵션은 ACL 리스트를 비워주는 옵션이고, '''-negative'''는 현재 할당된 권한의 반대로 플래그를 변화시켜준다. '''-id/-if''' 는 각각 디렉토리/파일에 대한 초기 권한 할당을 하는 옵션이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 볼륨 서버에 포함된 볼륨 리스트를 동기화하기 ===&lt;br /&gt;
&lt;br /&gt;
'''vos''' 명령행 도구는 볼륨 서버 / 볼륨 위치 데이터베이스에 관련된 작업을 하는 도구이다. 이를 이용하여, 같은 셀 내의 볼륨들에 대한 생성/삭제/리스트 동기화 등등을 할 수 있다. 이 단락에서 언급할 내용은, 각 서버에 잡혀있는 볼륨 리스트를 동기화 (sync VLDB) 하고, 볼륨 서버 동기화 (sync Server) 를 가능하게 하는 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VLDB/볼륨 서버 동기화는 다음과 같이 할 수 있다: 위의 것이 VLDB 동기화, 아래의 줄이 서버 동기화이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vos syncvldb &amp;lt;'''server name'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -localauth 또는 -noauth (현재 인증설정에 의존)&lt;br /&gt;
# vos syncserv &amp;lt;'''server name'''&amp;gt; -cell &amp;lt;'''cell name'''&amp;gt; -localauth 또는 -noauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참고로, 현재 vldb의 리스트는 다음과 같이 확인할 수 있다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# vos listvldb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
클라이언트에서 실행하면, 현재 셀의 모든 볼륨에 대한 리스트를 볼 수 있을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 볼륨의 남은 공간 보기 ===&lt;br /&gt;
&lt;br /&gt;
볼륨의 남은 공간은, 다음의 명령을 통해 알 수 있다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# fs diskfree&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
현재 Quota의 값이라던지, 다른 세부사항을 볼 때는 '''fs examine'''을 사용하면 된다. 마운트 포인트에 대한 모든 사항을, '''fs''' 명령어로 확인할 수 있기 때문에, '''fs help''' 를 사용하여 쓸 수 있는 명령어를 알아두는 것이 좋을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 너무 느리다 : 캐시 설정 이후에도, 파일을 가져오거나 리스팅에 지연(delay) 발생시 ===&lt;br /&gt;
&lt;br /&gt;
==== klog 인증시의 지연(delay) ====&lt;br /&gt;
&lt;br /&gt;
klog로 접속하는데 딜레이가 생긴다면, 일단 설정을 먼저 확인해보라. {{{/etc/openafs/CellServDB}}}가 접속 장애의 첫번째 이유가 될 수 있고, 그 다음은 서버의 인스턴스가 전부 작동하는지 '''bos status''' 명령으로 확인해보길 바란다. 단순히 init.d 스크립트로 구동했을 때, 모든 인스턴스 역시 실행될 거라는 보장은 아무도 못한다. (init.d의 구동 스크립트 는 bos 서버가 잘 뜨는지만 확인할 수 있을 뿐이다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== VLDB 리스팅시의 지연 ====&lt;br /&gt;
&lt;br /&gt;
Kerberos 인증에는 아무런 문제가 없었으나, '''vos listvldb''' 를 통해 현재 클라이언트가 인식한 VLDB 의 구조를 가져오는데 지연이 발생할 수 있다. 이 문제는 대부분 네임 서버를 통해 질의, 해당 OpenAFS 볼륨 서버/파일 서버로 접근할 때 발생한다. '''/etc/resolv.conf''' 가 네임서버를 정확하게 가르키고 있는지, 혹시 hostname 만으로 찾는다면 동등 domainname 을 자동으로 넣는지 등을 확인해 봐야 할 것이다. 필요하면, NSCD(Name Server Caching Daemon)을 재시작 하거나 시동시 자동으로 등록되게끔 하는 방법도 추가할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 그래도 접속/파일 접근/전송이 느리다면 ====&lt;br /&gt;
&lt;br /&gt;
# 방화벽 문제를 의심한다.&amp;lt;BR&amp;gt; OpenAFS 서버는 최소 7000~7010 까지의 UDP를 필수적으로 요구한다. 클라이언트 역시 7000~7010 UDP 포트를 열어두기를 권장한다.&lt;br /&gt;
# 동등 네트워크에 존재하는지 (동일 클래스인지) 검사해보라.&amp;lt;BR&amp;gt;사무실에서 구성할 경우, 무선 네트웍/DHCP 접속자는 200번대 이후로 IP를 발급했는데, DHCP 접속자가 유달리 접속/전송 속도가 느렸던 문제를 경험하였다.&lt;br /&gt;
# {{{/etc/openafs/CellServDB}}} 파일의 설정을 의심해보라. &amp;lt;BR&amp;gt;뒤의 주석이라고 생각될 만한 '''#Cell name''' 이나 '''#hostname.domain.name''' 역시 설정 파일에 들어가야할 내용이다. 없을 경우, 접속 속도나 전송에 지연현상을 겪었다. 그리고, 이 파일에는 셀에 포함된 모든 파일 서버까지 목록에 들어가는 것이 아니라, OpenAFS 데이터베이스 서버의 위치만 들어가야 한다. VLDB 서버가 없는 단일 파일서버가 이 목록에 포함되어 있을 경우, 역시 지연현상이 생길 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AFS 벤치마크에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
구성된 AFS 의 성능을 검사하기 위해, 여러가지 툴을 사용할 수 있다: 권장하는 것들로는 다음과 같은 것이 있다.&lt;br /&gt;
&lt;br /&gt;
* [http://www.citi.umich.edu/projects/linux-scalability/tools.html Andrew Benchmark] 가 있다.&lt;br /&gt;
* bonnie++ 을 사용하는 방법도 있다.&lt;br /&gt;
* 이것도 저것도 귀찮다면 dd 를 사용하라. 읽기 때는 /dev/null 로 보내고, 쓸 때는 /dev/zero 에서 가져오라. 이 때, 동등 파일을 여러번 실시하게 되면, afsd가 캐시를 이용하게 되어 테스트 결과가 혼란스럽게 나올 것이다. 정상적인 표본은, 절대 현재 네트워크의 한계속도를 뛰어넘을 수 없다.&lt;br /&gt;
* 지속적으로 가져올 수 있는지, 혹은 접근 반응등을 살펴보고 싶다면 AFS를 마운트 후 mplayer 와 같은 미디어 플레이어로 재생 능력을 테스트해보길 권장한다. bonnie++ 과 dd로는 알 수 없는 사항들을 몸소 느낄 수 있을것이다. 이 때도 역시, 캐시로 인해 정확한 판단이 불가능 할 수 있으므로, 파일을 먼저 AFS로 전송 후 AFS 클라이언트를 중지, 이후 캐시를 지우고 openafs-client 를 재시작하여 테스트 할 것을 권장한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== JAFS (Java API for AFS) 에 대하여 ===&lt;br /&gt;
&lt;br /&gt;
기본적으로 GentooLinux 에서나, 다른 배포판에서나 Java API (JNI로 만들어진) 패키지를 따로 찾을 수가 없다는 것이다. 하지만 존재한다: 소스를 풀어보고, ./configure 를 실행하라. 그리고, make jafs 를 하면 jafs 라이브러리가 생성될 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이때, 되도록이면 openafs를 emerge 할 때 갖가지 configure 설정을 그대로 유지하도록 하라. 그냥 ./configure 로 openafs를 구성하면, 각 배포판에서의 sysconfdir 같은 옵션으로 인해 openafs의 설정파일 위치가 다르기 때문에 토큰을 받아오는 가장 기본적인 API 사용도 불가능하게 될 수 있다. (Cell Database를 못찾는다던지...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 참고할만한, 그리고 이 문서를 작성하는데 도움을 준 문서들 ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.openafs.org/doc/index.htm OpenAFS 공식 Document]&lt;br /&gt;
* [http://www.angelfire.com/hi/plutonic/afs-faq.html AFS Frequently Asked Questions]&lt;br /&gt;
* [https://www-s.acm.uiuc.edu/wiki/space/Setting+up+your+computer+as+an+AFS+client ACM@UUIC Wiki : Setting up your computer as an afs clients]&lt;br /&gt;
* [http://www.captain.at/programming/openafs/ Captains Universe : OpenAFS on Solaris 9 x86]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooKRDoc]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=959</id>
		<title>B:GentooKRPublishDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=B:GentooKRPublishDoc&amp;diff=959"/>
		<updated>2013-03-17T13:06:23Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: OpenAFS-Gentoo-HOWTO 문서 링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Gentoo Korea 국내 제작문서&lt;br /&gt;
&lt;br /&gt;
[[OpenAFS-Gentoo-HOWTO|OpenAFS-Gentoo-HOWTO]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=WikiTestPage&amp;diff=958</id>
		<title>WikiTestPage</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=WikiTestPage&amp;diff=958"/>
		<updated>2013-03-17T12:51:03Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 예제용 템플릿 이름 수정&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; 여기는 MediaWiki의 문법 테스트페이지 입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Template:InfoIcon|정보아이콘]]&lt;br /&gt;
{{InfoIcon}}이렇게 아이콘이 나오게 할 수 있습니다.&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=WikiTestPage&amp;diff=957</id>
		<title>WikiTestPage</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=WikiTestPage&amp;diff=957"/>
		<updated>2013-03-17T12:50:36Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 테스트용 문법추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; 여기는 MediaWiki의 문법 테스트페이지 입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Template:NoticeIcon|주의아이콘]]&lt;br /&gt;
{{NoticeIcon}}이렇게 아이콘이 나오게 할 수 있습니다.&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%EB%8C%80%EB%AC%B8&amp;diff=956</id>
		<title>대문</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%EB%8C%80%EB%AC%B8&amp;diff=956"/>
		<updated>2013-03-17T12:47:08Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 위키문법테스트페이지 링크 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Gentoo Linux 란? ==&lt;br /&gt;
&lt;br /&gt;
Gentoo Linux는 여러가지 리눅스 배포판들 가운데 하나입니다. 기존 배포판들이 정해진 틀에 사용자를 묶는 경향이 강하다면 Gentoo Linux는 배포판이 사용자의 손길에 따라 움직인다고 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
꾸러미 관리의 개념은 기존 Redhat, Debian GNU/Linux와 같은 형태의 배포판들과는 많이 다릅니다. 기존의 배포판들이 미리 빌드된 꾸러미를 제공하고 사용자가 그 범위 안에서 선택적으로 설치/제거를 통해 시스템을 구성하도록 했다면 Gentoo Linux는 Portage, Ebuild 라는 시스템을 도입해 사용자가 가능한한 많은 선택사항들을 조정하고 제어해서 시스템을 직접 빌드할 수 있도록 하고 있습니다.&lt;br /&gt;
&lt;br /&gt;
시스템을 직접 빌드하는 과정이 어느 정도의 난이도를 가지고 있긴 하지만, 그렇게 복잡하고 어려운 것은 아닙니다. 왜냐하면 어느 정도의 Linux 사용 경험과 기본적인 개념만 알고 있다면 빌드 작업을 거의 자동화 할 수도 있기 때문입니다. 또한 필요한 선택 사항을 추가하고 불필요한 것들을 제거한 뒤 emerge 명령을 사용하는 것만으로 해당 꾸러미 또는 시스템 전체를 여러분의 입맛에 맞게 최적화 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 대분류 ==&lt;br /&gt;
&lt;br /&gt;
이곳은 Gentoo Korea에서 직접 관리하는 내용이 담긴 Wiki입니다.&lt;br /&gt;
Gentoo Linux Korea Wiki는 다음과 같은 분류로 이루어져있습니다&lt;br /&gt;
&lt;br /&gt;
* [[b:GentooKRTranslateDoc|Gentoo Korea 번역문서]]&lt;br /&gt;
* [[b:GentooKRPublishDoc|Gentoo Korea 제작문서]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 편집 참여 안내 ==&lt;br /&gt;
&lt;br /&gt;
번역, wiki 편집, 내용추가에 참여하고 싶으시다면 [http://www.gentoo.or.kr 한국 젠투 리눅스 사용자 모임]에서 &amp;quot;잉여양파&amp;quot;, &amp;quot;다크서클&amp;quot; 또는 &amp;quot;사랑천사&amp;quot; 에게 쪽지를 남겨주세요&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 편집시 주의사항 ==&lt;br /&gt;
&lt;br /&gt;
카테고리 관련된 부분을 도입하였습니다.&lt;br /&gt;
&lt;br /&gt;
* 번역문의 경우는 아래의 wiki코드를 문서 제일 아래쪽에 넣어주세요&amp;lt;pre&amp;gt;[[Category:GenooTrans]]&amp;lt;/pre&amp;gt; &lt;br /&gt;
* 제작문서의 경우는 아래의 wiki코드를 문서 제일 아래쪽에 넣어주세요&amp;lt;pre&amp;gt;[[Category:GenooKRDoc]]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
왼쪽의 사이드바에서 전체카테고리를 볼 수 있으며 클릭하면 카테고리별로 정렬된 문서를 찾아들어갈 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
문서작성하시는분들은 나중에라도 카테고리 관련된 부분을 잊지 말아주세요&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 기타사항 ==&lt;br /&gt;
&lt;br /&gt;
* [[WikiTestPage|위키문법테스트페이지]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 도움말 ==&lt;br /&gt;
위키를 처음 시작하셨다면 [http://www.mediawiki.org/wiki/Help:Contents 도움말] 을 읽어보시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
젠투 위키 포매팅을 위한 템플릿 사용법에 대해서는 [[B:HowToUseTemplate|템플릿 사용하기]]를 참조하시기 바랍니다.&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=%EB%8C%80%EB%AC%B8&amp;diff=955</id>
		<title>대문</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=%EB%8C%80%EB%AC%B8&amp;diff=955"/>
		<updated>2013-03-17T10:35:31Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 메인페이지-편집시 주의사항-내용추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Gentoo Linux 란? ==&lt;br /&gt;
&lt;br /&gt;
Gentoo Linux는 여러가지 리눅스 배포판들 가운데 하나입니다. 기존 배포판들이 정해진 틀에 사용자를 묶는 경향이 강하다면 Gentoo Linux는 배포판이 사용자의 손길에 따라 움직인다고 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
꾸러미 관리의 개념은 기존 Redhat, Debian GNU/Linux와 같은 형태의 배포판들과는 많이 다릅니다. 기존의 배포판들이 미리 빌드된 꾸러미를 제공하고 사용자가 그 범위 안에서 선택적으로 설치/제거를 통해 시스템을 구성하도록 했다면 Gentoo Linux는 Portage, Ebuild 라는 시스템을 도입해 사용자가 가능한한 많은 선택사항들을 조정하고 제어해서 시스템을 직접 빌드할 수 있도록 하고 있습니다.&lt;br /&gt;
&lt;br /&gt;
시스템을 직접 빌드하는 과정이 어느 정도의 난이도를 가지고 있긴 하지만, 그렇게 복잡하고 어려운 것은 아닙니다. 왜냐하면 어느 정도의 Linux 사용 경험과 기본적인 개념만 알고 있다면 빌드 작업을 거의 자동화 할 수도 있기 때문입니다. 또한 필요한 선택 사항을 추가하고 불필요한 것들을 제거한 뒤 emerge 명령을 사용하는 것만으로 해당 꾸러미 또는 시스템 전체를 여러분의 입맛에 맞게 최적화 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 대분류 ==&lt;br /&gt;
&lt;br /&gt;
이곳은 Gentoo Korea에서 직접 관리하는 내용이 담긴 Wiki입니다.&lt;br /&gt;
Gentoo Linux Korea Wiki는 다음과 같은 분류로 이루어져있습니다&lt;br /&gt;
&lt;br /&gt;
* [[b:GentooKRTranslateDoc|Gentoo Korea 번역문서]]&lt;br /&gt;
* [[b:GentooKRPublishDoc|Gentoo Korea 제작문서]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 편집 참여 안내 ==&lt;br /&gt;
&lt;br /&gt;
번역, wiki 편집, 내용추가에 참여하고 싶으시다면 [http://www.gentoo.or.kr 한국 젠투 리눅스 사용자 모임]에서 &amp;quot;잉여양파&amp;quot;, &amp;quot;다크서클&amp;quot; 또는 &amp;quot;사랑천사&amp;quot; 에게 쪽지를 남겨주세요&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 편집시 주의사항 ==&lt;br /&gt;
&lt;br /&gt;
카테고리 관련된 부분을 도입하였습니다.&lt;br /&gt;
&lt;br /&gt;
* 번역문의 경우는 아래의 wiki코드를 문서 제일 아래쪽에 넣어주세요&amp;lt;pre&amp;gt;[[Category:GenooTrans]]&amp;lt;/pre&amp;gt; &lt;br /&gt;
* 제작문서의 경우는 아래의 wiki코드를 문서 제일 아래쪽에 넣어주세요&amp;lt;pre&amp;gt;[[Category:GenooKRDoc]]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
왼쪽의 사이드바에서 전체카테고리를 볼 수 있으며 클릭하면 카테고리별로 정렬된 문서를 찾아들어갈 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
문서작성하시는분들은 나중에라도 카테고리 관련된 부분을 잊지 말아주세요&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 도움말 ==&lt;br /&gt;
위키를 처음 시작하셨다면 [http://www.mediawiki.org/wiki/Help:Contents 도움말] 을 읽어보시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
젠투 위키 포매팅을 위한 템플릿 사용법에 대해서는 [[B:HowToUseTemplate|템플릿 사용하기]]를 참조하시기 바랍니다.&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Trans:WritingEbuilds&amp;diff=953</id>
		<title>Trans:WritingEbuilds</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Trans:WritingEbuilds&amp;diff=953"/>
		<updated>2013-03-17T10:27:32Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 카테고리 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;이 페이지에서는 ebuild를 어떻게 작성하는지 설명되어 있습니다. 젠투 위키는 현재 ebuild 명령에 대한 문서가 부족합니다. &lt;br /&gt;
(기부자분들 참고: 개발자를 위한 많은 문서는 이미 존재합니다. 이 페이지는 사용자를 위해 소개 내용을 포함한 실제 정보를 제공합니다.)  &lt;br /&gt;
&lt;br /&gt;
* 원문 : [http://en.gentoo-wiki.com/wiki/Writing_Ebuilds Writing Ebuilds - Gentoo Linux Wiki]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== ebuild는 텍스트 파일입니다. ==&lt;br /&gt;
ebuild는 젠투 패키지 입니다. 데비안의 .deb과 레드햇의 .rpm과는 다르며, ebuild는 아카이브가 아닌 단순한 스크립트입니다. 고로, ebuild를 만들려면 ebuild 스크립트를 작성하기만 하면 됩니다. &lt;br /&gt;
&lt;br /&gt;
== 가장 쉬운 방법 : 이미 있는 ebuild 새로 고치기 ==  &lt;br /&gt;
ebuild를 준비하기 위해 일반적이고 (운 좋게도) 가장 쉬운 방법은 최신 버전의 소프트웨어가 공식 포티지 트리의 ebuild를 새로 고치는 것이지만, 실제로 ebuild는 최신으로 바뀌는 것이 아닙니다. &lt;br /&gt;
&lt;br /&gt;
=== 오버레이 === &lt;br /&gt;
여러분이 만든 ebuild는 &amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;&amp;lt;b&amp;gt;/usr/portage&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;에 놓으면 안됩니다. 이는 공식 포티지 트리를 위한 것이며 개인적으로 사용할 수 없습니다. (물론 놓을 수는 있지만 '''emerge --sync''' 명령으로 지워질 것입니다.)&lt;br /&gt;
&lt;br /&gt;
대신 여러분의 ebuild를 제공할 &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;오버레이&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; 디렉터리를 다른 곳에 만듭니다. 오버레이 디렉토리를 만들려면 다음을 &amp;lt;font color=&amp;quot;#007700 &amp;quot;&amp;gt;&amp;lt;b&amp;gt;/etc/make.conf &amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;에 추가하여야 합니다: &lt;br /&gt;
&lt;br /&gt;
{{Example|파일 : /etc/make.conf|&amp;lt;nowiki&amp;gt;PORTDIR_OVERLAY=&amp;quot;/usr/local/portage&amp;quot;&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
이제 '''emerge''', '''ebuild''', '''eix''' 등과 같은 명령들을 통해 계정의 오버레이로 접근하게 될 것입니다.&lt;br /&gt;
&lt;br /&gt;
=== 최신 ebuild 만들기 === &lt;br /&gt;
이 예제에서, 상상의 패키지 foo-zilla-2.0.8은 구버전, 그리고 2.0.9는 여러분이 원하는 버전입니다. &lt;br /&gt;
&lt;br /&gt;
==== 카테고리 알아보기 ====&lt;br /&gt;
먼저, 다음을 통해&lt;br /&gt;
&lt;br /&gt;
 eix foo-zilla&lt;br /&gt;
&lt;br /&gt;
또는&lt;br /&gt;
&lt;br /&gt;
 emerge --search foo-zilla&lt;br /&gt;
&lt;br /&gt;
를 사용하여 www-client 카테고리를 알아봅니다. 이제 됐습니다. &lt;br /&gt;
==== 오버레이로 복사하기 ====&lt;br /&gt;
다음, ebuild를 위한 디렉토리를 다음처럼 새로 만듭니다. &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /usr/local/portage/www-client/foo-zilla&lt;br /&gt;
&lt;br /&gt;
'''구조대로 따랐는지 확인합니다.''' /overlay/category/package 로 되어야 합니다. &lt;br /&gt;
이제 ebuild를 복사합니다: &lt;br /&gt;
&lt;br /&gt;
 cp /usr/portage/www-client/foo-zilla/foo-zilla-2.0.8.ebuild /usr/local/portage/www-client/foo-zilla/foo-zilla-2.0.9.ebuild&lt;br /&gt;
&lt;br /&gt;
원한다면 버전을 유지할 수 있습니다. 이 경우 오버레이된 ebuild는 공식 포티지 트리보다 우선하게 될 것입니다. 이는 어떤 패키지의 버전 번호가 증가시키고 싶지는 않지만, 포티지 컴파일 방법을 바꾸고 싶을때 유용합니다. &lt;br /&gt;
&lt;br /&gt;
또 한가지 알아둘 것은 항상 새로운 버전이 선택되기 때문에 2.0.10이 메인라인에 존재한다면 오버레이상에 2.0.9이후의 것을 준비해야 할 것입니다. 접두 문자 = 을(를) 사용하여 언제든지 정확한 버전을 지정할 수 있습니다: &lt;br /&gt;
&lt;br /&gt;
 emerge =www-client/foo-zilla-2.0.8&lt;br /&gt;
&lt;br /&gt;
==== 포티지 트리로부터 패치하기 ====&lt;br /&gt;
이전 ebuild에서 몇몇 패치를 유지하려 한다면, 복사할 필요가 있습니다. &lt;br /&gt;
&lt;br /&gt;
 cp -R /usr/portage/www-client/foo-zilla/files /usr/local/portage/www-client/foo-zilla/files&lt;br /&gt;
&lt;br /&gt;
심볼릭 링크도 좋습니다. &lt;br /&gt;
==== 매니페스트 만들기 ====&lt;br /&gt;
마지막으로 ''manifest'' 또는 보안 인증 파일을 만듭니다. &lt;br /&gt;
&lt;br /&gt;
 ebuild foo-zilla-2.0.9.ebuild manifest&lt;br /&gt;
&lt;br /&gt;
ebuild를 편집했다면, 때때로 manifest를 만들어야 합니다. 이 시점에서 소스가 다운로드 됩니다. &lt;br /&gt;
&lt;br /&gt;
다른 방법으론 emerge 명령에 '''FEATURES=&amp;quot;-strict&amp;quot;'''를 앞서 덧붙이는 것입니다. ('''{{{#007700 /etc/make.conf }}}''' 에 추가할 수는 있지만, 추천하는 것은 아닙니다. 공식 포티지 트리를 깨지게 할 수 있기 때문입니다.)&lt;br /&gt;
&lt;br /&gt;
이제&lt;br /&gt;
&lt;br /&gt;
 emerge foo-zilla&lt;br /&gt;
&lt;br /&gt;
하면 빌드 될 것입니다. 자 이제 해보세요! :D&lt;br /&gt;
== 예제 ==  &lt;br /&gt;
엄청난 양의 주석이 달린 좋은 예제는 &amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;&amp;lt;b&amp;gt;/usr/portage/skel.ebuild&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;에 있습니다. &lt;br /&gt;
&lt;br /&gt;
== 고치는 방법 ==  &lt;br /&gt;
때로는, 뭔가를 고치는 일이 필요합니다. ebuild를 편집하거나 패치를 추가하고 나면 manifest를 만드는 걸 잊지 마시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
=== 패치 추가 === &lt;br /&gt;
&amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;&amp;lt;b&amp;gt;my-new-patch.patch&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;에 패치 내용이 있고 적용하고 싶습니까? 쉽죠. &amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;&amp;lt;b&amp;gt; .../category/package/files/&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; 에 넣고 ebuild에 추가하시면 됩니다: &lt;br /&gt;
&lt;br /&gt;
{{Example|파일 : /usr/local/portage/www-client/foo-zilla/foo-zilla-2.0.9.ebuild|&amp;lt;nowiki&amp;gt;src_unpack() {&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;unpack ${A}&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;cd &amp;quot;${S}&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;epatch &amp;quot;${FILESDIR}&amp;quot;/my-new-patch.patch&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
만약 '''src_unpack'''이 있다면, epatch를 '''cd &amp;quot;${S}&amp;quot;''' 다음에 붙여줍니다. 그리고 다음을&lt;br /&gt;
&lt;br /&gt;
 inherit eutils&lt;br /&gt;
&lt;br /&gt;
ebuild 시작 부분 어딘가에 추가하여 ebuild가 epatch를 사용할 수 있도록 합니다. (inherit 줄이 이미 있다면 eutils가 있는지 확인합니다).&lt;br /&gt;
&lt;br /&gt;
매니페스트를 최신으로 만드는 것을 잊지 마시기 바랍니다:&lt;br /&gt;
&lt;br /&gt;
 ebuild /usr/local/portage/www-client/foo-zilla/foo-zilla-2.0.8.ebuild digest&lt;br /&gt;
&lt;br /&gt;
{{Note|예를 들어 ebuild가 cvs의 기능을 물려받는다면, 다음처럼 사용해야 합니다: ''unpack ${A}''가 있는 자리에 ''cvs_src_unpack'' 을 넣습니다. git를 사용할 때도 방식은 비슷합니다.}}&lt;br /&gt;
=== 디렉터리 구조가 잘못됨 ===&lt;br /&gt;
위의 예제에서 emerge는 &amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;&amp;lt;b&amp;gt;foo-zilla-2.0.9/&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; 에 압축이 풀린 타르볼을 넣는 것을 가정합니다. 만약 이런 경우가 아니라면 다음 줄을&lt;br /&gt;
&lt;br /&gt;
 S=dirname-tarball-makes&lt;br /&gt;
&lt;br /&gt;
ebuild의 앞 부분에 추가합니다.&lt;br /&gt;
&lt;br /&gt;
== 요령 ==&lt;br /&gt;
=== 이전 ebuild ===&lt;br /&gt;
공식 포티지 트리에 있던 ebuild지만 지금은 지워진지 오래된 ebuild는 젠투 소스 저장소에서 얻을 수 있습니다. -&amp;gt; [http://sources.gentoo.org/viewcvs.py/gentoo-x86/ gentoo-x86] (x86 뿐만 아니라 모든 아키텍처에 대한 ebuild가 여기에 있습니다.)&lt;br /&gt;
&lt;br /&gt;
=== 가지고 있는 소스 활용 ===&lt;br /&gt;
기본적으로 ebuild는 소스 타르볼이 온라인 어딘가에 있는 점을 고려합니다. my-zilla-1.0이라고 하는 소스를 사용한다면 &amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;&amp;lt;b&amp;gt;/usr/portage/distfiles&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; 에 넣고 manifest를 만드시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooTrans]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Trans:Git&amp;diff=952</id>
		<title>Trans:Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Trans:Git&amp;diff=952"/>
		<updated>2013-03-17T10:27:16Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 카테고리 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* 원본 [http://en.gentoo-wiki.com/wiki/Git gentoo-wiki.com/wiki/Git]&lt;br /&gt;
== 도입 ==&lt;br /&gt;
[http://git-scm.com/ Git]은 버전 관리 시스템입니다. 소스코드를 완성해 나가기 위한 변경 내용을 유지하는 등의 용도로 사용합니다. 변경 내용은 비록 중요하지 않을 수도 있겠지만 여러 사람이 자주 만듭니다. [http://www.nongnu.org/cvs/ CVS], [http://en.gentoo-wiki.com/wiki/Subversion Subversion] [http://mercurial.selenic.com Mercurial], [http://bazaar.canonical.com Bazaar] 등의 유사한 도구들도 있습니다. Git은 중앙 저장소를 필요로 하지 않는다는 의미의 분산 소스 제어 관리 시스템입니다. 그렇지만 Git은 중앙 저장소 작업 흐름선상에 위치할 수 있으며, 종종 그렇게도 사용합니다.&lt;br /&gt;
&lt;br /&gt;
Git은 본래 리눅스 커널의 개발을 관리하기 위해 리누스 토발즈가 개발 했습니다. 비교적 최근에 수많은 대형 프로젝트에 이것을 채택했습니다.&lt;br /&gt;
&lt;br /&gt;
== 설치 ==&lt;br /&gt;
{{Example|코드 예제 2.1: Git 설치하기|&amp;lt;nowiki&amp;gt;$ emerge --ask --verbose dev-vcs/git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
이 명령을 실행하면 클라이언트와 서버를 둘다 설치할 것입니다(만 기본적으로 서버는 비활성화 되어 있습니다).&lt;br /&gt;
&lt;br /&gt;
gitk를 사용하고 싶다면 dev-vcs/git에 대한 USE 플래그에 tk를 활성화해야 합니다.&lt;br /&gt;
&lt;br /&gt;
== 클라이언트 사용하기 ==&lt;br /&gt;
* [http://video.google.com/videoplay?docid=-3999952944619245780 랜덜 슈왈츠의 프리젠테이션]을 보세요.&lt;br /&gt;
* Git은 온라인에도 복제한 많은 양의 맨 페이지로 문서화 했습니다. 맨 페이지로 이동하세요: [http://www.kernel.org/pub/software/scm/git/ docs/].&lt;br /&gt;
* [http://www.kernel.org/pub/software/scm/git/docs/everyday.html 매일의 Git 문서]로 이동하세요 &lt;br /&gt;
&lt;br /&gt;
== 네트워크 서버 설정하기 ==&lt;br /&gt;
읽기 전용 서버로 설정하는 방법입니다.&lt;br /&gt;
&lt;br /&gt;
서버를 설정하기 위한 저장소의 기본 위치는 '''/var/git'''입니다. 여기에 정말 간단한 방법이 있습니다.&lt;br /&gt;
&lt;br /&gt;
=== 서버 설정 파일 ===&lt;br /&gt;
git-daemon 설정 파일을 다음처럼 만듭니다.&lt;br /&gt;
{{Example|코드 예제 4.1: /etc/conf.d/git-daemon|&amp;lt;nowiki&amp;gt;# conf.d file for git-daemon&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# Please check man 1 git-daemon for more information about the options&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# git-daemon accepts. You MUST edit this to include your repositories you wish&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# to serve.&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# Some of the meaningful options are:&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#   --syslog      --- Enables syslog logging&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#   --verbose     --- Enables verbose logging&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#   --export-all  --- Exports all repositories&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#   --port=XXXX   --- Starts in port XXXX instead of 9418&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;GITDAEMON_OPTS=&amp;quot;--syslog --enable=receive-pack --export-all --base-path=/var/git /var/git&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# To run an anonymous git safely, the following user should be able to only&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# read your Git repositories. It should not able able to write to anywhere on&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# your system, esp. not the repositories.&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;GIT_USER=&amp;quot;nobody&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;GIT_GROUP=&amp;quot;nobody&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
이 스크립트가 의미하는 것은&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;내용을 가두어 둘 루트&amp;quot;를 마지막 부분에 /var/git로 지정합니다&lt;br /&gt;
* --export-all 옵션으로 저장소에서 내보내기가 가능하도록 설정합니다. 좀 더 제한을 두고 싶다면 이 옵션을 제거하고 git-daemon-export-ok 파일을 touch 하시기 바랍니다.&lt;br /&gt;
* 모든 요청에 대해 미리 준비한 &amp;quot;내용을 가두어 둘 루트&amp;quot;를 만들어서 가져올 임의의 저장소 &amp;quot;가상 리소스&amp;quot;를 만듭니다.&lt;br /&gt;
* 모든 저장소는 전세계 모든 사람들이 기록할 권한을 가짐을 알아두어야 합니다. 신뢰하는 지역망인 경우에만 --enable=receive-pack 을 조심스럽게 적용하시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
/var/git 디렉터리가 존재하는지 확인합니다 (없으면 git를 시작하지 못합니다). 그렇지 않다면&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 4.2: /var/git 디렉터리 만들기|&amp;lt;nowiki&amp;gt;# mkdir /var/git&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# chown nobody.nobody /var/git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
그 다음 데몬을 시작합니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 4.3: git-daemon 시작하기|&amp;lt;nowiki&amp;gt;# /etc/init.d/git-daemon start&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
어떤 이유 때문에 조금 시간이 걸릴지도 모릅니다. ( '''OK'''대신에 '''!!'''가 뜨면 오류입니다)&lt;br /&gt;
&lt;br /&gt;
=== 저장소 설정하기 ===&lt;br /&gt;
먼저 데몬은 nobody로 실행할 것입니다. 때문에 nobody 사용자로 전환하고 그 다음의 모든 명령을 쉘에서 실행하도록 합니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 5.1: nobody 사용자로 실행하기|&amp;lt;nowiki&amp;gt;$ sudo -u nobody -s&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
먼저 데몬의 루트 디렉터리 안에 프로젝트 디렉터리를 만듭니다 (&amp;quot;내용을 가두어 둘 루트&amp;quot;를 통해서 입니다)&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 5.2: 프로젝트 디렉터리 만들기|&amp;lt;nowiki&amp;gt;$ cd /var/git&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;$ mkdir myproject&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
그 다음 이곳에 모든 파일들을 놓습니다. 이 디렉터리는 clone 할 디렉터리입니다. (중앙 집중형에서 사용하는 용어는 &amp;quot;check out&amp;quot;입니다).&lt;br /&gt;
&lt;br /&gt;
마지막으로 GIT 저장소를 여기에 만들어둡니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 5.3: git 저장소 초기화하기|&amp;lt;nowiki&amp;gt;$ git init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
여러개의 프로젝트가 있다면 위 단계를 따라 각각의 디렉터리를 만듭니다.&lt;br /&gt;
&lt;br /&gt;
사용자가 프로젝트를 가져가려면, 그들에게 다음을 실행하라고 알려줍니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 5.4: 로컬 위치에 저장소 클론하기|&amp;lt;nowiki&amp;gt;$ git clone git://your-server.com/path/to/myproject localdir&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 다중 사용자 Git 서버 ===&lt;br /&gt;
ssh를 사용하여 Git 서버로 밀어넣을때 새 파일에 대한 소유자는 push를 수행하는 사용자와 관련이 있습니다. 이는 다른 사용자가 같은 저장소를 사용하는 것을 허용하지 않습니다. 한가지 해결 방안이 있다면 사용자에 대한 기본 umask를 변경하는 것인데, 이것은 Git 처리 그 이상의 효과를 가져다줍니다.&lt;br /&gt;
&lt;br /&gt;
POSIX 접근 제어 목록을 사용하면 적당한 방법을 달성할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 ext4 파일 시스템의 커널에서 ACL을 활성화 하려면, 다음과 같이 체크합니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 6.1: ext4 파일 시스템에서 PACL 활성화 하기|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 File systems  ---&amp;gt;&lt;br /&gt;
      &amp;lt;*&amp;gt; The Extended 4 (ext4) filesystem&lt;br /&gt;
      [*]   Ext4 extended attributes&lt;br /&gt;
      [*]     Ext4 POSIX Access Control Lists&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
그리고 마운트 옵션에 acl을 추가합니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 6.2: /etc/fstab에서 ext4 마운트 옵션에 acl 추가하기|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/sda3               /               ext4            noatime,acl 0 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
gitusers 그룹을 만듭니다&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 6.3: gitusers 사용자 그룹 만들기|&amp;lt;nowiki&amp;gt;$ groupadd gitusers&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
제각각의 REPOS git 저장소에 대해 다음을 실행합니다&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 6.4: 저장소 소유그룹 gitusers로 설정하기|&amp;lt;nowiki&amp;gt;$ setfacl -R -d -m g:gitusers:rwX &amp;quot;${REPOS}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
위 명령으로 저장소의 모든 파일에 대해 gitusers 그룹에 있는 사용자들에게 읽기/쓰기 권한을 설정할 것입니다.&lt;br /&gt;
&lt;br /&gt;
이제 gitusers의 구성원은 저장소를 push/pull 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
=== 참조 ===&lt;br /&gt;
* [http://en.gentoo-wiki.com/wiki/Gitosis gitosis]&lt;br /&gt;
* [http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way gitosis로 git 저장소 제공하기]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooTrans]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Trans:OpenRCMigration&amp;diff=951</id>
		<title>Trans:OpenRCMigration</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Trans:OpenRCMigration&amp;diff=951"/>
		<updated>2013-03-17T10:27:00Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 카테고리 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Baselayout과 OpenRC 설정 가져오기 안내서 =&lt;br /&gt;
&lt;br /&gt;
== 배경 ==&lt;br /&gt;
=== Baselayout이란 뭔가요? ===&lt;br /&gt;
Baselayout은 /etc/hosts와 같이 모든 시스템에서 기능을 올바르게 동작하기 위해 필요로 하는 기본 파일 모음을 제공합니다. 또한 젠투에서 사용하는 (/etc, /var ,/usr, /home과 같은)파일 시스템 배치를 제공하기도 합니다.&lt;br /&gt;
&lt;br /&gt;
=== OpenRC란 뭔가요? ===&lt;br /&gt;
OpenRC는 시스템에서 제공하는 보통 /sbin/init인 init 기능이 어떤 것이냐에 대해서는 상관 없이 동작하는 의존성 기반 rc 시스템입니다만 /sbin/init을 대체할 수 ''없습니다''. 젠투 리눅스에서 사용하는 기본 init은 {{blue|sys-apps/sysvinit}} 이고, Gentoo/FreeBSD는(이하 젠투프비라고 합니다) {{blue|sys-freebsd/freebsd-sbin}}이 제공하는 FreeBSD init을 사용합니다.&lt;br /&gt;
&lt;br /&gt;
=== 그래서, 왜 설정을 가져와야 하나요? ===&lt;br /&gt;
본래 젠투의 rc 시스템은 baselayout 1에 빌드했고 완전히 bash 스크립트로 작성했습니다. 이는 약간의 제한 요소가 있었습니다. 예를 들어 각각의 시스템 호출들은 시동하는 동안에 접근할 필요가 있고 추가할 C 기반의 콜 아웃이 필요합니다. 이들 각각의 콜 아웃은 점차적으로 rc 시스템을 보기 흉하게 커지도록 정적으로 링크했었습니다.&lt;br /&gt;
&lt;br /&gt;
게다가 젠투프비와 젠투 임베디드 같은 플랫폼으로 젠투를 확장했을 때 Bash 기반 rc 시스템을 요구하는 것은 불가능하게 되었습니다. 이는 C기반으로 작성하였고 POSIX 호환 쉘만을 요구하는 Baselayout 2를 개발하는 요인이 되었습니다. Baselayout 2를 개발하는 동안 젠투용 기반 파일과 파일시스템 배치를 Baselayout이 대부분 제공했다면 더 좋았을 것이라는 판단을 하게 됐고, rc시스템은 패키지 내부에서 깨졌습니다. 그래서 OpenRC를 보유하게 된 것입니다.&lt;br /&gt;
&lt;br /&gt;
OpenRC는 초기에 [http://roy.marples.name/openrc Roy Marples]가 2010년까지 개발했고 지금은 [http://www.gentoo.org/proj/en/base/openrc/ 젠투 OpenRC 프로젝트] 에서 관리하고 있습니다. OpenRC는 현재 다양한 모든 젠투 시스템(젠투 리눅스, 젠투프비, 젠투 임베디드 젠투 V서버)과 FreeBSD와 NetBSD 같은 다른 플랫폼을 지원합니다.&lt;br /&gt;
&lt;br /&gt;
== OpenRC로 설정 가져오기 ==&lt;br /&gt;
OpenRC로 설정을 가져오는 것은 무지 쉽습니다. 꾸러미 관리자에 보통 업그레이드 과정의 일부가 될 것입니다. 실제로 가장 중요한 과정은 {{blue|&amp;lt;nowiki&amp;gt;&amp;gt;=sys-apps/baselayout-2&amp;lt;/nowiki&amp;gt;}}와 {{blue|sys-apps/openrc}} 꾸러미를 설치하고난 다음입니다. 재시동을 하기 전에 {{blue|dispatch-conf}}를 실행하고 /etc가 최신인지를 확인하는 것이 ''매우 중요'' 합니다. {{Bold|{{red|이 과정을 실패하면 시동할 수 없는 시스템이 될 것}} }} 이며, 시스템을 복구하기 위해 젠투 라이브CD를 사용하고 아래의 과정을 수행하는 것이 필요할 것입니다.&lt;br /&gt;
&lt;br /&gt;
=== /etc/conf.d/rc ===&lt;br /&gt;
/etc/conf.d/rc는 이미 오래됐으며 여기에 있는 설정 내용들은/etc/rc.conf에 적당한 설정으로 가져다 놓을 필요가 있을 것입니다. /etc/rc.conf와 /etc/conf.d/rc의 내용을 쭉 살펴보시고 설정 내용을 가져다 놓으시기 바랍니다. 이 과정이 끝나면 /etc/conf.d/rc를 삭제하십시오.&lt;br /&gt;
&lt;br /&gt;
=== 커널 모듈 ===&lt;br /&gt;
보통 시동시 각각의 커널 모듈을 자동으로 불러오고 싶을 경우, 여러분이 불러오고 싶은 모듈에 대한 인자들과 함께 커널 모듈을 /etc/modules.autolod.d/kernel-2.6에 놓을 것입니다. baselayout-2에서는 이 파일을 더 이상 사용하지 않습니다. 대신 자동으로 불러올 모듈과 모듈 인자들은 커널 버전에 상관 없이 /etc/conf.d/modules에 놓입니다.&lt;br /&gt;
&lt;br /&gt;
예전 방식의 설정 파일은 다음과 같을 것입니다.&lt;br /&gt;
{{Example|코드 예제 2.1: /etc/modules.autoload.d/kernel-2.6|&amp;lt;nowiki&amp;gt;ivtv&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;cx88_dvb video_br=2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
위 예제는 바꾼 결과는 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.2: /etc/conf.d/modules|{{red|&amp;lt;nowiki&amp;gt;# 시동시 자동으로 불러올 모듈&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;modules_2_6=&amp;quot;ivtv cx88_dvb&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
{{red|&amp;lt;nowiki&amp;gt;# 모듈 인자&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;module_cx88_dvb_args_2_6=&amp;quot;video_br=2&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
위의 예제에서 2.6 버전의 커널에 대한 모듈과 인자들만이 전달될 것입니다. 새 설정내용에서는 커널 버전에 따라 모듈과 인자를 세밀하게 조절할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
{{Important|{{Bold|module*}} 변수는 누적할 수 없습니다. 좀더 버전에 특화된 변수의 내용이 좀 더 일반적인 변수를 덮어쓸 것입니다.}}&lt;br /&gt;
{{Note|{{Bold|Module}}과 {{Bold|Modules}}의 차이를 숙지하여 주십시오.}}&lt;br /&gt;
&lt;br /&gt;
좀 더 자세한 예제는 다음과 같습니다.&lt;br /&gt;
{{Example|코드 예제 2.3: /etc/conf.d/modules의 자세한 예제|{{red|&amp;lt;nowiki&amp;gt;# 2.6.23-gentoo-r5에 대한 ivtv만 불러옵니다&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;modules_2_6_23_gentoo_r5=&amp;quot;ivtv&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
{{red|&amp;lt;nowiki&amp;gt;# (-gentoo-r5 말고) 2.6.23 커널에 대한 cx88_dvb만을 불러옵니다&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;modules_2_6_23=&amp;quot;cx88_dvb&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
{{red|&amp;lt;nowiki&amp;gt;# 2.6.x대 버전의 커널에서 x가 23이 아닌 경우 tun과 usbserial만을 불러옵니다&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;modules_2_6=&amp;quot;tun usbserial&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
{{red|&amp;lt;nowiki&amp;gt;# 이 외의 경우에 ochi1394와 ieee1394를 불러옵니다.&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;modules=&amp;quot;ohci1394 ieee1394&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
{{red|&amp;lt;nowiki&amp;gt;# 2.6.23-gentoo-r5에 대해 pass video_br=2 인자 값을 cx88_dvb에 전달합니다&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;module_cx88_dvb_args_2_6_23_gentoo_r5=&amp;quot;video_br=2&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
{{red|&amp;lt;nowiki&amp;gt;# 2.6.x 버전대 커널에 대해 vendor와 product 인자를 전달합니다&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;module_usbserial_args_2_6=&amp;quot;vendor=0x1410 product=0x2110&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
{{red|&amp;lt;nowiki&amp;gt;# ieee1394에 debug라는 값을 전달합니다&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;module_ieee1394_args=&amp;quot;debug&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 런레벨 시동 ===&lt;br /&gt;
{{blue|boot}} 런레벨은 모든 장치에 대해 중요한 여러단계를 수행합니다. 예를 들어 루트 파일 시스템을 읽기/쓰기로 마운트 했는지 확인하고, 이 파일시스템의 오류를 검사하며, 마운트 지점을 사용할 수 있는지 확인하고, /proc 가상 파일시스템을 시동시 시작합니다.&lt;br /&gt;
&lt;br /&gt;
OpenRC에서는 여러분의 블록 저장장치 에 대한 볼륨 관리 서비스를 더이상 시동시 자동으로 실행하지 않습니다. lvm, raid, swap, device-mapper(dm), dm-crypt와 같은 것들이 여기에 포함됩니다.이들 서비스에 대한 적당한 초기화 스크립트가 {{blue|boot}} 런레벨에 있는지 반드시 확인해야 하며, 그렇지 않으면 시스템을 시동할 수 없을 것입니다!&lt;br /&gt;
&lt;br /&gt;
OpenRC ebuild는 이 설정 내용 가져오기를 시도해볼 것이며 여러분은 모든 볼륨 관리 서비스에 대한 설정이 제대로 옮겨졌는지 검증해야 합니다.&lt;br /&gt;
{{Example|코드 예제 2.4: boot 런레벨에 있는 모든 서비스 표시하기|&amp;lt;nowiki&amp;gt;# ls -l /etc/runlevels/boot/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
root, procfs, mtab, swap, fsck가 위 목록에 보이지 않는다면 이들을 {{blue|boot}} 런레벨에 추가하기 위해 다음 명령을 수행합니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.5: boot 런레벨에 중요한 서비스 추가하기|&amp;lt;nowiki&amp;gt;# rc-update add root boot&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# rc-update add procfs boot&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# rc-update add mtab boot&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# rc-update add fsck boot&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# rc-update add swap boot&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
mdraid와 lvm을 사용하는 것을 알고 있고 위 목록에서 보지 못했다면, 초기화 스크립트를 {{blue|boot}} 런레벨에 추가하기 위해 다음 명령을 수행해야 합니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.6: boot 런레벨에 mdraid와 lvm 추가하기|&amp;lt;nowiki&amp;gt;# rc-update add mdraid boot&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# rc-update add lvm boot&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Udev ===&lt;br /&gt;
OpenRC는 더이상 기본적으로 {{blue|udev}}를 시작하지 않지만 {{blue|sysinit}} 런레벨에서 시작하도록 나타내야 합니다. OpenRC ebuild는 {{blue|udev}}를 이미 활성화 했고 {{blue|sysinit}} 런레벨로 추가했는지 감지할 것입니다. 그러나 안전을 위해 {{blue|udev}}가 있는지 확인해보십시오&lt;br /&gt;
{{Example|코드 예제 2.7: udev 확인하기|&amp;lt;nowiki&amp;gt;# ls -l /etc/runlevels/sysinit&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;lrwxrwxrwx 1 root root 14 2009-01-29 08:00 /etc/runlevels/sysinit/udev -&amp;gt; /etc/init.d/udev&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{blue|udev}}가 안보이면 올바른 런레벨에 추가합니다.&lt;br /&gt;
{{Example|코드 예제 2.8: udev를 sysinit 런레벨에 추가하기|&amp;lt;nowiki&amp;gt;# rc-update add udev sysinit&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 네트워크 ===&lt;br /&gt;
서로 다른 baselayout과 OpenRC 패키지로 쪼개진 이유 때문에 net.eth0 초기화 스크립트는 업그레이드 과정에서 없어질 것입니다. 이 초기화 스크립드를 바꾸고 기본 런레벨에 추가하려면 다음 명령을 수행해 주십시오:&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.7: 빠진 net.eth0 스크립트를 다시 추가하기|&amp;lt;nowiki&amp;gt;# cd /etc/init.d&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# ln -s net.lo net.eth0&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# rc-update add net.eth0 default&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
다른 네트워크 초기화 스크립트가 빠져있다면 다시 추가하기 위해 위 방법을 따라하도록 합니다. {{blue|eth0}}를 여러분의 네트워크 장치로 간단하게 바꿉니다.&lt;br /&gt;
&lt;br /&gt;
또한 /etc/conf.d/net (이전 네트워크) 는 설정 내용에 배시 방식의 배열을 더이상 사용하지 않습니다. 설정 방법을 보려면 /usr/share/doc/openrc-&amp;lt;버전&amp;gt;/net.example 을 검토하여 주시기 바랍니다. 배열의 여러 항목에 대해 줄바꿈 문자를 넣어 설정을 바꾸는건 비교적 쉬울 텐데, 예를 들어 정적 IP 할당은 다음처럼 바꿉니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.10: 이전 /etc/conf.d/net 방식|&amp;lt;nowiki&amp;gt;config_eth0=( &amp;quot;192.168.1.37 netmask 255.255.255.0 brd 192.168.1.255&amp;quot; )&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;routes_eth0=( &amp;quot;default via 192.168.1.100&amp;quot; &amp;quot;10.0.0.0/8 via 192.168.1.2&amp;quot; )&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.11: 새로운 /etc/conf.d/net 방식|&amp;lt;nowiki&amp;gt;config_eth0=&amp;quot;192.168.1.37 netmask 255.255.255.0 brd 192.168.1.255&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;routes_eth0=&amp;quot;default via 192.168.1.100 &amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;10.0.0.0/8 via 192.168.1.2&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 시계 ===&lt;br /&gt;
시계 설정 파일은 설정을 위해 /etc/conf.d/clock에서 시스템 자체 도구로 이름이 바뀌었습니다. 이는 리눅스에서는 /etc/conf.d/hwclock으로 바뀔 것이며 FreeBSD에서는 /etc/conf.d/adjkerntz로 바뀔 것임을 의미합니다. 실시간 시계(RTC) 칩이 동작하지 않는 시스템이라면 시스템을 종료할 때 만들어지는 파일의 mtime을 기반으로 하여 시스템 시간을 설정하는 /etc/init.d/sqclock을 사용해야 합니다. /etc/init.d의 초기화 스크립트는 이에 따라 이름을 바꾸었으니, 여러분의 시스템에 대해 boot 런레벨에 이미 적당한 스크립트를 추가했는지 확인하십시오.&lt;br /&gt;
&lt;br /&gt;
게다가 {{blue|TIMEZONE}} 변수는 더이상 이 파일에 없습니다. 이 내용은 대신 /etc/timezone 파일에서 찾을 수 있습니다. 만약 이 파일이 없다면, 물론 시간대 설정에 따라 이 파일을 만들어야 합니다. 이들 파일이 올바른지 검토하여 주시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
이 파일에 대한 적당한 값은 /usr/share/timeinfo에 있는 여러분의 시간대와 관련된 경로입니다. 예를 들어 아메리카 합중국 동부 해안에 거주하고 있다면 다음 값이 올바른 설정이 될 것입니다.&lt;br /&gt;
{{Example|코드 예제 2.12: /etc/timezone|&amp;lt;nowiki&amp;gt;America/New_York&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== XSESSION ===&lt;br /&gt;
XSESSION 변수는 /etc/rc.conf에 더이상 없습니다. 대신 각 사용자에 대해, 사용자의 각 디렉터리에 있는 ~/.bashrc (또는 이와 같은) 파일을, 또는 시스템 전체에 대해 /etc/env.d/ 에서 XSESSION 변수를 설정할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
전체 시스템에 대해 XSESSION 변수를 설정하는 예제는 다음과 같습니다.&lt;br /&gt;
{{Example|코드 예제 2.13: 시스템 영역의 XSESSION 변수 설정하기|# echo '&amp;lt;nowiki&amp;gt;XSESSION=&amp;quot;Xfce4&amp;quot;&amp;lt;/nowiki&amp;gt;' &amp;amp;gt;&amp;lt;nowiki&amp;gt;/etc/env.d/90xsession&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Important|/etc/env.d 에 파일을 만든 다음에 설정 내용을 적용하려면 반드시 {{blue|env-update}} 를 실행해야 하고, 로그아웃 한 다음 다시 로그인해야 합니다. 만약 ~/.bashrc에 변수를 설정했다면 {{blue|source ~/.bashrc}}로 변수 원본을 다시 지정할 수 있습니다.}}&lt;br /&gt;
&lt;br /&gt;
=== EDITOR와 PAGER ===&lt;br /&gt;
EDITOR 변수는 /etc/rc.conf에 더이상 없습니다. EDITOR와 PAGER 환경변수들은 기본적으로 /etc/profile에 설정되어 있습니다. 여러분 각자가 필요하다면 ~/.bashrc (또는 이와 같은) 파일에 필요한대로 설정을 해주시고 시스템 기본값을 설정하시려면 /etc/env.d/99editor파일을 만들고 여기에 설정해주십시오.&lt;br /&gt;
&lt;br /&gt;
{{Important|/etc/env.d 에 파일을 만든 다음에 설정 내용을 적용하려면 반드시 {{blue|env-update}} 를 실행해야 하고, 로그아웃 한 다음 다시 로그인해야 합니다. 만약 ~/.bashrc에 변수를 설정했다면 {{blue|source ~/.bashrc}}로 변수 원본을 다시 지정할 수 있습니다.}}&lt;br /&gt;
&lt;br /&gt;
=== 시동 로그 ===&lt;br /&gt;
예전에는 {{blue|app-admin/showconsole}}을 사용해서 시동과정을 기록할 수 있었습니다. 그러나 이제 OpenRC는 내부적으로 모든 로그를 다루기 때문에, 배포중인 {{blue|showconsole}}을 더이상 뜯어보지 않아도 됩니다. 이제 안전하게 {{blue|showconsole}}을 제거할 수 있습니다. 시동 메시지 기록을 계속하려면 /etc/rc.conf에 적당한 변수를 설정합니다. 로그 내용은 /var/log/rc.log에 나타날 것입니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.14: /etc/rc.conf에서 시동 기록 활성화하기|&amp;lt;nowiki&amp;gt;rc_logger=&amp;quot;YES&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== local.start와 local.stop ===&lt;br /&gt;
OpenRC에서 /etc/conf.d/local.start와 local.stop은 오래된 존재입니다. OpenRC로 설정 내용을 가져오는 동안에 이 파일들은 /etc/local.d로 옮겨지며 여기에 .start나 .stop이 붙습니다. 그러면 OpenRC가 이들을 알파벳 순서대로 실행할 것입니다.&lt;br /&gt;
&lt;br /&gt;
=== 시스템 하위유형: 가상화 특수 요건 ===&lt;br /&gt;
이전 OpenRC 버전에서는 다양한 형식의 가상화를 감지했고 각각의 초기화 스크립트를 건너뛰었을 때 감지한 요소들을 기록하기 위해 '''Depend'''함수의 '''keyword'''호출을 통해 사용하였습니다.&lt;br /&gt;
&lt;br /&gt;
그러나 0.7.0 릴리즈때에는 /etc/rc.conf의 '''rc_sys''' 변수를 사용하여 하위 형식을 분명하게 설정해주어야 합니다. 하위형식은 루트가 있는 가상화 환경에 일치하도록 설정해야 합니다. 일반적으로 비어있지 않은 '''rc_sys''' 값은 가상 컨테이너에 있을 것입니다. 호스트 노드는 &amp;lt;nowiki&amp;gt;'''rc_sys=&amp;quot;&amp;quot;'''&amp;lt;/nowiki&amp;gt; 설정을 가질 것입니다.&lt;br /&gt;
&lt;br /&gt;
{{Important|정해진 하위유형이 없으면 빈문자열을 기본값으로 사용해주시기 바랍니다. 이 변수를 지정하지 않으면 경고를 받을 것이고 이전 감지 알고리즘을 사용하려 할 것입니다.}}&lt;br /&gt;
{{Note|자동감지를 수행할 때 시스템에서 무슨 값을 사용하는지 모른다면 '''rc_sys'''변수를 임시로 주석처리하고 감지 명령인 rc -S를 사용해보아야 합니다.}}&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.15: /etc/rc.conf에 시스템 하위 유형을 없음으로 설정하기|&amp;lt;nowiki&amp;gt;rc_sys=&amp;quot;&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
감지 알고리즘은 하위 시스템 유형의 도입과 우선 순위 감지를 신뢰할 수 없게 만드는 커널을 바꾸기 위해 수동 설정으로 바꾸어야 합니다.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; bgcolor=&amp;quot;#8866ff&amp;quot;|'''&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;하위유형&amp;lt;/font&amp;gt;'''&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; bgcolor=&amp;quot;#8866ff&amp;quot;|'''&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;설명&amp;lt;/font&amp;gt;'''&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; bgcolor=&amp;quot;#8866ff&amp;quot;|'''&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;참고&amp;lt;/font&amp;gt;'''&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; | &amp;amp;nbsp;&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''기본, 하위유형 없음'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''설정하지 않은것과 같습니다. FreeBSD, Linux, NetBSD'''&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''jail'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''FreeBSD jails'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''lxc'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''리눅스 컨테이너'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''자동감지 못함'''&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''openvz'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''리눅스 OpenVZ'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''prefix'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''Prefix'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''자동감지 못함, FreeBSD, Linux, NetBSD'''&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''vserver'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''리눅스 V서버'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''xen0'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''Xen0 도메인'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''리눅스, FreeBSD'''&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''xenU'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''XenU 도메인'''&lt;br /&gt;
| bgcolor=&amp;quot;#ccccff&amp;quot; |'''리눅스, FreeBSD'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 오래된 설정 파일 지우기 ===&lt;br /&gt;
설정 파일을 옮기고 나면 포티지가 지우지 못한 파일들이 파일 시스템에 남아있을 것입니다. 이것들은 포티지 설정 파일 보호 기능으로 인해 보존된 설정 파일들입니다.&lt;br /&gt;
&lt;br /&gt;
가장 자세한 예제는  /usr/share/doc/openrc-*/net.example.bz2로 대체할 수 있는 /etc/conf.d/net.exmaple이 될 것입니다.&lt;br /&gt;
&lt;br /&gt;
=== 끝내기 ===&lt;br /&gt;
설정 파일과 초기화 스크립트의 갱신이 끝나면 마지막으로 남은 일은 '''재시동'''하는 것입니다. 시스템 상태 정보는 업그레이드 하는 동안 보존되는 것이 아니기 때문에 필요하며 새로 시동하여 시스템 상태 정보를 제공할 필요가 있습니다.&lt;br /&gt;
&lt;br /&gt;
== 바뀐 기능 ==&lt;br /&gt;
=== 일시정지 동작 ===&lt;br /&gt;
이전에는 {{blue|&amp;lt;nowiki&amp;gt;/etc/init.d/service pause&amp;lt;/nowiki&amp;gt;}}명령을 사용하여 모든 관련된 설정들에 지시하지 않고 서비스를 임시로 멈출 수 있었습니다만 OpenRC에서는 {{blue|pause}} 동작을 없앴습니다. 이 기능은 이전 baselayout에서도 동작하는 {{blue|&amp;lt;nowiki&amp;gt;/etc/init.d/service --nodeps stop&amp;lt;/nowiki&amp;gt;}} 명령으로 지원합니다.&lt;br /&gt;
&lt;br /&gt;
=== /etc/mtab의 rootfs 항목 ===&lt;br /&gt;
이전에는 초기에 /etc/mtab에서 '''rootfs''' 항목을 지우고 / 항목만 남겨두었습니다. 복제된 rootfs 항목은 실제로 시스템을 종료하는 도중에 다시 추가됩니다. OpenRC에서는  initramfs와 시동시의 tmpfs를 완벽히 지원하기 위해 '''rootfs'''와 / 항목 둘 다 있어야 합니다. 이는 시스템을 종료하는 동안에 더 적은 양의 기록이 필요하다는 의미입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooTrans]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Trans:Plymouth&amp;diff=950</id>
		<title>Trans:Plymouth</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Trans:Plymouth&amp;diff=950"/>
		<updated>2013-03-17T10:26:42Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 카테고리 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 개요 ==&lt;br /&gt;
=== Plymouth는 무엇인가요? ===&lt;br /&gt;
''Plymouth는 백그라운드에서 부트 과정을 진행하는 동안 그래픽 부팅 애니메이션을 보여주며 부트 과정 훨씬 이전에 실행하는 프로그램입니다 (심지어는 루트 파일시스템이 마운트 되기 훨씬 이전입니다!) 시스템에서 DRM 모드 설정 드라이버와 함께 동작하도록 설계했습니다. 컴퓨터에 일반 모드로 설정한 상태의 부트 과정이전에 대해, Plymouth를 사용하는 것을 생각해냈고, 전체 부트 과정에서 이 상태를 유지하며, 부트 과정이 끝나면 X를 시작하도록 하는 것입니다. 이상적인 목표는 시동하는 동안 화면의 모든 깜빡거림을 없애는 것입니다.''&lt;br /&gt;
-- Plymouth 개발자&lt;br /&gt;
&lt;br /&gt;
=== 젠투에서의 개발 상황 ===&lt;br /&gt;
intel, ATI Radeon, Nouveau(nVidia) DRM 드라이버를 지원하는 상태에서 x86과 amd64에서의 시험을 끝냈습니다. Plymouth 는 사용자 영역 VESA VGA ('''uvesafb''') 와도 사용할 수 있지만 상당히 효율적이지 못합니다. '''uvesafb'''를 사용하면 화면 깜빡임을 보시게 될 것입니다.&lt;br /&gt;
&lt;br /&gt;
Plymouth는 OpenRC 플러그인을 지원합니다. /run 디렉터리를 필요로 합니다. 나중에 이 디렉터리는 '''baselayout''' 패키지가 만들 것입니다. Plymouth는 아직 젠투 init 시스템에 완전히 통합하지 않았습니다. 부팅 시간의 일부 입력에 대한 특별한 조정을 끝낼 필요가 있(고 곧 끝낼 것입니)다.&lt;br /&gt;
&lt;br /&gt;
아마 일부 문제가 있을 수도 있습니다. 알려진 문제편을 보세요.&lt;br /&gt;
&lt;br /&gt;
'''baselayout-1'''은 더 이상 지원하지 않습니다.&lt;br /&gt;
&lt;br /&gt;
== 설치 ==&lt;br /&gt;
=== 준비 ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;sys-kernel-dracut&amp;lt;/font&amp;gt;에 대해 &amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;/etc/make.conf 에&amp;lt;/font&amp;gt; '''plymouth''' 모듈을 활성화 할 필요가 있습니다&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2-1 : DRACUT_MODULES 설정|&amp;lt;nowiki&amp;gt;DRACUT_MODULES=&amp;quot;plymouth&amp;quot;&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
일반 설치를 수행한다면 이렇게 해주어야 합니다. 그렇지 않으면 추가적인 모듈의 활성을 고려해야 합니다. (자세한 내용은 &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;equery uses sys-kernel/dracut&amp;lt;/font&amp;gt;을 참조하세요).&lt;br /&gt;
특정 DRM 드라이버를 지원하게 하려면 '''VIDEO_CARDS'''에서 활성화 하는 것을 필요로 합니다. '''intel''','''nouveau''','''radeon''' 중에 적당한것이 여러분의 시스템에 없다면 '''uvesafb'''를 최후의 수단으로 넣어봅니다. 이 최후의 수단은 USE 플래그 설정과 관계없이 지원합니다.&lt;br /&gt;
0.9버전 이전의 스냅샷 ebuild는 intel, Nouveau, VMWare gfx (ATI Radeon 지원 안함)의 추상 라이브러리인 libkms를 지원합니다. 때문에 여러분의 카드를 이 드라이버가 지원한다면 VIDEO_CARDS의 요소중 하나를 활성화 하는 대신에 libkms 플래그를 활성화 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
=== 설치 ===&lt;br /&gt;
이제 emerge 해봅니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2-2 : plymouth 설치|&amp;lt;nowiki&amp;gt; # emerge plymouth&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;sys-boot/plymouth&amp;lt;/font&amp;gt;와 plymouth 모듈을 활성화 한 &amp;lt;font color=&amp;quot;#007700&amp;quot;&amp;gt;sys-kernel/dracut&amp;lt;/font&amp;gt;는 상호 의존상태가 되기 때문에, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;emerge dracut&amp;lt;/font&amp;gt;을 실행하면, '''plymouth'''도 따라올 것입니다.&lt;br /&gt;
&lt;br /&gt;
=== 설정 ===&lt;br /&gt;
제일 먼저 OpenRC의 인터렉티브 모드를 완전히 비활성화 할 필요가 있습니다 (그 이유는 알려진 문제편에 있습니다).&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2-3 : /etc/rc.conf 편집|&amp;lt;nowiki&amp;gt;rc_interactive=&amp;quot;NO&amp;quot;&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
이제 실제 Plymouth 설정에 들어갑니다. 사용할 수 있는 테마를 나열하고 그 중 하나를 선택 (예: solar) 하려면 다음 명령을 실행합니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2-4 : plymouth 테마 나열|&amp;lt;nowiki&amp;gt; # plymouth-set-default-theme --list&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2-5 : solar 테마 선택|&amp;lt;nowiki&amp;gt; # plymouth-set-default-theme solar&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== initramfs를 만들고 부트로더 설정하기 ===&lt;br /&gt;
{{Note|이 부분중 grub.conf의 kernel 줄에 quiet splash 를 더 채워주는 것 이외에는 다른 설정은 의미가 없습니다}}&lt;br /&gt;
&lt;br /&gt;
현재 실행중인 커널에 대해 initramfs를 만들려면 다음 명령을 실행합니다&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2-6 : initramfs 만들기|&amp;lt;nowiki&amp;gt; # mount /boot (필요하다면)&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt; # dracut -H&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
'''dracut-009''' 이상을 기본으로 가지고 있다면 다음 줄이 다른 줄들 사이에 출력될 것입니다.&lt;br /&gt;
{{Example|코드 예제 2-7 : dracut 출력|&amp;lt;nowiki&amp;gt; I: *** Including module: plymouth ***&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
initramfs는 /boot/initramfs-$KV 경로에 만들어져야 하며, 여기서 $KV는 현재 사용하고 있는 커널 버전 ('''uname -r''') 입니다.&lt;br /&gt;
&lt;br /&gt;
{{Note|테마를 변경하거나 plymouth를 업데이트 할 때마다 initramfs를 다시 만들어야 할 필요가 있습니다}}&lt;br /&gt;
&lt;br /&gt;
마지막 과정은 부트로더 설정입니다. 예를 들기 위해 GNU GRUB에서 설정해보았습니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2-8 : /boot/grub/menu.lst 편집|&amp;lt;nowiki&amp;gt;title Gentoo Linux 2.6.38-gentoo-r1&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;kernel /boot/vmlinuz-2.6.38-gentoo-r1 root=/dev/sda1 video=radeon:1280x1024 quiet splash&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;initrd /boot/initramfs-2.6.38-gentoo-r1.img&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
확실히 말해서, 시스템 설정에 이 부분을 조정할 필요가 있습니다. KMS를 모듈로 빌드 했다면, &amp;lt;font color=&amp;quot;#aaaa00&amp;quot;&amp;gt;your-driver&amp;lt;/font&amp;gt;&amp;lt;b&amp;gt;.&amp;lt;/b&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;modeset=1&amp;lt;/font&amp;gt;을 커널 명령줄에 추가할 필요가 있습니다.&lt;br /&gt;
&lt;br /&gt;
이제 재부팅할 준비가 되었고 움직이는 부팅 화면을 감상하실 차례입니다. :)&lt;br /&gt;
&lt;br /&gt;
== 추가적 참고 ==&lt;br /&gt;
=== 알려진 문제 ===&lt;br /&gt;
다음의 모든 문제들은 Plymouth가 OpenRC에 최종적으로 통합할 때 해결될 것입니다.&lt;br /&gt;
* Plymouth가 tty1를 통해 제어권을 넘겨 받기 때문에 문제가 꼬입니다. 하지만 0.8.3-r3 이후로는 이 문제가 더 이상 발생하지 않을 것입니다.&lt;br /&gt;
** 줄 바꿈이 꼬이는 문제가 있습니다.&lt;br /&gt;
** tty1에 입력한 암호가 숨겨지지 않는 문제가 있습니다. 로그인을 하려면 다른 '''tty'''로 전환합니다.&lt;br /&gt;
&lt;br /&gt;
* Plymouth가 OpenRC의 인터랙티브 모드를 켭니다. 이걸 비활성화 하려면 /etc/rc.conf에 설정 내용을 완전히 박아두어야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooTrans]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.gentoo-kr.org/index.php?title=Trans:EbuildHowTo&amp;diff=949</id>
		<title>Trans:EbuildHowTo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gentoo-kr.org/index.php?title=Trans:EbuildHowTo&amp;diff=949"/>
		<updated>2013-03-17T10:26:27Z</updated>

		<summary type="html">&lt;p&gt;Onionmixer: 카테고리 추가&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* 원문 : [http://www.gentoo.org/proj/en/devrel/handbook/handbook.xml?part=2&amp;amp;chap=1  Gentoo Linux Installation - Ebuild HOWTO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ebuild HOWTO ==&lt;br /&gt;
=== 포티지 트리 ===&lt;br /&gt;
==== 개요 ====&lt;br /&gt;
포티지 트리는 보통 &amp;lt;nowiki&amp;gt;/usr/portage&amp;lt;/nowiki&amp;gt; 디렉터리 에서 찾을 수 있으며, 각각의 패키지 디렉터리가 딸려오는 카테고리 디렉터리 들이 포함되어 계층적 구조로 이루어져 있습니다. 예를 들어, /usr/portage/sys-apps/util-linux 디렉터리에서 util-linux-2.11y.ebuild 파일을 찾을 수 있습니다. 이 디렉터리에서는 또한 util-linux-2.11y.ebuild 파일과 함께 다른 버전의 ''util-linux''에 대한 ebuild가 있을 것입니다. 이는 포티지 오버레이를 설치하지 않는 한, (버전과 상관 없이) 제각각의 패키지에 대한 모든 ebuild 가 /usr/portage에서 mycat/mypkg를 공유하기 때문입니다.&lt;br /&gt;
&lt;br /&gt;
==== CVS에서 포티지 트리 체크아웃 하기 ====&lt;br /&gt;
CVS 시스템에 익숙하지 않다면 [http://www.gentoo.org/doc/en/cvs-tutorial.xml CVS 따라하기]를 보시기 바랍니다.&lt;br /&gt;
포티지 트리는 젠투 리눅스 트리의 '''gentoo-x86''' 모듈에서 찾을 수 있습니다. (대략 350 메가 바이트 정도 되는) 모듈을 체크아웃 하려면 먼저 안내서에 따라 CVS를 설정한 다음에 '''gentoo-x86''' 모듈을 체크아웃 합니다. &lt;br /&gt;
&lt;br /&gt;
==== 포티지 트리에 놓을 (놓지 말아야 할) 것 ====&lt;br /&gt;
새 ebuild를 작성하기 전에 패키지에 대한 ebuild가 이미 작성되었지만 아직 포티지 트리에 추가가 되었는지 안되었는지를 [http://bugs.gentoo.org bugs.gentoo.org]에서 확인합니다. [http://bugs.gentoo.org bugs.gentoo.org]로 이동하여 쿼리를 선택하고 Advanced Search를 선택한 다음, pruduct에는 Gentoo Linux를, component에는 ebuilds를 선택합니다. 검색 필드에는 ebuild의 이름을 입력하고 status에서는 NEW, ASSIGNED, REOPENED 그리고 RESOLVED (RESOLVED가 중요합니다) 를 선택한 다음 쿼리를 보냅니다. 게으른 분들을 위해 [http://bugs.gentoo.org/query.cgi?product=Gentoo%20Linux&amp;amp;component=Ebuilds&amp;amp;bug_status=UNCONFIRMED&amp;amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;amp;bug_status=RESOLVED 링크를 준비했습니다].&lt;br /&gt;
&lt;br /&gt;
일반적으로, 포티지 트리는 패치는 예제 설정 파일들과 같은 상대적으로 작은 부록 &amp;gt;파일들과 함께 .ebuild 파일을 저장하는 용도로만 사용하는 것이 좋습니다. 이런 파일&lt;br /&gt;
들은 mycat/mypkg 디렉터리가 포화되지 않도록 /usr/portage/mycat/mypkg/files 디렉&amp;gt;터리에 저장됩니다. 이 규칙의 예외는 젠투 미러에 위치하여 수많은 양의 대역폭과 하드디스크 용량을 낭비하지 않도록 해야 할 큰 패치 파일 ( 20KB를 넘는 패치를 위해 권장합니다 ) 에 적용됩니다. 또한 (ASCII가 아닌) 바이너리 파일을 포티지 CVS트리에 넣지 말아야 합니다. 만약 예를 들어 다른 CVS 트리에서 이렇게 할 필요가 있다면, 이유 여하를 막론하고 작은 PNG 그림 파일을 추가할 필요가 있다면 다음과 같이 '''-kb''' 옵션을 사용하여 CVS에 추가하도록 합니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 1-1: CVS에 바이너리 파일 추가하기|# cvs add -kb myphoto.png}}&lt;br /&gt;
&lt;br /&gt;
'''-kb''' 옵션은 CVS에게 myphoto.png가 바이너리 파일이고 특별하기 다루어져야 한다는 것을 알려줍니다. 예를 들어 이 파일에 대해 제각기 다른 두개의 버전간의 차이를 명백한 이유로 병합하도록 하지 못하게 하여야 할 것입니다. 또한 변경사항의 병합에 대해 말하자면, 포티지에 추가한 어떤 패치도 일반적으로 압축되지 않게 하는것이 좋습니다. 이렇게 하면 CVS가 변경사항을 병합하게 하고 개발자에게 충돌 내용을 정확하게 알려줍니다. &lt;br /&gt;
&lt;br /&gt;
커밋할 패키지는 안정버전으로 커밋되었을때 최종 사용자를 위해 반드시 제대로 준비가 되어야 한다는 것을 잊지 마셔야 합니다. 대부분의 시스템과 여러분의 패키지를 사용할 사용자들을 만족시킬 기본 설정이 갖춰졌는지 확인 바랍니다. 만약 패키지가 깨&amp;gt;졌고, 어떻게 동작하게 할 수 있을지 잘 모르겠다면, 패키지 자체버전을 완성한 다른 배포본을 확인합니다. 예제를 보기위해 [http://cvs.mandriva.com/cgi-bin/viewvc.cgi/SPECS/ 맨드리바] 나 [http://www.debian.org/distrib/packages 데비안] 혹은 [http://cvs.fedora.redhat.com/ 페도라]를 확인해 볼 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
==== CVS 커밋 정책 ====&lt;br /&gt;
* 커밋 하기 전에 '''repoman scan'''을 항상 실행합니다.&lt;br /&gt;
* 커밋 하기 전에 '''repoman full'''을 실행해 주시기 바랍니다.&lt;br /&gt;
* 커밋 하기 전에 '''emerge --pretend mypkg'''를 실행하여 package.mask가 완전한지 시험하고 어떤 충돌 사항이 포함되지 않도록 점검합니다.&lt;br /&gt;
* 커밋 하기 전에 ChangeLog를 항상 갱신합니다. &lt;br /&gt;
* package.mask를 커밋하는 동안 충돌이 발생하는 경우, 갱신된 패키지를 올리기 전에 갱신된 package.mask를 항상 커밋합니다.&lt;br /&gt;
* 항상 요소별로 커밋합니다. 새로운 라이선스로 패키지를 커밋하거나 패키지가 가려졌을 때 최신 package.mask나 혹은 라이선스를 먼저 커밋한 다음 사용자의 설치가 깨지는 것을 막기 위해 ebuild, ChangeLog, 패치들 그리고 metadata.xml을 한꺼번에 커밋합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== files 디렉터리 ====  &lt;br /&gt;
앞서 참고한 바와 같이 각각의 패키지에 포함된 하위 디렉터리로서 files/ 디렉터리가 있습니다. 여러분의 패키지에 있는 어떤 패치나 설정 파일 혹은 기타 보조 파일들이 이 디렉터리에 추가될 필요가 있을 것이며, 20KB 그 이상을 넘는 어떤 파일의 경우는 우리 사용자들이 다운 받을 (불필요한) 많은 파일들을 줄이기 위해 미러에 넣는 것이 좋습니다. mypkg-1.0-gentoo.diff나 혹은 좀 더 간단하게 1.0-gentoo.diff와 같이 패키지를 빌드하기 위해 버전과 관련된 이름으로 여러분 자신이 만든 패치에 이름을 붙이고 싶을지도 모릅니다. 또 참고하셔야 할 것은 젠투 익스텐션은 사용자들에게 이 패치가 메일링 리스트나 다른 어떤 곳에서 가져온 것이 아니라, 젠투 리눅스 개발자들이 만들었다는 것을 알려준다는 것입니다. 다시 한번 말하지만, CVS가 바이너리 파일에 대해 제대로 동작하지 않기 때문에 패치들을 압축해선 안 됩니다.&lt;br /&gt;
&lt;br /&gt;
files/ 디렉터리에 넣을 모든 파일이름에 접두하거나 (mypkg-1.0 처럼)접미하는 것을 고려하여, ebuild의 제각각의 버전에서 사용하는 파일들이 다른 것들과 구별될 수 있&lt;br /&gt;
도록 하여 리비전들간의 변경 차이점이 보이도록 합니다. 이러한 방법이 보통 정말 좋은 방법입니다 :). 패치 이름에 좀 더 많은 의미를 부여하려 다른 접미어를 사용하고 싶으실 수도 있습니다.&lt;br /&gt;
&lt;br /&gt;
files/ 디렉터리로 갈 파일이 많다면, files/1.0/ 과 같은 하위 디렉터리를 만들고 적당한 하위 디렉터리에 관련 파일들을 넣는 것을 고려해 보도록 합니다. 만약 이 방법대로 한다면, 종종 더 편한 방법으로 활용되는 파일들의 이름에 버전 정보를 넣을 필요가 없습니다.&lt;br /&gt;
&lt;br /&gt;
=== Ebuild 스크립트 ===&lt;br /&gt;
==== 개요 ====&lt;br /&gt;
Ebuild 스크립트는 전체 포티지 시스템의 기반입니다. 어떤 추가적인 설치/제거 혹은 설정의 이전 이후 과정에서 어떻게 수행할 것인지와 같은, 다운로드하고 패키지를 풀고 소스 모음을 설치하는 일련의 정보들을 지니고 있습니다. 포티지의 대부분은 파이선으로 작성되었으며, 배시를 사용하여 명령줄에서 우리가 수행하게 될 명령을 호출할 수 있도록 하기 위해 ebuild 스크립트는 배시 스크립트로 작성되었습니다. ebuild 스크립트의 이면에 있어 중요한 설계 원칙 중 하나는, 패키지를 직접 설치하려 명령줄 상에서 직졉 입력할 명령들을 보유한다는 것입니다. 이 목적을 위해 배시 문법을 사용하는 방법이 가장 좋습니다.&lt;br /&gt;
&lt;br /&gt;
Ebuild 스크립트는 '''ebuild'''와 '''emerge''' 명령에 의해 번역됩니다. '''ebuild''' 명령에 대한 개념은 저수준 빌드 도구 입니다. 이를 통해 단일 ebuild를 빌드하고 설치하지만, 그 이상의 역할은 하지 않습니다. 이를 통해 또한 의존성이 만족하는지 확인하겠지만, 이들 문제를 자동으로 풀려 시도하지는 않을 것입니다. 반면에 emerge 는 고수준의 ebuild 엔진이며, 필요에 따라 의존성을 자동으로 병합하는 능력이 있고, 병합할 내용들을 추측하여 사용자들이 어떤 ebuild가 병합될 것인지 등에 대해 확인할 수 있도록 해줍니다. 일반적으로 '''emerge'''는 일부분을 제외하고 '''ebuild'''를 능가합니다. '''ebuild'''를 통해서 패키지 이머지 (반입, 패키지 해제, 컴파일, 설치, 병합) 의 다양한 부분을 통해 점진적 절차를 한번에 수행할 수 있습니다. 개발자를 위해 귀중한 디버깅 도구가 될 수 있는데, ebuild의 특정 일부분에 대한 ebuild 문제를 봉인할 수 있게 해주기 때문입니다.&lt;br /&gt;
&lt;br /&gt;
==== ebuild 파일 이름 짓기 ====&lt;br /&gt;
Ebuild 파일 이름은 다음 네 부분의 논리적 하위섹션으로 구성되어 있습니다.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;&lt;br /&gt;
'''pkg_ver{_suf{#}}{-r#}.ebuild'''&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Note|중괄호 ({})는 선택적 필드를 나타내며 문자 그대로의 패키지 이름상에서&amp;gt;는 나타내지 않습니다. #은 0이 아닌 양의 정수를 나타냅니다.}}&lt;br /&gt;
&lt;br /&gt;
첫 하위 섹션, '''pkg'''는 패키지의 이름을 나타내며 소문자, 0부터 9까지의 숫자 그리고 단일 하이픈 (-), 밑줄 문자 (_) 혹은 양의 부호 (+) 문자만이 포함됩니다. 예를 들자면 '''util-linux''', '''sysklogd''' 그리고 '''gtk+'''가 있습니다. 어떤 패키지는 이 규칙을 따르지 않지만 여러분의 패키지는 이 규칙을 따르는 것이 좋습니다. &lt;br /&gt;
&lt;br /&gt;
두번째 하위 섹션, '''ver'''은 패키지의 버전을 나타내며, 보통 주 소스 타르볼의 버전과 같습니다. 버전은 '''1.2'''나 '''4.5.2'''처럼 마침표로 구분된 둘 혹은 셋 (그 이상) 의 숫자들로 구성되며, '''1.4b'''나 '''2.6h'''처럼 마지막 숫자 다음에 단일 문자가 따라올 수도 있습니다. 패키지 버전은 패키지 이름과 하이픈 (-) 으로 연결됩니다. 예를 들면 foo-1.0, bar-2.4.6 과 같습니다.&lt;br /&gt;
&lt;br /&gt;
{{Important|버전 문자열에 꼬리 문자를 사용하려 한다면, 알파와 베타들은 출시 이전 버전들이고 문자 버전은 좀더 새로운 버전임을 나타내기 때문에, 패키지의 알파 혹은 베타 상태를 구분하기 위해 사용되어서는 안된다는 것을 알아두시기 바랍니다. 이는 동일한 카테고리나 이름을 지닌 다른 패키지보다 최신이거나 혹은 더 오래되었을 경우 결정할 ebuild의 버전을 포티지가 사용하기 때문에 중요한 구별 사항입니다. 패키지의 버전을 버전 번호로 충실히 표현하여 포티지가 의존성 검사 정책을 제대로 수행하도록 하는 것은 매우 중요합니다.}}&lt;br /&gt;
&lt;br /&gt;
세번째 하위 섹션, '''{_suf{#}}'''는 다음의 미리 정의된 접미어들중 하나를 선택적으로 포함하며, 덜 최신인 것부터 가장 최신인 순으로 나열하였습니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;cols&amp;quot;| 접미어 &lt;br /&gt;
! scopy=&amp;quot;cols&amp;quot;| 의미 &lt;br /&gt;
|-&lt;br /&gt;
| _beta &lt;br /&gt;
| 베타 릴리즈&lt;br /&gt;
|-&lt;br /&gt;
| _pre &lt;br /&gt;
| 출시 이전&lt;br /&gt;
|-&lt;br /&gt;
| _rc &lt;br /&gt;
| 출시 후보 &lt;br /&gt;
|-&lt;br /&gt;
| (none)&lt;br /&gt;
| 일반 릴리즈&lt;br /&gt;
|-&lt;br /&gt;
| _p &lt;br /&gt;
| 패치 레벨(보통 정수가 딸려옴) &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
이들 접미어들에는 linux-2.4.0_pre10과 같이 0이 아닌 양의 정수가 딸려옵니다. 동&amp;gt;일한 버전 부분을 감안하여, 접미어는 다음과 같은 순서로 나열됩니다 ( 낮다는 것은 오래됨을 의미합니다 ): '''_alpha''' &amp;lt; '''_beta''' &amp;lt; '''_pre''' &amp;lt; '''_rc''' &amp;lt; (접미어 없음)&amp;lt; '''_p'''.&lt;br /&gt;
&lt;br /&gt;
정수가 딸려오는 동일한 접미어를 비교할 때, 큰 수가 더 최신인 것으로 간주됩니다. foo-1.0_alpha4가 foo-1.0_alpha3보다 최신인 것입니다.&lt;br /&gt;
&lt;br /&gt;
패키지 이름의 네번째 하위 섹션은 젠투 리눅스에서 지정한 리비전 번호('''{-r#}''')입니다. 이 하위 섹션에서는 접미사와 마찬가지로 선택적인 요소입니다. #은 package-4.5.3-r3에서와 같이 0이 아닌 양의 정수를 의미합니다.&lt;br /&gt;
&lt;br /&gt;
이 리비전 번호는 소스 타르볼의 버전과는 별개이며, 사용할 수 있는 일부 패키지의 향상된 젠투리눅스 최신 리비전임을 나타낼 때 사용됩니다. ebuild의 초기 릴리즈는 package-4.5.3과 같이 리비전 번호가 없어야 하며 Portage는 리비전 번호가 0인 것으로 간주합니다. 이는 리비전 카운팅이 1.0(초기 버전), 1.0-r1, 1.0-r2와 같이 진행됨을  의미합니다.&lt;br /&gt;
&lt;br /&gt;
기존의 ebuild 파일에 사소하지 않은 향상 요소를 넣었다면, 리비전 번호를 1 증가시킨 ebuild파일을 복사하는 것이 좋습니다. 리비전 충돌이 야기될 때 ''항상'' ChangeLog'''와''' CVS 커밋 메세지에 변경사항을 명시해야 하는걸 잊지 마시기 바랍니다. 이렇게 하지 않으면 정책을 위반하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
... 그리고 실제로 ebuild 이름의 다섯번째 섹션이 있지 않나 싶습니다. 이 이름에 붙는 .ebuild 확장자가 그것입니다.&lt;br /&gt;
&lt;br /&gt;
==== ebuild 파일의 내용 ====&lt;br /&gt;
이 섹션은 ebuild를 소개합니다. ebuild에서 가능한 모든 내용을 보려면, ebuild 스크립트에서 사용하는 자체 형식과 변수, 함수에 대해 설명하는 manpage가 있습니다: '''man 5 ebuild'''.&lt;br /&gt;
&lt;br /&gt;
===== 헤더 =====&lt;br /&gt;
ebuild를 제출할 때 헤더는 /usr/portage/header.txt의 헤더와 완전히 동일해야 합니다. 무엇보다 중요한건, 무슨 일이 있더라도 수정해선 안되며, '''$Header: $'''부분에 손을 댔는지 확인해보셔야 합니다.&lt;br /&gt;
&lt;br /&gt;
처음 세줄은 다음과 같이 보일 것입니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2-1: 유효한 헤더|&amp;lt;nowiki&amp;gt;# Copyright 1999-2005 Gentoo Foundation&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# Distributed under the terms of the GNU General Public License v2&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# $Header: $&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== 변수 =====&lt;br /&gt;
모든 ebuild파일의 첫 부분은 변수들로 채워집니다. 제각각의 변수에 대한 내용을 보려면 [http://devmanual.gentoo.org/ebuild-writing/variables/index.html 개발설명서]를 보도록 합니다.&lt;br /&gt;
&lt;br /&gt;
===== 함수 =====&lt;br /&gt;
패키지의 빌드와 설치과정을 제어할 수 있는 ebuild 파일에서 정의할 수 있는 많은 제각각의 함수들이 있습니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 함수 &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 용도 &lt;br /&gt;
|-&lt;br /&gt;
| pkg_setup&lt;br /&gt;
|어떤 기타 조건 작업을 수행할때 이 함수를 사용합니다. 이는 아마도 기존의 설정파일을 검사하는 기능이 있을 것입니다.&lt;br /&gt;
|-&lt;br /&gt;
| pkg_nofetch &lt;br /&gt;
|(라이센스 문제와 같은) 어떤 문제로 인해 소스가 포티지에 의해 자동으로 다운로드 되지 않을때 필요한 동작을 사용자에게 안내합니다. '''RESTRICT=&amp;quot;fetch&amp;quot;'''와 함께 사용합니다. 이 함수에서는 메세지만 보여주기만 하며, die를 호출하지 않습니다.&lt;br /&gt;
|-&lt;br /&gt;
| src_unpack &lt;br /&gt;
|소스 패키지를 풀고 패치를 적용하며 autotools와 같은 외부 프로그램을 실행할때 이 함수를 사용합니다. 기본적으로 이 함수는 '''A'''에 나열된 패키지를 풉니다. 기본 작업 디렉터리는 WORKDIR에 정의되어 있습니다. &lt;br /&gt;
|-&lt;br /&gt;
| src_compile &lt;br /&gt;
|패키지를 설정하고 빌드할때 이 합수를 사용합니다. 기본 작업 디렉터리는 '''S'''' 입니다.&lt;br /&gt;
|-&lt;br /&gt;
| src_install &lt;br /&gt;
|'''D'''에 있는 이미지로 패키지를 설치할 때 이 함수를 사용합니다. 패키지가 automake를 사용한다면 '''emake DESTDIR=&amp;quot;${D}&amp;quot; install'''로 간단하게 수행할 수 있습니다. '''D''' ''를 사용하여 패키지의 파일을 설치할 때 루트계정으로 수행하는지 확인하도록 합니다.'' 기본 작업 디렉터리는 '''S'''입니다.&lt;br /&gt;
|-&lt;br /&gt;
| src_test &lt;br /&gt;
| '''FEATURES=&amp;quot;test&amp;quot;'''가 설정되었고, '''RESTRICT=&amp;quot;test&amp;quot;'''가 해제되었을 경우에만 실행되며, 이 함수는 기본적으로 제공되는 의존성에 따라 &amp;quot;make test&amp;quot;나 &amp;quot;make check&amp;quot;를 실행하여 '''${S}''' 디렉터리에 있는 어떤 Makefile들로부터 존재하는 시험 기능들을 실행합니다. 사용자 정의 시험 설정을 만드는 것에 우선될 수 있습니다.&lt;br /&gt;
|-&lt;br /&gt;
| pkg_preinst &lt;br /&gt;
| 이 함수의 명령은 시스템에 패키지 이미지를 병합하기 전에 실행할 것들입니다.&lt;br /&gt;
|-&lt;br /&gt;
| pkg_postinst &lt;br /&gt;
| 이 함수의 명령은 시스템에 패키지 이미지를 병합하고 나서 실행할 것들입니다. &lt;br /&gt;
|-&lt;br /&gt;
| pkg_prerm &lt;br /&gt;
| 이 함수의 명령은 시스템으로부터 패키지를 병합해제하기 전에 실행할 것들입니다. &lt;br /&gt;
|-&lt;br /&gt;
| pkg_postrm &lt;br /&gt;
| 이 함수의 병령은 시스템으로부터 패키지를 병합해제하고 난 후에 실행할 것들입니다. &lt;br /&gt;
|-&lt;br /&gt;
| pkg_config &lt;br /&gt;
|패키지가 설치되고 나서 초기 설정을 수행할때 이 함수를 사용합니다. 이 함수의 모든 경로는 / 가 아닌 사용자 지정 설치 루트를 가리키는 '''ROOT'''가 접두사로 붙게 됩니다. 이 함수는 오직 사용자가 실행하려 할때만 사용합니다: '''emerge --config =${PF}''' &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== 도우미 함수 =====&lt;br /&gt;
또한 ebuild에서 다음의 도우미 함수를 사용할 수도 있습니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| 함수 &lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| 용도&lt;br /&gt;
|-&lt;br /&gt;
| use &lt;br /&gt;
| 하나 이상의 USE 플래그가 정의되었는지 확인합니다. 만약 정의되어 있다면 shell에 true를 반환합니다. 아무것도 없어도 표준 출력에 표시해줍니다. 자세히 보여주려면, USE 플래그가 정의되었을 때 USE플래그를 보여주는 '''usev'''를 사용해보기 바랍니다.&lt;br /&gt;
|-&lt;br /&gt;
| has_version &lt;br /&gt;
| 제각각의 패키지에 대해 요청된 버전이 시스템에 있다면 1을 반환합니다. '''has_version &amp;gt;=sys-libs/glibc-2.3.0'''과 같이 사용합니다.&lt;br /&gt;
|-&lt;br /&gt;
| best_version &lt;br /&gt;
| 요청한 category/package의 category/package-version을 반환합니다. '''best_version x11-libs/gtk+extra와 같이 사용합니다.&lt;br /&gt;
|-&lt;br /&gt;
| use_with &lt;br /&gt;
| 이 함수는 USE플래그가 정의되었는지 확인하고 &amp;quot;- -with-foobar&amp;quot; 나 &amp;quot;- -without-foobar&amp;quot;를 즉시 반환합니다. 만약 단 한 가지의 인자를 사용한다면, 그 인자는 USE플래그와 with(out) 문자열에 해당됩니다. 그렇지 않다면 첫번째 인자는 USE플래그이고 두번째 인자는 with(out) 문자열입니다. '''use_with truetype freetype'''와 같이 사용하면 USE 플래그중 truetype을 사용한다면 &amp;quot;- -with-freetype&amp;quot;을 표시할 것입니다.&lt;br /&gt;
|-&lt;br /&gt;
| use_enable &lt;br /&gt;
| '''use_with'''와 동일하지만, &amp;quot;- -enable-foobar&amp;quot; 혹은 &amp;quot;- -disable-foobar&amp;quot;를 즉시 반환합니다.&lt;br /&gt;
|-&lt;br /&gt;
| check_KV &lt;br /&gt;
| 포티지가 파악하는 커널 버전을 확인합니다. 만약 안되면 오류를 출력하고 죽습니다. 스크립트 상에 커널 버전이 필요하다면, 포티지가 자동으로 정의한 '''KV''' 변수를 사용해보기 바랍니다. gentoo-sources-2.4.20-r6를 실행하는 시스템에서 '''KV'''는 2.4.20값을 지니고 있을 것입니다.&lt;br /&gt;
|-&lt;br /&gt;
| keepdir &lt;br /&gt;
| (필요한 경우) 주어진 디렉터리에 .keep 파일을 만들어서 자동으로 제거되지 않도록 합니다. 절대로 .keep 파일을 임의대로 만들지 마시기 바랍니다. 포티지가 '''keepdir''' 동작을 변경할 때, 임의로 파일을 만드는 행위가 패키지를 깨지게 할 수도 있습니다.&lt;br /&gt;
|-&lt;br /&gt;
| econf &lt;br /&gt;
| 필요한 경로변경 (prefix, host, mandir, infodir, datadir, sysconfdir, localstatedir)과 함께 '''./configure'''를 수행합니다. '''econf'''를 호출했을 때 이들을 지정하여 '''./configure'''에 추가 인자를 선택적으로 넘길 수 있으며, 사용자는 필요한 경우 환경변수 '''EXTRA_ECONF''' 를 설정할 수 있습니다. 옵션들은 설정을 위해 주어진 순서의 역순으로 전달됩니다. 다시 말해, 전달된 첫번째 인자는 항상 우선순위가 가장 나중으로 될 것입니다.&lt;br /&gt;
|-&lt;br /&gt;
| einstall &lt;br /&gt;
| 필요한 경로변경 (prefix, datadir, mandir, infodir, datadir, sysconfdir, localstatedir)과 함께 '''make install'''을 수행합니다. 다시 말해, '''einstall'''을 호출하면 이들을 지정하여 make 명령으로 추가 인자를 넘길 수 있습니다. 패키지를 설치하기 위해 준비된 방법은 '''emake install DESTDIR=&amp;quot;${D}&amp;quot;''' 명령을 통해서지 einstall을 통한 방법이 아님을 인지하여 주시기 바랍니다. 이 명령은 단지 깨진 make 퍄일에 우선하는 대체용일 뿐입니다. &lt;br /&gt;
|-&lt;br /&gt;
| die &lt;br /&gt;
| 현재 프로세스를 중단하도록 합니다. 주어진 인자를 이유로 사용하여 사용자에게 알려줍니다. 단일 함수에서 이것을 한번 이상 호출한다면 메세지를 전달하는 것을 게을리하지 마시기 바랍니다. 어떤 패키지에서 실패가 발생했는지 알 수 없다면 이를 추적하는 것이 어렵기 때문입니다. &lt;br /&gt;
|-&lt;br /&gt;
| elog &lt;br /&gt;
| 사용자에게 중요한 내용을 알려줍니다. '''elog'''에 주어진 인자는 사용자가 보게 될 메시지 입니다. &amp;quot;**************************************&amp;quot; 와 같은 배너를 보여주기 위해 '''elog'''를 사용하지 마시기 바랍니다. '''elog'''를 사용한다는 것은 사용자의 주의를 충분히 끄는 것입니다. 메시지는 ELOG 시스템을 사용하여 기록됩니다.&lt;br /&gt;
|-&lt;br /&gt;
| einfo &lt;br /&gt;
| 도움이 되지만 로그될 필요가 없는 그다지 중요하지 않은 메시지를 보여줍니다.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== eutils.eclass에서 제공하는 도우미 함수 =====&lt;br /&gt;
&lt;br /&gt;
ebuild에서는 &amp;quot;eutils&amp;quot; eclass에서 제공하는 다음의 도우미 함수를 사용할 수 있습니다. 이 함수가 동작하려면 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;inherit eutils&amp;lt;/font&amp;gt;가 파일에 있는지 확인해보셔야 합니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 함수 &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 용도 &lt;br /&gt;
|-&lt;br /&gt;
| epatch &lt;br /&gt;
| 이 함수는 '''patch'''의 친숙한 대체 대상처럼 동작하며 .bz2, .gz, .zip 그리고 순수 텍스트 패치와 함께 동작합니다. -p 옵션 뿐만 아니라 '''EPATCH_OPTS'''에 명시적으로 지정될 필요가 있는 어떤 옵션도 지정할 필요가 없습니다. 이 함수는 파일이나 디렉&amp;gt;터리 둘 중 하나가 인자로서 사용됩니다. 디렉터리를 사용한다면 &amp;quot;??_${ARCH}_...&amp;quot;와 같은 모양새의 모든 패치가 적용될 것입니다. 이 패치들을 적용하려면 실행중인 아키텍처와 일치하거나, 이름에 &amp;quot;_all_&amp;quot;이 들어가거나 '''EPATCH_FORCE'''가 반드시 &amp;quot;yes&amp;quot;로 설정될 필요가 있습니다. &lt;br /&gt;
|-&lt;br /&gt;
| gen_usr_ldscript &lt;br /&gt;
| 이 함수는 /lib에 있는 동적 라이브러리에 대해 /usr/lib에 링커 스크립트를 생성합니다. 이는 /lib에 .so가 있고 /usr/lib에 .a 가 존재할때 연결 문제를 수정합니다. &lt;br /&gt;
|-&lt;br /&gt;
| edos2unix &lt;br /&gt;
| 이 함수는 '''dos2unix''' 바이너리처럼 동작합니다. &lt;br /&gt;
|-&lt;br /&gt;
| egetent &lt;br /&gt;
| egetent는 리눅스용 '''getent'''나 Mac OS X(R)용 '''nidump'''의 래퍼 처럼 동작합니다.&lt;br /&gt;
|-&lt;br /&gt;
| enewuser &lt;br /&gt;
| 새 사용자를 만듭니다. 이 함수는 사용자 이름 인자를 필수로 사용하며 몇몇 추가적 인자가 지정될 수 있습니다: '''$2''' 에는 UID가 들어가는데 -1을 전달하면 그 다음 사용가능한 ID를 전달하게 됩니다. '''$3'''에는 쉘이 들어가며 -1은 기본값을 의미합니다. '''$4''' 에는 홈 디렉터리가 들어가는데 /dev/null이 기본값이 되며, '''$5''' 에는 사용자가 들어가게 될 그룹이 들어가는데 빈 값이 기본값이며, '''$6'''에는 useradd에 전달하고 싶은 추가적인 옵션이 들어갈 수 있습니다. &lt;br /&gt;
|-&lt;br /&gt;
| enewgroup &lt;br /&gt;
| 새 그룹을 추가합니다. 이 함수는 그룹 이름을 필수로 사용합니다. 추가적인 두번째 인자는 그룹에 지정된 GID를 부여합니다. &lt;br /&gt;
|-&lt;br /&gt;
| make_desktop_entry &lt;br /&gt;
| 데스크톱 엔트리를 만듭니다. 첫번째 인자는 바이너리의 경로를 포함합니다. 선택적으로 두번째 인자는 아이콘의 이름입니다. 기본값은 '''${PN};''' 입니다. 세번째 인자는 /usr/share/pixmaps에 상대적인 경로를 포함하거나 전체 경로를 포함할 수 있습니다. 기본값은 '''${PN}.png;''' 입니다. 네번째 인자는 [http://standards.freedesktop.org/menu-spec/latest/apa.html 프로그램 카테고리]를 포함할 수 있고, 다섯번째 인자는 선택적으로 프로그램의 시작 경로를 포함할 수 있습니다.&lt;br /&gt;
|-&lt;br /&gt;
| check_license &lt;br /&gt;
| 사용자가 수락할 라이선스를 표시합니다. 만약 인자가 지정되지 않았다면 '''${LICENSE}'''에 지정된 라이선스가 사용됩니다. &lt;br /&gt;
|-&lt;br /&gt;
| unpack_pdv &lt;br /&gt;
| pdv가 생성한 아카이브를 풉니다. 첫번째 인자는 풀어낼 파일이 반드시 들어가야 하며 두번째 인자는 '''strace -elseek ${file}'''과 &amp;quot;4&amp;quot;라는 값을 전달할 lseek(3,-4,SEEK_END)&amp;quot;와 같은 것을 통해 수동 생성될 &amp;quot;off_t&amp;quot;가 들어가게 됩니다. &lt;br /&gt;
|-&lt;br /&gt;
| unpack_makeself &lt;br /&gt;
| makeself가 생성한 아카이브를 풉니다. 풀 파일이름이 인자로서 필요합니다.&lt;br /&gt;
|-&lt;br /&gt;
| cdrom_get_cds &lt;br /&gt;
| CD를 가져오려 시도합니다. 인자에 지정한 파일들은 시스템에 나타나며 '''${CDROM_ROOT}'''에 마운트됩니다.&lt;br /&gt;
|-&lt;br /&gt;
| cdrom_load_next_cd &lt;br /&gt;
| 첫번째 CD에 대한 작업이 끝났다면 다음 CD를 넣도록 합니다. 이 함수가 값을 반환하면 '''${CDROM_ROOT}'''는 다음 CD를 가리킬 것입니다.&lt;br /&gt;
|-&lt;br /&gt;
| strip-linguas &lt;br /&gt;
| 이 함수는 LINGUAS 변수에 패키지에서 지원할 수 있는 함수의 인자로 지정한 언어만 들어있는지를 확인합니다. 첫번째 인자가 -i라면, 지정된 디렉터리에 있는 .po 파일들의 목록이 만들어지고, 리스트들의 교집합이 사용될 것입니다. 첫번째 인자가 -u라면, 지정된 디렉터리의 .po파일 목록이 만들어지고, 전체 리스트들의 모든 항목을 사용할 것입니다.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== flag-o-matic.eclass에서 제공하는 도우미 함수 =====&lt;br /&gt;
ebuild에서는 &amp;quot;flag-o-matic&amp;quot; eclass에서 제공하는 다음의 도우미 함수를 사용할 수 있습니다. 이 함수가 동작하려면 {{{#0000ff inherit flag-o-matic }}}이 파일에 있는지 확인해보셔야 합니다. 어떤 컴파일러의 설정이라도 직접 수정하지 않는 것이 좋으며, 문제를 일으&amp;gt;키는 플래그를 걸러내는 일련의 동작을 수행하기 위해서라면 flag-o-matic을 대신 사용해주시는 것이 좋겠습니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 함수 &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 용도&lt;br /&gt;
|-&lt;br /&gt;
| filter-flags &lt;br /&gt;
| 이 함수는 '''C(XX)FLAGS'''의 일부 플래그를 제거합니다. 일치하는 완전한 플래그에만 해당됩니다.&lt;br /&gt;
|-&lt;br /&gt;
| append-flags &lt;br /&gt;
| 이 함수는 존재하는 '''C(XX)FLAGS''' 변수에 추가 플래그를 추가합니다. &lt;br /&gt;
|-&lt;br /&gt;
| replace-flags &lt;br /&gt;
| 이 함수는 '''C(XX)FLAGS'''에 존재하는 플래그중 하나가 들어간 두번째 인자를 지정된 첫번째 인자로 대체합니다. &lt;br /&gt;
|-&lt;br /&gt;
| replace-cpu-flags &lt;br /&gt;
| 두 인자가 필요합니다. 주어진 mtune/march/mcpu 값을 새로운 값으로 바꿉니다 (다음과 같이 될 것입니다: replace-cpu-flags 'i686' 'i586' 은 -mtune/-march/-mcpu=i686 을 -mtune/-march/-mcpu=i586으로 바꿀 것입니다). &lt;br /&gt;
|-&lt;br /&gt;
| strip-flags &lt;br /&gt;
| 모든 플래그를 없애지만, '''ALLOWED_FLAGS'''에 지정된 것들은 제외합니다. &lt;br /&gt;
|-&lt;br /&gt;
| strip-unsupported-flags &lt;br /&gt;
| 실행중인 GCC 버전에 의해 지원되지 않는 어떤 플래그든지간에 '''C(XX)FLAGS'''에 있으면 없앱니다. &lt;br /&gt;
|-&lt;br /&gt;
| get-flag &lt;br /&gt;
| 플래그를 찾아서 값을 출력합니다. &lt;br /&gt;
|-&lt;br /&gt;
| is-flag &lt;br /&gt;
| 현재 '''C(XX)FLAGS''' 에 설정되어 있는 플래그라면 true를 반환합니다. 완전히 일치하는 경우에만 수행됩니다.&lt;br /&gt;
|-&lt;br /&gt;
| append-ldflags &lt;br /&gt;
| 이 함수는 존재하는 '''LDFLAGS'''변수에 추가 플래그를 추가합니다.&lt;br /&gt;
|-&lt;br /&gt;
| filter-ldflags &lt;br /&gt;
| '''LDFLAGS'''로부터 완전히 일치하는 지정된 플래그만을 제거합니다.&lt;br /&gt;
|-&lt;br /&gt;
| fstack-flags &lt;br /&gt;
| -fstack-protector와 -fstack-protector-all의 적용을 억제하는 -fno-stack-protector를 붙입니다.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== toolchain-funcs.eclass에서 제공하는 도우미 함수 =====&lt;br /&gt;
ebuild에서는 &amp;quot;tollchain-funcs&amp;quot; eclass에서 제공하는 다음의 도우미 함수를 사용할 수 있습니다. 이 함수가 동작하려면 {{{#0000ff inherit toolchain-funcs}}} 가 파일에 있는지 확인해보셔야 합니다. 어떤 컴파일러나 binutils의 설정을 직접 명시적으로 지정하지 않는 &amp;gt;것이 좋으며 컴파일러나 binutils를 지정하려면 toolchain-funcs를 사용해주시는 것이 좋겠습니다.&lt;br /&gt;
&lt;br /&gt;
아래 함수들에 대한 사용 목적은 크로스 컴파일링의 지원과 icc 컴파일러를 위한 것입니다. 이 함수들은 gcc, g++, ld, ranlib 또는 아래의 도구들 중 하나를 사용할 때 사용될 것입니다. 자동 설정 도구를 사용하는 일반적인 패키지들은 크로스 컴파일을 자동으로 감지하며 다음 함수를 필요로 하지는 않습니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 함수 &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 용도&lt;br /&gt;
|-&lt;br /&gt;
| tc-getAR &lt;br /&gt;
| 아카이버의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| tc-getAS &lt;br /&gt;
| 어셈블러의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| tc-getCC &lt;br /&gt;
| C 컴파일러의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| tc-getCXX &lt;br /&gt;
| C++ 컴파일러의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
|| tc-getLD &lt;br /&gt;
| 링커의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
|| tc-getNM &lt;br /&gt;
| 심볼/객체 검사 도구의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| tc-getRANLIB &lt;br /&gt;
| 아카이버 인덱서의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| tc-getF77 &lt;br /&gt;
| 포트란 컴파일러의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| tc-getGCJ &lt;br /&gt;
| 자바 컴파일러의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| tc-getBUILD_CC &lt;br /&gt;
| 빌드를 위한 C 컴파일러의 이름을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| gcc-fullversion &lt;br /&gt;
| $($CC -dumpversion)으로부터 나오는 버전을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| gcc-version &lt;br /&gt;
| 버전을 반환하지만 &amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt; 형식으로만 나옵니다 &lt;br /&gt;
|-&lt;br /&gt;
| gcc-major-version &lt;br /&gt;
| 메이저 버전을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| gcc-minor-version &lt;br /&gt;
| 마이너 버전을 반환합니다. &lt;br /&gt;
|-&lt;br /&gt;
| gcc-micro-version &lt;br /&gt;
| 마이크로 버전을 반환합니다. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ebuild 파일 작성 규칙 ====&lt;br /&gt;
ebuild파일이 단지 쉘 스크립트이기 때문에, ebuild파일을 편집하려면 편집기의 쉘 스크립트 모드를 사용하는 것이 좋습니다. 적절한 들여쓰기를 하는 것이 좋으며, 들여쓰기에는 공백 문자입력이 아닌 탭을 사용합니다. 편집기가 탭 간격이 4칸으로 조정되어 있는지를 확인합니다. 그리고 환경변수 주변에 중괄호를 감쌌는지 항상 확인합니다. 예를 들어 그냥 '''$P'''가 아니라 '''${P}''' 입니다.&lt;br /&gt;
&lt;br /&gt;
긴 줄에 대해서는 '\'로 마무리 합니다. 따라서&lt;br /&gt;
{{Example|코드 예제 2.3: ebuild 편집을 위해 vimrc 설정하기|&amp;lt;nowiki&amp;gt;au BufRead,BufNewFile *.e{build,class} let is_bash=1|setfiletype sh&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;au BufRead,BufNewFile *.e{build,class} set ts=4 sw=4 noexpandtab&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
이맥스를 사용한다면, app-emacs/gentoo-syntax(GNU Emacs용)나 app-xemacs/gentoo-syntax (XEmacs 용) 둘 중 하나를 이머지 하는 것이 좋습니다. 이 패키지들은 자동 들여쓰기와 ebuild에 대한 문법 강조 그리고 기타 젠투에 특화된 파일 유형을 위한 이맥스 메이저 모드를 제공합니다.&lt;br /&gt;
&lt;br /&gt;
나노를 사용한다면, 운이 참 좋은 것입니다! 단지 /etc/nanorc를 편집하여 ebuild참조 섹션에 대한 주석을 해제하기만 하면 됩니다.&lt;br /&gt;
&lt;br /&gt;
==== USE 변수 ====&lt;br /&gt;
USE 변수의 용도는 포티지 설정을 전체적으로 설정할 수 있게 하고 추가적 빌드 타임에 어떤 기능을 자동으로 활성화 혹은 비활성화 할 수 있게끔 합니다. 예를 들어보도록 합니다. 여러분은 그놈 팬이고 선택적으로 그놈을 지원할수 있는 옵션을 ebuild에 넣고 싶어합니다. 이 경우 /etc/make.conf의 '''USE''' 변수에 '''gnome''' 을 넣고 '''USE''' 변수에 그놈이 ''설정되지 않았는지'' 확인합니다. 젠투 리눅스는 여러분이 원하는 방식으로 정확하게 설정된 시스템을 가질 수 있도록, 압도적으로 많은 USE 옵션을 지니고 있습니다.&lt;br /&gt;
&lt;br /&gt;
{{Note|USE 변수의 설정을 해제한다면(예를 들어, &amp;lt;b&amp;gt;USE&amp;lt;/b&amp;gt;로부터 &amp;lt;b&amp;gt;gnome&amp;lt;/b&amp;gt;을 제거한다면), 포티지에게 그놈을 위한 선택적 빌드 타임 지원을 비활성화 하라고만 지시할 것입니다. 그러나 그놈을 필요로 하는 ebuild를 &amp;lt;b&amp;gt;emerge&amp;lt;/b&amp;gt; 한다면, 해당 패키지는 기대하는 바와 같이 그놈 지원을 명백히 활성화 할 것입니다. 이는 또한 그놈이 설치되지 않았다면 자동으로 (의존성에 따라) 설치될 것임을 의미합니다. 이렇기 때문에 &amp;quot;실제로&amp;quot; &amp;lt;b&amp;gt;emerge&amp;lt;/b&amp;gt;를 수행하기 전에 &amp;lt;b&amp;gt;emerge --pretend&amp;lt;/b&amp;gt;를 수행하는 것은 좋은 방법입니다. 이 방법을 통해 여러분은 정확하게 어떤 패키지를 얻게 되는지 항상 알게 될 것입니다!}}&lt;br /&gt;
&lt;br /&gt;
여러분의 ebuild에서 '''use &amp;lt;variable&amp;gt;''' 명령을 통해 USE변수에 설정이 되었는지 검사할 수 있습니다. 보통 이 명령을 다음처럼 사용할 것입니다:&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.4: USE 플래그가 설정되어 있는지 찾아보기|if use X; then&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt; # Commands specific to X...&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
fi&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
USE 변수는 또한 의존성을 설정하기 위해서도 사용됩니다. 예를 들어, 몇몇 USE 변수값이 설정되었을때 패키지를 요구하는 것만 원할지도 모릅니다. 이는 ebuild의 DEPEND 변수에서 '''flag? ( mycat/mypackage )''' 문법을 사용하여 해결할 수 있습니다. 이 경우 '''mycat/mypackage'''는 '''flag'''가 '''USE'''에 있을때만 필요합니다. 또한 어떤 USE 플래그가 설정되었을때와 어떤 USE 플래그가 설정되지 않았을때 어떤 의존성이 사용될지 '''flag? ( mycat/mypackage )''' 와 '''!flag? ( othercat/otherpackage )'''로 지정할 수도 있습니다. 이 경우 '''flag'''가 설정되어 있지 않았다면 '''othercat/otherpackage'''가 '''mycat/mypackage''' 대신 사용될 것입니다. 배시의 if를 사용하는 것이 아니라 ebuild의 이 문법을 사용했는지 확인해보시기 바랍니다. Bash 조건문은 포티지의 의존성 캐싱과 혼동되며, 배시 문법을 사용하면 ebuild를 깨지게 할 것입니다.&lt;br /&gt;
&lt;br /&gt;
여기에 USE를 사용하는 중요한 요령이 있습니다. 대부분, 패키지에는 설정 과정을 수행하기 위해 '''./configure''' 스크립트를 가질 것입니다. 일반적으로 ebuild가 '''./configure'''를 사용하면, 어떤 추가적인 빌드타임 기능성은 '''./configure''' 명령으로 적당한 인&amp;gt;자를 전달하여 활성화되거나 비활성화될 것입니다. 여기에 이런 것들을 조작하는 가장 좋은 방법이 있습니다.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.5: USE 설정 기반 조건문|&amp;lt;nowiki&amp;gt;DEPEND=&amp;quot;X? ( &amp;gt;=x11-base/xfree-4.3 )&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;mysql? ( &amp;gt;=dev-db/mysql-3.23.49 )&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;apache2? ( &amp;gt;=net-www/apache-2 )&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;!apache2? ( =net-www/apache-1* )&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;src_compile() {&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;econf \&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;$(use_enable X x11) \&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;$(use_enable mysql)&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;emake || die &amp;quot;Error: emake failed!&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
이 접근은 매우 괜찮은 결과를 가져옵니다. mysql이나 X를 위한 기본 설정(활성화/비활성화)이 어떤지에 대해 걱정할 필요가 없고, '''econf'''에게 '''USE''' 변수 값들을 기반으로 원하는 것들을 명확하게 알려줍니다. 가독성 측면에서도 조금 깔끔하다는 점은 굳이 언급하지 않겠습니다.&lt;br /&gt;
&lt;br /&gt;
가끔 ebuild에는 선택적인 특징들의 충돌이 있을 것입니다. 이러한 충돌을 검사하고 오류를 반환하는 것은 가능한 해결책이 아닙니다. 대신 다른 것들중 한가지 특징에 대해 반드시 선택하여야 합니다. 이렇게 되면, 업스트림과 상의(보통 기본적으로 쓰는 것이 무엇이냐)하거나, 좀더 일반적인 기능을 제공하는 옵션을 고려하거나, 동전 뒤집기를 합니다. msmtp ebuild로부터 한가지 예를 들어보도록 하겠습니다. 패키지에는 SSL과 GnuTLS, SSL과 OpenSSL 혹은 SSL을 모두 사용하지 않는 방식을 사용할 수 있습니다. 왜냐면 GnuTLS는 OpenSSL에 비해 더 많은 기능을 지니고 있는데, 이게 장점입니다:&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 2.6: 충돌 기능 다루기|&amp;lt;nowiki&amp;gt;src_compile() {&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;local myconf&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;if use gnutls ; then&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;myconf=&amp;quot;${myconf} --enable-ssl --with-ssl=gnutls&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;elif use ssl ; then&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;myconf=&amp;quot;${myconf} --enable-ssl --with-ssl=openssl&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;else&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;myconf=&amp;quot;${myconf} --disable-ssl&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;fi&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;econf \&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;# Other stuff&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;${myconf}&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;emake || die &amp;quot;make failed&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
USE 변수에 대한 최신 테이블을 계속 보시려면, [http://www.gentoo.org/dyn/use-index.xml 이 곳]으로 가시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
=== 파일 시스템 위치 ===&lt;br /&gt;
==== FHS에 대한 소개 ====&lt;br /&gt;
젠투 리눅스에서 사용하는 파일 시스템 배치 표준은 File system Hierarchy Standard의 약자인 FHS를 거의 따릅니다. 표준에 대한 간단한 설명은 여기에 있습니다. 완전한 명세서를 보시려면 [http://www.pathname.com/fhs/ http://www.pathname.com/fhs/]로 가시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
{{Note|/opt 계층은 FHS의 섹션 3.12 에 있습니다. 섹션 4.4 에서는 /usr/X11R6 디렉터리에 대해 다룹니다. KDE와 GNOME은 특별히 다루어지지 않았고 현재 버전의 FHS에서 언급되지도 않았습니다.}}&lt;br /&gt;
&lt;br /&gt;
==== 시스템에 패키지를 적용하는 방법 ====&lt;br /&gt;
보통 패키지가 autoconf와 automake를 사용한다면 기본 설치 대상경로는 대부분 몇몇 예외를 제외하고 올바릅니다:&lt;br /&gt;
&lt;br /&gt;
* 프로그램을 /bin, /sbin, /usr/bin, 혹은 /usr/sbin에 설치한다면 프로그램의 관련 맨 페이지는 /usr/share/man 트리에 설치될 것입니다. 이는 종종 ebuild에서 '''./configure --mandir=/usr/share/man'''을 지정하여 수행할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
* GNU info 파일은 X11, 그놈, KDE와 관련된 프로그램이나 도구에 대한 것일지라도 항상 /usr/share/info 에 설치될 것입니다. 여기서 참고할 것은 /usr/share/info 는 오직 GNU info 파일이 위치하게 될 공식 경로입니다. 대부분의 '''./configure''' 스크립트가 '''/usr/info'''에 GNU info 파일을 설치하는 것을 기본으로 하는데, 종종 '''./configure'''에 '''--infodir=/usr/share/info''' 인자를 붙여 호출할 필요가 있습니다.&lt;br /&gt;
&lt;br /&gt;
* 문서 파일들은 /usr/share/doc에 설치되며, 제각각의 프로그램에 대하여 하위 디렉터리에 프로그램의 이름과 버전, 리비전을 반영합니다. 이는 그놈, KDE, X11 그리고 콘솔을 기반으로 하는 모든 프로그램에 적용됩니다. 그러나 어떤 프로그램은 추가적인 문서를 설치할 것이고 그들 자신의 고유목적에 따라 /usr/share 계층으로 지원 파일을 넣을 것입니다.&lt;br /&gt;
&lt;br /&gt;
* X11과 관련된 프로그램과 라이브러리는 항상 /usr에 설치되겠지만 /usr/X11R6로 바로 들어가는 것은 아닐 것입니다. /usr/X11R6 계층을 X 윈도 시스템 버전 11 릴리즈 번호 6을 위해 예약하였습니다. 이는 아마도 몇몇 다른 배포판이 그렇게 했다기보단 FHS의 문자적인 해석에 비중을 두기 때문인지도 모릅니다.&lt;br /&gt;
&lt;br /&gt;
* 그놈과 KDE 프로그램과 같은 것들은 항상 /usr 로 설치될 것입니다.&lt;br /&gt;
&lt;br /&gt;
{{Important|몇몇 배포판은 그놈과 KDE를 /opt로 설치하는 것을 선택합니다. 실제로 그들 파일을 어디에 설치할 것인가에 대한 내용이 이들 데스크탑 환경에 대해 표준으로 존재하지 않습니다. 단순성과 일관성 고려측면에서, 젠투는 모든 KDE와 그놈 패키지를 선택하기 위해 /usr 디렉터리를 선택했습니다.}}&lt;br /&gt;
&lt;br /&gt;
일반적으로, /usr 트리에 이들 파일을 설치하는 ebuild를 가지고 있을 것입니다. 몇몇 프로그램은 혼동을 야기하는 그놈이나 KDE, X11 라이브러리를 포함하거나 제외하여 컴파일하고 링크할 수 있습니다. 해결책이 있다면 모호성을 방지하기 위해 모두 /usr에 설치하고 ebuild 저작자를 위해 복잡성을 줄이는 것입니다. 프로그램의 파일이 설치될 위치는 특정 '''USE''' 변수의 존재와 누락에 관련되어서는 ''안될 것''입니다. 따라서, 포티지 트리의 ebuild는 ''거의 항상'' 배타적으로 /usr 계층에 설치합니다.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Note|젠투 리눅스에서 /opt 디렉터리는 바이너리만 존재하는 패키지를 위해 예약되었습니다. 그 예로 mozilla-bin, acroread, netscape 그리고 realplayer가 포함됩니다. 여기에 설치될 패키지는 보통 /etc/env.d/foo와 같은 파일을 필요로 할 것입니다. 이를 통해 경로와 추가 변수를 환경에 포함할 수 있습니다. /etc/env.d에 대해 더 알아보시려면 [[http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=2&amp;amp;chap=5 이 문서]] 를 방문해보시기 바랍니다.}}&lt;br /&gt;
&lt;br /&gt;
=== 포티지 스크립트와 유틸리티 ===&lt;br /&gt;
==== 공용 스크립트 ====&lt;br /&gt;
이 스크립트는 시스템 관리자가 패키지를 설치하고 제거하며 패키지 데이터베이스를 유지하는데 사용합니다.&lt;br /&gt;
&lt;br /&gt;
'''ebuild'''는 포티지 시스템의 주 엔진입니다. 이는 패키지 풀기, 컴파일, 설치, 병합 그리고 병합해제와 같은 모든 주된 작업을 수행합니다. 이는 다음 명령으로 호출됩니다: '''ebuild path/to/package.ebuild command'''. 사용할 수 있는 명령은 다음과 같습니다:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 명령 &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 설명 &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 관련 '''ebuild''' 함수&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;setup&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
| ebuild가 수행되기 전에 필요한 어떤 잡다한 명령들을 수행합니다 &lt;br /&gt;
| pkg_setup&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;depend&amp;lt;/font&amp;gt;&lt;br /&gt;
| |패키지를 빌드하는데 필요한 의존성을 표시합니다 &lt;br /&gt;
| N/A &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;merge&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
| 시스템에 패키지를 풀고, 컴파일, 설치 그리고 병합합니다 &lt;br /&gt;
| N/A &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qmerge&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
| 이미 시스템에 패키지가 풀리고, 컴파일 설치 과정이 실행되었다 가정한 상태에서 파일 시스템에 패키지를 병합합니다 &lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;unpack&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
| 작업 디렉터리로 소스 타르볼을 풉니다 &lt;br /&gt;
| src_unpack &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;compile&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
| 패키지를 컴파일 합니다 &lt;br /&gt;
| src_compile&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;rpm&amp;lt;/font&amp;gt;&lt;br /&gt;
| 패키지로부터 RPM을 만듭니다 &lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;package&amp;lt;/font&amp;gt;&lt;br /&gt;
| 젠투의 '''tbz2''' 패키지를 만듭니다 &lt;br /&gt;
| N/A &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;prerm&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
| 패키지를 제거하기 이전 단계를 실행합니다 &lt;br /&gt;
| pkg_prerm&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;postrm&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
| 패키지를 제거하고 난 단계를 실행합니다 &lt;br /&gt;
| pkg_postrm&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;preinst&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
| 패키지를 설치하기 이전 단계를 실행합니다 &lt;br /&gt;
| pkg_preinst &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;postinst&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
| 패키지를 설치하고 난 단계를 실행합니다 &lt;br /&gt;
| pkg_postinst &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;config&amp;lt;/font&amp;gt;&lt;br /&gt;
| 패키지가 병합되면 기본 설정내용으로 설정합니다 &lt;br /&gt;
| pkg_config &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;touch&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
| 패키지의 각각의 소스 아카이브에 대한 mtimes를 새로 고칩니다 &lt;br /&gt;
| N/A &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;clean&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
| 패키지의 작업 디렉토리를 비웁니다 &lt;br /&gt;
| N/A &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fetch&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
| 패키지 소스 타르볼을 가져옵니다 &lt;br /&gt;
| N/A &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;manifest&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
| 패키지에 대한 매니페스트를 만듭니다 &lt;br /&gt;
| N/A &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;test&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
| 패키지에 대한 자체 테스트 루틴을 실행합니다 &lt;br /&gt;
| src_test &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;install&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
| 이미지 디렉터리에 패키지를 설치합니다 &lt;br /&gt;
| src_install &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;unmerge&amp;lt;/font&amp;gt;&lt;br /&gt;
| 파일 시스템으로부터 패키지를 병합해제합니다&lt;br /&gt;
| N/A &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|별표 문자(*)와 함께 있는 명령은 개발자들만 사용합니다.}}&lt;br /&gt;
&lt;br /&gt;
'''emerge'''는 재귀적으로 패키지와 파일 시스템의 모든 의존요소를 병합합니다. 이 명령은 많은 옵션들이 있습니다. 목록을 보려면 '''emerge --help'''를 입력합니다.&lt;br /&gt;
&lt;br /&gt;
'''env-update'''는 설치된 패키지가 변경한 내용이 들어있는 설정 파일들을 새로 고칩니다 (/etc/ld.so.conf와 /etc/profile.env도 포함하지만 제한적임)&lt;br /&gt;
&lt;br /&gt;
==== 비공개 스크립트와 명령들 ====&lt;br /&gt;
일반적인 작업을 수행할 ebuild 파일에서 사용할 수 있는 스크립트 입니다.&lt;br /&gt;
&lt;br /&gt;
기초적인 분들을 위해 /usr/lib/portage/bin에 있는 스크립트에 대해 보도록 하겠습니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 명령&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 기본값&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 설명&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 예제&lt;br /&gt;
|-&lt;br /&gt;
| diropts &lt;br /&gt;
| -m0755 &lt;br /&gt;
| '''dodir'''을 실행할때 사용하는 옵션을 설정합니다 &lt;br /&gt;
| diropts -m0750 &lt;br /&gt;
|-&lt;br /&gt;
| dobin &lt;br /&gt;
| N/A &lt;br /&gt;
| 지정된 바이너리를 DESTTREE/bin에 설치합니다 &lt;br /&gt;
| dobin wmacpi&lt;br /&gt;
|-&lt;br /&gt;
| docinto &lt;br /&gt;
| &amp;quot;&amp;quot; &lt;br /&gt;
| '''dodoc'''이 사용하는 관련 하위 디렉터리 (DOCDESTTREE)를 설정합니다 &lt;br /&gt;
| docinto examples &lt;br /&gt;
|-&lt;br /&gt;
| dodir &lt;br /&gt;
| N/A &lt;br /&gt;
| ${D}를 명백하게 다루는 디렉토리를 만듭니다 &lt;br /&gt;
| dodir /usr/lib/newpackage &lt;br /&gt;
|-&lt;br /&gt;
| dodoc &lt;br /&gt;
| N/A &lt;br /&gt;
| 지정된 파일을 패키지의 문서 디렉토리 (/usr/share/doc/${PF}/DOCDESTTREE)로 설치합니다('''docinto''' 참조) &lt;br /&gt;
| dodoc README *.txt &lt;br /&gt;
|-&lt;br /&gt;
| doexe &lt;br /&gt;
| N/A &lt;br /&gt;
| EXEOPTIONS ('''exeopts''' 참조) 모드로 지정된 파일을 EXEINTO ('''exeinto''' 참조)가 정의한 PATH로 설치합니다. &lt;br /&gt;
| doexe ${FILESDIR}/quake3 &lt;br /&gt;
|-&lt;br /&gt;
| dohard &lt;br /&gt;
| N/A &lt;br /&gt;
| ${D}를 명백하게 다루는 하드링크를 만듭니다 &lt;br /&gt;
| dohard ls /bin/dir &lt;br /&gt;
|-&lt;br /&gt;
| dohtml &lt;br /&gt;
| N/A &lt;br /&gt;
| 지정한 파일과 디렉터리를 /usr/share/doc/${PF}/html에 설치합니다 &lt;br /&gt;
| dohtml -r doc/html/* &lt;br /&gt;
|-&lt;br /&gt;
| doinfo&lt;br /&gt;
| N/A &lt;br /&gt;
| 지정한 파일을 /usr/share/info에 설치하고, gzip으로 압축합니다 &lt;br /&gt;
| doinfo doc/*.info &lt;br /&gt;
|-&lt;br /&gt;
| doins &lt;br /&gt;
| N/A &lt;br /&gt;
| '''INSOPTIONS''' ('''insopts''' 참조) 모드로 지정된 파일을 INSDESTTREE('''insinto''' 참조)에 설치합니다 &lt;br /&gt;
| doins *.png icon.xpm &lt;br /&gt;
|-&lt;br /&gt;
|  dolib &lt;br /&gt;
|  N/A &lt;br /&gt;
| 지정된 라이브러리를 0644모드로 DESTTREE/lib에 설치합니다 &lt;br /&gt;
| dolib *.a *.so &lt;br /&gt;
|-&lt;br /&gt;
| dolib.a &lt;br /&gt;
|  N/A &lt;br /&gt;
| 지정된 라이브러리를 0644모드로 DESTTREE/lib에 설치합니다 &lt;br /&gt;
| dolib.a *.a &lt;br /&gt;
|-&lt;br /&gt;
| dolib.so &lt;br /&gt;
| N/A &lt;br /&gt;
| 지정된 라이브러리를 755모드로 DESTTREE/lib에 설치합니다 &lt;br /&gt;
| dolib.so *.so &lt;br /&gt;
|-&lt;br /&gt;
| doman &lt;br /&gt;
| N/A &lt;br /&gt;
| 지정된 파일을 파일의 접미문자에 따라 /usr/share/man/manX에 설치합니다 (file.1 은 man1에 복사됨) &lt;br /&gt;
| doman *.1 *.5 &lt;br /&gt;
|-&lt;br /&gt;
| dosbin &lt;br /&gt;
| N/A &lt;br /&gt;
| 파일을 DESTTREE/sbin에 설치하고, 실행가능한지 확인합니다 &lt;br /&gt;
| dosbin ksymoops &lt;br /&gt;
|-&lt;br /&gt;
| dosym &lt;br /&gt;
| N/A &lt;br /&gt;
| ${D}를 명백하게 다루는 심볼릭 링크를 만듭니다 &lt;br /&gt;
| dosym gzip /bin/zcat &lt;br /&gt;
|-&lt;br /&gt;
| emake &lt;br /&gt;
| N/A &lt;br /&gt;
| '''MAKEOPTS'''로 make를 실행합니다. 어떤 패키지는 병렬로 만들어질 수 없어서 대신 '''emake -j1'''을 사용합니다. 패키지를 만들기 위해 전달할 추가 인자가 필요하다면, emake 명령에 붙여주기만 하면 됩니다. 사용자들은 emake에 추가 플래그를 넘겨주기 위해 '''EXTRA_EMAKE''' 환경 변수를 설정할 수 있습니다. &lt;br /&gt;
| emake &lt;br /&gt;
|-&lt;br /&gt;
| exeinto &lt;br /&gt;
| / &lt;br /&gt;
| '''doexe'''명령을 위해 루트 (''EXEDESTTREE'')를 설정합니다 &lt;br /&gt;
| exeinto /usr/lib/${PN} &lt;br /&gt;
|-&lt;br /&gt;
| exeopts &lt;br /&gt;
| -m0755 &lt;br /&gt;
| '''doexe'''를 실행할 때 사용하는 옵션을 설정합니다 &lt;br /&gt;
| exeopts -m1770 &lt;br /&gt;
|-&lt;br /&gt;
| fowners &lt;br /&gt;
| N/A &lt;br /&gt;
| ${D}를 명백하게 다루는 chown 명령을 통해 지정된 소유규칙을 지정된 파일에 적용합니다. &lt;br /&gt;
| fowners root:root /sbin/functions.sh &lt;br /&gt;
|-&lt;br /&gt;
| fperms &lt;br /&gt;
| N/A &lt;br /&gt;
| ${D}를 명백하게 다루는 chown 명령을 통해 지정된 권한을 지정된 파일에 적용합니다. &lt;br /&gt;
| fperms 700 /var/consoles &lt;br /&gt;
|-&lt;br /&gt;
| insinto &lt;br /&gt;
| /usr &lt;br /&gt;
| '''doins'''명령을 위해 루트 (''INSDESTTREE'')를 설정합니다 &lt;br /&gt;
| insinto /usr/include &lt;br /&gt;
|-&lt;br /&gt;
| insopts &lt;br /&gt;
| -m0644 &lt;br /&gt;
| '''doins'''를 실행할 때 사용하는 옵션을 설정합니다 &lt;br /&gt;
| insopts -m0444 &lt;br /&gt;
|-&lt;br /&gt;
| into  &lt;br /&gt;
| /usr &lt;br /&gt;
| 모든 'do' 명령들 ('''dobin''', '''dolib''', '''dolib.a''', '''dolib.so''', '''domo''', '''dosbin''')을 위해 타겟 접두 경로(DESTTREE)를 설정합니다. &lt;br /&gt;
| into / &lt;br /&gt;
|-&lt;br /&gt;
| libopts &lt;br /&gt;
| -m0644 &lt;br /&gt;
| '''dolib'''를 실행할때 사용하는 옵션을 설정합니다 &lt;br /&gt;
| libopts -m0555 &lt;br /&gt;
|-&lt;br /&gt;
| newbin &lt;br /&gt;
| N/A &lt;br /&gt;
| 지정된 바이너리를 명백하게 두번째 인자로 이름을 바꿔 설치하는 '''dobin'''의 래퍼입니다 &lt;br /&gt;
| newbin ${FILESDIR}/vmware.sh vmware &lt;br /&gt;
|-&lt;br /&gt;
| newdoc &lt;br /&gt;
| N/A&lt;br /&gt;
| 지정된 파일을 명백하게 두번째 인자로 이름을 바꿔 설치하는 '''dodoc'''의 래퍼입니다 &lt;br /&gt;
| newdoc README README.opengl&lt;br /&gt;
|-&lt;br /&gt;
| newexe&lt;br /&gt;
| N/A ||지정된 파일을 명백하게 두번째 인자로 이름을 바꿔 설치하는 '''doexe'''의 래퍼입니다 &lt;br /&gt;
| newexe ${FILESDIR}/xinetd.rc xinetd&lt;br /&gt;
|-&lt;br /&gt;
| newins&lt;br /&gt;
| N/A ||지정된 파일을 명백하게 두번째 인자로 이름을 바꿔 설치하는 '''doins'''의 래퍼입니다 &lt;br /&gt;
| newins ntp.conf.example ntp.conf&lt;br /&gt;
|-&lt;br /&gt;
| newman&lt;br /&gt;
| N/A &lt;br /&gt;
| 지정된 파일을 명백하게 두번째 인자로 이름을 바꿔 설치하는 '''doman'''의 래퍼입니다 &lt;br /&gt;
| newman xboing.man xboing.6&lt;br /&gt;
|-&lt;br /&gt;
| newsbin&lt;br /&gt;
| N/A &lt;br /&gt;
| 지정된 파일을 명백하게 두번째 인자로 이름을 바꿔 설치하는 '''dosbin'''의 래퍼입니다 &lt;br /&gt;
| newsbin strings strings-static&lt;br /&gt;
|-&lt;br /&gt;
| prepall&lt;br /&gt;
| N/A &lt;br /&gt;
| '''prepallman''', '''prepallinfo''' 그리고 '''prepallstrip'''를 실행합니다. 또한 /opt/*/lib, /lib, /usr/lib 그리고 /usr/X11R6/lib 에 있는 모든 라이브러리가 실행가능한지 확인합니다. 또한 일부 흩어진 aclocal 매크로를 /usr/share/aclocal에 옮겨줍니다 &lt;br /&gt;
| prepall&lt;br /&gt;
|-&lt;br /&gt;
| prepalldocs&lt;br /&gt;
| N/A&lt;br /&gt;
| 이것이 수행하는 동작이 포티지 버전이 바뀌면서 변경되어 새로운 ebuild에서는 이 함수를 사용하지 않는 것이 좋습니다. &lt;br /&gt;
| prepalldocs &lt;br /&gt;
|-&lt;br /&gt;
| prepallinfo&lt;br /&gt;
| N/A &lt;br /&gt;
| /usr/share/info의 모든 info 파일을 재귀적으로 gzip으로 압축합니다 &lt;br /&gt;
| prepallinfo &lt;br /&gt;
|-&lt;br /&gt;
| prepallman &lt;br /&gt;
| N/A &lt;br /&gt;
| /opt/*/man/*, /usr/share/man/*, /usr/local/man/*, /usr/X11R6/share/man/* 에 있는 모든 맨 페이지를 gzip으로 압축하고 일부 심볼릭 링크 경로를 확실하게 수정합니다. &lt;br /&gt;
| prepallman &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 패키지 의존성 ===&lt;br /&gt;
==== 의존성이 중요한 이유 ====&lt;br /&gt;
포티지는 소스로부터 어떤 하나의 프로젝트 (프로그램이나 라이브러리) 를 빌드하는 통합적인 수단을 제공해주는 편의 스크립트의 그 이상입니다. 또한 ebuild에 지정하여 처리할 필요한 어떤 의존요소를 가져오고 설치할 것입니다.&lt;br /&gt;
&lt;br /&gt;
공식 ebuild에서는 모든 의존요소가 이미 지정되어 있어 '''emerge net-www/mozilla/mozilla-1.0'''을 실행하면, 포티지는 모질라를 빌드하고 실행하는데 필요한 모든 라이브러리가 모질라를 빌드하기 전에 적당하게 설치하는 것을 확실하게 할 것입니다.&lt;br /&gt;
&lt;br /&gt;
포티지는 또한 빌드타임 의존 요소와 실행시간 의존 요소를 구분합니다. (경고: 현재로서는, 포티지는 모든 빌드타임, 실행시간 의존요소와 나머지의 것들을 설치합니다. 다음 단계에서, 설치 내용을 손 볼 가능성이 있어, 실행 시간 의존 요소만 설치된 채로 남아있게 됩니다)&lt;br /&gt;
==== ebuild 파일(DEPENDS 요소)에 의존성을 지정하는 방법 ====&lt;br /&gt;
foo-x.y.z.ebuild에 있는 '''DEPEND''' 변수는 포티지에게 어떤 패키지를 빌드할 필요가 있는지를 알려줍니다. '''RDEPEND''' 변수는 foo를 실행하는데 필요한 패키지를 지정합니다. '''RDEPEND''' 는 DEPEND와 같다 해도 명시적으로 설정되어야 하는데 DEPEND에 기본으로 지정되&amp;gt;어 있는 것이 나중에 포티지로부터 제거되도록 계획되어 있기 때문입니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 5.1: Depend 예제|&amp;lt;nowiki&amp;gt;DEPEND=&amp;quot;virtual/opengl&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;nowiki&amp;gt;dev-libs/libxml2&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;RDEPEND=&amp;quot;${DEPEND}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
이는 foo-x.y.z를 빌드하도록 포티지에게 일러줍니다. virtual/opengl 과 dev-libs/libxml2 패키지가 필요합니다. 여기에는 opengl이나 libxml2의 어떤 버전이 필요한지 알려주진 않으며 이는 &amp;quot;실행할 어떤 것&amp;quot;을 의미합니다.&lt;br /&gt;
&lt;br /&gt;
이 &amp;quot;실행할 것&amp;quot;이 물론 조금 무섭(?)기도 하고, 일반적으론 동작하지 않을 것입니다. 그러나 라이브러리라면, 항상 100% 바이너리 호환을 지니게 하는 노력이 매우 어렵지만, 실제적으론 동작합니다. 다른 라이브러리에 대해, 물론 버전 의존 요소를 지정할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 5.2: 버전 예제|&amp;lt;nowiki&amp;gt;&amp;gt;=sys-apps/bar-1.2&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;=sys-apps/baz-1.0&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;gt;=&amp;lt;/nowiki&amp;gt; 와 =는 무얼 원하는지에 대한 판단을 수행합니다. sys-apps/bar는 버전 1.2 이상이면 됩니다 (이 얘기는 sys-apps/bar-2.0이면 된다는 얘깁니다). 그리고 sys-apps/baz의 버전은 1.0만 허용됩니다. 버전 개요에 대해 더 많이 알고 싶다면 [http://darkcircle.myhome.tv/wiki/wiki.php?GentooEbuildHowto&amp;amp;amp;action=show&amp;amp;amp;dummy=1#s-1.2.2 ebuild 파일 이름 짓기]에 있는 섹션을 보시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
버전 의존 요소를 지정하는 다른 방법은 다음과 같습니다:&lt;br /&gt;
&lt;br /&gt;
{{Example|코드 예제 5.3: 버전 의존요소 지정하기|&amp;lt;nowiki&amp;gt;~sys-apps/qux-1.0&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;=sys-apps/foo-1.2*&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;!sys-libs/gdbm&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
~sys-apps/qux-1.0 는 qux-1.0의 최신 포티지 리비전을 선택할 것입니다.&lt;br /&gt;
&lt;br /&gt;
=sys-apps/foo-1.2* 는 1.2시리즈의 최신 멤버를 선택하지만 1.3이상은 무시할 것입니다. 이 얘기는 foo-1.2.3 와 foo-1.2.0는 유효하지만, foo-1.3.3, foo-1.3.0 그리고 foo-1.1.0는 그렇지 않다는 것입니다. 이때 문제가 될 수 있는 foo-1.22.3 또한 일치할 것이라는 것 알아두&lt;br /&gt;
시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
!sys-libs/gdbm 는 이미 gdbm이 이머지 되었을 때 이 패키지가 이머지 되는 것을 막을 것입니다.&lt;br /&gt;
&lt;br /&gt;
==== 중요한 참고 ====&lt;br /&gt;
DEPEND와 RDEPEND변수에 잘못 지정하는 많은 경우들이 있습니다. 의존요소를 작성할 때 따라야 할 중요한 점들이 있습니다.&lt;br /&gt;
&lt;br /&gt;
* ''CATEGORY는 항상 포함합니다.''&lt;br /&gt;
예를 들어 '''&amp;gt;=x11-libs/gtk+-2'''지, '''&amp;gt;=gtk+-2'''가 아닙니다.&lt;br /&gt;
* ''&amp;gt;= 의존 요소에는 별표 문자(*)를 넣지 않습니다.''&lt;br /&gt;
예를 들어 '''&amp;gt;=x11-libs/gtk+-2*'''보다는 '''&amp;gt;=x11-libs/gtk+-2'''가 되어야 합니다.&lt;br /&gt;
* ''메타패키지를 의존 요소로 절대 걸지 않습니다.''&lt;br /&gt;
다시 말해 항상 libgnome과 같은 특정 라이브러리에 의존하는 gnome-base/gnome을 의존 요소로 걸면 안됩니다.&lt;br /&gt;
* ''한 줄에 하나의 의존 요소''&lt;br /&gt;
한 줄에 여러 의존요소를 적지 않습니다. 읽기 괴랄해지고 파악하기 어렵습니다.&lt;br /&gt;
* GTK: GTK+1 프로그램을 위해 항상 ''=x11-libs/gtk+-1.2*''를 사용합니다.&lt;br /&gt;
&lt;br /&gt;
덧붙여 여러분의 패키지에 모든 의존 요소가 완전히 작성되었는지 확인하는데 중요한 사항들입니다.&lt;br /&gt;
&lt;br /&gt;
* ''설치된 바이너리/라이브러리를 살펴봅니다''&lt;br /&gt;
DT_NEEDED 항목을 나열해보기 위해 scanelf -n 과 같은 도구를 사용합니다.&lt;br /&gt;
* ''configure.in이나 configure.ac를 살펴봅니다''&lt;br /&gt;
패키지를 검사하기 위해 이곳을 봅니다. pkg-config checks나 특정 버전을 확인하는 AM_* 함수를 사용하면 찾을 내용을 살펴볼 수 있습니다.&lt;br /&gt;
* ''포함된 .spec 파일을 살펴봅니다''&lt;br /&gt;
의존요소를 바로 볼 수 있는 방법은 관련된 의존 요소가 포함된 .spec파일을 찾아보는 것입니다. 그러나 의존 요소들의 결정적으로 완벽한 목록이 될 거라고 믿지는 마시기 바랍니다.&lt;br /&gt;
* ''패키지의 README와 INSTALL를 읽습니다''&lt;br /&gt;
패키지를 빌드하고 설치하기 위한 유용한 정보가 들어있기도 합니다.&lt;br /&gt;
* ''pkg-config, 문서 생성 프로그램 등의 비 바이너리 의존성을 상기합니다''&lt;br /&gt;
보통 빌드 과정에서는 intltool, libtool, pkg-config, doxygen, scrollkeeper, gtk-doc 등과 같은 의존 요소를 필요로 합니다. 명확하게 명시되었는지 확인해보도록 합니다.&lt;br /&gt;
&lt;br /&gt;
DEPEND 요소에 대한 최신 세부내용을 보시려면 ebuild의 맨 페이지 섹션 5를 참고바랍니다: '''man 5 ebuild'''.&lt;br /&gt;
&lt;br /&gt;
=== 테스트 및 배포 ===&lt;br /&gt;
==== ChangeLog ====&lt;br /&gt;
ebuild를 새로 받을(혹은 새로 작성할) 때마다 이에 대한 ChangeLog를 새로 고쳐(혹은 새로 만들어)야 합니다. skel.ChangeLog에는 기반으로 사용할 수 있는 간단한 ChangeLog가 있습니다.&lt;br /&gt;
&lt;br /&gt;
ChangeLog의 목적은 무엇을 했는지, 왜 했는지, 누가 했는지를 문서화 하는 것입니다. 이를 통해 개발자와 사용자가 변경사항을 쉽게 추적할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
ChangeLog는 기본적으로 사용자에게 초점이 맞춰져 있기 때문에, 이 시점에서 반드시 짧게 작성하는 것을 유지해야 하며, 내부의 기술적 세부내용에 대해 장황하게 늘어놓는 것을 삼가해야 합니다.&lt;br /&gt;
&lt;br /&gt;
==== 여러분의 ebuild를 따로 저장하기 ====&lt;br /&gt;
ebuild를 테스트 할 수 있게 하고, 포티지가 이것을 알아채게끔 하려면, 기존의 알려진 디렉터리에 이것(ebuild)들을 넣어야 합니다. 포티지는 /etc/make.conf에 설정할 수 있는 PORTDIR_OVERLAY변수를 사용할 것입니다. 사용할 디렉토리를 이 변수에 (/usr/local/portage 처럼) 설정할 필요가 있습니다.&lt;br /&gt;
&lt;br /&gt;
이 디렉토리에 /usr/portage와 같은 구조 (와 카테고리) 를 사용하여야 합니다.&lt;br /&gt;
&lt;br /&gt;
PORTDIR_OVERLAY를 사용할 때, ebuild는 시스템에 남아있게 되고, '''emerge sync'''를 수행해도, 포티지가 이들이 남아있음을 인지합니다.&lt;br /&gt;
&lt;br /&gt;
==== 패키지 시험 ====&lt;br /&gt;
이 패키지가 동작하는지 어떻게 테스트 할 것인지를 생각해보도록 합니다. 가끔 개발자는 패키지의 기본적인 기능성을 테스트 하기 위해 이미 들어간 '''make test'''나 '''make check'''루틴을 보유합니다. 만약 이렇다면 '''FEATURES=test ebuild foo-x.y.z.ebuild test'''를 실행할 때 '''make test'''나 '''make check'''루틴을 실행할 것입니다. 이게 깨졌다면 이게 제대로 동작하도록 고쳐보려 할 것입니다 (그리고 업스트림 개발자에게 패치를 제공할 것입니다).&lt;br /&gt;
&lt;br /&gt;
이 상황이 고려되지 않았다면 '''src_test''' 루틴을 ebuild에 넣는 것을 고려해보도록 합니다. '''src_install'''루틴을 수행하기 전에 이것을 먼저 실행할 것이고 여러 아키텍처에서 프로그램이 동작하는 것을 시험하는데 매우 도움이 될 수 있을 것입니다. 여기에 루틴을 추가&lt;br /&gt;
하여 패키지의 기능에 대한 지식을 필요로 하지 않는다면 아키텍처 개발자는 퍽이나 좋아라 할 것입니다.&lt;br /&gt;
&lt;br /&gt;
ebuild의 일반적인 요구사항을 염두에 두기 바랍니다. '''src_test'''루틴은 반드시 대화형이어선 안됩니다. 만약 시험 루틴이 다른 패키지에 의존한다면 '''test''' USE플래그를 사용하여 선택적 컴파일 시간의 '''DEPEND'''ancy를 지정할 수 있도록 합니다. 또한, '''src_test''' 루틴은 사용자들이 포티지의 실행으로 종종 성공적으로 실행하지 못하는 그래픽 X 프로그램을 위해서라면 그다지 추천하지 않는다는 것을 알아두셨으면 합니다.&lt;br /&gt;
&lt;br /&gt;
==== 유용한 시험 도구 ====&lt;br /&gt;
ebuild를 작성하고 관리하기 위해 도움을 줄 몇몇 유용한 도구들이 있습니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 도구&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 패키지&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 설명&lt;br /&gt;
|-&lt;br /&gt;
| repoman &lt;br /&gt;
| sys-apps/portage &lt;br /&gt;
| 절차상 CVS 체크를 도와주는 개발자 전용 도구 입니다. 일반적인 수많은 QA를 수행하고, 포티지 트리를 깨뜨리지 않을 CVS에 추가된 파일을 확인합니다&lt;br /&gt;
|-&lt;br /&gt;
| ccache &lt;br /&gt;
| dev-util/ccache &lt;br /&gt;
| 미리 처리된 파일을 유지하는 도구이며, 재 컴파일을 매우 빠르게 처리합니다. '''ccache'''를 /etc/make.conf의 FEATURES 변수에 넣어주셔야 합니다&lt;br /&gt;
|-&lt;br /&gt;
| sandbox &lt;br /&gt;
| sys-apps/sandbox &lt;br /&gt;
| 샌드박스 환경을 만드는 쉘을 실행합니다. 포티지로 패키지 내용을 빌드하고 직접 디버깅하는 동일한 환경으로 진입하는데 유용합니다.&lt;br /&gt;
|-&lt;br /&gt;
| echangelog &lt;br /&gt;
| app-portage/gentoolkit-dev &lt;br /&gt;
| 새 ChangeLog를 만들거나, 이미 존재한다면 항목을 추가할 수 있습니다. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:GenooTrans]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
		
	</entry>
</feed>