2013년 11월 30일 토요일

[Linux] 특정파일에서 특정문자를 찾을 때

find ./ -type f | xargs grep 문자열

이렇게 찾는 경우가 많이 있는데요 이렇게 했을 경우 띄워쓰기한 파일명에서 문자열을 찾지 못합니다.

이럴 경우

find ./ -type f -exec grep -l  문자열 {} \;

라고 해주면 문자열이 포함된 파일명만 보여 줍니다.

인버스 도메인 신청/위임 및 서브도메인 위임

- 작성자 : san2(at)linuxchanne.net
- 작성일 : 2002.04.25
- 수  준 : 초중급이상

http://www.linuxchannel.net/docs/inverse-subdomain.txt

이문서는 인버스 도메인 신청,위임 및 서브도메인 위임에
대해서 개략적인 설명을 그 내용으로 하고 있습니다.

----------------------------------------------------------
1. 인버스 도메인
2. 인버스 도메인은 어떤 경우에 사용되나?
3. 인버스 도메인 신청은?
4. 서브 도메인 생성 및 인버스 도메인 위임
  4-1. 하나의 C클래스(192.168.11.0)를 통째로 위임할 경우
  4-2. 하나의 C클래스(192.168.10.0)중 일부분을 위임할 경우
5. 후기
----------------------------------------------------------


1. 인버스 도메인(inverse domain)

역도메인이라고도 합니다. 이는 IP주소를 역으로 나열해서 뒤에
옥텟(octet)단위의 'in-addr.arpa' 이라는 특수 도메인이 붙은
도메인을 말하며, 역변환(IP주소->FQDN 리졸빙) zone에서
PTR(PoinTeR) 레코드를 사용해서 FQDN을 지정합니다.

* FQDN(Fully Qualified Domain Name)
* 옥텟(octet)단위 :
  IP주소를 8비트씩 묶어 dot(.)으로 구분하여 표현

IP주소가 192.168.10.3 이라면
.
arap.
in-addr.arpa.
192.in-addr.arpa.
168.192.in-addr.arpa.
10.168.192.in-addr.arpa.
3.10.168.192.in-addr.arpa.

3.10.168.192.in-addr.arpa. 도메인은 상위의 10.168.192.in-addr.arpa.
도메인에서 위임받은 서브도메인입니다.
또한
특별하게 도메인을 쪼개어 위임하지 않는 이상, 위와 같은
블럭단위 -옥텟(octet)단위- 인버스 도메인을 사용합니다.

일반적으로 지역 node에서 이 인버스 도메인을 관리하는데
A,B,C클래스 단위로 관리 및 위임합니다.


2. 인버스 도메인은 어떤 경우에 사용되나?

역변환이 이루어질때 사용됩니다.
예를들어, 원격의 다른 네트워크로 FQDN이 아닌 IP 주로 POP3 와
같은 서버에 접속할때 IP주소를 FQDN으로 역변환합니다.
(POP3 서버에서 이 기능을 Off할 수 있음)
간혹 원격의 POP3에 IP주소로 접속할때 상당히 접속이 느려진
경험을 했을 겁니다.
이런 경우는 LocalDNS에서 역변환하는 과정중 네임스페이스가 깨져
역변환을 제대로 못한 경우입니다.
상대방 node에서나 네임서버 zone에서 위임받은 인버스 도메인을
설정해줘야합니다.

하지만,
굳지 인버스 도메인을 위임받지 않더라도, 같은 LocalDNS을 사용하고
이 LocalDNS 가 설정한(위임받지 않은) IP주소로 접속하면 그만입니다.
다만 다른 외부 네트워크에 IP주소로 접속할때 상대방 node나
zone에서 인버스 도메인을 (위임받아) 설정하지 않으면 곤란하죠...


3. 인버스 도메인 신청은?

인버스 도메인을 신청할때 해당 ISP로 전화해서 문의하면 지역 node로
연결해 줄겁니다.(경기 남부지역일 경우 대부분 동수원)
이때 사업장(해당 기관)에서 C클래스 단위가 아닌 C클래스의 일부분을
사용할 경우는 C클래스나 일부분 통째를 위임해주지 않습니다.
어것 때문에 작년 가을쯤에 강력하게 항의(?)했는데 당담자 분이
쩔쩔매더군요...

'왜 안됩니까? 25,26,27 비트 정도로 서브도메인을 생성해 주면 되지
않습니까?'
'.....'
'그럼 안된다면 어떤 규정이나 원칙이 있나요?'
'.....'
'그럼 제가 포기하죠.....1,2차 네임서버만 설정해 주세요...'
'네...'

현시점에서 상당히 많은 작은 규모의 사업장에서는 C클래스 단위가 아닌
255.255.255.128, 255.255.255.192, 255.255.255.224 와 같은
넷매스크를 많이 사용합니다.
위와 같은 넷매스크를 사용하고 있는 사업장에서는 호스트가 생성될
때마다 인버스 도메인을 설정해 달라고 괴롭게 해야하는 판국입니다
....T.T

$ nslookup aaa.bbb.ccc.ddd 168.126.63.1
...
** server can't find ddd.ccc.bbb.aaa.in-addr.arpa.: NXDOMAIN
$

위와 같이 localDNS가 아닌 **받드시** 다른 네임서버(168.126.63.1)에
질의해서 역변환이 되지 않는다면 신청하는 것이 좋습니다(필요하다면).
(KLDP는 인버스 도메인이 없군요)

dig를 사용한다면

$ dig @168.126.63.1 -x 202.30.50.90
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19622
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;90.50.30.202.in-addr.arpa.     IN      PTR

;; ANSWER SECTION:
90.50.30.202.in-addr.arpa. 3600 IN      PTR     www.nic.or.kr.

;; AUTHORITY SECTION:
50.30.202.in-addr.arpa. 3600    IN      NS      ns1.nic.or.kr.
50.30.202.in-addr.arpa. 3600    IN      NS      ns2.nic.or.kr.

;; ADDITIONAL SECTION:
ns1.nic.or.kr.          3600    IN      A       202.30.50.51
ns2.nic.or.kr.          3600    IN      A       218.145.52.186

;; Query time: 35 msec
;; SERVER: 168.126.63.1#53(168.126.63.1)
;; WHEN: Wed Apr 24 12:13:11 2002
;; MSG SIZE  rcvd: 138
$

또는

$ dig @168.126.63.1 ddd.ccc.bbb.aaa.in-addr.arpa PTR

host 를 사용한다면

$ host -t PTR aaa.bbb.ccc.ddd 168.126.63.1


4. 서브 도메인 생성 및 인버스 도메인 위임

서브도메인을 생성 및 위임할때 퍼블릭도메인은 비교적 간단하나
인버스 도메인 생성및 위임은 상당히 까다롭습니다.
(특히 클래스 단위로 위임하지 않는다면)


4-1. 하나의 C클래스(192.168.11.0)를 통째로 위임할 경우

위임받은(또는 할당받은) IP주소가 C클래스 단위로 2개 이상일
경우에 해당됨(비교적 쉬움).

----------------------------------------------------------
; 퍼블릭 서브 도메인 생성 및 위임.
; kernel.linux.ac.kr 이라는 서브 도메인을 생성하고,
; 서브 도메인의 1차 네임서버는 ns.kernel.linux.ac.kr
; 2차 네임서버는 ns2.kernel.linux.ac.kr로 위임함.
;
$ORIGN linux.ac.kr.
;...
kernel IN NS ns.kernel
       IN NS ns2.kernel
;...
ns.kernel  IN A 192.168.11.3
ns2.kernel IN A 192.168.11.4
;...
----------------------------------------------------------

----------------------------------------------------------
; 인버스 도메인 위임.
; 192.168.11.0/24 네트워크 모두를
; 1차 네임서버는 ns.kernel.linux.ac.kr
; 2차 네임서버는 ns2.kernel.linux.ac.kr로 위임함.
;
$ORIGN 11.168.192.in-addr.arpa.
;...
@ IN NS ns.kernel.linux.ac.kr.
  IN NS ns2.kernel.linux.ac.kr.
;...
----------------------------------------------------------

서브도메인의 named.conf 파일

zone 'kernel.linux.ac.kr' IN {
type master;
file 'zone-kernel.linux.ac.kr';
...
};
zone '11.168.192.in-addr.arpa' IN {
type master;
file 'zone-11.168.192';
...
};


4-2. 하나의 C클래스(192.168.11.0)중 일부분을 위임할 경우

예: 네트워크 192.168.11.192/26
192.168.11.193 ~ 192.168.11.254까지의 62개 위임.

----------------------------------------------------------
; 퍼블릭 서브 도메인 생성 및 위임.
; kernel.linux.ac.kr 이라는 서브 도메인을 생성하고,
; 서브 도메인의 1차 네임서버는 ns.kernel.linux.ac.kr
; 2차 네임서버는 ns2.kernel.linux.ac.kr로 위임함.
;
$ORIGN linux.ac.kr.
;...
kernel IN NS ns.kernel
       IN NS ns2.kernel
;...
ns.kernel  IN A 192.168.11.193
ns2.kernel IN A 192.168.11.194
;...
----------------------------------------------------------

인버스 도메인 생성 및 위임은 상당히 까다로운데 두가지 정도로
설정할 수 있습니다.

[방법1] NS 레코드를 사용할 경우(권장하지 않음)
(단순하면서 상당히 반복 지루하고 지저분함)

----------------------------------------------------------
; 인버스 서브 도메인 자체 위임.
; 192.168.11.192/26 네트워크 모두를
; 1차 네임서버는 ns.kernel.linux.ac.kr
; 2차 네임서버는 ns2.kernel.linux.ac.kr로 위임함.
;
$ORIGN 11.168.192.in-addr.arpa.
;...
193 IN NS ns.kernel.linux.ac.kr.
    IN NS ns2.kernel.linux.ac.kr.
;
194 IN NS ns.kernel.linux.ac.kr.
    IN NS ns2.kernel.linux.ac.kr.
;
195 IN NS ns.kernel.linux.ac.kr.
    IN NS ns2.kernel.linux.ac.kr.
;...
254 IN NS ns.kernel.linux.ac.kr.
    IN NS ns2.kernel.linux.ac.kr.
;
; 위의 내용을 간단하게 $GENERATE 지시자를 사용하여
; 2줄로 요약할 수 있음(bind 8.2.3이후,bind 9.x)
;
$GENERATE 193-254 $ IN NS ns.kernel.linux.ac.kr.
$GENERATE 193-254 $ IN NS ns2.kernel.linux.ac.kr.
----------------------------------------------------------

서브도메인의 named.conf 파일

zone 'kernel.linux.ac.kr' IN {
type master;
file 'zone-kernel.linux.ac.kr';
...
};
zone '193.11.168.192.in-addr.arpa' IN {
type master;
file 'zone-193.11.168.192';
...
};
zone '194.11.168.192.in-addr.arpa' IN {
type master;
file 'zone-194.11.168.192';
...
};
...
zone '254.11.168.192.in-addr.arpa' IN {
type master;
file 'zone-254.11.168.192';
...
};

서브도메인의 zone-193.11.168.192 파일
----------------------------------------------------------
$ORIGN 193.11.168.192.in-addr.arpa.
@ IN SOA ns.kernel.linux.ac.kr. root.kernel.linux.ac.kr. ()
  IN NS ns.kernel.linux.ac.kr.
  IN NS ns2.kernel.linux.ac.kr.
  IN PTR ns.kernel.linux.ac.kr.
----------------------------------------------------------

[방법2] CNAME 레코드를 사용할 경우
(RFC 2317)

----------------------------------------------------------
; 인버스 서브 도메인 위임(CNAME으로 블럭 생성).
; 192.168.11.192/26 네트워크 모두를
; 1차 네임서버는 ns.kernel.linux.ac.kr
; 2차 네임서버는 ns2.kernel.linux.ac.kr로 위임함.
;
$ORIGN 11.168.192.in-addr.arpa.
;...
kernel IN NS ns.kernel.linux.ac.kr.
       IN NS ns2.kernel.linux.ac.kr.

193    IN CNAME 193.kernel
194    IN CNAME 194.kernel
195    IN CNAME 195.kernel
;...
254    IN CNAME 254.kernel
;
; 위의 내용을 간단하게 $GENERATE 지시자를 사용하여
; 한줄로 요약할 수 있음(bind 8.2.3이후,bind 9.x)
;
$GENERATE 193-254 $ IN CNAME $.kernel
----------------------------------------------------------

서브도메인의 named.conf 파일

zone 'kernel.linux.ac.kr' IN {
type master;
file 'zone-kernel.linux.ac.kr';
...
};
zone 'kernel.11.168.192.in-addr.arpa' IN {
type master;
file 'zone-kernel.11.168.192';
...
};

서브도메인의 zone-kernel.11.168.192 파일
----------------------------------------------------------
$ORIGN kernel.11.168.192.in-addr.arpa.
@ IN SOA ns.kernel.linux.ac.kr. root.kernel.linux.ac.kr. ()
  IN NS ns.kernel.linux.ac.kr.
  IN NS ns2.kernel.linux.ac.kr.
;...
193 IN PTR ns.kernel.linux.ac.kr.
193 IN PTR ns2.kernel.linux.ac.kr.
;...
195 IN PTR mail.kernel.linux.ac.kr.
;...
198 IN PTR www.kernel.linux.ac.kr.
;...
----------------------------------------------------------


5. 후기

생략

[Linux] 큐메일을 이용한 웹호스팅용 POP + SMTP 메일

==========================================

         큐메일을 이용한 웹호스팅용 POP + SMTP 메일서버 구축하기

                             2001년 3월 28일 작성(REDHAT 6.2 기반)
                             2001년 7월 29일 수정(REDHAT 7.1 기반)
                             2001년 9월 5일 수정(오타,qmail-scanner설치법)

                             작성자 : 서진우 (alang@sysmng.com)

** 참고 사이트

http://qmail.kldp.org
http://kldp.org/~eunjae


===========================================

큐메일은 기존의 sendmail 을 대체하는 메일 전송 에이전트( MTA )로써 보다 안정하고
빠른 속도로 많이 알려져 있다. 하지만 어려운 설치 과정과 많은 설정파일때문에 일부
관리자들만이 사용하고 있다. 이런 큐메일에 몇가지 프로그램을 같이 사용하여 웹호스
팅용 메일 서버 패키지로 사용하고자 한다. 기존의 sendmail 에서 할수 없었던 많은
기능을 발휘할수 있을것이다.


1. 주요 기능

* 무한정(?) 도메인과 pop 메일 아이디를 발급할수 있다.
* 한개의 시스템 계정생성으로 모든 버츄얼 도메인,pop 계정을 만들수 있다.
( 불필요한 유저 생성을 막을수 있다. - 보안적인 측면에 유리 )
* 각 도메인 마다 메일 계정, 메일링 리스트의 한계를 설정할수 있다.
* 웹인터페이스로 메일 추가,삭제,메일링 및 각 도메인에 대한 메일 관리가 가능하다.
* 유저별 quota 설정이 가능하다.
* 각 도메인 관리자가 자기 도메인의 메일 계정 추가 삭제가 가능하다.
* 가상 메일 없이도 도메인 마다 똑같은 사용자 계정을 만들수 있다.

위의 내용은 웹호스팅용 메일 시스템으로 아주 유리한 기능들이다. 이밖에 다양한
기능들이 많이 있다.


2. 필요한 프로그램

qmail-1.03.tar.gz
qmail103.patch
rblsmtpd-0.70.tar.gz
ucspi-tcp-0.88.tar.gz
daemontools-0.70.tar.gz
autorespond-1.0.0.tar.gz
qmailadmin-0.42.tar.gz
vpopmail-4.9.10.tar.gz
ezmlm-0.53.tar.gz
ezmlm-idx-0.40.tar.gz


3. 설치

qmail 컴파일 설치

위 프로그램들을 모두 /usr/local/src/qmail 디렉토리 및에 옮겨두고 tar 를 푼다.
그리고 qmail 이 설치될 디렉토리를 만든다. 그런뒤 qmail103.patch 파일을
qmail-1.03 디렉토리 안에 둔다. 그런뒤 ..

[root@linux qmail]# cd qmail-1.03
[root@linux qmail]# patch < qmail103.patch
[root@linux qmail-1.03]# mkdir /var/qmail

INSTALL.ids 파일을 편집한다.(qmail 에 필요한 계정과 그룹들이다. 해당 OS에 맞추어
편집한다.)

[root@linux qmail-1.03]# vi INSTALL.ids
-----------------------------------------------------
groupadd nofiles
useradd -g nofiles -d /var/qmail/alias alias
useradd -g nofiles -d /var/qmail qmaild
useradd -g nofiles -d /var/qmail qmaill
useradd -g nofiles -d /var/qmail qmailp
groupadd qmail
useradd -g qmail -d /var/qmail qmailq
useradd -g qmail -d /var/qmail qmailr
useradd -g qmail -d /var/qmail qmails
-----------------------------------------------------

[root@linux qmail-1.03]# sh INSTALL.ids

qmail 관련 계정,그룹이 생성되었는지 확인한다.

[root@linux qmail-1.03]# cat /etc/passwd

컴파일 한다.

[root@linux qmail-1.03]# make
[root@linux qmail-1.03]# make setup check

기본 /var/qmail/control 및의 설정 파일의 설정을 위해 다음을 실행한다.

[root@linux qmail-1.03]# ./config

만일 여기서 정상적으로 실행되지 않으면 직접적으로 설정을 실행하는 방법을
사용한다. ( 단 DNS 에 문제가 있을수도 있다. )

[root@linux qmail-1.03]# ./config-fast test.net


qmail 을 위한 몇가지 부수적은 프로그램을 설치한다.

[root@linux qmail]# tar xzvf ucspi-tcp-0.88.tar.gz
[root@linux qmail]# cd ucspi-tcp-0.88
[root@linux ucspi-tcp-0.88]# make
[root@linux ucspi-tcp-0.88]# make setup check

Redhat 7.1 부터는 glibc 라이브러리에 큰 변화가 있기 때문 daemontools-0.70
과 rblsmtpd-0.70 을 그냥 컴파일 하면 error 가 발생한다. 컴파일전에 다음과
같이 소스를 수정해 준다.

[root@linux qmail]# tar xzvf daemontools-0.70-man.tar.gz
[root@linux qmail]# cd daemontools-0.70
[root@linux daemontools-0.70]# vi tai64nlocal.c
-------------------------------------------------------
처음 헤드 부분의 sys/time.h 를 time.h 로 수정한다.
-------------------------------------------------------

[root@linux daemontools-0.70]# make ; make setup check

[root@linux qmail]# tar xzvf rblsmtpd-0.70.tar.gz
[root@linux qmail]# cd rblsmtpd-0.70
[root@linux rblsmtpd-0.70]# vi Makefile
------------------------------------------------------------------

Makefile 화일 에서는

rblsmtpd: \
load rblsmtpd.o txt.o commands.o ip.o getopt.a strerr.a substdio.a \
stralloc.a alloc.a error.a case.a env.a str.a fs.a dns.lib socket.lib
        ./load rblsmtpd txt.o commands.o ip.o getopt.a strerr.a \
        substdio.a stralloc.a alloc.a error.a case.a env.a str.a \
        fs.a  `cat dns.lib` `cat socket.lib`

이부분을
rblsmtpd: \
load rblsmtpd.o txt.o commands.o ip.o getopt.a strerr.a substdio.a \
stralloc.a alloc.a error.a case.a env.a str.a fs.a dns.lib socket.lib
        ./load rblsmtpd txt.o commands.o ip.o getopt.a strerr.a \
        substdio.a stralloc.a alloc.a error.a case.a env.a str.a \
        fs.a  `cat dns.lib` `cat socket.lib` -L/usr/lib -lresolv
                                             ^^^^^^^^^^^^^^^^^^^ 이렇게
------------------------------------------------------------------


[root@linux rblsmtpd-0.70]# vi rblsmtpd.c
---------------------------------------------------------
rblsmtpd.c 에서는 맨위에
#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
을 추가하시면 에러가 안날껍니다
---------------------------------------------------------

참고 : ucspi-tcp 0.86 이상부터는 rblsmtpd 가 포함되어져 있습니다.
따로 설치 하지 않아도 될거 같습니다. 오히려 설치하니깐..tcp.smtp 에서
제대로 smtp 기능을 재대로 인증하지 못하는거 같더군요..

autorespond 는 직접 컴파일 해야 한다.

[root@linux qmail]# tar xzvf autorespond-1.0.0.tar.gz
[root@linux qmail]# cd autorespond-1.0.0
[root@linux autorespond-1.0.0]# gcc -Wall -o autorespond autorespond.c
[root@linux autorespond-1.0.0]# cp autorespond /usr/local/bin/


모두 이상없이 설치가 되었다면 다시 qmail 을 위해 파일을 만든다.

[root@linux qmail]# vi /var/qmail/rc
----------------------------------------------------------------

#!/bin/sh
exec env - PATH='/var/qmail/bin:$PATH' \
qmail-start ./Maildir/ splogger qmail

----------------------------------------------------------------

[root@linux qmail]# chmod a+x /var/qmail/rc

다음은 큐메일 데몬을 위한 디렉토리와 파일들을 생성.

mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log
chmod +t /var/qmail/supervise/qmail-send
chmod +t /var/qmail/supervise/qmail-smtpd

/var/qmail/supervise/qmail-send/run 의 내용
------------------------------------------
#!/bin/sh
exec /var/qmail/rc

/var/qmail/supervise/qmail-send/log/run 의 내용
----------------------------------------------
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail

/var/qmail/supervise/qmail-smtpd/run 의 내용
-------------------------------------------
#!/bin/sh
ALIAS_UID=`id -u alias`
ALIAS_GID=`id -g alias`
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -v -p -x/etc/tcp.smtp.cdb \
-u $ALIAS_UID -g $ALIAS_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1

/var/qmail/supervise/qmail-smtpd/log/run 의 내용
-----------------------------------------------
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
/var/log/qmail/smtpd

이렇게 편집한 파일들에 실행 권한을 준다.

chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-send/log/run
chmod 755 /var/qmail/supervise/qmail-smtpd/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run


다음은 qmail-smtpd 를 위한 로그 디렉토리 만들기

mkdir -p /var/log/qmail/smtpd
chown qmaill /var/log/qmail /var/log/qmail/smtpd

다음 파일에는 qmail smtp 데몬이 메일을 중계할 주소를 적어주는 것이다.
211.201.133.135 은 당연히 설치할 서버의 주소로바꿔야 한다.
그외 메일을 중계 해줄 서버의 주소가 있다면 같은 형식으로 추가한다.

vi /etc/tcp.smtp
------------------------------------------
127.0.0.1:allow,RELAYCLIENT=''
211.201.133.135:allow,RELAYCLIENT=''
------------------------------------------

후에 이 파일에 변경이 있는 경우 다음의 qmail 부트 스크립트를 이용해 다음과
같이 한다.

/etc/rc.d/init.d/qmail cdb


알리아스 설정

만약 주 도메인의 메일 계정들도 모두 vpopmail 로 관리할 것이 아니라면
(필자는 주 도메인의 메일 계정들도 모두 vpopmail로 관리할것을 권장한다.)
몇가지 알리아스를 설정해 준다. 여기서 silver 는 root, postmaster 등으로 오는
메일을 받을 일반계정이다.

cd ~alias
echo alang > .qmail-mailer-daemon
echo alang > .qmail-postmaster
echo alang > .qmail-root

qmail 부트 파일

다음은 qmail 데몬의 부트 스크립트이다. /etc/rc.d/init.d/qmail 로 만들어준다.

vi /etc/rc.d/init.d/qmail
------------------------------------------------------------------

#!/bin/sh
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 80 80
# description: sendmail을 대체하는 빠르며, 안정적이고, 유연한 MTA

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = 'no' ] && exit 0

PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin
export PATH

case '$1' in
  start)
    echo -n 'Starting qmail: svscan'
    cd /var/qmail/supervise
    env - PATH='$PATH' svscan &
    echo $! > /var/run/svscan.pid
    echo '.'
    ;;

  stop)
    echo -n 'Stopping qmail: svscan'
    kill `cat /var/run/svscan.pid`
    echo -n ' qmail'
    svc -dx /var/qmail/supervise/*
    echo -n ' logging'
    svc -dx /var/qmail/supervise/*/log
    echo '.'
    ;;
  stat)
    cd /var/qmail/supervise
    svstat * */log
    ;;
  doqueue|alrm)
    echo 'Sending ALRM signal to qmail-send.'
    svc -a /var/qmail/supervise/qmail-send
    ;;
  queue)
    qmail-qstat
    qmail-qread
    ;;
  reload|hup)
    echo 'Sending HUP signal to qmail-send.'
    svc -h /var/qmail/supervise/qmail-send
    ;;
  pause)
    echo 'Pausing qmail-send'
    svc -p /var/qmail/supervise/qmail-send
    echo 'Pausing qmail-smtpd'
    svc -p /var/qmail/supervise/qmail-smtpd
    ;;
  cont)
    echo 'Continuing qmail-send'
    svc -c /var/qmail/supervise/qmail-send
    echo 'Continuing qmail-smtpd'
    svc -c /var/qmail/supervise/qmail-smtpd
    ;;
  restart)
    echo 'Restarting qmail:'
    echo '* Stopping qmail-smtpd.'
    svc -d /var/qmail/supervise/qmail-smtpd
    echo '* Sending qmail-send SIGTERM and restarting.'
    svc -t /var/qmail/supervise/qmail-send
    echo '* Restarting qmail-smtpd.'
    svc -u /var/qmail/supervise/qmail-smtpd
    ;;
  cdb)
    tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
    chmod 644 /etc/tcp.smtp*
    echo 'Reloaded /etc/tcp.smtp.'
    ;;
  help)
    cat << HELP
   stop -- stops mail service (smtp connections refused, nothing goes out)
  start -- starts mail service (smtp connection accepted, mail can go out)
  pause -- temporarily stops mail service (connections accepted, nothing leaves)
   cont -- continues paused mail service
   stat -- displays status of mail service
    cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
  queue -- shows status of queue
   alrm -- same as doqueue
    hup -- same as reload
HELP
   ;;
  *)
    echo 'Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue|help}'
    exit 1
    ;;
esac

exit 0
------------------------------------------------------------------


vpopmail 설치

vpopmail 은 가상 도메인 추가, 설정, pop 유저 설정과 pop3 데몬등의 기능을 한다.

컴파일과 설치

설치하기 전에 vpopmail 이 사용할 유저와 그룹을 만든다.

groupadd vchkpw
useradd -g vchkpw vpopmail

vpopmail 을 설치하자.

tar xzf vpopmail-4.9.10.tar.gz
cd vpopmail-4.9.10

MySQL 사용하지 않을 경우

설치시 몇가지 옵션이 있는데 자세한것은 vpopmail faq 를 읽어보도록.
보통 다음 옵션만 주고 컴파일 하면 된다.

./configure --enable-default-domain=test.net
make
make install-strip



MySQL을 사용 할 경우

MySQL db를 사용하려 한다면, 컴파일 하기전에 먼저 vmysql.h 를 열어서
sql 서버를 억세스할수 있는 user와 암호등을 설정해 주어야 한다.
테이블을 생성/삭제 할수 있는 사용자 이여야하므로 보통 root 나 해당 유저로
설정해 준다.

./configure --enable-default-domain=test.net --enable-mysql=y \
   --enable-sqlincdir=/usr/local/mysql/include/mysql \
   --enable-sqllibdir=/usr/local/mysql/lib/mysql

make
make install-strip


이때 --enable-large-site=n|y 옵션을 사용할수도 있는데 이것은, 디폴트로 vpopmail
은 모든도메인, 유저 정보를 한개의 테이블에서 관리한다. 만약 각각의 도메인에
많은 메일유저가있다면 y 로 설정하면, vpopmail은 도메인별로 테이블을 생성,유저
정보를 관리한다.

만약 sql 헤더파일이나 라이브러리를 찾지 못한다며 컴파일에 실패한다면,
--enable-sqlincdir= sql 헤더파일 경로. --enable-sqllibdir= sql 라이브러리
경로 등을 ./configure 할때 추가 해준다.

위의 예에서 test.net 는 주 서버의 도메인 이름이다. 이것을 설정하면 주서버의
메일 계정도 모두 가상 도메인의 메일 계정과 동일하게 관리 할수 있다.
(이렇게 하는 것을 권장한다)

설치가 되었다면 ~vpopmail 안에는

bin
doc
domains
etc
include
lib
users
등의 디렉토리과 필요한 바이너리들이 생겼을 것이다.



pop3 데몬 시동 파일

vpopmail 의 pop3 데몬 시동 파일을 /etc/rc.d/init.d 에 만든다.

#!/bin/sh
env - PATH='/var/qmail/bin:/usr/local/bin' \
tcpserver 0 pop-3 /var/qmail/bin/qmail-popup test.net \
/home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir &

위와 같은 파일을 pops 등의 이름으로 만들고 실행퍼미션을 주고 부팅시 켜질수
있도록 한다. 방법은 밑에...


도메인, 메일 계정 추가하기

~vpopmail/bin 디렉토리 안에 가상 도메인 관리를 위한 바이너리들이 있는데
다음과 같은 기능을한다.

표 1. 각 바이너리들의 용도

vadddomain :
가상 도메인을 추가한다. postmaster 암호를 물어보는데 이것은 다음에
설치할 qmailadmin 웹 인터페이스에서 로그인 할때 물어볼 암호이다.
형식은  [ vadddomain 도메인명 ]

vdeldomain :
가상 도메인과 모든 유저를 삭제한다. vdeldomain 도메인명

vadduser :
pop 메일 유저 계정을 만든다.  [ vadduser alang@test.net ]

vdeluser :
pop 메일 유저 삭제. [ vdeluser alang@test.net ]

vpasswd :
메일 유저의 암호 바꾸기 [ vpasswd alang@test.net ]

vsetuserquota :
각 유저 별로 quota 설정을 할수 있다. [ vsetuserquota alang@test.net 51200 ]
(단위는 byte 이다).
vpopbull :
서버에 설정되어 있는 모든 유저들에게 한번에 메일을 보낼때 유용하게 사용할수
있다.  


이제 도메인을 추가하자. 위에서 주 도메인도 vpopmail에서 관리하기로 했다면
주 도메인과 메일 계정들도 추가해야 한다.

만약 주 도메인이 test.net 이고, 추가할 가상 도메인이 zzang911.org,
zzang911.co.kr 라고 한다면 다음과 같이 한다
(추가하기 전에 가상 도메인들의 DNS MX 레코드의 IP주소가 주 서버로 되어있는지
확인 해보자).

vadddomain test.net
vadddomain tru64unix.co.kr

재대로 설정파일이 변경이 되었는지 확인해 보자.

cat /var/qmail/control/locals
------------------------------------------------
localhost

주 도메인도 vpopmail이 관리하기로 했다면 /var/qmail/control/locals 파일의
내용은 localhost 만이 있어야 정상이다. 다른것이 있으면 지운다.


cat /var/qmail/control/virtualdomains
-----------------------------------------------
test.net:test.net
tru64unix.co.kr:tru64unix.co.kr

cat /var/qmail/users/assign
-----------------------------------------------
+test.net-:test.net:515:510:/home/vpopmail/domains/test.net:-::
+tru64unix.co.kr-:tru64unix.co.kr:515:510:~vpopmail/domains/tru64unix.co.kr:-::

sendmail 에서 qmail 로의 전환

모든 설정이 확실히 되었다고 생각이 들면 sendmail을 죽이고 qmail로 전환한다.

/etc/rc.d/init.d/sendmail stop : sendmail 죽인다.

이제 기존의 sendmail 바이너리를 qmail 의 것으로 바꾼다.

mv /usr/lib/sendmail /usr/lib/sendmail.old
mv /usr/sbin/sendmail /usr/sbin/sendmail.old
ln -s /var/qmail/bin/sendmail /usr/lib
ln -s /var/qmail/bin/sendmail /usr/sbin

/etc/rc.d/init.d/qmail start : qmail 가동  
/etc/rc.d/init.d/pops : pop 가동

일일이 위 두 데몬을 띄우기 싫으시면 하나의 qmailstart 라는 간단한 스크립트를
만들고 이것을 /etc/rc.d/rc.local 및에 추가하여 부팅때 마다 실행하도록 한다.

vi /etc/rc.d/init.d/qmailstart
-----------------------------------------------
/etc/rc.d/init.d/qmail start
/etc/rc.d/init.d/pops

이로써 MS 의 아웃룩이나 Netscape 의 메일메신져 에서 메일을 받아보실수가 있다.
여기서 주의 할것.

주 도메인 이외의 도메인 pop3 메일 계정 사용자들은 메일 클라이언트의
유저 이름을 my_id@babo2.com 과 같이 아이디@도메인명 으로 모두 써주어야
pop 로긴이 가능하다.


qmailadmin 설치


qmailadmin 설치시에는 vpopmail 을 mysql 사용 안함으로 설치 하세요.

/usr/local/src/qmail 가서

tar xzf ezmlm-0.53.tar.gz
tar xzf ezmlm-idx-0.40.tar.gz
mv -f ezmlm-idx-0.40/* ezmlm-0.53/
cd ezmlm-0.53
patch < idx.patch
make
make man
make setup

ezmlm 은 /usr/local/bin/ezmlm/ 에 설치될 것이다.

qmailadmin 설치

tar xvzf qmailadmin-0.3x.tar.gz
cd qmailadmin-0.3x


./configure 에 몇가지 옵션이 있다. 서버의 설정이 디폴트와 다른 경우 설정해 주자.

--enable-cgibindir : qmailadmin 이 설치될 디렉토리이다.
                      웹서버가 사용중인 cgi-bin 디렉토리를 적어준다.
                      디폴트는 /usr/local/apache/cgi-bin 이다.

--with-htmllibdir  : qmailadmin 의 html 템플레이트 파일 (당연히 이 파일들은
                      후에 입맛에 맞게 수정할수 있다.)들이 저장될 장소이다.
                      그냥 디폴트로 나두어도 된다. (/usr/local/share/qmailadmin)

--enable-cgipath   : 사용중인 웹서버의 cgi path가 /cgi-bin/ 이 아닌 경우
                      설정해준다. 디폴트는 /cgi-bin/qmailadmin 이다.


make
make install-strip



설치가 잘 되었는지 브라우저로 접속해본다.
http://localhost/cgi-bin/qmailadmin

* qmailadmin 설치 팁..

만일 특정 멀티도메인으로 qmailamdin 을 설치하고자 할때의 예제이다.
여기서 전 vpopmail 계정에 qmailadmin 까지 합쳐서 관리하고자 한다.
그리고 mail.domain.com 이란 도메인으로 접속하고자 한다.
먼저 소스를 풀고 ..그 소스 디렉토리로 이동한다. 그런뒤...

# ./configure --enable-cgibindir=/home/vpopmail/www/cgi-bin \
--with-htmllibdir=/home/vpopmail/www --with-htmldir=/home/vpopmail/www \
--enable-cgipath=/cgi-bin/qmailadmin.cgi

# make
# make install-strip

일단 설치는 완료되었다..하지만 /home/vpopmail/www/cgi-bin 로 가보면 qmailadmin
파일을 그냥 웹에서 띄울려면 여러가지 시스템 설정을 다시 해야한다..그리고 보안
에도 문제가 발생할수 있다. 그러니...다음과 같이 하자..

# cd ~vpopmail/www/cgi-bin
# cp -a qmailadmin qmailadmin.cgi
# ln -s qmailadmin.cgi index.cgi

그런뒤 간단한 웹서버 설정을 해준다.

# ScriptAlias /cgi-bin/ '/usr/local/apache/cgi-bin'
이부분의 주석을 확인하고...

qmailadmin 에 사용될 도메인을 버추얼로 하나 잡는다.

그런뒤 웹페이지에서 http://mail.domain.com/cgi-bin/index.cgi 로 접속하자..
무사히 페이지가뜨면 성공~~

그런데..이마 간단한 인증 폼만 나올것입니다. 그냥 기본 설치 하면..이쁜(?)이미지
와 함께 나오는데..이미지는 나오지 않을 경우에...이미지가 들어 있는 디렉토리가
/usr/local/apache/htdocs/images/qmailadmin 이 경로에 들어가기 때문입니다.
이때는 images/qmailadmin 디렉토리를 ~vpopmail/www 안에 복사해 주면 됩니다.

이제 원하는 도메인과 postmaster의 암호를 넣으면 로그인해서 여러가지 설정을
편안하게 할수있다.


4. 관리 하기

도메인 추가후

qmail 과 vpopmail 이 돌아가고 있는 상태에서 vadddomain 으로 도메인을 추가했다면
/etc/rc.d/init.d/qmail reload 또는 kill -HUP 시그날을 qmail-send 에게 보내서
/var/qmail/user 설정 파일을 다시 읽도록 해야 한다.

알리아스와 포워드 계정

알리아스와 포워드 계정은 거의 비슷한 기능을 하는데 다른점은 알리아스는 이 서버
에 존재하는 메일 계정에 다른 이름을 여러게 설정하는 것이고, 포워드 계정은 도착
한 메일을 설정해 놓은 다른도메인의 메일 계정(들)로 보내는 것이다.

다음 설정 과정을 보면 이해가 쉬울것이다.

qmailadmin 에서는 쉽게 설정 할수 있겠고, 만약 qmailadmin 을 설치하지 않은 경우
다음과 같이 한다.

# 알리아스

silver 라는 팝 메일 계정이 존재하고, webmaster 라는 알리아스를 만드는 경우.
해당 도메인 디렉토리(~vpopmail/domains/도메인/)에 다음과 같은 내용의
.qmail-webmaster 파일을 만든다.

/home/vpopmail/domains/도메인/silver/Maildir/

이제 webmaster 로 오는 메일은 silver 가 받을 것이다.


# 포워드

silver 로 오는 메일을 babo@kldp.org 라는 다른 도메인으로 포워딩 해줄때.

해당 도메인 디렉토리(~vpopmail/domains/도메인/)에 다음과 같은 내용의
.qmail-alang 파일을 만든다.

&alang@kobis.net

이제 이 도메인의 alang 으로 오는 메일들은 alang@kobis.net 로 보내질 것이다.

# 각 도메인마다 메일 계정, 메일링 리스트 수 한계 정하기

이것은 웹 호스팅 업체에서 qmailadmin 으로 각 유저들에게 사용중인 도메인의
메일 설정을 직접 하게 해줄때 매우 유용하게 쓰일수 있을것이다.

각 도메인마다 메일,메일링 리스트의 설정 한계를 줄수 있는데, 이것은
~vpopmail/domains/도메인/ 에 .qmailadmin-limits 파일을 만들어 주면 된다.
형식은 다음과같다.

maxpopaccounts          X
maxaliases              X
maxforwards             X
maxmailinglists         X
maxautoresponders       X

X 는 해당 도메인이 사용할수 있는 최대한의 수를 넣어주면 되겠다.

# bounce 되는 메일에 메세지 넣기

해당 도메인으로 수신되는 메세지가 바운스 되는 경우가 있는데 보통, 팝 유저의
쿼타 용량이한도를 넘었거나, 유저가 존재하지 않을 경우이다.

다음과 같은 파일을 만들어 각 가상 도메인의 디렉토리에 넣어 놓으면 바운스 되는
메일들에포함되어 되돌려 지며 당신은 센스있는 관리자가 된다 :-)

.over-quota.msg 에는 메일 유저의 쿼타 용량이 초과 되었으므로 메일 수신을 할수
없다는메세지를.

.no-user.msg 에는 우리 도메인엔 그런 메일 계정 없지롱 하는 내용의 메세지를
넣어 두면 된다.

이 파일들이 없다면 vpopmail은 바운스되는 메일에 뻣뻣한 영문 메세지 만을 포함
시킨다.


5. ezmlm 으로 메일링 보내기

메일링 테스트를 해보도록 하자.

먼저 ~ezmlm/bin 로 간다.
그런뒤 메일링 리스트의 메일링 대표 아이디를 생성한다.

./ezmlm-make [대표도메인디렉토리/대표아이디]
             [대표도메인디렉토리/.qmail-대표아이디]
             [대표아이디 domain]

예)

$ ./ezmlm-make /home/vpopmail/domains/test.net/mailling \
   /home/vpopmail/domains/test.net/.qmail-mailling mailling test.net

그 다음으로 메일링 리스트의 리스트를 작성한다.

$ ./ezmlm-sub /home/vpopmail/domains/test.net/mailling alang@test.net

위와 같은 식으로 계속 추가 하면 된다.
추가된 리스트 확인은 ezmlm-list 명령어로 가능하다.

$ ./ezmlm-list /home/vpopmail/domains/test.net/mailling

자 이제 메일링을 보내 보도록 하자.

mail -v mailling@test.net

메일링이 재대로 이루어 졌는지 확인하면 된다.

주의 : 꼭 vpopmail 사용계정으로 메일링 리스트 설정을 해야 합니다.
root 로 하였을 경우 메일링이 발송 안되는 수도 있습니다.


이와 같이 설치후에 요즘 메일로 전파되는 여러가지 바이러스등을 필터해내줄수
있는 툴을 설치해야 합니다. 웹호스팅 서버에서는 smtp 를 통합하는 경우가 많은
데..이때 메일바이러스가 한번 떴다하면..거의 smtp 서버는 마비 됩니다.
큐에 쌓이는 메일만해도 1시간에 5G 정도 쌓이더군요. 사용량에 따라 조금씩 다
르겠지만..아무튼..웹호스팅에서 스캐너는 필수라고 할수 있습니다.
이제 설치법에 들어 가도록 하겠습니다.


큐메일 스캔너 설치 ( Qmail-scanner Install )

참조 : http://qmail-scanner.sourceforge.net/

큐메일 설치전에 몇가지 패치와 연동프로그램을 설치해야 한다.

   * Perl 5.005_03+ 이상 버젼 설치
   * Perl module Time::HiRes 모듈 설치
   * Maildrop 0.73 이상 버젼 설치
   * Qmail 1.03 에 QMAILQUEUE patch 를  해야 한다.

위의 몇가지 사항을 만족해야 qmail-scanner 이 무사히 설치가 된다.
perl 은 기본적으로 설치가 되어져 있을것이다. 없다면...

rpm -Uvh perl-* 로 설치한다.
그런후 Time::HIRes 모듈을 설치한다.
먼저 http://search.cpan.org/doc/JHI/perl-5.7.2/ext/Time/HiRes/HiRes.pm 에서
HiRes.pm 파일을 다운 받고..그 디렉토리에서 ...

# perl -e 'use CPAN; install Time::HiRes'

그럼...이것저것 물어보면서 자동으로 설치를 한다.
그런 후 http://download.sourceforge.net/courier/ 에서 maildrop 를 다운 받아
설치 한다.

# ./configure [options]
# make
# make install-strip
# make install-man

http://www.qmail.org/qmailqueue-patch 이곳의 qmailqueue-pathch 파일을 다운
받고 qmail 소스를 패치 시킨다.

# tar xzvf qmail-1.03.tar.gz
# patch -p0 < qmailqueue-patch

그런뒤 멋지게 큐메일을 설치한다.


그런후 qmail-scanner 를 설치한다. 설치전에
suidperl 의 퍼미션 등을 점검한다. 보안상 막아놓았다면  풀어주자.
염려되면..alias 계정을 wheel 등의 그룹에 추가하여 일정 사용자에게만 풀
어주자..

# chgrp wheel /usr/bin/suidperl
# chmod 4710 /usr/bin/suidperl


# ./configure --install

하시면 알아서 필요한 팻키지들을 점검한후 설치를 해버린다.
혹시 unzip 이나 기타 다른 팻키지가 없을때 어디가서 다운 받아서 깔아라고
친절하게 가르쳐 주니 그대로 필요 팻키지를 설치한고 다시 시도한다.

이제 설치가 완료되었으면...

/var/qmail/bin/qmail-scanner-queue.pl 가 생성되어 있을것이다.
그리고 ../var/spool/qmailscan 이란 디렉토리가 생성되어져 있을것이다.
이제 몇가지 환경 변수 지정 및 설정을 해주면 된다.

# vi /var/qmail/supervise/qmail-smtpd/run  을 열고 아래와 같이 설정을
변경해 준다.

#!/bin/sh
QMAILQUEUE='/var/qmail/bin/qmail-scanner-queue.pl'
export QMAILQUEUE
ALIAS_UID=`id -u alias`
ALIAS_GID=`id -g alias`
exec /usr/local/bin/softlimit -m 6000000 \
/usr/local/bin/tcpserver -v -p -x/etc/tcp.smtp.cdb -u $ALIAS_UID -g \
$ALIAS_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1

* softlimit 값을 기본 2000000 정도로 잡는데...3배 정도로 반드시 올려줘라

그런후 /var/spool/qmailscan 으로 가서 quarantine-attachments.txt 에 필터 대상
헤드 내용을 추가해 줘라..요즘에 유행하는 sircam 바이러스 필터 헤드는 다음과
같다.

Multipart message   Virus-Content-Disposition:  Sircam.worm Virus

* Multipart message 와 Vireus-Comtent-Dispositon: 과 Sircam.worm Virus 사이는
모두 [TAB] 이다.

추가로

.pif    0   Sircam Virus(.pif)

헤드문도 추가 해준다.

이와 같이 주정후 꼭 다음 명령어를 실행해 준다.

# /var/qmail/bin/qmail-scanner-queue.pl -g

이제 테스트 해보자

설치 소스가 있는 디렉토리로 가서 하위의 contrib 디렉토리로 가면 다음 테스트
스크립트가 있다. 실행하면 된다.

# ./test_installation.sh -doit

이제 /var/spool/qmailscan 으로 가셔 ..

viruses.log 를 보면..

04/08/2001 16:30:15     root@zzang911.net   Qmail-Scanner viral
test: checking perlscanner...   EICAR Test Virus

아래와 같은 메세지가 있을것이다. 잘 걸려 낸다..

실제로 필터된 메일은.../var/spool/qmailscan/viruses 안에 저장되고 실제 수신처로
전달되진 않는다..보낸사람에겐 바이러스성 메일이라는 경보성 메일을 보낸다.

이걸루..qmail-scanner 설치가 완료되었다.

[Linux] 각종 데몬 이름 및 설명

작성자 : 굼벵이 ( linuxis@linux.co.kr )
사이트 : http://chtla.com (초심으로..) linux community

amanda : 백업 클라이언트인 amanda 데몬
amandaidx : amanda 서버의 패키지 서비스 중 하나인 amandaidx 데몬
amd : auto mount daemon, 시스템의 요청이 있는 경우에 자동으로 장치와 NFS 호스트를 마운트해 주는 데몬. 네트워크의 설정이 잘못된 경우에는 부팅을 하는 도중에 문제를 일으킬수 있으므로 처음에서 꺼두는 것이 좋다.
amidxtape : amand 서버에 패키지 서비스 중 하나인 amidxtape 데몬
anacron : 시간에 따라 지정한 프로그램을 정기적으로 실행하는 데몬. cron과 같은 기능을 하지만 계속 켜두지 않는 컴퓨터에서 사용하는 데몬
apmd : 베터리 상태를 감시하고 syslog(8)에 기록하며 시스템을 끄기도 하는 데몬
arpwatch : 이더넷 카드와 ip 어드레스의 설정 관계를 유지하는 데몬
atd : 특정 시간 또는 시스템 부하가 적을때 지정된 명령을 실행시키는 데
autofs : 파일 시스템을 사용하고자 할때 자동으로 마운트 시켜주는 데몬
chargen : chargen의 TCP 버전 서버
chargen-upd : chargen의 UDP 버전 서버
ciped : ip address를 암호화하는 CIPE 데몬
crond : cron을 실행시키는 데몬, cron은 지정한 프로그램을 특정 시간에 주기적으로 실행시키는 유닉스 표준 프로그램
daytime : daytime의 TCP 버전 서버. daytime은 클라이언트의 질의에 응답하여 아스키 형태로 현재 시간과 날짜를 출력하는 데몬. TCP 포트 13을 사용
daytime-udp : daytime의 UDP 버전 서버. UDP포트 13을 사용
dhcpd : Dynamic host configuration protocol server daemon. 동적 호스트 제어 프로토콜 서버 데몬. BOOTP와 DHCP가 포함된 데몬으로 클라이언트들이 부팅할때 자동으로 동적 IP 어드레스와 네트워크 정보를 가질수 있게 해줌.
echo : echo 의 TCP 버전 서버
echo-udp : echo 의 UDP 버전 서버
finger : finger 리퀘스트에 응답하는 서버. finger는 사용자에 대한 로그인 네임, 디렉토리, 쉘과 최종 로그인 시간에 대한 정보를 볼수 있게 하는 프로토콜
gated : gated(라우팅 데몬) 을 시작하거나 종
gpm : MC(midnight command) 와 같은 텍스트 기반 리눅스용 애플리케이션에서 마우스를 쓸수 있게 해주는 데몬. 콘솔에서 마우스를 이용한 팝업 메뉴와 복사/ 붙이기 기능도 지원
httpd : 웹 서비스를 위한 아파치 데몬. html파일과 cgi를 사용가능하게 함
identd : 특별한 TCP 연결에서 사용자의 신원을 결정해 주는 데몬. TCP 포트번호를 주면 연결된 서버 시스템 소유자를 확인할수 있는 문자열을 돌려줌
imap : 원격 사용자가 imap 클라이언트(Pine, netscape communicator)를 이용하여 자신의 메일에 접근할수 있게 하는 서비스
imaps : 원격 사용자가 SSL을 지원하는 imap 클라이언트(netscape communicator, fetchmail 등)를 이용하여 자신의 메일에 접근할수 있게 하는 서비
innd : 유즈넷 뉴스 서버를 이용하여 지역 뉴스 서버를 설정할수 있는 데몬
ipchains : 패킷 필터링 파이어월을 자동으로 실행하는 데몬
ipop2 : 원격 사용자가 pop2 클라이언트를 이용하여 메일에 접근할수 있게 하는 서비스
ipop3 : 원격 사용자가 pop3 클라이언트를 이용하여 메일에 접근할수 있게 하는 서비스
irda: irda 가 정상적으로 동작하도록 해 주는 데몬
keytable : /etc/sysconfig/keytable로 키보드 유형을 변환할수 있게 하는 서비스. 한텀에서 kbdconfig 프로그램을 실행하여 키보드 유형을 변환할수 있다. 대부분의 시스템에서 keytable 데몬은 실행시켜 두어야 한다.
kudzu : 부팅시 새롭게 추가된 하드웨어를 설정할 수 있게 hardware probe를 실행시키는 데몬
linuxconf : 시스템 설정을 유지하기 위해 부팅시에 다양한 태스크의 실행을 정렬시키는 데몬.
linuxconf-web : 웹을 통해 linuxconf를 실행할수 있게 연결을 허용하는 데몬
lpd : 프린터(line printer)가 정상적으로 동작하도록 해 주는 프린트 서비스 데몬
mars-nwe : netware IPX 프로토콜을 사용하는 클라이언트에게 리눅스 머신에서 파일과 프린트 서버를 호환시켜 주는 데몬
mcserv: midnight command(MC) 서버이다. MC끼리 네트워크를 공유한다
mysqld : 매우 빠르고 안정적인 mysql 데이타 베이스 서버 데몬이다
named : 도메인 네임과 ip어드레스를 해석하기 위한 DNS서버(BIND) 데몬. 로컬 호스트에서 DNS서버를 운영할때만 실행 시킨다.
netfs : 삼바, 네트워크 파일 시스템(NFS), NCP(netware)등의 마운트와 언마운트에 관여하는 데몬.
network : 네트워크 인터페이스의 설정을 시스템 부팅시 커널에 적재시키는 데몬.
nfs : TCP/IP 네트워크에서 파일을 공유할수 있게 하는 데몬. /etc/exports 파일에서 설정한 NFS 서버가 기동할수 있게 해 준다.
nfslock : NFS파일을 locking 한다.
nscd : NIS/NS 를 사용할수 있게 하는 데몬. nscd는 실행중인 프로그램의 그룹을 살피고 패스워드를 변경하거나 다음 질의를 위해 결과를 캐시하는 데몬이다.
ntalk : 서로 다른 시스템끼리 채팅이 가능하게 ntalk 연결을 허용하는 서버
ntpd : NTPv4데몬
pcmcia : 휴대용 PC에서 이더넷이나 모뎀을 쓸수 있게 하는 데몬.
pop3s : SSL을 지원하는 pop3클라이언트를 사용하여 메일에 접근할수 있게 하는 서비스이다.
portmap : RPC(NFS, NIS, mcsev등) 연결을 관리하기 위한 포트 매핑 데몬으로 RPC를 사용하는 프로그램을 실행하기 위해서는 반드시 선택하여야 하는 데몬.
postgresql : postgresql 디비에 관한 데몬
pppoe : adsl서비스에 연결시켜 주는 데몬
proftpd : 쉬운설정, 보안성, 단순성에 초점을 맞춘 개선된 ftp 서버 데몬
pxe : 부팅전 실행환경 서버. 다른 PXE기반 머신에 네트워크 부팅을 제공한다
random : 시스템에 필요한 난수 발생 및 저장 데몬
rawdevices : HDD 파티션과 같은 블론 디바이스를 위한 스크립트. /etc/sysconfig/rewdevices 파일을 편집하여 원시 디비아스를 블론 디바이스로 매핑할수 있다.
reconfig : /etc/reconfigSys 파일이 존재하면 재설정을 실행하는 데몬
rexec : rexec(3) 루틴을 위한 서버 데몬. 인증된 사용자 이름과 패스워드로 원격 실행을 제공하는 서버이다.
rlogin : rlogin 프로그램을 위한 서버 데몬. 신뢰할수 있는 호스트로부터 특권화된 포트 번호에 기반한 인증을 통해 원격 로그인을 제공한다.
routed : RIP 프로토콜을 통해 업데이트된 자동 IP 라우팅 테이블 설정 데몬
rsh : rshd 서버는 rcmd 루틴을 위한 서버이며 따라서 rsh 프로그램을 위한 서버이다. 신뢰할수 있는 호스트로부터 특권화된 포트번호에 기반한 인증 통해 원격 실행을 제공한다.
rstat : 네트워크에 연결된 사요자에게 그 네트워크 상의 머신에 대한 퍼포먼스 매트릭스를 회수할수 있게 해주는 프로토콜
rsync : 컴퓨터간 자료 공유를 위해서 사용되는 rsync에 대한 데몬이다.
rusersd : 네트워크에 특정 사용자가 있는 검색해 주는 데몬.
rwalld : 시스템에 동작중인 모든 터미널에 메시지를 표시할수 있게 해 주는 프로토콜
rwhod : 원격 접속자의 목록을 볼수 있게 해주는 데몬. finger와 비슷한 기능을 한다.
sendmail : 메일을 다른 호스트로 전송하는 메일 전송(Mail Transport Agent)데몬
smb : SMB 네트워크 서비스를 제공하기 위한 삼바 서버(smbd와 nmbd)데몬
snmpd : SNMP(Simple Network Management Protocol)데몬
squid : HTTP, FTP, gopher와 같은 프로토콜을 사용할때 캐싱 속도를 높이는 데몬.
sshd : openssh 서버 데몬
swat : 삼바 웹 관리 툴, 삼바 서버의 설정을 위해 swat를 사용하며, 웹 브라우저를 통해 901포트로 접속한다.
syslog : 많은 데몬들이 로그 메세지를 다양한 시스템 로그파일에 기록하는데 사용하는 데몬. syslog는 항상 실행되는 것이 좋다.
talk : 다른 시스템에 접속한 사용자로 부터 채팅 요구에 응답하여 터미널의 내용을 다른 사용자에게 보내서 대화할수 있게 하는 데몬.
telnet : telnet 세션을 제공하는 서버. 인증을 위해 사용자 이름과 패스워드를 사용한다.
tftp : 파일 전송을 위한 프로토콜. tftp프로토콜은 어떤 OS에서는 부팅 디스켓이 없는 워크스테이션이나 네트워크 인식 프린터를 위한 설정 파일의 다운로드, 설치 프로세스의 시작을 위해 가끔 이용된다. time : rdate 데몬에 의해 사용되는 RFC 868 시간 서버의 TCP 버전
time-udp : rdate 데몬에 의해 사용되는 RFC 868시간 서버의 UDP 버전
webmin : webmin 관리자 서버 데몬
xfs : 부팅과 셧다운시 X 폰트 서버를 시작하거나 종료시키는 데몬
xinetd : inetd 데몬을 대체하는 강력한 데몬. telnet, ftp 등과 같은 서비스를 처리하는 슈퍼 데몬.
ypbind : NIS/YP 클라이언트에서 실행되는 데몬으로 NIS도메인을 바인드한다. NIS클라이언트로 동작하기 위해서는 glibc에 기반한 시스템에서 실행되어 한다. 그러나 NIS를 사용하지 않는 시스템에서는 실행하지 말아야 한다.
yppasswd : NIS클라이언트 사용자의 패스워드를 변경할수 있게 해 주는 데몬
ypserv : 표준 NIS/YP 네트워크 프로토콜 서버. 호스트 네임, 사용자 네임과 다른 정보 데이타베이스를 네트워크를 통하여 배포하는 것은 허용한다. ypserv데몬은 클라이언트에서는 필요하지 않으며 NIS 서버에서 실행된다.

[Linux] /proc 디렉토리의 주요정보

cpu 정보 : cat /proc/cpuinfo
pci 정보 : cat /proc/pci
사용중인 irq 정보 : cat /proc/interrupts
사용중인 dma 채널 : cat /proc/dma
사용중인 i/o 포트 정보 :cat /proc/ioports
현재 사용가능한 화일 시스템 :cat /proc/filesystems
현재 사용중인 메모리 : cat /proc/meminfo
현재 사용중인 파티션 :cat /proc/partitions
현재 사용중인 스왑 파티션 정보 : cat /proc/swaps
현재 사용중인 커널 버전 : cat /proc/version
현재 사용중인 드라이버 :cat /proc/devices
현재 사용중인 부트 이미지 : cat /proc/cmdline
현재 사용중인 ethernet card : /etc/sysconfig/hwfile


lsdev 명령도 비슷한 용도로 활용이 가능합니다.

[Linux] tar로 분할 압축하기

자료출처: 적수네

나누어 압축할 때
---------
tar -zcvpf - /압축할dir | split -b 670mb - 압축파일.tar.gz

그러면 압축파일.tar.gzaa
압축파일.tar.gzab순으로 파일이 생깁니다.

-b 670mb는 압축파일을 670mb단위로 분할 하라는 옵션입니다.

=========

풀려면

cat 압축파일.tar.gza* | (cd /;tar -xzvpf - )

하면 됩니다.

풀 때 (cd /;tar -xzvpf - ) 중의 /; 하면 / 디렉으로 옮겨 가서 풀리게 됩니다.

만약 /temp 하면 temp내에 풀어 놓게 됩니다.

[Linux] 서비스 관리, 디스크 관리

### 서비스 관리, 디스크 관리(제 5회 데비안 유저스 세미나 강의 자료) ###

# 발표자 : 김현덕(현덕0)

시스템 관리에서 가장 중요한 부분은 시스템의 정상적으로 작동을 관리하는 것이다.
시스템이 정상적으로 작동을 하지 않거나 어떠한 문제로 인하여 서비스가 작동하지
않는다면 사용자는 관리자를 찾을 것이다.
또한 관리자는 최소한 시스템의 잘못된 상황을 파악하여 문제를 해결해야 한다.
본 파트는 위와 같은 시스템 관리를 위해 서비스와 디스크 관리에 해당하는 부분을
설명할 것이다.



############ 목차 ############

서비스 관리 부분(pcharly님, soju님) 

1. 시스템 V 스타일 초기화

2. init 설정파일

3. init.d 와 rc?.d 디렉토리의 구조

4. rc 스크립트 파일

5. 부팅시 서비스 등록

6. update-rc.d


디스크 관리 부분(force님, freemir님, 잔디님)

1. cfdisk 소개

2. cfdisk에서의 파티션 설정

3. 하드디스크 추가

4. Software-RAID HOWTO

##############################




######################################################################
시스템 관리 부분
######################################################################


*1 시스템 V 스타일 초기화
-커널의 하드웨어 인식과 초기화를 마친 후 커널은 모든 프로세스의 어머니
역활을 하는 PID 1 번의 init를 실행시킨다.
init는 새로운 프로세스를 생성하고 프로세스가 종료되면 이를 다시 시작시키는
기능과 시스템이 부팅할 때 스크립트를 실행할 책임을 진다.

-데비안에서 구동되는 모든 프로그램과 데몬들은 커널에 의해 처음으로 실행되는
init에 의해 실행이된다.  당연한 말이겠지만 이 init가 종료된다는 것은
시스템 종료와 같다.

-유닉스 계열의 운영체제에서 init가 실행되는 방식에는 크게 'System V'와 'BSD'
방식이 있다. 리눅스는 다른 면에서는 'BSD' 방식을 많이 사용하나 init가
실행되는 기동 방식만큼은 'System V' 방식을 따른다.

-데비안에서 init 명령은 sysvinit 패키지에 들어 있다.
이 패키지에는 init 외에도 shutdown, runlevel 같은 시스템 운영에 필요한
중요한 명령이 들어있다.

-리눅스 시스템 관리자라면 리눅스 시스템의 초기화 관정을 이해하는 것이
상당히 중요하다. 이 'System V' 방식의 기동 과정을 제대로 이해해야지만
시스템을 자기 입맛에 맞게 고치고 유지 할 수가 있다.


리눅스의 시동 경로 --------------------------------------------------

  +------+
  |전원on| (부팅) POST(Power of self test)
  +--+---+
     |
  +--+---------+
  | /sbin/init |
  +--------+---+
           |
           |    /etc/inittab
           |  +--------------+
           |  |              |    
           |  |      rcS-----+---- rcS.d 디렉토리
           |  |              |     [시스템의 기본적인 초기화]
           +--+              |       (rc.boot)
              |              |
              |      rcN-----+---- rcN.d디렉토리
              |              |     +-------------+
              |              |     | S 파일 실행 |
              |              |     | K 파일 실행 |
              |              |     +-------------+
              +-------+------+
                      |
                   +--+---+
                   |로그인|
                   +------+

주) 여기서 N 은 런레벨을 의미한다.
---------------------------------------------------------------------


*2 init 설정 파일(/etc/inittab)
-init도 일종의 프로그램이다 그렇기때문에 이 프로그램의 실행 방법을 명시하는
설정 파일이 있다. init 설정 파일은 /etc/inittab(inittab=INITial TABle) 이다

-inittab 파일을 간략하게 살펴보며 데비안 시스템이 구동되는 방법을 알아 보자.
inittab 파일의 각 행은 다음과 같은 형태로 되어 있다.

----------------------------------------------------------------------
id:runlevels:action:command
----------------------------------------------------------------------

-id
유일하게 한 글자나 두 글자가 나열된 것으로 항목을 구별하기 위해 사용된다.
몇몇 항목은 정확한 작업때문에 특별한 코드를 가져야 하나 보통 파일 내에서
다른 것과 충돌하지만 않으면 어떤것이 와도 상관없다.

-runlevels
이 항목이 실행될 실행 레벨이 무엇인지를 나타낸다.
실행 레벨은 현재 시스템의 상태를 단순하게 숫자나 글자로 정의한 것이다.
가령 시스템 실행 레벨이 3으로 바뀐다면 init 프로그램은 inittab파일 runlevel
필드에 3을 포함하는 모든 항목이 실행한다.

-action
init가 이 항목을 어떻게 처리할 것인지를 지시 한다.
한 번만 실행하고 말 것인지, 아니면 명령이 종료할때마다 다시 시작할 것인지를
결정할 수 있다.

-command
init가 이 항목에 대해 실행할 명령이다.

-'System V' 방식의 초기화를 이해할려면 먼저 실행레벨(Run Level)개념을
이해하고 넘어가야만 한다.
실행 레벨은 선택된 그룹의 프로세스만 시스템에서 실행되도록 허락하기 위해
만든 설정이다.

-데비안 7가지 실행계층

0 : 시스템 정지(halt)
1 : 단일 사용자 모드
2 - 5 : 여러가지 다중 사용자 모드
6 : 시스템 재기동(reboot)

참고
----------------------------------------------------------------------
레드햇 계열의 런레벨은 데비안의 그것과는 조금 다르다.

0 - 시스템 중지(halt)
1 - 단일 사용자 모드
2 - NFS를 제외한 다중 사용자 모드(만 네트워크와 연결되어 있지 않으면 런레벨
     3과 같다)
3 - 모든 기능이 작동하는 다중 사용자 모드(default)
4 - 사용하지 않음
5 - X 윈도우 부팅(xdm, gdm)
6 - 리부팅(reboot)
----------------------------------------------------------------------

-/etc/inittab 파일의 내용을 분석해보면서 실행레벨을 이해하자.

----------------------------------------------------------------------
# /etc/inittab: init(8) configuration.
# $Id: seminar.txt,v 1.8 2002/04/29 21:15:11 pcharley Exp $

# The default runlevel.
id:2:initdefault:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
----------------------------------------------------------------------

-id:2:initdefault:
데비안 시스템은 다중 사용자 상태로 들어가는 실행계층 '2'를 기본으로 해서
시작하고 /etc/rc2.d/에 있는 스크립트를 실행한다. 위의 행에서 지정한 숫자
2가 데비안 시스템의 기본 부팅 레벨이 2임을 가리킨다. 기본 실행 레벨을
바꾸기 위해서는 여기서 숫자를 바꾸면 된다.당연히 0 이나 6을 지정하면
않된다. 시스템이 부팅하자 마자 중지되거나 리부팅될 것이다.

-si::sysinit:/etc/init.d/rcS
/etc/init.d/rcS 스크립트는 부팅 과정에 단 1 회 실행되는 스크립트로
시스템에 기본적인 초기화를 수행하도록 한다.

----------------------------------------------------------------------
for i in /etc/rcS.d/S??*
do
        # Ignore dangling symlinks for now.
        [ ! -f "$i" ] && continue

        case "$i" in
                *.sh)
                        # Source shell script for speed.
                        (
                                trap - INT QUIT TSTP
                                set start
                                . $i
                        )
                        ;;
                *)
                        # No sh extension, so fork subprocess.
                        $i start
                        ;;
        esac
done
----------------------------------------------------------------------

위 내용은 /etc/init.d/rcS 스크립트에 들어 있는 내용으로, /etc/init.d/rcS
스크립트의 가장 중요한 내용이라 할 수있으며 /etc/rcS.d 디렉토리에 있는 모든
명령들을 불어 오도록 한다.

rcS 스크립트에서 수행하는 초기화는 대략 다음과 같다.

1) 파일 시스템 검사 및 연결
2) 모듈 적재(modconf에서 지정한 모듈)
3) 네트워크 서비스 시작
4) 시스템 시간을 CMOS 시간에 맞춘다.
5) /etc/rc.boot 에 있는 모든 스크립트 실행 (파일 이름 처음이 '.'으로 시작하는
    파일은 제외)
6) 기본 키보드 지정
7) 읽어버린 편집 파일 복구
8) 직렬 포트 설정

5)번 초기화를 제외한 모든 초기화가 /etc/rcS.d 디렉토리에 있는 명령에서
실행된다. /etc/init.d/rcS 에서 실행되는 초기화는 싱글 모드에서도 실행이 된다.

-~~:S:wait:/sbin/sulogin
싱글모드로 들어갈때 관리자 패스워드를 물어보게 한다. 레드햇 계열에서는
싱글 모드로 들어갈때 로그인 과정을 생략한다. 하지만 데비안의 경우에는
기본적으로 관리자 패스워드를 입력해야지만 싱글모드로 들어갈 수가 있다.
하지만 이 설정도 콘솔 앞에 앉은 공격자를 막을수는 없다.
부팅시 lilo에서 아래 옵션을 주면 관리자 패스워드 없이 싱글모드로 부팅할
수가 있다.
init=/bin/bash

-l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

각 실행 레벨에 대하여 어떤 명령을 수행할 것인지를 정한다.
보이는 것처럼 /etc/init.d/rc 스크립트에 실행 레벨 번호를 매개 변수로 전달하여
실행시키고 있다.
action 필드의 wait는 모든 command를 실행하고 종료될 때까지 기다린 후 다음
작업으로 넘어가라는 지시다.
/etc/init.d/rc 스크립트는 실행 레벨이 바뀔 때마다 실행 레벨 번호를 인수로
실행되는 다목적 시동 스크립트로 각 실행 레벨에서 알맞은 다른 스크립트를
실행시켜 줌으로 각 실행 레벨에서 실행하거나 중지시켜야할 스크립트들을
start나 stop 매개 변수로 차례로 실행시키거나 중지시킨다.

-z6:6:respawn:/sbin/sulogin
싱글 모드로 들어갈때 관리자 패스워드를 물어보는것처럼 실행 레벨을 6으로
바꿀때-실행 레벨을 6으로 바꾼다는 것은 시스템 리부팅을 뜻한다-도 관리자
패스워드를 물어보게 한다. 

-ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
<Ctrl>+<Alt>+<Del> 키를 누르면 재부팅이 되도록 한다.
만약 리부팅이 아니라 종료를 시키고 싶다면 -r 을 -h 로 바꾸어주면 된다.

-pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
UPS 상태를 모니터링할 수 있는 bpowerd 패키지를 인스톨 했을 경우 사용되어 진다.

-1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

1번부터 6번까지의 가상 콘솔에 대하여 login: 프롬프트를 보여주는 getty
프로그램을 실행시킨다. runlevel 필드를 보면 모든 행들에 대해 1번 실행
레벨이 빠져 있음을 알것이다. 1번 실행 레벨은 싱글 모드로 이미 위의
'~~:S:wait:/sbin/sulogin' 행에서 설정을 했기 때문에 이곳에는 빠져있다.
그러나 레드햇 계열은 싱글 모드를 위한 특별한 설정이 없기 때문에 1번
콘솔에서만 1번 실행 레벨로 로그인을 가능하게 하고 나머지 콘솔에서는 싱글
모드로 로그인을 불가 한다.
action 필드에 있는 respawn는 프로그램이 죽으면 다시 계속 실행하라는
의미이다. 로그아웃을 하여도 계속해서 로그인 화면이 뜨는 이유가 init
프로그램이 inittab에서 respawn 옵션을 보고 계속적으로 getty를 실행 시키기
때문이다.
영문 주석에서 설명한 것 처럼 code 필드는 반드시 디바이스의 마지막 글자하고
같아야 한다. 대부분 경우 코드는 파일 내에서 다른 것과 충돌 하지만 않으면
돼지만 이번 경우에는 정확한 작업을 위해서 정확한 코드를 기입해야한다.

-#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

init는 콘솔을 통한 사용자들의 로그인을 처리한다. 하지만 리눅스 시스템은
콘솔뿐만이 아니라 터미널을 위한 serial 포트나 모뎀으로의 로그인도 처리할
수 있다. 여기서 자세히 설명을 하지는 않겠다.
만약 필요 하다면 위의 주석 처리 되어 있는 부분과 getty, mgetty 맨 페이지를
보고 시도해 보기 바란다. mgetty의 경우 mgetty 패키지를 인스톨 해야 한다.

-inittab 파일을 변경할 경우 init에게 inittab 파일의 변경을 밑에 명령으로
알려 주어야 한다.

     init q

*3 init.d 와 rc?.d 디렉토리의 구조
-먼저 데비안의 초기화 시스템의 파일과 디렉토리 구성을 알아 보자.
데비안도 리눅스 배포판에 하나지만 같은 리눅스 배포판인 레드햇과도 약간의
차이를 갖는다.

----------------------------------------------------------------------
- 실행 파일
/sbin/init
/etc/inittab        : init가 실행해야할 모든 일이 명시된 파일
/etc/init.d/rc      : 각 실행 레벨 실행 스크립트
/etc/init.d/rcS     : init에서 처음으로 실행하는 스크립트

- 디렉토리
/etc/init.d         : 각 실행 레벨에서 실행되는 실제 스크립트가 저장
/etc/rcS.d          : rcS 스크립트에 의해 실행되어질 명령 목록
/etc/rc0.d          : 0번 실행 레벨에서 실행되어질 명령 목록   
/etc/rc1.d                          .
/etc/rc2.d                          .
/etc/rc3.d                          .
/etc/rc4.d
/etc/rc5.d
/etc/rc6.d
----------------------------------------------------------------------

-데비안에서 데몬으로 돌아가는 패키지를 설치하면 시스템 부팅시 자동으로
실행하기 위하여 실행 스크립트를 /etc/init.d/ 디렉토리에 설치한다. 
그리고 각 실행 레벨별 디렉토리에 /etc/init.d 디렉토리에 설치된 실제
스크립트를 향하는 심볼릭 링크를 만든다.

-실제로 각 실행 레벨 디렉토리 /etc/rc?.d (?은 0~6의 실행 레벨을 나타냄)에서
ls -l 명령을 내려 보면 'SnnXXXX' 'KnnXXXX' 형태의 많은 심볼릭 링크 파일만을
볼 수가 있을것이다. 'S' 나 'K' 는 각 실행 레벨 디렉토리에 있는 심볼릭 링크
파일이 /etc/init.d 디렉토리에서 실제 실행되어지는 스크립트의 실행 방향을
지시한다. 'S'로 시작하는 파일은 start 매개 변수로 /etc/init.d 디렉토리에
스크립트를 시작하고 'K'로 시작하는 파일은 stop 매개 변수로 /etc/init.d
디렉토리에 스크립트를 중지한다.
nn은 00-99 사이의 숫자 중 하나이며 이 숫자는 스크립트의 실행 순서를
맞추려는 것으로 실행 순서를 의미한다. 스크립트는 항상 작은 숫자를 먼저
실행한다. XXXX는 시스템 서비스 명으로 /etc/init.d 에 존재하는 실질적인
스크립트 이름을 나타낸다.


S/K 파일명 형식 -----------------------------------------------------

           +--- 시동(start)이나 정지(stop)를 결정한다.
           |
           |                 +--- 실행 순서를 정한다.
           |                 |
           |                 |                  +- 서비스 기능 표시
           |                 |                  |
       +---+----+     +------+------+     +-----+----+
       | S or K |  +  | 두자리 숫자 |  +  | 서비스명 |   ex)s91apache
       +--------+     +-------------+     +----------+

---------------------------------------------------------------------

실제적으로 'K'로 시작하는 파일은 /etc/rc0.d, /etc/rc1.d, /etc/rc6.d 에만
존재하고 나머지 실행 레벨(2-5) 디렉토리에는 'S'로 시작되는 파일만이
존재한다. 

apache를 예로 설명하면 apache를 패키지로 시스템에 인스톨을 할 경우 실제
실행 스크립트는 /etc/init.d/apache 로 존재하고 실행 레벨 디렉토리 2에서
5까지에는 'S91apache'로 실제 스크립트를 실행하는 심볼릭 링크가 만들어진다.
실행 레벨 디렉토리 0,1,6 에는 'K20apache'로 실제 스크립트를 중지하는 심볼릭
링크가 만들어진다.

*4. rc 스크립트

-자신이 제공하고자 하는 서비스를 원하는 특정 런레벨에 진입할 때 자동으로 실행
시키거나 중지시키기 위해서는 부팅시 실행되는 스크립트가 무엇이며, 또한 그 구조에
대한 지식이 필요하다.

-System V 스타일의 init 를 사용하는 데비안의 특성상 특정 런레벨에서 실행되어야
하는 daemon 들을 시작 / 중지 시키는 스크립트들이 /etc/init.d 와 /etc/rcN.d
(N 은 런레벨임) 디렉토리에 존재하게 된다.

-init.d는 부팅시에 쓰이는 모든 스크립트들이 집합해 있는 디렉토리 이고,
rcN.d는 init.d의 디렉토리 안에 있는 스크립트들 중에 각 런레벨에 해당하는,
그러니까 자신들이 필요로 하는 스크립트들만을 링크시킨 파일이다.

-그리고 실제로 이것들을 실행시켜주는 파일은 /etc/init.d/rc 이다.
rc 가 어떻게 해서 실행되는지는 부팅과정을 설명할 때 자세히 다루겠다.

rc 스크립트의 일부이다.

---------------------------------------------------------------------

    for i in /etc/rc$runlevel.d/S*
    do
        [ ! -f $i ] && continue

        if [ $previous != N ] && [ $previous != S ]
        then
            #
            # Find start script in previous runlevel and
            # stop script in this runlevel. 
            #
            suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
            stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
            previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
            #
            # If there is a start script in the previous level
            # and _no_ stop script in this level, we don't
            # have to re-start the service.
            #
            [ -f $previous_start ] && [ ! -f $stop ] && continue
        fi
        case "$runlevel" in
            0|6)
                startup $i stop
                ;;
            *)
                startup $i start
                ;;
        esac
    done

---------------------------------------------------------------------
주석 해석>
          
            # Find start script in previous runlevel and
            # stop script in this runlevel. 
       
            이 전의 런레벨에 있던 start 스크립트와
            현재의 런레벨에 있는 stop 스크립트를 찾는다.
           
            # If there is a start script in the previous level
            # and _no_ stop script in this level, we don't
            # have to re-start the service.
           
            만약에 이전 런레벨에 start 스크립트가 있는데,
            지금 현재의 런레벨에는 stop 스크립트가 없을경우,
            해당하는 스크립트의 서비스를 제시작 할 수 없다.

---------------------------------------------------------------------          

-rc 스크립트의 이 부분은, /etc/rcN.d 디렉토리 아래에 있는 S로 시작하는
모든 파일에 대해서 다음과 같은 일을 수행한다.

        - 현재의 런레벨이 0이나 6일때는 startup 함수를 stop인수로 호출하고,

        - 그 나머지 런레벨인 1.2.3.4.5일때는 start를 인수로 하여 startup을 호출한다.

startup() 함수는 다음과 같이 정의되어 있다 :

---------------------------------------------------------------------

startup() {
        case "$1" in
        *.sh)
                 $debug sh "$@"
        ;;
        *)
                 $debug "$@"
        ;;
        esac
        }

---------------------------------------------------------------------

startup 함수는 인수로 넘겨받은 "$1"  파일을 실행한다.
여기서 startup함수가 넘겨받는 인수는 파일 이름 뿐 만이 아니고,
뒤에 따라붙는 stop 혹은 start 의 지시자까지도 넘겨받게 된다.

  즉, startup foo start 라고 호출하였을 경우 함수는 foo start ($@ 변수)를 실행하게
되는 것이다.

-여기서 우선, /etc/init.d 에 들어갈, daemon 을 실행 / 중지 시키는 스크립트의
작성요령 보자.

친절하게도 데비안에서는 /etc/init.d/skeleton 파일에 /etc/init.d 디렉토리에 들어갈
스크립트들의 기본 골격을 만들어 두었다.

/etc/init.d/skeleton 의 코드는 약간 복잡한데, 더 단순화 하면 다음과 같다.

---------------------------------------------------------------------

case "$1" in
  start)
        #이부분에 시작되는 코드를 넣는다.
        ;;
  stop)
        #이부분에 종료하는 코드를 넣는다.
        ;;
  *)
        #만약 start 혹은 stop이 명시되지 않으면 다음줄을 실행한다.
        echo "Usage: skeleton {start|stop}"
  esac

---------------------------------------------------------------------

스크립트에 이 부분만 포함되어 있으면, 시스템이 시작할 때,
원하는 daemon 을 실행시키고, 종료될 때 안전하게 끝날 수 있도록 할 수 있다.
그 이유는, 앞서 설명한 rc 스크립트에서도 보았듯이 rc 가 /etc/init.d 의 스크립트를
실행하면서 넘겨주는 인수인 start 혹은 stop 으로 daemon 을 시작할 것인지,
아니면 종료할 것인지를 결정하기 때문이고, 따라서, 위의 형태와 같이 스크립트를
작성해야만 rc 파일과 함께 무리없이 잘 동작하는 스크립트를 만들 수 있을 것이다.

*6. 부팅시 서비스 등록

-부팅시에 실행하고자 하는 daemon 이나 그 daemon을 실행하는 스크립트를 원하는
런레벨에서 실행하도록 할려면 /etc/rcN(런레벨).d 에 링크를 걸어주면 된다.

-먼저 링크를 거는 방법에 대해 얘기해 보겠다.
다음과 같은 예를 보자.

---------------------------------------------------------------------

# cat > /etc/init.d/runa
#!/bin/sh
case $i in
start)
        echo Runa hello
        ;;
stop)
        echo Runa Bye
        ;;
*)
        echo "Usage: runa [start|stop]"
easc
^D
---------------------------------------------------------------------

# chmod a+x /etc/init.d/runa
# cd /etc/rc0.d
# ln -s /etc/init.d/runa K80runa
# cd /etc/rc1.d
# ln -s /etc/init.d/runa K80runa
# cd /etc/rc2.d
# ln -s /etc/init.d/runa S80runa
# cd /etc/rc3.d
# ln -s /etc/init.d/runa S80runa
# cd /etc/rc4.d
# ln -s /etc/init.d/runa S80runa
# cd /etc/rc5.d
# ln -s /etc/init.d/runa S80runa
# cd /etc/rc6.d
# ln -s /etc/init.d/runa K80runa

---------------------------------------------------------------------

*7. update-rc.d

위 방법을 보다 간편하게 링크를 걸기 위해 사용되는 도구가 update-rc.d이다.
스크립트를 위와 같이 작성했다고 가정하고, 다음과 같이 써주면 된다.

---------------------------------------------------------------------

# update-rc.d runa defaults
Adding system startup for /etc/init.d/runa ...
   /etc/rc0.d/K20runa -> ../init.d/runa
   /etc/rc1.d/K20runa -> ../init.d/runa
   /etc/rc6.d/K20runa -> ../init.d/runa
   /etc/rc2.d/S20runa -> ../init.d/runa
   /etc/rc3.d/S20runa -> ../init.d/runa
   /etc/rc4.d/S20runa -> ../init.d/runa
   /etc/rc5.d/S20runa -> ../init.d/runa
#

---------------------------------------------------------------------

-보는 바와 같이 자동으로 링크가 걸렸다.
defaults 를 써 주었을때에는 런레벨 2,3,4,5 에는 start 를,
016 에는 stop을 해서 링크가 걸리게 된다.
보다 자세한 update-rc.d 의 사용법을 알기 위해서 man page에 나오는 설명과
예제를 요약해 보면

# man update-rc.d

SYNOPSIS
       update-rc.d [-n] [-f] name remove

       update-rc.d [-n] name defaults [NN | NN-start NN-stop]

       update-rc.d [-n] name start|stop NN runlevel runlevel  ...
              .  start|stop NN runlevel runlevel ...  . ..

설명>

update-rc.d는 system V 스타일의 /etc/rcRUNLEVEL.d/NNname 을 /etc/init.d/name
으로의 init 스크립트의 링크를 자동으로 갱신해 준다.
이 스크립트들은 runlevel 을 바꿀 때 init 프로그램에 의해서
시스템의 daemon 과 같은 서비스를 시작하거나 중지할 때 사용된다. (중략)
INSTALLING INIT SCRIPT LINKS
defaults 값을 주고서 실행했을 경우에 update-rc.d 는 런레벨 2345 에
서비스를 시작하는 링크를 만들고, 런레벨 016에 서비스를 중지하는 링크를 만들어 준다.
그리고, 기본적으로 모든 링크는 숫자 20 을 사용하여 링크된다.
즉, name 에 foobar 가 주어졌다면, S20foobar K20foobar 와 같은 식의 이름의 링크가
생성된다.


예제>

defaults 값 대신 여러 가지 값들이 주어질 수가 있다.

defaults 값 대신에 줄 수 있는 여러 가지 값들은 예제를 통해서 알아보면,

---------------------------------------------------------------------
# update-rc.d -n test defaults 80
---------------------------------------------------------------------

과 같이 하면, S80test K80 test 와 같은 식으로 링크가 생성된다.
시작링크와 종료링크, 즉, S 로 시작되는 링크와 K 로 시작되는 링크가 생성되는
런레벨은 앞서 얘기한 defaults 값으로 되며, 그것은 2345 에는 서비스를
시작할 수 있도록 링크를 걸어주며,
016에는 서비스를 종료하도록 링크를 생성해 주는 것이다.

-n 옵션이 주어졌을 때에는 update-rc.d 는 실제로 아무것도 하지 않고,
단지 실제로 실행되었을 때 어떠어떠하게 될 것이다라는 메세지만을 화면에 출력하고
종료한다.

---------------------------------------------------------------------       
# update-rc.d -f test remove
---------------------------------------------------------------------

를 하면, test 를 가리키는 링크들을 /etc/rcN.d 디렉토리들에서 찾아서 모두 지워준다.

여기서 잠시 -f 옵션에 대해서 알아보도록 하겠다.

먼저, -f 옵션을 주지 않고 update-rc.d 를 이용해서 링크를 생성하거나
링크를 삭제할 경우에는 어떻게 되는지를 이야기해 보겠다.

첫번째로, -f 옵션 없이 링크를 생성하는 update-rc.d 명령을 실행하게 되면,
update-rc.d 는 /etc/init.d 에 있는 스크립트 파일로의 링크가 /etc/rc?.d 에
존재할 경우에는 링크를 생성시켜주지 않고 에러를 출력하고 종료한다.

두번째로, -f 옵션 없이 링크를 삭제하는 update-rc.d 명령을 실행하게 되면,
update-rc.d 는 /etc/init.d 에 있는 스크립트가 존재하는지를 체크하게 된다.
그렇게 하여서 만약 /etc/init.d 에 스크립트가 (삭제하고자 하는 링크가 가리키는 파일)
존재하고 있다면, 삭제를 수행하지 않고, 에러를 출력하고 종료하게 된다.

그러나 -f 옵션이 주어질 경우, 파일의 존재여부를 무시하고 링크를 삭제
내지는 생성하게 된다.


---------------------------------------------------------------------
# update-rc.d test start 80 2 5 . stop 20 0 1 .
---------------------------------------------------------------------

과 같이 '.' 으로 start 와 stop 을 구분해서 적어주면,

/etc/rc2.d/S80test
/etc/rc5.d/S80test
/etc/rc0.d/K20test
/etc/rc1.d/K20test

의 링크가 생성되는데 이 예제는,

앞서 언급한 update-rc.d 명령의 형식에 보면, 다음과 같은 라인이 나온다 :

       update-rc.d [-n] name start|stop NN runlevel runlevel  ...
              .  start|stop NN runlevel runlevel ...  . ..

이것을 번역하면 다음과 같다.

        update-rc.d (이름) (start 혹은 stop) (S 혹은 K 뒤에 들어갈 두자리 숫자)
                           (start 혹은 stop 의 링크가 생성될 런레벨의 목록) .
                           (start 혹은 stop) (S 혹은 K 뒤에 들어갈 두자리 숫자)
                           (start 혹은 stop 의 링크가 생성될 런레벨의 목록) .

-이처럼 rc 파일의 구조와 동작 원리를 알고, 또한 그에 따르는 디렉토리의 내용과
디렉토리 내부의 파일들의 역할을 잘 이해한다면, 시스템 부팅시에 제공할 서비스들을
자유롭게 선택할 수 있을 것이다.

-또한, 편리한 관리 도구인 update-rc.d 도 이용한다면
보다 쉽게 시스템의 서비스나 프로세스들에 대한 컨트롤을 가질 수 있을 것이다.

참고
----------------------------------------------------------------------
레드헷의 경우 ntsysv라는 일반 콘솔에서 조작하는 런레벨 메니저가 있다.
또한 X윈도우용인 tksysv가 있다.
----------------------------------------------------------------------




######################################################################
디스크 관리부분
######################################################################


*1. cfdisk 소개

1. cfdisk란?

  cfdisk는 기존의 숫자 선택을 통한 일방적인 진행을 통해 설정하던 fdisk를 메뉴화
시키고, 조금 더 인터렉티브(interactive)하게 만든 것으로, 현재 레드햇 리눅스
(Red Hat Linux) 7.2 이니그마(Enigma)에서도 Disk Druid, fdisk와 함께 채용하고
있을 정도로 상당히 편리한 파티셔닝(partitioning) 도구라고 할 수 있습니다.
  데비안(Debian GNU/Linux)의 경우는 파티셔닝 도구로 cfdisk를 기본으로 채택하고
있습니다. 기존의 레드햇 사용자의 경우는 cfdisk가 처음보는 형태라 dselect와
더불어 접근하는데 있어 발생하는 거부감으로 인해 접근에 어려움이 있으리라 생각
합니다. 이에, cfdisk의 기본적인 모습부터 활용까지 알아보도록 하겠습니다.

2. cfdisk의 시작

  cfdisk를 사용하려면 파티션을 나누는 작업을 하는 것이므로 일반적으로 root로
로그인(login)하시거나 su(substitute user : 사용자 전환) 명령을 통해 root로
전환이 필요합니다. 또는, 그룹(group : /etc/group) 권한에서 disk 권한이 필요
합니다. sudo를 이용하셔서 root 권한을 획득하셔도 무방합니다.
서론이 길었군요. cfdisk의 실행은 결론적으로 "디스크 사용 권한(access permission)을
가진 상태에서 cfdisk를 입력하여 실행하면 된다"입니다.

---------------------------------------------------------------------
  # cfdisk
---------------------------------------------------------------------

  ---cfdisk의 옵션에 대해---
 
  "cfdisk --help"를 실행해 보면 몇 가지 옵션을 볼 수 있습니다.
  이 옵션을 보면 다음과 같습니다.

   cfdisk -v
    - cfdisk의 버전을 출력합니다.

   cfdisk -P {r|s|t} [option] 장치
    - 해당 장치(device)의 파티션 정보를 출력합니다.
      예를 들어 "cfdisk -P r /dev/hda"라고 한다면 /dev/hda 장치의 파티션 정보를
      Raw 형식으로 보여줍니다.
     
      Disk Drive: /dev/hda
      Sector 0:
      0x000: FA E8 42 00 81 01 4C 49 4C 4F 01 00 16 02 00 00
      0x010: 00 00 00 00 5D 4C 6D 38 5B 00 00 00 00 00 00 00
     
      만약 r 옵션 대신 s 옵션을 사용한다면, 파티션 정보를 섹터로

        Partition Table for /dev/hda

                    First    Last
         # Type     Sector   Sector   Offset  Length   Filesystem Type (ID)   Flags
        -- ------- -------- --------- ------ --------- ---------------------- ---------
         1 Primary        0   385559      63   385560  Linux (83)             Boot (80)
         2 Primary   385560 33591914       0 33206355  Extended (05)          None (00)

      과 같은 파티션 요약정보를 보여줍니다.

      마지막으로, t 옵션을 사용한다면, 파티션 정보를 테이블 형태로

      Partition Table for /dev/hda

               ---Starting---      ----Ending----    Start Number of
       # Flags Head Sect Cyl   ID  Head Sect Cyl    Sector  Sectors
      -- ----- ---- ---- ---- ---- ---- ---- ---- -------- ---------
       1  0x80    1    1    0 0x83  254   63   23       63    385497
       2  0x00    0    1   24 0x05  254   63 1023   385560  33206355

      과 같이 보여줍니다.

      이 것이 -P 옵션이고

      다른 옵션으로는 -a, -z, -c C -h -H -s S 등이 있으며, -a는 하이라이팅
      (선택 영역을 반전시켜 주는 것) 대신 화살표를 사용하도록 해주며, -z는
      현재 설정되어 있는 모든 파티션을 무시하고 0 파티션 즉, 아무것도 설정이 안된
      것으로 간주한 상태에서 시작합니다.
      -c C -h H -s S는 현재 커널이 읽어들인 하드디스크 정보를 무시하고 사용자가
      직접 Cylinder(실린더), Head(헤드), Sector(섹터) 값을 입력하는 것입니다.

     -----------------------------------------------------------------------


이렇게 실행을 하시면 [그림 1]과 같은 화면 구성을 보실 수 있습니다.

[그림 1 cfdisk-2-1.jpg]

한가지씩 알아 보도록 하겠습니다.

   cfidk 2.11n
    - cfdisk의 버전(version)을 표시하는 부분입니다.

   Disk Drive: /dev/hda
    - 현재 편집중인 파티션을 의미합니다. /dev/hda 인 것으로 보아 IDE 방식
      하드디스크로 메인보드(Mainboard)의 프라이머리(Primary) 마스터(Master)에
      연결되어 있습니다.
  
   Size:  30738677760 bytes
    - 현재 편집 중인 하드디스크의 크기를 의미합니다.

   Heads: 255   Sectors per Track: 63   Cylinders: 3737
    - 하드디스크의 헤더 수, 트랙 당 섹터 수, 실린더 수를 나타냅니다.

   Name
    - 하드디스크 파티션의 이름을 나타냅니다.

   Flags
    - 해당 파티션의 상태를 나타냅니다. "Boot"라고 표시되어 있는 것이 부팅 파티션입니다.

   Part Type
    - 파티션 종류를 나타냅니다. Primary와 Logical이 있으며, Primary는 말 그대로
      주 파티션이고 Logical은 논리 파티션으로 확장(Extended) 파티션에 사용자가
      사용할 수 있도록 논리적으로 분리해 놓은 파티션을 의미합니다. 참고적으로
      하나의 하드 디스크에는 최대 4개까지의 주 파티션이 생성될 수 있으며 4개까지
      주 파티션이 생성된 다음에는 빈 공간(Free Space)가 있어도 파티션 생성이 불가합니다.

   FS Type
    - 파티션의 파일시스템(file system) 종류를 나타냅니다. 현재 Linux ReiserFS와
      Linux swap 파티션이 보여지고 있습니다.

   [Label]
    - 해당 파티션의 레이블 즉, 이름을 나타냅니다.

   Size (MB)
    - 해당 파티션의 크기를 MB(Mega Byte)로 나타냅니다.

   Bootable
    - 선택된 파티션을 부팅 파티션으로 지정합니다.

   Delete
    - 선택된 파티션을 삭제합니다.

   Help
    - cfdisk 사용법의 설명을 보여줍니다.
  
   Maximize
    - 선택된 파티션을 남은 공간을 모두 이용하며 최대 크기로 만듭니다.

   Print
    - 현재의 설정 상태를 Raw, Sectors, Table 형태로 보여주며, 파일로 저장,
      또는 화면상으로 출력할 수 있습니다. "cfdisk -P" 옵션을 실행하는 것과 동일합니다.

   Quit
    - cfdisk를 종료합니다.

   Type
     - 현재 선택된 파티션의 종류를 결정합니다.

   Units
    - 한 번 선택할 때마다 우측 크기 정보를 크기(Size) -> 섹터(Sectors) ->
      실린더(Cylinders)로 변경합니다.

*2. cfdisk 에서의 파티션 설정

1. 파티션 생성(Creation of Partition)

  파티션을 만드려면 현재 표시되어 있는 커서를 "Pri/Log Free Space" 즉, 빈 공간으로
이동시킵니다.
메뉴에서 [New]를 선택하면 [그림 2]의 화면이 나타납니다.

[그림 2 cfdisk-3-1.jpg]

  - [Primary] : 주(Primary) 파티션을 만드는 것으로, 하나의 하드 디스크 당 최대
    4개의 주 파티션이 만들어 질 수 있으며, MS Windows의 경우 1개의 주 파티션을
    생성하며, 나머지는 모두 확장(Extended) 파티션 상의 논리(Logical) 파티션으로
    만듭니다.

  - [Logical] : 논리(Logical) 파티션으로 만드는 것으로, 주 파티션과 같은 갯수
    제한이 없다. (정확히는 있으나 신경을 쓰지 않아도 된다)

  논리 파티션을 생성할 것이므로 [Logical]을 선택하면 [그림 3]의  화면이 나타납니다.

  [그림 3 cfdisk-3-2.jpg]

  Size는 말 그대로 크기를 지정하는 부분입니다.
  필자의 경우는 현재 남은 13538.81MB를 둘로 나눌 생각이므로 일단은 6500MB로 지정했습니다.
  크기를 지정해주면 [그림 4]의  화면이 나타납니다.

  [그림 4 cfdisk-3-3.jpg]

   - [Beginning] : 남은 섹터의 시작 부분부터 입력한 크기만큼 만드는 것을 의미합니다.

   - [   End   ] : 남은 섹터의 끝 부분부터 입력한 크기만큼 만드는 것을 의미합니다.

  시작부분부터 만드는 것이 통례적이므로 [Beginning]을 선택합니다.

  이제 하나의 파티션 생성이 되었습니다. 이렇게 생성을 마치면 [그림 5]와 같은 화면이
  나타납니다.

  [그림 5 cfdisk-3-4.jpg]

  이름은 파티션 생성 순서에 따라 hda10으로 지정되었으며, 파일시스템 종류는 Linux로
  기본 값이 선택되어 있습니다. 이름은 입력을 해주지 않았으므로 정해지지 않았습니다.

2. 파티션 종류 변경

  파티션의 종류를 바꿔 보도록 하겠습니다.
  메뉴에서 [Type]을 선택합니다.
  [그림 6]과 같은 해당 번호당 지정되어 있는 파일시스템 종류를 나타내주며,
  아무 키(key)나 누르면 두 번째 설명 페이지로 넘어갑니다. 아무 키나 눌러봅니다.
  그러면, [그림 7]과 같이 파일시스템 설명이 계속 나오고 선택할 파일시스템의 종류를
  입력하라고 나타납니다.

  [그림 6 cfdisk-4-1.jpg]

  [그림 7 cfdisk-4-2.jpg]

  스왑(swap) 파티션으로 변경하기 위해 82를 입력했습니다.
  [그림 8]처럼 6.5GB짜리 스왑 파티션이 만들어졌습니다.

  [그림 8 cfdisk-4-3.jpg]

3. 파티션 삭제

  파티션을 지워보도록 하겠습니다.
  선택한 파티션을 지우려면 메뉴에서 [Delete]를 선택합니다.
  그러면 삭제됩니다. (물어보지도 않습니다.)

4. 파티션 정보 기록

  변경사항을 기록해 보겠습니다.
  기록하지 않으면 변경한 사항이 기록되지 않습니다.
  기록하려면 [Write]를 선택합니다.
  선택을 하면 [그림 9]와 같이 현재 파티션 테이블을 디스크에 기록할 것인지 "yes"나
  "no"로 대답하라는 문구가 나타납니다.
  기록할 것이니 "yes"를 입력합니다. 물론, 기록하지 않으려면 "no"를 선택하시면 됩니다.
 
  [그림 9 cfdisk-6-1.jpg]

  "yes"를 선택하면 잠시 후 파티션 정보를 기록 중이라는 문구가 나타나고 다시
   cfdisk 주 화면이 나타납니다.

5. cfdisk 종료

메뉴에서 [Quit]를 선택합니다.


 
*3. 하드디스크 추가

하드 디스크를 새로 추가 하는 작업을 다음과 같은 단계로 구분해 보았다.

단계---------------------------------------------+
   1. 사전 확인 사항 점검                         |
   2. 하드디스크 추가 장착(커널에 인식)           |
   3. 파티션 작성                                 |
   4. 파일 시스템을 포맷                          |
   5. 파일 시스템 마운트(/etc/fstab에 설정)       |
   6. 재부팅후 확인                               |
  ------------------------------------------------+

1. 사전 확인 사항 점검

1.1 현재 사용중인 하드디스크 확인(/etc/fstab 내용확인)

----------------------------------------------------------------------
jandie@master:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>                       <dump>  <pass>
/dev/hda1       /               reiserfs        defaults,notail 0       0
/dev/hda2       none            swap    sw                      0       0
proc            /proc           proc    defaults                        0       0
/dev/fd0        /floppy         auto    defaults,user,noauto            0       0
/dev/cdroms/cdrom0      /cdrom0         iso9660 defaults,ro,user,noauto         0       0
/dev/cdroms/cdrom1      /cdrom1         iso9660 defaults,ro,user,noauto         0       0
/dev/hda3       /usr    reiserfs        defaults,notail                 0       0
/dev/hda5       /var    reiserfs        defaults,notail                 0       0
/dev/hda6       /home   reiserfs        defaults,notail                 0       0
/dev/hda7       /boot   ext2            defaults                0       0
/dev/hda8       /home2  reiserfs        defaults                        0       0
tmps            /dev/shm        tmpfs   defaults                        0       0
jandie@master:~$
---------------------------------------------------------------------

1.2 df명령어로 내용확인

-h옵션은 용량단위를 보기 쉽게 해줌
-h, --human-readable
              print sizes in human readable format (e.g., 1K 234M 2G)

---------------------------------------------------------------------
jandie@master:~$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1             957M  120M  837M  13% /
/dev/hda3             4.7G  2.7G  1.9G  58% /usr
/dev/hda5             2.8G  488M  2.3G  18% /var
/dev/hda6              20G   15G  4.6G  77% /home
/dev/hda7              99M   23M   71M  25% /boot
/dev/hda8             8.9G  702M  8.2G   8% /home2
tmps                  188M     0  187M   0% /dev/shm
jandie@master:~$
---------------------------------------------------------------------

  1.3 mount명령어로 내용확인

---------------------------------------------------------------------
jandie@master:~$ mount
/dev/hda1 on / type reiserfs (rw,notail)
proc on /proc type proc (rw)
/dev/hda3 on /usr type reiserfs (rw,notail)
/dev/hda5 on /var type reiserfs (rw,notail)
/dev/hda6 on /home type reiserfs (rw,notail)
/dev/hda7 on /boot type ext2 (rw)
/dev/hda8 on /home2 type reiserfs (rw)
tmps on /dev/shm type tmpfs (rw)
jandie@master:~$
---------------------------------------------------------------------

하드디스크 내용과 파티션,마운트위치를 정확히 파악하셔야합니다.


2.하드디스트 추가 장착후 재부팅

2.1 재부팅후 확인(dmesg)

---------------------------------------------------------------------
jandie@master:~$ dmesg|grep hd
Kernel command line: BOOT_IMAGE=unstable ro root=341 hdd=ide-scsi
ide_setup: hdd=ide-scsi
hda: WDC WD400BB-00CFC0, ATA DISK drive
hdb: WDC WD205BA, ATA DISK drive
hdc: CRD-8402B, ATAPI CD/DVD-ROM drive
hdd: HL-DT-ST GCE-8160B, ATAPI CD/DVD-ROM drive
hda: 78165360 sectors (40021 MB) w/2048KiB Cache, CHS=4865/255/63
hdb: 40088160 sectors (20525 MB) w/2048KiB Cache, CHS=2495/255/63
hdc: ATAPI 48X CD-ROM drive, 128kB Cache
jandie@master:~$
---------------------------------------------------------------------
hdb가 추가되었습니다.

3. 파티션 작성

  하드장착이 확인되었으면 fdisk로 파티션생성을 합니다.(파티션 생성은 cfdisk나
기타 파티션 작성 프로그램으로 작성하면 됩니다.)

---------------------------------------------------------------------
jandie@master:~$ fdisk /dev/hda (아무것도 적지 않으면 첫번째 IDE 드라이브가 기본값)
Command (m for help):
(첫번째로 p명령으로 파티션레이블의 현재상태를 확인한다.)

Command (m for help): p
Disk /dev/hda: 16 heads, 38 sectors, 683 cylinders
Units = Cylinders of 608 * 512 bytes
Device        Boot        Begin        Start        End        Blocks        Id        System
/dev/hda1 *        1        1        203        61693        83        ext2

Command (m for help):

(/dev/hda1에 약60M 한개의 ext2파티션이 만들어져있다.)

command (m for help):n
Command action
e        extend
p        primary partition(1-4)
p

(생성할 파티션의 종류를 물어온다. 확장파티션 또는 프라이머리파티션 인지.
파티션이 4개가 넘어갈 경우 프라이머리파티션중 하나를 extend로 설정하여 나눠주면 된다.
예제는 프라이머리로만 가능)


Partition Number(1-4):2
first cylinder (204-683):204
Last cylinder or +size or +sizeM or +sizeK (204-683):+80M
---------------------------------------------------------------------

생성할 파티션번호는 1번이 사용중이므로 2번을 선택한다.
파티션의 시작실린더번호를 물어온다.
204부터 683실린더까지 사용할수 있으므로 204를 입력한다. 끝나는 실런더를 지정할때는
바이트/킬로바이트/메가바이트 단위 크기 지정이 가능하다.
대부분 메가바이트를 사용할것이다.

p로 확인을 한후 t명령어로 파티션타입을 지정해주면된다.

작업이 끝난후 w 명령어로 저장후 빠져나온다.   
저장하지 않고 빠져나올경우엔 q 명령을 쓴다.


4. 작성된파티션에 파일시스템 생성

4.1 ext2
  가장 흔하게 사용되는 filesystem은 Second Extended Filesystem  ( ext2fs )이다.
  Ext2fs filesystem은 가장 효율적이고 유연한 filesystem중의  하나이다: 이는
  filename을 256자까지 가능하게 하며,  filesystem 크기는 4 테라바이트까지 가능하다.
  그러나 내부적으로는 우리는 extfs filesystem을 사용한다고 가정한다.

4.2 ext2 파일 시스템 생성
  mkfs 명령을 사용하여 파일시스템을 만들 수 있다. 흔히 말하는 '포맷'과 비슷하다.
  ext2파일시스템은 mkfs.ext2를 사용한다. mkfs.ext2와 mke2fs는 같다.
---------------------------------------------------------------------
  mkfs -t type device blocks

ex> mkfs -t ext2 -c /dev/hda2 1000
---------------------------------------------------------------------
1메가 hda2 하드를 나타낸다.

하지만 대부분 자동으로 파티션크기를 인식하여 처리하므로 blocks인수는 적어주지
않는다. 괜히 잘못써주면 다른파티션까지 몽땅 날아가는 수가 있으므로 왠만하면
비어두자. 일반적으로 간단하게 mke2fs device 로 간단히 해결가능하다.

mkfs의 옵션
-c 파일시스템을 만들면서 물리적인 배드블럭을 점검
(-v 진행과정 출력옵션)


5.파일 시스템 마운트

mount 명령을 통하셔 파일 시스템을 마운트 하여야 합니다.
mount 명령에 대한 자세한 사항은 참고란을 하십시오.
---------------------------------------------------------------------
   # mount -t ext2 /dev/hda3 /mnt/unstable1
   # mount -t ext2 /dev/hda5 /mnt/stable
---------------------------------------------------------------------

부팅시 자동 마운트를 위한 /etc/fstab 편집
형식은 device mount-point type options
각각의 의미는 mount명령과 같다.

---------------------------------------------------------------------
jandie@master:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>                       <dump>  <pass>
/dev/hdb1       /               reiserfs        defaults,notail 0       0
/dev/hdb2       none            swap    sw                      0       0
proc            /proc           proc    defaults                        0       0
/dev/fd0        /floppy         auto    defaults,user,noauto            0       0
/dev/cdroms/cdrom0      /cdrom0         iso9660 defaults,ro,user,noauto         0       0
/dev/cdroms/cdrom1      /cdrom1         iso9660 defaults,ro,user,noauto         0       0
/dev/hdb3       /usr    reiserfs        defaults,notail                 0       0
/dev/hdb5       /var    reiserfs        defaults,notail                 0       0
/dev/hdb6       /home   reiserfs        defaults,notail                 0       0
/dev/hdb7       /boot   ext2            defaults                0       0
/dev/hdb8       /home2  reiserfs        defaults                        0       0
tmps            /dev/shm        tmpfs   defaults                        0       0
/dev/hda3       /mnt/unstable1  ext2    defaults,noauto         0       0 *추가!
/dev/hda5       /mnt/stable     ext2    defaults,noauto         0       0 *추가!
jandie@master:~$
---------------------------------------------------------------------

ex>
#device  &nb

Reentrancy Attack: 블록체인 스마트 컨트랙트의 치명적인 취약점

블록체인 기술이 전 세계적으로 주목받으면서 스마트 컨트랙트(Smart Contract)의 사용이 급격히 증가하고 있습니다. 하지만 그만큼 보안 취약점도 함께 늘어나고 있는데, 그 중에서도 Reentrancy Attack(재진입 공격)은 매우 치명적이고...