2011. 11. 28. 19:28 Log/Linux

DNS - Domain Name Service

dns 서비스

dns 서버는 크게 세가지가 있다.

1. Primary DNS (또는 Master DNS)

2. Secondary DNS (또는 Slave DNS) - 백업 역할을 하는 DNS.
반드시 필요한 것은 아니며 primary dns 가 다운되었을때 대신 서비스 하기 위한것이다.

3. Cache Only DNS


DNS 역할

다른 호스트에 접속시 ip 주소가 반드시 필요하다.
그러나 ip 주소는 기억하기 어려우므로 보통 도메인 이름을 사용한다.
그래서 필요한 것이 DNS 이다.

도메인에 대한 해당 ip 주소를 알려주는것이 DNS 의 주된 역할이다.


도메인이 ip 주소로 변환되는 과정.

1. 클라이언트: http://www.abc.co.kr
2. ip 주소가 아니므로 클라이언트는 ip주소를 알아내기 위해 /etc/host.conf 파일 참조
여기에 order hosts,bind 로 설정되어 있으면 /etc/hosts 에서 해당도메인 정보를 찾고
없으면 그 다음 /etc/resolv.conf 파일을 참조한다. 적혀있는 순서대로 참조한다.
3. /etc/hosts 파일에 없다고 가정하면 /etc/resolv.conf 를 참조하게 되고
거기에 nameserver 168.126.63.1 이 적혀 있으면 그 주소의 서버에게 도메인 주소를
알려 달라고 요청한다.
4. 168.126.63.1 의 dns 서버가 자신이 가지고 있는 dns zone 설정 파일을 참조해서
해당되는 정보가 있으면 ip 를 알려준다.
5. 클라이언트는 ip 를 알게되었으므로 그 ip 를 가지고 서버에 접속한다.


*. 그런데 4번 단계에서 168.126.63.1(kornet) dns 가 www.abc.co.kr 에 대한 설정을 가지고 있지
않으면 조금 복잡해진다.

이런경우 코넷 dns는 최상위 계층에 존재하는 root dns 에게 www.abc.co.kr 에 대한 도메인 주소를
물어본다. 실제 등록된 domain 주소에 대한 ip 주소는 root dns 는 전부 찾을 수 있다.

5. root dns 는 www.abc.co.kr 에 대한 정보를 찾기 위해서 하위 몇단계를 거쳐 찾는다.
그리고 그 정보를 코넷 dns 한테 알려준다.

6. 코넷 dns는 www.abc.co.kr 주소를 캐시영역에 저장해두고 찾은 ip 주소는 클라이언트에게 알려준다.

*. 그 다음 또 어떤 클라이언트가 코넷 dns에게 www.abc.co.kr 의 ip 를 알려달라고 요청하면
이번에는 캐시에 그 정보가 저장되어 있으므로 root dns 에게 묻지 않고 바로 알려준다.

유닉스에서 주로 사용되는 dns 패키지는 bind 이다.

[root@star etc]# rpm -qa | grep bind
bind-utils-9.3.1-4
bind-9.3.1-4
ypbind-1.17.2-5 => 이건 bind 패키지가 아니다.
bind-chroot-9.3.1-4
bind-libs-9.3.1-4

설치되어 있지 않으면 rpm 또는 yum 으로 설치한다.

*. DNS 설정파일

/etc/named.conf

나머지 세부 설정파일은 /etc/named.conf 의 설정에 따라 경로 및 파일이름이 결정된다.

[root@star etc]# cat /etc/named.conf
// <== // 이 기호는 주석으로 사용된다. 한라인 주석.
// named.conf for Red Hat caching-nameserver
//

options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};

//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

zone "." IN {
type hint;
file "named.ca";
};

zone "localdomain" IN {
type master;
file "localdomain.zone";
allow-update { none; };
};

zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};

/* 여기서 부터는 ipV6 를 위한 설정으로 ipV6 사용하지 않는다면
수정할 필요없이 그대로 두면 된다. (/* ~ */ 이 사이에 있는것은 다 주석으로 처리된다)

zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.ip6.local";
allow-update { none; };
};

zone "255.in-addr.arpa" IN {
type master;
file "named.broadcast";
allow-update { none; };
};

zone "0.in-addr.arpa" IN {
type master;
file "named.zero";
allow-update { none; };
};

*/

include "/etc/rndc.key";

*. named.conf 파일안에 들어가는 설정은 크게 4가지이다.

첫번째 - 세부 설정파일을 저장할 디렉토리 : option
두번째 - root domain zone
세번째 - Forward zone : 도메인 -> ip 변환
네번째 - Reverse zone : ip -> 도메인 변환

[root@star etc]#

'Log > Linux' 카테고리의 다른 글

DNS - Primary DNS 설정 및 테스트  (0) 2011.11.28
dns 설정파일 문법  (0) 2011.11.28
압축유틸리티/백업복구/패키지관리  (0) 2011.11.28
ftp 서비스 - server  (0) 2011.11.28
ftp 서비스 - client  (0) 2011.11.28
Posted by logwatch

압축유틸리티/백업복구/패키지관리

압축 utility

gzip 리눅스에서 가장 많이 사용되는 압축 프로그램이다.

man gzip
GZIP(1) GZIP(1)
NAME gzip, gunzip, zcat - compress or expand files
(gzip외에 옆에 두개의 gunzip, zcat 명령은 서로 관련 있는 명령어라는 의미이다)
SYNOPSIS gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ... ] (옵션은 역시 많다)
gunzip [ -acfhlLnNrtvV ] [-S suffix] [ name ... ] zcat [ -fhLV ] [ name ... ]

옵션이 많지만 역시 많이 사용되는 것은 몇 개 안된다.

주요옵션

압축시 숫자 1 ~ 9 (정수) : 압축시 사용하는 옵션으로 숫자가 1에 가까울수록 압축효율은 낮고
압축시간을 단축된다.
숫자가 9에 가까울수록 압축효율은 높고 압축시간은 길어진다.

압축해제시 -d (또는 gunzip)

ex)
mkdir /tmp/testcd /tmp/test

[root@river test]# cp /bin/a* /etc/syslog.conf ./ (실습을 위해 몇 개의 파일을 복사한다)

[root@river test]# lsarch ash ash.static aumix-minimal awk syslog.conf

[root@river test]# gzip * a.gz gzip: a.gz: No such file or directory

모든 파일을 압축한 후 a.gz 파일 하나로 만들려고 했으나 되지 않는다.gzip 뒤에 압축할 대상 만 적을 수 있을 뿐이다.
만들어질 파일은 결정하지 못한다. mswinodws 에서 사용되는 압축프로그램처럼 하나로 묶어주는 기능은 갖고 있지 못하다.
이것은 하나의 명령어는 최소한의 필요한 작업만 할 수 있도록 만들어져 있기 때문이다. unix의 철학이기도 하다.
압축 프로그램은 단지 압축과 관련된 일만 한다.

[root@river test]# lsarch.gz ash.gz ash.static.gz aumix-minimal.gz awk.gz syslog.conf.gz

[root@river test]#

파일들이 각각 압축되었다. 그러나 이렇게 압축한다면 관리하기 어려울 것이다. 예를 들어서 인터넷에 올리거나
메일로 보내거나 해야 한다면 지금처럼 몇 개 안되지만 수십 개 또는 수백 개의 파일로 이루어져 있다면 곤란할 것이다.
그런 경우 하나로 묶어줄 필요가 있다.

파일묶기

tar (Tape Archive) - 파일명이 의미하는 것과 같이 tar는 데이터를 자기테이프에 백업하기 위한 용도로 많이 쓰이는 명령어이다.
그러나 압축하기 전에 파일을 먼저 하나로 묶기 위해서도 많이 사용한다.

인터넷에 올라와 있는 linux 관련 소스패키지들은 파일명이 xxx.tar.gz 또는 xxx.tar.bz2 이런식의 이름을 가지는 파일들이 많다.
이 파일명이 의미하는 것은 어떤 파일들을 tar로 먼저 하나로 묶고 그 파일을 다시 압축프로그램으로 압축했다는 의미이다.

물론, 용량이 그리 크지 않다면 tar로 묶기만 하고 압축은 하지 않아도 될 것이다.

tar 주요옵션 (tar 명령어도 옵션이 매우 많다)

파일묶을때

tar -cvf 타겟파일 소스파일(디렉토리도 가능)
-c : 묶기
-v (verbose) : 진행과정을 보여준다.

이 옵션은 부가적인 것이다. 사용하지 않아도 된다.
-f :

묶인파일 풀때

tar -xvf 파일명
-x : 풀기

풀지않고 안에 파일리스트만 보고자 할때
tar -tvf 파일명-t : 묶인 파일 list 보기

ex)[root@river test]# tar -cvf test.tar *archashash.staticaumix-minimalawksyslog.conf
[root@river test]#

[root@river test]# ls -l
합계 1780-rwxr-xr-x 1 root root 2644 5월 9 11:57 arch
-rwxr-xr-x 1 root root 92444 5월 9 11:57 ash
-rwxr-xr-x 1 root root 492968 5월 9 11:57 ash.static
-rwxr-xr-x 1 root root 10456 5월 9 11:57 aumix
-minimal-rwxr-xr-x 1 root root 294332 5월 9 11:57 awk
-rw-r--r-- 1 root root 693 5월 9 11:57 syslog.conf
-rw-r--r-- 1 root root 901120 5월 9 12:10 test.tar
[root@river test]#

생성된 tar 파일 크기가 원래 파일을 다 합한 크기보다 더 크다. 압축된 것이 아님을 알 수 있다.
이제 tar 파일을 압축해보자

우선 압축하기전에 압축효율을 확인해보기 위해 tar 파일을 다른 이름으로 몇 개 복사한다.

[root@river test]# cp test.tar test1.tar

[root@river test]# cp test.tar test2.tar

[root@river test]# cp test.tar test3.tar

[root@river test]# ls -l test*
-rw-r--r-- 1 root root 901120 5월 9 12:10 test.tar
-rw-r--r-- 1 root root 901120 5월 9 12:16 test1.tar
-rw-r--r-- 1 root root 901120 5월 9 12:16 test2.tar
-rw-r--r-- 1 root root 901120 5월 9 12:16 test3.tar

[root@river test]# time gzip test.tar
real 0m0.194suser 0m0.190ssys 0m0.000s

time 명령은 time 의 인수로 사용되는 명령의 실행시간을 측정하는 프로그램이다.
출력 결과 중 real이 명령 실행 시 완료까지 걸린 시간을 나타낸다.

[root@river test]# time gzip test3.tar
real 0m0.194suser 0m0.180ssys 0m0.010s

[root@river test]# time gzip -1 test1.tar
real 0m0.083suser 0m0.080ssys 0m0.000s

[root@river test]# time gzip -9 test2.tar
real 0m0.409suser 0m0.410ssys 0m0.000s

[root@river test]# ls -l test*
-rw-r--r-- 1 root root 901120 5월 9 12:10 test.tar
-rw-r--r-- 1 root root 448839 5월 9 12:16 test1.tar.gz
-rw-r--r-- 1 root root 417022 5월 9 12:16 test2.tar.gz
-rw-r--r-- 1 root root 418790 5월 9 12:16 test3.tar.gz
[root@river test]#

압축효율이 높을수록 시간이 많이 걸리는 것을 알 수 있으며 옵션을 사용하지 않아도 됨을 알 수 있다.
옵션을 사용하지 않았을 때의 압축효율과 시간은 위의 출력결과를 참조하라. 사실, 파일이 아주 크지 않다면
굳이 옵션을 사용해야 할 필요가 없을 것이다.

이번에는 압축해제를 해보자. 압축해제는 압축의 역순으로 해야 한다.

[root@river test]# gunzip test.tar.gz

[root@river test]# tar -tvf test1.tar.gz

[root@river test]# gunzip test1.tar.gz (이것은 gzip -d test1.tar.gz) 와 같다.

[root@river test]# lstest.tar test1.tar test2.tar.gz test3.tar.gz

압축이 풀리면서 용량이 늘어난다.

[root@river test]# tar -tvf test1.tar (풀기 전에 먼저 어떤 파일들을 포함하는지 확인)
-rwxr-xr-x root/root 2644 2007-05-09 11:57:01 arch
-rwxr-xr-x root/root 92444 2007-05-09 11:57:01 ash
-rwxr-xr-x root/root 492968 2007-05-09 11:57:01 ash.static
-rwxr-xr-x root/root 10456 2007-05-09 11:57:01 aumix-minimal
-rwxr-xr-x root/root 294332 2007-05-09 11:57:01 awk
-rw-r--r-- root/root 693 2007-05-09 11:57:01 syslog.conf

[root@river test]# tar -xvf test1.tar
arch
ash
ash.static
aumix-minimal
awk
syslog.conf
[root@river test]# ls
arch ash ash.static aumix-minimal awk syslog.conf test.tar test1.tar test2.tar.gz test3.tar.gz

[root@river test]#

제대로 풀렸다.

bzip2

압축 tool 이 여러 가지가 있으나 압축에 대한 기본개념은 큰 차이가 없다. 그러므로 한 가지 압축프로그래만 잘 알아도
다른 압축툴을 쓰는데 별 어려움이 없을 것이다.

[root@river test]# ls
test.tar

[root@river test]# cp test.tar test1.tar

[root@river test]# cp test.tar test2.tar

[root@river test]# gzip -9 test1.tar

[root@river test]# bzip2 test2.tar

[root@river test]# ls -l
합계 1680
-rw-r--r-- 1 root root 901120 5월 9 12:10 test.tar
-rw-r--r-- 1 root root 417022 5월 9 12:36 test1.tar.gz
-rw-r--r-- 1 root root 385616 5월 9 12:36 test2.tar.bz2
[root@river test]#

test.tar 파일 하나만 남겨두고 모두 삭제한 후 다시 두개의 다른 파일명으로 복사를 했다. 그
리고 gzip 과 bzip2 로 각각 압축했다. 출력결과를 보면 gzip2 로 최대한 압축효율을 높인것 보다
bzip2 로 압축한것이 용량이 더 작다는 것을 알 수 있다. 이것이 bzip2 압축 프로그램의 가장 큰 장점이다.

용량이 아주 큰 파일들은 최대한 용량을 줄이기 위해 bzip2 를 많이 사용한다.
그 외의 경우에는 주로 gzip 을 많이 사용한다.

backup / restore

백업

- 시스템이나 저장된 데이터에 문제가 생겼을때 복원하기 위하여 백업한다.

- 데이터가 손실될수 있는 경우
시스템 크래쉬, 커널패닉,Disk Fail, 하드웨어 장애
운영자의 실수,
허가받지 않은 사용자에 의한 데이터 파괴.
낙뢰, 화재, 침수등의 재난

백업종류

Full backup (완전백업)
파일시스템 전체를 백업

Incremental backup (증분백업)
이전에 백업한 시점을 기준으로 변경되거나 추가된 데이터만 백업

Differential backup (차등백업)
- 전체 백업한 시점을 기준으로 변경되거나 추가된 데이터만 백업
- full backup 이후로 부터 시간이 멀어질수록 백업하는데 시간과 용량이 더 필요해진다.

백업매체
자기테이프,하드디스크, CD-RW,usb 메모리 등 데이터를 기록할 수 있는 각종 매체.

백업 명령어

tar (tape archive)

incremental backup

tar 의 -g, --listed-incremental 옵션이 필요하다.

/dev/sdb2                95195      6822     83458   8% /mnt/backup
/dev/sdb1                95179      5652     84613   7% /home

ex)
/home 디렉토리의 계정을 /mnt/backup 디렉토리에 백업을 받으려면

백업스케쥴은 아래와 같다고 가정.
월 : 풀백업
화 ~ 금 : 증분백업

월 :  tar -g /mnt/backup/home.backup.list -cvzf /mnt/backup/home0.backup.tar.gz ./
화 :   tar -g /mnt/backup/home.backup.list -cvzf /mnt/backup/home1.backup.tar.gz ./
수 :  tar -g /mnt/backup/home.backup.list -cvzf /mnt/backup/home2.backup.tar.gz ./
... 이하생략

*. home.backup.list 은 백업할때의 정보가 저장되고 이후 증분백업할때 참고되어진다.
Restore는 full backup 부터 복구한다음 화요일 -> 수요일 -> 목요일 ... 백업데이터를 차례대로
풀어줘야 한다.

rm -rf /home/*
[root@centos1 home]# tar -xvzf /mnt/backup/home0.backup.tar.gz
[root@centos1 home]# tar -xvzf /mnt/backup/home1.backup.tar.gz
... 이하생략.



백업스크립트

  1 #! /bin/bash
  2
  3 backup_dir=/mnt/backup
  4 time=$(date +%Y%m%d%H%M)
  5 day=$(date +%a)
  6 backup_source=/home
  7
  8 if [ ! -d $backup_dir ]
  9 then
 10     mkdir $backup_dir
 11 fi
 12
 13 if [ $day = "일" ]
 14 then
 15     rm -f $backup_dir/home.backup.list
 16     tar -g $backup_dir/home.backup.list -czf $backup_dir/home_$time.full-backup.tar.gz $backup_source
 17 else
 18     tar -g $backup_dir/home.backup.list -czf $backup_dir/home_$time.backup.tar.gz  $backup_source
 19 fi


*. /etc/crontab 파일에 등록하여 주기적으로 자동 백업이 되게 한다.

ex)
0 1 * * * root /root/bin/backup.sh 

[root@centos1 home]# touch newtestfile
[root@centos1 home]# vi sysuer1/.bash_profile
[root@centos1 home]#

*. 특정디렉토리 제외하려면
[root@centos1 backup]# tar -cvf homeA.tar /home/sysuer1 /home/sysuer2 --exclude /home/sysuer1/test1 --exclude /home/sysuer2/test1/

--exclude 옵션을 사용한다.  
  
 
dd
디스크를 복제하거나 파티션내의 모든 데이터를 복제할때 유용하게 사용될 수 있다.
디스크 전체를 복제할때는 소스디스크와 타겟디스크 용량이 같아야 한다.

dd if=/ of=/dev/st0    ; 파일시스템 전체를 테이프 드라이버에 백업.
dd if=/dev/sda1 of=/dev/st0
dd if=/dev/sda1 of=/dev/sdb1
dd if=/dev/sda of=/dev/sdc

cpio - copy files to and from archives

도움말문서 http://heirloom.sourceforge.net/man/cpio.1.html#1
[root@centos1 ~]# cpio --help
Usage: cpio [OPTION...] [destination-directory]

주요옵션
-o : 표준입력으로부터 경로명의 파일목록을 읽어스 그 파일명을 경로명 상태정보와 함께 표준출력으로 복사.
-i : cpio -o 의 실행결과를 표준입력으로 하여 패턴이 일치하는 파일만 선택한다.
-p : 표준입력으로부터 경로명의 목록을 읽어서 지정한 디렉토리에 파일을 생성하고 복사한다.
-d : 디렉토리가 필요할경우 자동으로 생성한다.
-f : 패턴과 일치하는것을 제외하고 모든 파일복사.
-v : 진행되는 상황을 표시해준다.
-c : 아스키 형태로 정보를 읽거나 저장.
-u : restore 할때 같은 이름의 파일이 있으면 덮어쓴다. 디폴트는 같은 파일이 있는경우 원본의 시간을 비교하여 오래된 파일인 
경우에만 덮어쓴다.


ex)
[root@centos1 home]# ls file1 file2 | cpio -ocv > /backup/test.cpio
file1
file2
1 block
[root@centos1 backup]# cpio -ivc < test.cpio
file1
file2
1 block
[root@centos1 backup]# cat file1
hello

[root@centos1 home]# find . | cpio -ocv > /backup/test2.cpio  : 백업

[root@centos1 test]# cpio -ivc < ../test2.cpio : 복원

[root@centos1 backup]# cpio -t < test.cpio  : resotore 하지 않고 백업된 파일목록을 보는경우
file1
file2
1 block
[root@centos1 backup]# cpio -vt < test.cpio            : 자세히 보려면 v 옵션을 추가한다.
-rw-r--r--   1 root     root            6 Jul 16 06:08 file1
-rw-r--r--   1 root     root            6 Jul 16 06:08 file2
1 block
[root@centos1 backup]#

rpm -Redhat Package Manager

- 초기 리눅스 시스템은 어떤 프로그램을 설치하고자 하면 소스를 받아다가 일일이 컴파일해야 했다.
컴파일에 대한 지식이 없는 사람에게는 매우 힘든 작업이었다. 그러다가 redhat 사에서 rpm 이라는 패키지 관리 툴을 만들어
배포판에 포함함으로써 리눅스 프로그램의 설치,추가,삭제등을 손쉽게 할 수 있게 되었으며 이것이 많은 리눅스 배포판 중에서도
redhat이 널리 사용되게 된 이유중에 하나가 되었다.

rpm 패키지 관리방식은 설치 후 바로 사용할 수 있는 바이너리 파일, 설치될 파일경로, 환경설정파일등을 하나의
패키지에 저장하여 rpm 이라는 명령어를 통해 패키지를 손쉽게 설치,업그레이드,질의,검증,삭제 등이 가능한 방식이다.
mswindows 에서 패키지를 관리하는 것처럼 쉽다.

rpm 패키지 파일의 형태.

fedora os 설치 시디안에 있는 패키지들 역시 rpm 으로 되어있다. cdrom 을 마운트 시키고 확인해 보자

[root@river root]# umount /mnt/cdrom

[root@river root]# mount /mnt/cdrom

[root@river root]# cd /mnt/cdrom/Fedora/RPMS/

[root@river RPMS]# ls -l | more
합계 517140
-rw-r--r-- 77 root root 1837336 2월 24 2003 Suite-0.11.1-13.i386.rpm
-rw-r--r-- 77 root root 558616 2월 24 2003 GConf-1.0.9-10.i386.rpm
-rw-r--r-- 77 root root 733991 2월 24 2003 GConf2-2.2.0-1.i386.rpm
-rw-r--r-- 77 root root 282745 2월 24 2003 Glide3-20010520-25.i386.rpm

... 이하생략

rrpm 패키지는 모두 이런형태의 포맷을 갖는다.

[root@river RPMS]# ls -l httpd*
-rw-r--r-- 75 root root 1056911 2월 26 2003 httpd-2.0.40-21.i386.rpm
-rw-r--r-- 75 root root 832576 2월 26 2003 ttpd-manual-2.0.40-21.i386.rpm
[root@river RPMS]#

웹서버 패키지가 두개가 있다는것을 볼 수 있다.

웹서버패키지를 설치해보자. 그전에 rpm 패키지 형태 및 설치옵션을 간단하게 알아보자.

rpm 패키지의 형태.

패키지명-패키지버전-아키텍처.rpm : 이런 형태로 되어 있다.

ex)
httpd-2.0.40-21.i386.rpm
=> 패키지명 httpd
버전 : 2.0.40-21
아키텍처: i386
확장자 : rpm

아키텍처는 alpha,arm,mips,sparc,i386 등 여러 가지가 있는데 i386 은 인텔cpu 와 호환이 되는것을 의미하는 것으로
일반PC가 여기에 해당된다. 만약 인터넷에서 rpm 파일을 다운로드 받아서 설치하는 경우에는 바이너리 패키지이므로
아키텍처를 잘 확인해야 한다. 자신이 사용하는 cpu에 맞는 아키텍처 여야 한다.

rpm 주요옵션 (rpm은 매우 많은 옵션을 가지고 있다)

설치시(rpm 패키지를 설치한다는 것은 패키지 안에 포함된 파일들을 적당한 디렉토리에 옮겨주는것이다.)
rpm -i 패키지명
그러나 일반적으로 -ivh 형태로 많이 사용한다.
i (install) : 설치. 이 옵션 하나만 사용해도 된다.
v (verbose) : 이 옵션을 사용하면 설치진행과정을 볼 수 있다.
h (hash mark => '#') : 진행과정을 해시마크를 찍어서 보여준다. (ftp client 명령어에 있는 hash와 같은 의미이다.)
--replacepkgs : 덮어쓰기로 설치하고자 하는 경우에 추가하는 옵션이다.

질의옵션

rpm 패키지의 설치 유무를 확인하거나 어떤 경로에 설치되어 있는지를 알고자 하는 경우에 사용하는 옵션이다.

-q : 질의옵션

ex)
[root@river RPMS]#rpm -q httpd
(파일명 대신 패키지명만 적어야한다)
httpd-2.0.40-21 (패키지가 이미 설치되어 있다)[root@river RPMS]#

설치된 모든 rpm 패키지를 보고자 하는 경우에는

root@river RPMS]# rpm -qa | more (a 옵션을 추가한다)
setup-2.5.25-1
bzip2-libs-1.0.2-8
e2fsprogs-1.32-6
glib-1.2.10-10
iputils-20020927-2

-- 이하 생략

설치된 패키지 중 문자열로 검색 할 경우(찾고자 하는 패키지 이름을 정확히 모를 경우)

[root@river RPMS]# rpm -qa | grep mail (찾은 결과를 grep 으로 걸러내면 될 것이다)
mailx-8.1.1-28sendmail-8.12.8-4
mailcap-2.1.13-1mozilla-mail-1.2.1-26
sendmail-cf-8.12.8-4
procmail-3.22-9
fetchmail-6.2.0-3[root@river RPMS]#

rpm 실행시 응답이 없거나 에러가 발생되면 아래와 같은 파일이 잘못되어 그럴수 있다. 그럴때는
[/var/lib/rmp]# ls *db*
__db.000 __db.001 __db.002 __db.003
위에 보이는 db 파일을 삭제하고 새로 생성하면 된다.
rm *db*
rpm --rebuilddb

이제 웹서버 패키지를 설치해보자

[root@river RPMS]# rpm -ivh httpd-2.0.40-21.i386.rpm
경고: httpd-2.0.40-21.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
준비 중... ########################################### [100%]
httpd-2.0.40-21 패키지는 이미 설치되어 있습니다
[root@river RPMS]#

이미 설치되어 있으므로 삭제하고 새로 설치하거나 덮어쓰기로 설치해야 한다.

[root@river RPMS]# rpm -ivh --replacepkgs httpd-2.0.40-21.i386.rpm
경고: httpd-2.0.40-21.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
준비 중... ########################################### [100%]
1:httpd ########################################### [100%]
[root@river RPMS]#

설치가 완료되었다.

이번에는 웹서버 메뉴얼관련 패키지도 설치해보자

[root@river RPMS]# rpm -i httpd-manual-2.0.40-21.i386.rpm
경고: httpd-manual-2.0.40-21.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
[root@river RPMS]#

설치되었다. 설치시 -i 옵션만 사용했을때와 -ivh 옵션을 사용 했을 때의 차이를 알 수 있다.

패키지 설치경로 확인

[root@river RPMS]# rpm -ql httpd | more (-ql 옵션을 사용하면 된다)/etc/httpd
/etc/httpd
/conf/etc
/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf/httpd.conf/

-- 이하생략

*. 설치하거나 삭제 할 때 주의할 점이 있다. 의존성 관계에 있는 패키지라면 의존성 관계에 걸려있는 패키지를
먼저 설치하거나 제거한 후 설치 및 삭제를 해야 한다. 의존성 관계를 무시할 수 있는 옵션도 있는데 --nodeps 옵션이다.
(rpm -e --nodeps 패키지명. e는 제거옵션이다) 그러나 의존성을 함부로 무시하고 설치 및 삭제를 하는 것은 좋지 않다.
당연히 문제가 있을 수 있다.

rpm 패키지 삭제

rpm 패키지를 직접 찾아서 삭제하기는 어렵다. 파일이 많고 설치경로도 여러 개의 경로에 분산되어 설치되는 경우가
대부분이므로. 그냥 rpm 이 제공하는 삭제 옵션을 사용하면 된다.

-e : 삭제옵션

root@river RPMS]# rpm -e httpd-manual

[root@river RPMS]# rpm -e httpd오류: Failed dependencies: httpd is needed by (installed) redhat-config-httpd-1.0.1-18
[root@river RPMS]#

httpd-manual 패키지는 삭제되었으나 httpd 패키지는 의존성에 걸려 삭제되지 않았다.
redhat-config 패키지가 httpd 패키지의 일부 파일을 사용한다는 것이다. 이럴 경우 httpd 패키지는 삭제되지 않는다.
삭제 하려면 redhat-config 패키지를 먼저 삭제하고 httpd 패키지를 삭제하든지 그렇지 않으면 의존성을 무시하고 (--nodeps)
삭제해야 한다.

[root@river RPMS]# rpm -e --nodeps httpd (여기서는 의존성을 무시하고 삭제하기로 한다)

[root@river RPMS]# rpm -q httpdhttpd 패키지가 설치되어 있지 않습니다[root@river RPMS]#

깨끗하게 삭제되었다.

YUM - Yellowdog Updater Modified

rpm 명령의 불편한 점인 패키지 의존성 문제를 해결해준다. 
특정 패키지를 설치할때 의존성 관계에 있는 패키지를 먼저 자동으로 설치해준다. 

yum 은 인터넷을 통하여 rpm 파일이 저장된 저장소(repository)에서 필요한 파일을 다운로드 후 
설치하게 되므로 반드시 인터넷에 연결이 되어 있어야 사용할 수 있다. 

파일을 다운로드 받게 되는 저장소의 주소는 /etc/yum.repos.d 디렉토리의 파일에 저장되어 있다. 

*. yum 이 설치 되어 있지 않으면 씨디롬을 마운트하여 rpm 설치를 하거나 아니면 인터넷에서
다운로드하여 rpm 설치한다.

yum 설정파일

[root@bega rpm]# cat /etc/yum.conf
[main]
cachedir=/var/cache/yum 
keepcache=0
debuglevel=2
logfile=/var/log/yum.log : yum 으로 작업한 기록이 저장되는 파일
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
metadata_expire=1800
installonly_limit=2

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

[root@bega rpm]# ls /etc/yum.repos.d
fedora-rawhide.repo          fedora-updates.repo
fedora-updates-testing.repo  fedora.repo
[root@bega rpm]#
* 위에 파일 내용에 파일을 다운로드 받을 저장소 주소가 포함되어 있다.

사용법 

yum [options] [command] [package ...] 

yum install 패키지 [ 패키지2 패키지3 ...] => 패키지 설치 
yum check-update 업데이트 가능 목록보기 
yum update 패키지이름 => 패키지 업데이트 
yum remove 패키지이름 => 패키지 삭제 
yum info 패키지이름 => 패키지 정보확인 
yum update  => 커널을 포함한 전체 패키지 업데이트 

ex)
[root@bega updates]# yum info telnet-server
Loaded plugins: refresh-packagekit
Installed Packages
Name       : telnet-server
Arch       : i386
Epoch      : 1
Version    : 0.17
Release    : 42.fc9
Size       : 49 k
Repo       : installed
Summary    : 텔넷 원격 로그인 프로토콜에 사용되는 서버 프로그램.
License    : BSD
Description: Telnet is a popular protocol for logging into remote systems over
           : the Internet. The telnet-server package includes a telnet daemon
           : that supports remote logins into the host machine. The telnet
           : daemon is disabled by default. You may enable the telnet daemon by
           : editing /etc/xinetd.d/telnet.

[root@bega updates]#


[root@bega updates]#

[root@bega ftpuser]# yum install telnet-server
Loaded plugins: refresh-packagekit
fedora                                                   | 2.4 kB     00:00
primary.sqlite.bz2                                       | 6.1 MB     00:49
updates                                                  | 2.3 kB     00:00
primary.sqlite.bz2                                       | 2.2 MB     00:15
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package telnet-server.i386 1:0.17-42.fc9 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 telnet-server           i386       1:0.17-42.fc9    fedora             36 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 36 k
Is this ok [y/N]:
Downloading Packages:
(1/1): telnet-server-0.17-42.fc9.i386.rpm                |  36 kB     00:01
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing: telnet-server                ######################### [1/1]

Installed: telnet-server.i386 1:0.17-42.fc9
Complete!
[root@bega ftpuser]#



[root@bega ftpuser]# yum install xinetd
Loaded plugins: refresh-packagekit
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package xinetd.i386 2:2.3.14-18.fc9 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Updating:
 xinetd                  i386       2:2.3.14-18.fc9  fedora            124 k

Transaction Summary
=============================================================================
Install      0 Package(s)
Update       1 Package(s)
Remove       0 Package(s)

Total download size: 124 k
Is this ok [y/N]: y
Downloading Packages:
(1/1): xinetd-2.3.14-18.fc9.i386.rpm                     | 124 kB     00:02
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Updating  : xinetd                       ######################### [1/2]
  Cleanup   : xinetd                       ######################### [2/2]

Updated: xinetd.i386 2:2.3.14-18.fc9
Complete!
[root@bega ftpuser]#[root@bega packages]# rpm -q telnet-server
telnet-server-0.17-42.fc9.i386

[root@bega packages]# yum remove telnet-server  <= 패키지 제거할때
Loaded plugins: refresh-packagekit
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package telnet-server.i386 1:0.17-42.fc9 set to be erased
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Removing:
 telnet-server           i386       1:0.17-42.fc9    installed          49 k

Transaction Summary
=============================================================================
Install      0 Package(s)
Update       0 Package(s)
Remove       1 Package(s)

Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Erasing   : telnet-server                ######################### [1/1]
??: /etc/xinetd.d/telnet(?)?? /etc/xinetd.d/telnet.rpmsave(?)??????????
Removed: telnet-server.i386 1:0.17-42.fc9
Complete!
[root@bega packages]# rpm -q telnet-server
telnet-server 패키지가 설치되어 있지 않습니다

*.기타 옵션
yum list all 
yum list available 사용가능한 패키지 목록 출력

yum list updates
업데이트 가능한 패키지 출력

yum list installed
설치된 패키지 목록 출력
yum check-update
시스템에 필요한 업데이트 목록ㄹ 출력

yum update 패키지명


yum info 패키지명

yum list recent
yum 저장소에 최근에 추가된 패키지 목록 확인

yum search 검색어

패키지 설명과 요약문 패키지 이름에서 지정한 특정 문자열에 매칭하는지 
여부를 확인하여 그 정보를 출려해준다.

ex)
yum search quota

yum localinstall 패키지명
yum localupdate 패키지명


패키지그룹 - 관련 패키지를 하나의 그룹을 묶은것
yum grouplist
yum groupinstall 패키지그룹명
yum groupremove 패키지그룹명
yum groupinfo 패키지그룹명

'Log > Linux' 카테고리의 다른 글

dns 설정파일 문법  (0) 2011.11.28
DNS - Domain Name Service  (0) 2011.11.28
ftp 서비스 - server  (0) 2011.11.28
ftp 서비스 - client  (0) 2011.11.28
서비스 운영방식 - standalone / inetd(xinetd)  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:27 Log/Linux

ftp 서비스 - server

ftp 서버

종류

ftp 서버는 여러가지 종류가 있는데 리눅스에서 많이 사용되어지는 ftp 서버는

vsftpd 와 proftpd 두가지 정도이다.
어떤 ftp 서버라도 한가지만 제대로 이해하고 운영할 수 있으면 다른 ftp 서버를
설정하고 운영하는것도 그리 어렵지 않을것이다.

1. vsftpd
- 페도라 패키지에 포함되어 있는 ftp 서버이다.
[root@star ~]# rpm -q vsftpd
vsftpd-2.0.3-1 <= 설치되어 있다.


공식사이트
http://vsftpd.beasts.org

장점
Security
Performance
Stability

1)설정

rpm 이나 yum 으로 설치하는 경우 설정 파일의 기본 디렉토리는
/etc/vsftpd 이다.

a)익명 사용자 설정

anonymous_enable=YES : 익명접속허용 여부

anon_upload_enable=NO : 익명접속 파일업로드 허용여부

anon_mkdir_write_enable=NO :익명접속시 디렉토리 생성허용 여부

anon_root=/var/ftp/pub : 이 설정을 하지 않으면 ftp 계정 디렉토리가 된다.

logging 설정

xferlog_file=/var/log/xferlog : 로그 저장 파일

xferlog_enable=YES : 파일전송 기록 허용여부

dual_log_enable
If enabled, two log files are generated in parallel, going by default to /var/log/xferlog and
/var/log/vsftpd.log. The former is a wu-ftpd style transfer log, parseable by standard tools. The latter
is vsftpd’s own style log.

Default: NO


b) local account 설정

local_enable=YES : 로컬 계정 접속 허용 여부
local_umask=022 : 파일생성시 디폴트 권한 (umask값이 022 인경우 기본파일퍼미션:644, 기본디렉토리퍼미션:755)
chroot_list_enable=YES : chroot_list_file 설정 허용
chroot_list_file=/etc/vsftp/chroot_list : chroot 적용 받는 사용자
chroot_local_user=YES : 모든 사용자에게 chroot 기능 적용
userlist_deny=YES : userlist_file 옵션 허용여부
userlist_file=/etc/vsftpd/user_list : userlist_deny 가 YES 일때 이파일에 적혀
있는 사용자는 ftp 서버 접속불가

c) timeout 시간 설정
idle_session_timeout=60(초단위) : 접속후 아무것도 하지 않을때의 접속종료시간
data_connection_timeout=120 : 파일전송시 아무런 동작을 하지 않을때 접속 종료시

d) 출력 메세지 설정
ftpd_banner=Welcome to blah FTP service.
banner_file=/etc/vsftpd/welcome.msg
dirmessage_enable=YES
message_file=.messages

e) 동시접속자수 제한
max_clients=30 : 최대 동시접속자수는 30명으로 제한
max_per_ip=2 : 한 ip 당 동시접속을 계정과 상관없이 2개로 제한

===========================================================
2. proftpd

proftpd - 페도라에 포함되어 있지 않으므로 proftpd 를 사용하려면 별도로 다운로드 받아서
설치해야 한다. 쉽고 간결하게 구성할 수 있으며 메뉴얼이 한글로 번역되어 인터넷으로
서비스 되므로 구성할때 쉽게 참조할 수 있는것이 장점.

[root@star proftpd]# rpm -qa | grep proftp
[root@star proftpd]# <= 설치되어 있지 않다.

다운로드 주소 : www.proftpd.org
ftp 주소 : ftp.proftpd.org( Korea User Group - 레퍼런스를 한글로 볼수 있다)

소스파일을 컴파일할때 시스템 날짜가 잘못 설정되어 있으면 아래와 같은
오류메시지가 출력될 수 있다. 이런경우 date 명령어로 시간을 제대로 설정해서
다시 컴파일 해야 한다.
tar: proftpd-cvs-20081007/src/fsio.c: time stamp 2008-09-04 03:19:37 is 1611839 s in the future

*. 아래는 ftp 로 다운로드 받은 proftpd 를 설치하는 과정이다.

[root@star tmp]# ls pro*
proftpd-cvs-20081007.tar.gz <= 이 파일은 최신버전이지만 다른 버전을 받아도 된다.

gzip -d proftpd*
tar -xvf proftpd*

또는 그냥 한번에 tar -xvzf proftpd* 로 압축과 tar 를 동시에 풀수도 있다.

[root@star tmp]# ls -ld pro*
drwxr-xr-x 14 1006 1006 4096 8월 10 07:04 proftpd-cvs-20081007/

cd pro*

다운로드 받은 소스파일을 설치해서 proftpd 바이너리 파일을 생성해야 한다.
소스파일은 대부분 c 언어로 작성되어 있으며 설치하기 위해서는 컴파일러가
설치되어 있어야 한다.

[root@star proftpd-cvs-20081007]# find . -name \*c <= 이 명령어로 소스파일
리스트를 볼수 있다.

컴파일하는 방법

많은 파일로 구성된 소스파일의 설치방법은 대개 아래와 같은 순서로 진행된다.

./configure --prefix=/usr/local/proftpd => 컴파일 환경을 설정한다. -
현재 시스템 check, 컴파일러버전, 라이브러리 등을 체크해서
가장 적합한 컴파일 환경을 makefile 을 만들고 거기에 설정하게 된다.

confiugre 스크립트를 실행할 때 많은 옵션을 줄수 있으며 옵션에 따라서 서버 설정정보가
달라지게 된다. --prefix 옵션은 가장 많이 사용되는 옵션으로 컴파일이 끝났을때 생성된
파일을 어디로 복사할것인가 하는것이다. 쉽게 말하면 서버가 설치될 디렉토리.

make => 실제 소스를 컴파일하는 작업
make install => 위에 prefix 옵션 뒤에 적은 디렉토리로 컴파일이 끝났을때 만들어진
파일을 복사는 하는 작업.


작업이 다 끝나면

[root@star proftpd-cvs-20081007]# ls /usr/local/proftpd
bin/ etc/ include/ lib/ libexec/ sbin/ share/ var/ <= 이렇게 몇개의 디렉토리가 만들어져 있다.

cd /usr/local/proftpd
[root@star proftpd]# ls sbin
ftpshut* in.proftpd@ proftpd* <= proftpd 가 proftpd 서버 파일이다.
[root@star proftpd]#

그리고 proftpd 서버의 설정파일은 /usr/local/proftpd/etc/proftpd.conf 파일이다.

proftpd.conf 파일의 설정형식은

지시자 value

ex)
ServerName "ProFTPD Default Installation"
ServerType standalone

이런 형식으로 되어 있다.

proftpd 의 설정파일에 들어갈수 있는 지시자의 종류는 수백가지가 된다.
그러므로 지시자를 다 알수는 없으며 모르는 경우
proftpd 서버 사이트를 참조해야 한다.(proftpd.oops.org - Korean User Group 사이트)

========================================================
예제를 통해 vsftpd 및 proftpd의 설정을 이해한다.


예제. (괄호안에 첫글자가 대문자인것은 proftpd 설정이며 첫글자가 소문자로 되어있는것은
vsftpd 설정입니다.)

1. ftp 서버로 접속했을때 login 하기전 아래 메시지를 출력한다.

************************ (DisplayConnect / banner_file)
Welcome to my ftp server
************************

2. 익명계정으로 login 했을때
************************ (DisplayLogin / dirmessage_enable / message_file)
Welcome anonymous user!
************************

3. 클라이언트 한개당 ftp 서버의 동시접속을 2개까지로 제한한다. (MaxClinetPerHost / max_per_ip)


4. ftp 서버 최대의 접속자수를 50명까지로 제한한다.(MaxInstances / max_clients)


5. /var/ftp/upload 디렉토리는 업로드 및 다운로드 허용

6. /var/ftp/pub 디렉토리는 다운로드는 허용하고 업로드는 금지한다.

7. user2 계정의 ftp 서비스를 금지한다. (userlist_deny / userlist_file)

8. 모든 계정에게 chroot 기능을 적용시킨다.(chroot_local_user)

9./var/ftp/upload 디렉토리로 들어갈때 아래와 같은 메시지 자동출력.
(vsftpd.conf 의 도움말중 dirmessage_enable 옵션(변수) 참조)
******************************
상용 및 불법자료 업로드 금지!!!
******************************

추가문제.

1. standalone 방식으로 동장하는 vsftpd 서비스 구동방식을 inetd 방식으로
설정을 변경한다.. (*. 설정후 제대로 동작하지 않으면 메뉴얼 페이지를
참조 => man vsftpd)

*. 설정파일을 수정한 경우 ftp 서비스를 반드시 새로 올려줘야만 고친 설정파일이 적용된다.
(단, 이것은 inet 방식의 데몬에는 해당되지 않는다. inet 방식은 요청할때 실행되므로.)

*.solve

'Log > Linux' 카테고리의 다른 글

DNS - Domain Name Service  (0) 2011.11.28
압축유틸리티/백업복구/패키지관리  (0) 2011.11.28
ftp 서비스 - client  (0) 2011.11.28
서비스 운영방식 - standalone / inetd(xinetd)  (0) 2011.11.28
리눅스 네트워크  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:27 Log/Linux

ftp 서비스 - client

ftp 서비스

- file transfer protocol을 의미하며 호스트간에 file 송수신을 하기 위한 프로토콜 및 서비스를 의미한다.
- 송수신 하는 파일은 이진형식과 바이너리 형식 두가지 형식이 있다.

ftp client

[root@star tmp]# ftp
ftp> ? <= ftp prompt 에서 ? 를 입력하면 command 목록을 볼수 있다.

Commands may be abbreviated. Commands are:

! cr mdir proxy send
$ delete mget sendport site
account debug mkdir put size
append dir mls pwd status
ascii disconnect mode quit struct
bell form modtime quote system
binary get mput recv sunique
bye glob newer reget tenex
case hash nmap rstatus trace
ccc help nlist rhelp type
cd idle ntrans rename user
cdup image open reset umask
chmod lcd passive restart verbose
clear ls private rmdir ?
close macdef prompt runique
cprotect mdelete protect safe
ftp> help bin <= 각 명령어에 대한 간단한 설명을 보려면 'help 명령어' 하면 된다.
binary set binary transfer type
ftp>

이중에서 자주 사용되는 명령은

*.명령은 줄여쓸수 있다.

! : ftp 프롬프트에서 셀명령어를 쓸수 있다.
ascii : 전송모드를 ascii 타입으로 지정
bin(binary) : 전송모드를 binary 모드로 지정 => 아스키 파일을 송수신 하는 경우가 아니면 전송모드는
전부 바이너리 모드로 해야 한다.
get : 하나의 파일을 다운로드
mget : 여러개의 파일을 다운로드
cd : 디렉토리 변경
mkdir : 디렉토리 생성
rmdir : 디렉토리 삭제
hash : 파일송수신시 '#' 마크를 찍어서 전송상태 표시해준다.
close : 접속 끊기
quit: ftp 를 끝내고 shell 로 돌아간다.
user : 로그인시 id 나 암호가 틀렸을때 다시 입력하는 명령어
lcd : 서버가 아닌 클라이언트의 현재 디렉토리를 변경하는 명령어
ex) lcd /tmp => 클라이언트의 현재 작업경로를 /tmp 로 변경.



ex) internic 에서 named.root(= named.ca) 파일을 다운로드 받는과정이다.


[root@star tmp]# ftp ftp.rs.internic.net
Connected to ftp.rs.internic.net.
220-**********************************************************
220-***** *****
220-***** InterNIC Public FTP Server *****
220-***** *****
220-***** Login with username "anonymous" *****
220-***** You may change directories to the following: *****
220-***** *****
220-***** domain - Root Domain Zone Files *****
220-***** *****
220-***** Unauthorized access to this system may *****
220-***** result in criminal prosecution. *****
220-***** *****
220-***** All sessions established with this server are *****
220-***** monitored and logged. Disconnect now if you do *****
220-***** not consent to having your actions monitored *****
220-***** and logged. *****
220-***** *****
220-**********************************************************
220
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (ftp.rs.internic.net:root): anonymous <= 익명계정으로 접속한다.
331 Please specify the password. <= 익명계정은 패스워드를 마음대로 쳐도 인증이 된다.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (198,41,0,6,43,115)
150 Here comes the directory listing.
drwxr-xr-x 2 ftp ftp 4096 Oct 06 19:03 domain
226 Directory send OK.
ftp> cd domain
250 Directory successfully changed.
ftp> dir <= 파일리스트를 출력하는 ftp 명령어
227 Entering Passive Mode (198,41,0,6,100,241)
150 Here comes the directory listing.
-rw-r--r-- 1 ftp ftp 457 Oct 06 19:03 INTERNIC_ROOT_ZONE.signatures
-rw-r--r-- 1 ftp ftp 693 Oct 06 19:03 INTERNIC_ROOT_ZONE.signatures.asc
-rw-r--r-- 1 ftp ftp 687 Oct 06 17:51 arpa.zone.gz
-rw-r--r-- 1 ftp ftp 33 Oct 06 17:51 arpa.zone.gz.md5
-rw-r--r-- 1 ftp ftp 65 Oct 06 17:51 arpa.zone.gz.sig
-rw-r--r-- 1 ftp ftp 2876 Feb 04 2008 db.cache
-rw-r--r-- 1 ftp ftp 43 Feb 04 2008 db.cache.md5
-rw-r--r-- 1 ftp ftp 72 Feb 04 2008 db.cache.sig
-rw-r--r-- 1 ftp ftp 2879 Feb 04 2008 named.cache
-rw-r--r-- 1 ftp ftp 46 Feb 04 2008 named.cache.md5
-rw-r--r-- 1 ftp ftp 72 Feb 04 2008 named.cache.sig
-rw-r--r-- 1 ftp ftp 2878 Feb 04 2008 named.root
-rw-r--r-- 1 ftp ftp 45 Feb 04 2008 named.root.md5
-rw-r--r-- 1 ftp ftp 72 Feb 04 2008 named.root.sig
-rw-r--r-- 1 ftp ftp 19903 Oct 06 19:03 root.zone.gz
-rw-r--r-- 1 ftp ftp 33 Oct 06 19:03 root.zone.gz.md5
-rw-r--r-- 1 ftp ftp 65 Oct 06 19:03 root.zone.gz.sig
226 Directory send OK.
ftp> ascii <= 전송모드를 선택하는 명령어(여기서는 ascil 모드로 전송받겠다는 것이다.)
200 Switching to ASCII mode.
ftp> hash <= 1024 바이트당 해시마크('#')을 찍어서 전송상황을 출력하겠다는 의미.
Hash mark printing on (1024 bytes/hash mark).
ftp> get named.root => get 은 한개의 파일을 다운받아오는 명령어 (참고 : get named* <= 이렇게 할수는 없다. 와일드카드 문자를 쓰려면
여러개의 파일을 동시 다운로드 받을수 있는 met 명령을 써야 한다)
local: named.root remote: named.root
227 Entering Passive Mode (198,41,0,6,170,61)
150 Opening BINARY mode data connection for named.root (2878 bytes).
WARNING! 85 bare linefeeds received in ASCII mode
File may not have transferred correctly.
226 File send OK.
2878 bytes received in 0.00053 seconds (5.3e+03 Kbytes/s)
ftp> bin => 아스키 모드일때 경고메시지가 출력하였으므로 전송타입을 binary 모드로 바꿨다.
200 Switching to Binary mode.
ftp> get named.root
local: named.root remote: named.root
227 Entering Passive Mode (198,41,0,6,60,184)
150 Opening BINARY mode data connection for named.root (2878 bytes).
##
226 File send OK.
2878 bytes received in 0.00017 seconds (1.6e+04 Kbytes/s)
ftp> close
ftp> quit
[root@star tmp]# ls -l named.root
-rw-r--r-- 1 root root 2878 8월 16 11:16 named.root
[root@star tmp]# file named.root
named.root: ASCII English text

=> 제대로 받아졌습니다.

'Log > Linux' 카테고리의 다른 글

압축유틸리티/백업복구/패키지관리  (0) 2011.11.28
ftp 서비스 - server  (0) 2011.11.28
서비스 운영방식 - standalone / inetd(xinetd)  (0) 2011.11.28
리눅스 네트워크  (0) 2011.11.28
boot procedure(부팅 진행과정)  (0) 2011.11.28
Posted by logwatch
*. 서비스 운영방식은 크게 두가지로 나뉜다.
standalone 방식과 inet 방식이다.

standalone 방식 - 서비스를 하려면 해당 서버가 메모리에 미리 올라와 있어야 한다.
일반적으로 여기에 해당되는 서비스는 sendmail, apache, mysql , name server, nfs 등.
이 방식으로 운영되는 서비스는 /etc/init.d/ 디렉토리 안에 있는 스크립트 파일을 보면 알 수 있다.

서비스 실행 방법
- /etc/init.d/sendmail start => sendmail 서비스 시작
/etc/init.d/sendmail stop => sendmail 서비스 종료
/etc/init.d/sendmail restart => sendmail 서비스 재 시작.

또는 servce sendmail start / service sendmail restart / service sendmail stop
*. 다른 standalone 방식의 서비스도 다 이런식으로 서비스 된다.


xinet 방식 - 이 방식의 서비스는 standalone 방식에 비하면 좀 복잡하다.
standalone 방식과 가장 다른점은 해당 서버가 클라이언트가 서비스 요청할때 그때 자동으로 올라간다는 것이다.
관리자가 서버를 올리거나 내리거나 할 필요가 없고 항상 메모리를 점유하는게 아니므로 편리하고 메모리 사용에
효율적이다.
이방식으로 운영되는 대표적인 서비스는 telnet 이나 pop3 그리고 finger 서비스이다.
이방식으로 운영되는 서비스는 /etc/xinetd.d 디렉토리의 파일을 보면 알 수 있다.

클라이언트가 telnet 으로 접속 시도할 경우

ex)
1. telnet 192.168.10.1 => 디폴트 포트 번호 23 으로 접속시도 한다.

2. xinetd 는 클라이언트가 요청하는 23번 포트가 어떤 서비스인지를 확인한다.
이때 참조하는 파일은 /etc/services 파일이다.
그 파일을 보면 23 번 포트를 사용하는 서비스는 telnet 으로 되어 있다.(기본설정)

3. 그 다음 xinetd /etc/xinetd.conf 를 참조한다. 그리고 마지막줄 includedir 이 있으면
그 디렉토리 안에 있는 모든 파일중 서비스 이름이 telnet 으로 되어 있는 파일을 찾아서
disable=no 로 되어 있으면 거기에 있는대로 텔넷 서버파일을 실행한다.

4. 클라이언트 telnet 이 서버의 telnetd 데몬과 연결이 된다.

*. 클라이언트가 telnet 접속을 끊으면 telnetd 는 메모리에서 자동으로 내려온다.
*. 다른 xinetd 방식의 서비스도 다 이런식으로 서비스 된다.


서비스 실행방법

예를 들어 telnet 서비스를 운영하려면

/etc/xinetd.d/telnet => 이 파일을 편집기로 열어서
disable = yes ====> disable = no

이렇게 변경한다음

/etc/init.d/xinetd restart 또는 service xinetd restart 이렇게 하면 된다.

*. xinetd 를 재실행하는것은 거의 모든 서버 데몬은 메모리로 올라갈때만 설정파일을 참조하기 때문이다.
xinetd 가 메모리로 올라갈때 그때 고친파일을 참조한다. 그렇지 않으면 xinetd 는 여전히 고치기 전의
내용으로 텔넷서비스를 서비스한다.


*. 당연히 부팅할때 자동으로 구동되는 데몬들은 전부 standalone 방식의 데몬이다.


inetd 데몬 프로그램은 거의 모든 유닉스 시스템에서 사용되고 있다.
그러나 redhat 리눅스 7 부터 inetd 를 확장시킨 xinetd 를 사용할 수 있다.

xinetd 는 inetd 와 비교하면 몇가지 부분이 강화되었다.

tcp, udp, rpc 서비스에 대한 접근 제어가 가능

서비스 운영시간을 지정 그 시간에만 서비스가 가능하게 할 수 있다

서비스 접속 기록 형태 세부적으로 설정할 수 있다.

Dos 공격예방을 위한 구동되는 데몬 갯수를 원하는대로 제한할 수 있다.

공식사이트 : http://www.xinetd.org

- 소스파일이나 rpm 파일을 받아서 설치할 수 있다.

아래와 같이 xinet 설치유무를 확인해보고
설치되어 있지 않으면 설치부터 해야 한다.

[root@star xinetd.d]# rpm -qa | grep xinet
xinetd-2.3.13-6
[root@star xinetd.d]#

만약 설치 안되어 있다면 rpm 이나 yum 또는 소스패키지를 내려받아 설치한다.

1. rpm 으로 설치할 경우.
페로다 시디중 3번째 시디를 마운트 시킨다음 xinetd 패키지를 설치하면 된다.

[root@star /]# mount -t iso9660 /dev/cdrom /media/cdrom
mount: block device /dev/cdrom is write-protected, mounting read-only
[root@star /]# cd /media/cdrom/Fedora/RPMS/
[root@star RPMS]# ls *xinet*
xinetd-2.3.13-6.i386.rpm
[root@star RPMS]# rpm -ivh xinetd-2.3.13-6.i386.rpm

2. yum 으로 설치할 경우
yum install xinetd

*. yum 은 더 간편하지만 인터넷이 사용가능한 상태이어야 하며
인터넷으로 내려받아서 설치하는 것이기 때문에 인터넷 연결상태가 나쁘거나
패키지가 저장된 서버 상태에 따라서설치가 잘 안될 수 있다.

3. 공식사이트에서 소스패키지를 내려받아서 설치할 수 있다.
그러나 이것은 권장하지 않는다. 소스패키지는 설치과정이 번거롭다.
소스 패키지를 내려받아서 설치하는 경우는 세밀한 설정이나 최적화 시키기
위함이다. xinetd 는 굳이 그렇게 설치할 필요는 없다.


xinetd 데몬설정 파일

/etc/xinetd.conf

형식

Default 또는 Service service_name
{
속성 연산자 값
속성 연산자 값
....
}

ex) cat /etc/xinetd.conf

#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/


defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}

includedir /etc/xinetd.d


# => 주석(comment)

instances : 동시에 실행될 수 있는 같은 타입의 서비스. 이 숫자를 초과할 경우
해당 데몬이 더이상 메모리에 적재되지 못한다.

log_type : 로그기록 설정부분이다. SYSLOG 데몬을 통해서 로그를 남긴다는 의미
log_on_failure : 해당 서버 데몬에 로그시 실패한경우 남기게 될 로그기록.
cps : 서버로 접속하는 연결범위 지정.

includedir : 추가 설정 디렉토리 => 이 디렉토리 안에 있는 파일내용을 포함하라는 의미

ex)

[root@star xinetd.d]# cat telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no
}

[root@star xinetd.d]#

socket_type : 서비스 타입이 tcp 기반이면 stream udp 기반이면 dgram 으로 설정해야 한다.
wait : no 이면 동시접속 가능. yes 이면 동시접속 불가.
user : 서버 데몬의 프로세스 소유자를 여기 적혀 있는 계정으로 한다는 의미
server : 서버파일이 있는 경로
disable : 서비스 사용가능 유무. no 이면 서비스 사용 가능, yes 이면 서비스 사용불가.
log_on_failure += USERID : 서비스 접속에 실패할경우 기존 log 설정에 접속에 실패한
사용자 id 를 포함해서 기록한다. 기존 log 설정은 /etc/xinetd.conf 파일에 설정되어 있다
only_from : 서비스를 사용할 수 있는 클라이언트를 지정하기 위한 부분.
ex) only_from 192.168.xxx.xxx/24 => 192.168.xxx.xxx/24 에서만 접속가능함.


ex2)

service ftp
{
socket_type=stream => ftp 서비스는 tcp 기반의 서비스
wait=no => 다수의 사용자가 ftp 서비스에 동시접속 가능
user=root => ftp 서버 데몬(/usr/sbin/in.ftpd)의 프로세스 소유자는 root
server=/usr/sbin/in.ftpd => ftp 서버 데몬 파일의 경로
server_args=-l => ftp 서버가 구동될때 -l 옵션 적용 (/usr/sbin/in.ftpd -l)
instances=4 => ftp 서버 구동 갯수 (최대 4개까지)
access_time=7:00-12:00 13:00-17:00 => ftp 서비스 이용가능 시간
only_from=192.168.10.0/24 => ftp 서비스에 접속할 수 있는 클라이언트 주소

}

*. 이 옵션들이 다 필요한 것은 아니며 여기서 생략해도 되는 것은
server_args, instances, access_time, only_from 이다.

'Log > Linux' 카테고리의 다른 글

ftp 서비스 - server  (0) 2011.11.28
ftp 서비스 - client  (0) 2011.11.28
리눅스 네트워크  (0) 2011.11.28
boot procedure(부팅 진행과정)  (0) 2011.11.28
shell 및 shell script  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:26 Log/Linux

리눅스 네트워크

tcp/ip 모델

참고 ppt 문서

응용계층

- 네트워크를 이용하는 응용프로그램으로 구성
- ftp, telet, ftp, pop3 등 응용프로그램이 사용하는 프로토콜이 해당된다.

전송계층

- 양 종단 사이의 데이터 전송 서비스 제공
- process to process 통신
- 데이터 전송의 신뢰성을 보장하는 tcp와 신뢰성을 보장하지 않는 udp 두개의
프로토콜로 구성.
- Port 주소 사용

인터넷계층

- 데이터 라우팅과 데이터 그램을 정의
- 인터넷 주소체계 정의
- 원격호스트로의 데이터그램 라우팅
- ip 주소 사용

네트워크 엑세스 계층

- 시스템이 네트워크를 이용해 네트워크에 직접 연결되어 있는 다른 장치들에게
데이터를 전달하는 수단을 제공
- OSI 7 계층의 1,2 계층을 포함한다.
- Mac 주소 사용

* 패킷참고

A Class : 10.x.x.x
B Class : 172.16.0.0 ~ 172.31.255.2555
C Class : 192.168.x.x


통신방식

unicast - 데이터를 송신자가 수신자에게 1:1 로 전송하는 방식
여러 수신자가 데이터를 원하는 경우에는 데이터를 여러번 복사하여
각각의 수신자 ip 주소로 전송해야 한다.

multicast - 데이터를 둘 이상의 다른 수신자에게 동시 전송하는 방식
수신자가 많은 경우 유니캐스트로 데이터를 보내는것에 비해 효율적이다.

broadcast - 데이터를 같은네트워크에 있는 모든 수신자에게 전송하는 방식


*. 리눅스 Network 설정

1. 랜카드 설정

명령어

랜카드 설정 및 설정정보 출력

ifconfig

ifconfig 인터페이스명 ip주소 [netmask] [broadcast] [up 또는 down]

ex)
[root@star ~]# ifconfig eth0:1 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.255 up
[root@star ~]# ifconfig eth0:1
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:9E:9E:DF
inet addr:192.168.10.1 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:10 Base address:0x2000

*. netmask, braoadcast 값을 입력하지 않으면 디폴트 값이 적용된다.
*. up 을 붙이지 않더라도 fedora 에서는 up 이 된다.

랜카드 비활성화
[root@star ~]# ifconfig eth0:1 down
[root@star ~]# ifconfig eth0:1
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:9E:9E:DF
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:10 Base address:0x2000

=> ip 설정값이 없어졌다.

*. 라우터 설정

설정값 보기.
[root@star ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.37.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.37.2 0.0.0.0 UG 0 0 0 eth0
[root@star ~]#


라우터 설정정보 변경

default gateway 삭제
==>
route del default

ex)
[root@star ~]# route del default
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.37.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
[root@star ~]#

default route 추가

route add default gw 주소

[root@star ~]# route add default gw 192.168.37.2
[root@star ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.37.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.37.2 0.0.0.0 UG 0 0 0 eth0
[root@star ~]#

찾을 DNS 주소 지정

아래처럼 등록해 두면 된다.

[root@star ~]# cat /etc/resolv.conf
nameserver 168.126.63.1

영구설정

커맨드 라인에서 설정한 정보들은 메모리에만 남아 있는 상태이므로
리부팅하면 새로 설정해야 한다.
영구적으로 설정하려면 부팅시 자동으로 실행되는 네트워크 설정파일에
주소를 입력해야 한다.


ip 주소 설정파일

부팅하면 /etc/sysconfig/network-scripts 디렉토리에 있는 파일이 자동
실행된다.
아래와 같이 파일로 설정해두면 된다.

[root@star ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.37.255
HWADDR=00:0C:29:9E:9E:DF
IPADDR=192.168.37.3
NETMASK=255.255.255.0
NETWORK=192.168.37.0
ONBOOT=yes ; 부팅시 랜카드를 활성화 한다.
TYPE=Ethernet
USERCTL=no ; 일반 사용자가 이 랜카드 설정을 변경하는것을 금지한다.
PEERDNS=yes
GATEWAY=192.168.37.2
IPV6INIT=no
[root@star ~]#

랜카드를 dhcp client 로 구성하는 경우에는
ifcfg-eth0 파일을 아래처럼 간단히 설정하면 된다.

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp

그리고 랜카드그 한장 더 있고 두번째 랜카드를 설정한다고
가정하면
파일명은 ifcfg-eth1 로 하고
파일안에 있는 DEVICE=eth1 이것만 다르고 나머지는
다 똑같은 방법으로 구성하면 된다.

*. 게이트웨이 주소는 /etc/sysconfig/network 파일에 기입해도 된다.

[root@star ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=star
GATEWAY=192.168.37.2
[root@star ~]#


기타

/etc/hosts 파일은 host 이름과 ip 주소를 매핑하기 위한 파일이다.
여기에 등록되어 있는 host는 ip 대신 host 이름으로 접근할 수 있다.

[root@star ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 star localhost.localdomain localhost
[root@star ~]#

파일형식

host ip주소 host 이름 host이름에대한 alias1 host이름에 대한 alias2

*. alias 는 생략할수 있다.

네트워크 상태 확인 명령어

ping
nslookup
traceroute 등이 있다.

*. 가상 이더넷 인터페이스 장치(nic) 만들기
- 하나의 랜카드에 여러개의 ip를 부여할때 사용한다.

eth0 이 있으면 eth0:n 의장치를 만들수 있다. (n = 자연수)
eth1 이 있으면 eth1:n 의 장치를 만들수 있다.

가상 nic 를 설정하는 방법은 장치명만 제외하면 실제장치를 구성하는것과 같다.

ex) ifconfig eth0:1 192.168.100.1 up

영구설정 역시 실제 nic 장치와 마찬가지로 /etc/sysconfig/netwokr-scripts/ifcfg-eth0:1 을 만들고
설정하면 된다.

'Log > Linux' 카테고리의 다른 글

ftp 서비스 - client  (0) 2011.11.28
서비스 운영방식 - standalone / inetd(xinetd)  (0) 2011.11.28
boot procedure(부팅 진행과정)  (0) 2011.11.28
shell 및 shell script  (0) 2011.11.28
디스크 Quota  (0) 2011.11.28
Posted by logwatch

Boot Procedure(진행과정)

- 전원을 켠 후 login 프롬프트가 화면에 보일때까지의 과정.
부팅과정을 이해한다면 부팅 시 발생할 수 있는 여러 가지 문제를 해결할 수 있으며
시스템을 효율적으로 운영할 수 있다.

부팅과정을 크게 나눠보면

1. 전원 ON.
2. ROM BIOS promgram이 POST 진행
3. 부트로더 실행
4. 커널이미지 메모리 적재
5. init 프로세스 실행
6. login

1번과 2번은 하드웨어에 관련된 부분
리눅스와 직접 관련된 3 ~ 6 부분

컴퓨터 전원을 켜면 롬에 저장되어 있는 프로그램에 의해 POST(Power On Self Test) 를 진행한다.
cpu,디스크,주변장치,메모리등 기본적인 하드웨어 진단을 한다. 이 과정에서 특별한 문제가 없다면
하드디스크 또는 다른 부팅매체의 0번 섹터(MBR(Master Boot Record)라고 한다)의 부트프로그램을 읽는다.

설치된 OS에 따라 여기에는 lilo 또는 grub 아니면 다른 OS의 부트로더가 들어 있을 수 있다.

과거의 부트로더 화면은 텍스트 모드였으나 요즘은 대개 그래픽 화면이다.
redhat linux 인 경우 그래픽 화면의 부트로더에서 텍스트 화면을 선택할 수 도 있는데 부팅시 어떤 문제가 있는
경우 장애 해결을 위해서 일반적으로 사용된다.

하드웨어 진단이 완료된 후 부트로더가 실행되면 MBR 영역에 설치된 부트로더 화면이 뜬다.

*. 부트로더가 lilo 인경우

부트로더 그래픽 화면인데 그림 왼쪽하단의 설명처럼 ctrl+x 를 누르면 과거의 리눅스처럼 텍스트 부트로더 화면으로
들어가게 된다. 리눅스와 다른 OS 가 같이 설치된 경우라면 다른 OS를 선택해서 부팅할 수도 있다.

아무런 키 입력이 없으면 5초후 자동으로 부팅을 시작한다. 부트로더 화면에서 멈추게 하려면 방향키를 한번 입력하면
부팅과정으로 넘어가지 않는다. 그 상태에서 그냥 부팅하려면 엔터키를 입력

* 부트로더가 grub 인 경우

[root@linux ~]# cat /etc/grub.conf

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=0 => 첫번째 title 에 있는 이미지로 부팅
timeout=5 => 부팅시 5초간 아무런 키 입력이 없으면 디폴트 OS 로 부팅 시작.
splashimage=(hd0,0)/boot/grub/splash.xpm.gz => grub 부트로더 메뉴 이미지를 보이게 하는 설정
splasy.xpm.gz 는 압축된 그림파일
hiddenmenu => 부팅시 grub 부트로더 메뉴를 숨긴다.
title Fedora Core (2.6.11-1.1369_FC4) => 부팅 이미지 레이블명
root (hd0,0) => 부트 파티션 hd0,0 은 첫번째 디스크의 첫번째 파티션.
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ rhgb quiet => 커널이미지 파일,
rhgb는 redhat graphic boot loader를 의미.
initrd /boot/initrd-2.6.11-1.1369_FC4.img => initrd의 이미지 명

[root@linux ~]#

*. grub boot loader 에 암호걸기

- single user mode 로 누구나 시스템에 root 권한으로 접근하는 것을 막으려면 boot loader 에
암호를 걸어두면 된다.

grub 실행후

grub>md5crypt

password : ********** 패스워드 입력

Encrypted : $a$bPD$ao323$... <= 이 암호를 복사해서 붙여 넣기 하면 된다.

출력된 값을복사해서 grub.conf 파일 맨 아래에 password --md5 $a$bPD$ao323$... 추가한다음 리부팅하면 부팅시 암호를 요구한다.

password --md5 $a$bPD$ao323$...를 splashimage=(hd0,0)/boot/grub/splash.xpm.gz 바로 아래줄에 쓰게되면
부팅시 grub 메뉴에서 'e'를 눌러 수정할 때만 암호를 요구한다.

다음 단계는 압축된 커널이미지 메모리 적재 단계이다.

*. 부트로더가 lilo 인경우.

부트로더가 하나의 커널이미지를 상징하는 레이블명을 선택하면 부트로더는 자신의 설정파일에서 레이블명에
해당하는 커널이미지를 지정된 디렉토리에서 찾아서 메모리로 올린다. l
ilo 가 참조하는 설정파일은 lilo.conf 이다.

커널이미지는 디스크에 압축된 하나의 이미지로 존재하는데 redhat linux 인 경우 보통 /boot 디렉토리에 위치한다.
커널 이름은 어떤 이름이라도 상관없다. 파일명과 경로가 lilo.conf에 정확히 지정되어 있으면 된다.
그러나 커널이름은 보통 리눅스 개발자 이름을 따서 vmlinuz 라는 이름을 많이 사용한다.

redhat 리눅스는 커널 설정파일은 따로 존재하지 않는다.
(커널소스코드 컴파일시 어떠한 필요한 기능이나 디바이스를 지원하기 위한 설정은 있다.)

커널이 메모리에 올라가면 리눅스를 사용하기 위한 여러가지 하드웨어를 체크하고 각종 프로토콜을 올린다.
하드웨어 체크는 bios 단계에서 실행된 POST 와는 다른 것이다. 디스크 검사를 예를 들면 bios 단계에서
물리적인 디스크 연결 상태를 체크한다면 이 단계에서는 파티션 설정 등을 체크한다.

그리고 swapper라고도 불리는 pid 0번이 프로세스가 실행되는데 이 프로세스는 메모리관리,
프로세스관리 등을 수행한다.

그리고 init 프로세스를 생성한다.

init 프로세스는 pid 가 1번이다. 리눅스의 모든 프로세스는 부모 프로세스를 갖는데 init 프로세스의
부모 프로세스가 pid 0번인 swapper 이다. swapper 는 프로세스 리스트에서도 볼 수 없으며 부모 프로세스도 없다.
swapper는 fork() 로 만들어지는 프로세스가 아니다. 커널 자체라고 생각하면 된다.

init 프로세스는 실행 후 login 이 뜨기까지 자신의 설정파일에 따라 runlevel을 결정하고 그에 따른 여러 가지
스크립트를 실행한다. 우리가 실행한 적이 없는데도 메모리에 올라와 있는 여러 가지 데몬들도 init 프로세스에
의해 실행된 것이다.

부팅과정중 init 프로세스의 역할은 /etc/inittab file을 따른다.

아래는 /etc/inittab file을 캡쳐한 것이다.

1 #
2 # inittab This file describes how the INIT process should set up
3 # the system in a certain run-level.
4 #
5 # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
6 # Modified for RHS Linux by Marc Ewing and Donnie Barnes
7 #
8
9 # Default runlevel. The runlevels used by RHS are:
10 # 0 - halt (Do NOT set initdefault to this)
11 # 1 - Single user mode
12 # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
13 # 3 - Full multiuser mode
14 # 4 - unused => 이 런레벨은 사용되지 않는 것이다.
15 # 5 - X11 => X11 은 Xserver 버전을 나타내는 것으로 Xwindow 환경의 unlevel을 뜻한다.
16 # 6 - reboot (Do NOT set initdefault to this)
17 #
18 id:3:initdefault: => 여기에 숫자가 5가 적혀 있다면 부팅시 바로 Xwindow 환경으로 들어가게 된다.
19
20 # System initialization.
21 si::sysinit:/etc/rc.d/rc.sysinit
22
23 l0:0:wait:/etc/rc.d/rc 0
24 l1:1:wait:/etc/rc.d/rc 1
25 l2:2:wait:/etc/rc.d/rc 2
26 l3:3:wait:/etc/rc.d/rc 3
27 l4:4:wait:/etc/rc.d/rc 4
28 l5:5:wait:/etc/rc.d/rc 5
29 l6:6:wait:/etc/rc.d/rc 6
30
31 # Trap CTRL-ALT-DELETE
32 ca::ctrlaltdel:/sbin/shutdown -t3 -r now
33
34 # When our UPS tells us power has failed, assume we have a few minutes
35 # of power left. Schedule a shutdown for 2 minutes from now.
36 # This does, of course, assume you have powerd installed and your
37 # UPS connected and working correctly.
38 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
39
40 # If power was restored before the shutdown kicked in, cancel it.
41 pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
42
43
44 # Run gettys in standard runlevels
45 1:2345:respawn:/sbin/mingetty tty1
46 2:2345:respawn:/sbin/mingetty tty2
47 3:2345:respawn:/sbin/mingetty tty3
48 4:2345:respawn:/sbin/mingetty tty4
49 5:2345:respawn:/sbin/mingetty tty5
50 6:2345:respawn:/sbin/mingetty tty6
51
52 # Run xdm in runlevel 5
53 x:5:respawn:/etc/X11/prefdm -nodaemon

*. 편의상 라인번호를 붙여서 출력하였다.

설정파일 자체는 복잡하지 않은데 이 설정파일에 의해 실행되는 스크립트를 이해하는것은 다소 어렵다.
inittab 설정파일 역시 도움말이 준비되어 있다.

INITTAB(5) Linux System Administrator's Manual INITTAB(5)

NAME inittab - format of the inittab file used by the sysv-compatible
init processDESCRIPTION The inittab file describes which processes are started at bootup and
during normal operation (e.g. /etc/init.d/boot, /etc/init.d/rc, get- tys...).
Init(8) distinguishes multiple runlevels, each of which can have its own set of processes that are started.
Valid runlevels are 0-6 plus A, B, and C for ondemand entries. An entry in the inittab
file has the following format:

id:runlevels:action:process

Lines beginning with `#' are ignored.

id is a unique sequence of 1-4 characters which identifies an entry
in inittab (for versions of sysvinit compiled with libraries < 5.2.18 or a.out libraries the limit is
2 characters).
Note: For gettys or other login processes, the id field should be the tty suffix of the
corresponding tty,
e.g. 1 for tty1. Otherwise, the login accounting might not work correctly.

......

manual page 안에 상세히 설명되어 있으니 manual page 를 보는 것만으로도 설정파일을 이해하는데 많은
도움이 될 것이다 설정파일이 대게 그렇듯이 여기서도 "#" 은 주석이다.

각 라인은 위에 manual page 에 나와있듯이 id:runlevels:action:process <= 이런 형태이다.

여기서 id 필드는 특별한 의미가 없으며 각 라인을 구분하기 위한 용도라고 생각하면 된다.
여기에 올수 있는 문자수는 최대 4글자(도움말 참조)

runlevel :이 부분은 중요하다.
여기에 오는 숫자에 따라 실행되는 스크립트 및 프로세스가 다를 수 있다.

위에 주석에도 설명이 나와 있듯이 runlevel의 종류는 여섯 가지이다.
그러나 4번은 사용되지 않는다. 그래서 실제로는 5가지로 보면 된다.
우리가 시스템을 끄는것도 결국 runlevel 전환이며 rebooting 도 마찬가지이다.

action : 각 라인을 수행하는 방법. 여기에는 sysinit,wait,nowait,respawn 등이 올 수 있다.
process : 실행할 스크립트 및 프로세스이다.
id:5:initdefault: 디 폴트 런레벨을 결정하는 부분이다. 숫자 5는 부팅 시 runlevel을 5로 하겠다는 것이며
이는 Xwindows 를 기본 환경으로 사용하겠다는 것이다. 여기에 오는 숫자는 5나 3이 적당할 것이다.
5와 3이 모든 서비스를 사용할 수 있는 완전한 기능이다. 만약 이 부분의 숫자를 0 이나 6을 적게 되면 시스템이
부팅되자마자 꺼지거나 리부팅 될 것이다.
si::sysinit:/etc/rc.d/rc.sysinit => 시스템 초기화 스크립트를 실행하는 부분이다.
기본적인 환경변수를 결정하고 하드디스크 검사등을 수행하는 단계이다.
23 라인 ~ 29 라인중 디폴트 runlevel이 3인 경우에는 실행되는 부분은 26라인이다.
다른 행은 실행되지 않는다. runlevel 필드와 현재 runlevel 이 일치하는 행만 실행된다.

26 라인 l3:3:wait:/etc/rc.d/rc 3 : rc 스크립트에 현재 런레벨과 같은 번호인 3을 인수로 전달하여 실행한다는 것이다.
런레벨 0에서 6까지 실행되는 스크립트는 rc 로 다 똑같다.
단지 인수만 다르다는 것을 알 수 있다. action 필드의 wait 는 이 스크립트를 다 수행할 때까지는 다음 행을
실행하지 말고 기다리라는 의미이다.

rc 스크립트 file을 열 줄만 출력해 보자.

[root@server root]# cat -n /etc/rc.d/rc | head -10
1 #! /bin/bash
2 #
3 # rc This file is responsible for starting/stopping
4 # services when the runlevel changes.
5 #
6 # Original Author:
7 # Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
8 #
9
10 # check a file to be a correct runlevel script[root@server root]#

스크립트를 이해하기 위해 굳이 하나하나 분석하지 않아도 된다. 주석이 잘 붙어있기 때문이다. 주석을 참조하라.

rc 스크립트가 실행하는 내용이 주석으로 설명이 잘 붙어있다.

소스 중간에 보면 ...
53 # First, run the KILL scripts.
54 for i in /etc/rc$runlevel.d/K* ; do
55 check_runlevel "$i" || continue
56
57 # Check if the subsystem is already up.
58 subsys=${i#/etc/rc$runlevel.d/K??}
59 [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
60 || continue
61
62 # Bring the subsystem down.
63 if egrep -q "(killproc |action )" $i ; then
64 $i stop
65 else
66 action $"Stopping $subsys: " $i stop
67 fi
68 done
69
70 # Now run the START scripts.
71 for i in /etc/rc$runlevel.d/S* ; do
72 check_runlevel "$i" || continue
73
74 # Check if the subsystem is already up.
75 subsys=${i#/etc/rc$runlevel.d/S??}
76 [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
77 && continue
78
79 # If we're in confirmation mode, get user confirmation
80 if [ -n "$CONFIRM" ]; then
81 confirm $subsys
82 case $? in
83 0) :;;
84 2) CONFIRM=;;
85 *) continue;;
86 esac
87 fi
88
89 # Bring the subsystem up.
90 if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
91 export LC_ALL=C
92 exec $i start
93 fi
94 if egrep -q "(daemon |action |success |failure )" $i 2>/dev/null \
95 || [ "$subsys" = "single" -o "$subsys" = "local" ]; then
96 $i start
97 else
98 action $"Starting $subsys: " $i start
99 fi
100 done

출력된 스크립트 부분은 /etc/rc$runlevel.d/K* 파일은 stop 인수를 넘겨주고 실행하라는 것이며
/etc/rc$runlevle.d/S* 파일은 start 인수를 넘겨주고 실행하라는 것이다.
$runlevel은 현재의 runlevel 숫자가 저장되는 변수이다. runlevel 3일 때는 아래에 있는 파일들이
다 실행된다는 의미이다.

[root@server root]# cd /etc/rc3.d

[root@server rc3.d]# ls
K05saslauthd K34yppasswdd K45named K54pxe K95firstboot S10network S17keytable S26apmd
S56xinetd S90cups S97rhnsdK15httpd K35smb K50snmpd K74ntpd S05kudzu S12syslog
S20random S28autofs S80sendmail S90xfs S99localK20nfs K35winbind K50snmptrapd K74ypserv
S08iptables S13portmap S24pcmcia S55sshd S85gpm S95anacronK24irda K36lisa K50vsftpd
K74ypxfrd S09isdn S14nfslock S25netfs S56rawdevices S90crond S95atd
[root@server rc3.d]#

여기에 있는 각 스크립트는 모두 비슷하게 프로그래밍 되어 있으며 아래와 같은 소스를 거의 다 포함하고 있다.

아래 소스는 K45named 파일의 일부이다.

# See how we were called.
case "$1" in
start)
start => start 함수 호출 (데몬 죽이는 함수) ;;
stop)
stop => stop 함수 호출(데몬 올리는 함수) ;;
status)
rhstatus ;;
restart)
restart ;;
condrestart)
[ -e /var/lock/subsys/named ] && restart ;;
reload)
reload ;;
probe)
probe ;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|probe}"
exit 1
esac
exit $?

이 소스코드를 실행할 때 start 인수 및 stop 인수가 전달되면 어떻게 되는지 알 수 있다.
즉 K 문자로 시작되는 위의 파일명과 관련된 데몬은 부팅 시 자동 실행되지 않으면 S 문자로 시작되는 파일명과
관련 있는 데몬은 설정에 아무런 문제가 없다면 메모리에 올라갈 것이고 그렇지 않은 경우에는 실행되지 않도록
프로그램이 되어있다.

[root@server rc3.d]# who -r
run-level 3 Apr 26 20:44 : 현재 runlevel이 3이다.
[root@server rc3.d]# pgrep -fl sendmail
1689 sendmail1698 sendmail

[root@server rc3.d]# pgrep -fl vsftpd
[root@server rc3.d]#

메모리에 sendmail은 올라와 있고 ftp서버는 없다. 왜 그런지는 /etc/rc3.d/* 파일을 보면 알 수 있을것이다.
그러면 메일서버가 필요 없다고 가정하여 부팅시 sendmail 데몬이 자동 실행되지 않도록 하려면 ?

/etc/rc3.d/S*sendmail 파일을 첫 글자가 대문자 S가 아닌 K나 다른 문자로 바꾸면 된다.

또는 그렇게 하는 것이 번거롭거나 어렵다면 setup 명령어로 쉽게 할 수도 있다. 결과는 같다.
setup tool 을 실행하면 몇 개의 메뉴가 보이는데 거기에서 system service 항목을 선택하면
부팅시 자동으로 올라오는 서비스의 목록이 보인다.

체크표시가 되어 있는 것이 부팅시 자동으로 올라오는 서비스들이다.
부팅시 특정 데몬을 구동하거나 반대로 구동하지 않으려면 체크표시를 하거나 체크표시를 없애면 된다.
선택은 스페이스 바로 한다. 예를 들어서 crond 에 체크를 없애면 현재 runlevel 이 만약 3이라고 가정한다면 /etc/rc3.d/S**crond 파일명이 /etc/rc3.d/K**crond 파일명으로 자동 변경될 것이며 이렇게 되면
runlevel 3으로 부팅시 cron demon 이 메모리에 자동으로 올라오지 않게 된다.

runlevel 0 즉 시스템을 끌때의 과정은 /etc/rc0.d/ 디렉토리의 파일과 관련있다.

[root@server rc3.d]# ls /etc/rc0.d
K03rhnsd K05saslauthd K15httpd K30sendmail K36lisa K50snmptrapd
60crond K74ypserv K86nfslock K91isdn K96pcmciaK05anacron K10cups
K20nfs K34yppasswdd K44rawdevices K50vsftpd K72autofs K74ypxfrd K87portmap

.... 이하생략

당연히 끄는 경우에는 데몬을 메모리에 올릴 필요 없으며 오히려 다 내려야 한다.
파일명을 보면 알겠지만 그렇게 되어있다. 끌 때 필요한 halt 와 프로세스를 모두 죽일 때 사용하는
killall 을 제외하고 다 첫문자가 K 이다.

32 ca::ctrlaltdel:/sbin/shutdown -t3 -r now

이 부분은 ctrl+alt+del 키에 대한 내용이다. ctrl+alt+del 키를 누르면 오른쪽 끝의 shutdown 명령이 실행되면서
rebooting 된다. ctrl+alt+del로 리부팅하는것도 안전한 종료방법이라는것을 알 수 있다.
MSwindos 환경의 가상머신에서는 안될 수 있다. (ctrl+alt+del 키가 mswindows 에서도 사용하는 키이기 때문)

44 # Run gettys in standard runlevels
45 1:2345:respawn:/sbin/mingetty tty1
46 2:2345:respawn:/sbin/mingetty tty2
47 3:2345:respawn:/sbin/mingetty tty3
48 4:2345:respawn:/sbin/mingetty tty4
49 5:2345:respawn:/sbin/mingetty tty5
50 6:2345:respawn:/sbin/mingetty tty6

가상 콘솔에 관련된 부분이다. 가상콘솔을 (tty1 ~ tty6까지)6개까지 사용할 수 있도록 되어 있다.
mingetty 프로세스가 가상콘솔을 관리하는 역할을 하며 login 프로세스를 감시한다.
사용자가 특정 가상콘솔로 login 하면 mingetty 프로세스가 하나 죽는다. 그리고 그 사용자가 logout 하면
다시 mingetty 프로세스가 메모리에 올라간다. 액션부분의 respawn 이 바로 그것을 의미한다.

root 패스워드를 분실한 경우 싱글유저 모드로 들어가면 로그인 절차 없이 바로 로그인 되는데 그 이유가
mingetty 프로세스는 싱글유저모드(런레벨1)에서는 실행되지 않기 때문이다.

52 # Run xdm in runlevel 5
53 x:5:respawn:/etc/X11/prefdm -nodaemon : runlevel 5에서만 실행되는 부분이다.

부팅 장애시 복구방법

장애 복구

xwindows 설정이 잘못되어 화면출력이 되지 않거나 root 사용자가 패스워드를 분신하였거나 또는 파일시스템이
문제가 있는 등 정상적으로 부팅이 안 될 경우에는 싱글유저 모드로 부팅하여 복구할 수 있는데 싱글유저 모드는
mswindows의 안전모드와 유사하다고 생각하면 된다.

싱글유저 모드로 부팅하면 가상콘솔을 지원하지 않으면 단 하나의 콘솔만사용할 수 있으며
네트워크 서비스 되지 않는다. 인터페이스도 불편해진다.

1.root 패스워드를 잊어버린 경우

부트로더가 lilo 인경우

부트로더 화면에서 ctrl+x 를 입력하면 텍스트화면으로 바뀌게 되면 화면상단에 boot: 표시가 보인다.

여기서 tab 키를 입력하면

boot:redhat (레이블명)

이렇게 label 명이 보인다. 그 레이블명을 사용해서 부팅하면 된다.

boot: redhat single => single user mode 를 선택하면 login 절차 생략이다.
그러므로 패스워드 없이 바로 root login 이 가능하다. 그렇게 부팅하더라도 물론 패스워드는
아래처럼 암호화되어 있으므로 알지 못한다. 패스워드를 다른 것으로 변경하고 나오면 된다.

sh-2.05b# head -1 /etc/shadow
root:$1$0lvCjXwW$JwSLfSuCJGtHebt.0BJGr/:13587:0:99999:7:::sh-2.05b#

패스워드 변경후 reboot 하면 된다.

부트로더가 grub 인 경우

부트로더 화면에서 레이블 명 선택후 'e' 입력후 편집상태에서 single 또는 숫자 1을 맨 뒤에 입력한다.
그 다음 'b' 명령으로 부팅하면 single user 모드로 login 된다. 그 다음과정은 lilo와 같다.

2. Xwindows 설정 문제로 화면이 보이지 않는경우

화면이 보이지 않으면 당연히 명령어를 제대로 입력할 수도 없다.이럴 경우에는 텍스트 모드로 변경 후
Xwindows 설정을 다시 해야 한다.

역시 single user 모드로 부팅 후

sh-2.05b# grep initdefault /etc/inittab
# 0 - halt (Do NOT set initdefault to this)
# 6 - reboot (Do NOT set initdefault to this)
id:5:initdefault: <= 5 라는 숫자를 3으로 바꿔주면 된다.

sh-2.05b#

3. file system 장애

file system에 문제가 있는 경우 부팅하면 아래와 같은 메세지가 보이게 된다.
*** An error occurred during the file system
check.*** Dropping you to a shell; the system will reboot
*** when you leave the shell.
Give root password for maintenance(or type Control-D to continue) :

여기서 root 패스워드를 입력하든지 ctl+d 를 입력하든지 둘 중 하나를 선택해야 한다.
그러나 ctrl+d 를 입력하면 rebooting 이 되겠지만 또 다시 저 메세지가 보이고 멈추게 될 것이다.
file system 에 문제가 있다면 고치기전에는 리부팅해도 마찬가지인 것이다.
그러므로 복구하기위해서는 여기에서 root 패스워드를 입력하고 login후 file system 에러를 고쳐야 한다.

login 후 화면에는(Repair filesystem) 1 # <= 이렇게 출력된다. 파일시스템 복구모드로 진입한 것이다.
파일시스템 에러가 발생하는 많은 경우는 fstab 파일에 대한 정보가 잘 못된 경우이다.
예를 들면 포맷이 되어 있지 않은 파티션을 마운트 하도록 설정이 되었거나 또는 존재하지 않는 장치를
마운트 하려고 하는 경우 등.
이런 경우에는 파티션 정보를 확인하고 fstab 파일도 적절히 수정한 후 리부팅하면 된다.

4. 부트로더가 잘 못 설치되거나 삭제 된 경우

- 부트로더 설정을 확인해보고 잘못된 부분이 있다면 수정한 후 새로 설치해야 한다.
* 부트로더가 제대로 동작할 수 없으면 커널을 메모리에 적재하지 못하므로 당연히 부팅할 수 없다.
이런 경우에는 부트로더 대신 사용자가 시디롬을 이용하여 커널을 직접 메모리에 올려주는 방법이 있다.
설치시디중 1번 시디에 리눅스 커널이 포함되어 있다. 1번 시디로 부팅후

boot: 화면이 보이면 엔터키를 치지 말고(엔터키를 치면 리눅스 설치모드가 된다.)

boot: vmlinuz root=/dev/sda <= vmlinuz 는 시디에 있는 커널이다.
뒤에 인수는 init 프로세스를 생성하기 위함이다. linux 의 root 파티션을 적으면 된다.
커널만으로는 부팅이 안 되며 부팅 마지막 단계에는 init 프로세스가 동작해야 한다.
init 프로세스 생성은 디스크를 통해서 한다 .

위와 같은 명령어로 안 되면 또 다른 방법이 있다.설치시디중 1번 시디 넣고 부팅한 다음

boot: linux rescue 를 입력하면 login 할 수 있을 것.
linux rescue 를 입력하고 기다리면 설치화면과 유사한 몇 가지 내용이 나온다.
거기에서 적절히 답한다. 그리고 network 설정에 대해서도 물어보는데 network 설정은 그냥 skip 한다.

부팅이 다 되면 chroot /mnt/sysimage 후 lilo 명령만 한번 실행해주면 끝.
chroot 는 change root directory 라는 의미이다. / 파티션이 / 가 아닌 /mnt/sysimage 디렉토리에 마운트 된다면
기존의 설정파일 경로가 /mnt/sysimage 이하의 경로로 다 바뀌므로 chroot 명령으로 /mnt/sysimage를 / 파티션으로
사용하겠다는 의미이다.

* boot 로더가 grub 인 경우

linux rescue 모드로 부팅 후

grub-install /dev/hda <= 부트로더가 재설치됨.

rescue 모드로 부팅하면 / 파티션이 /mnt/sysimage 디렉토리에 마운트 되므로 그 상태에서 lilo 명령을
실행하면 당연히 되지 않는다. 왜냐하면 /etc/lilo.conf 가 /mnt/sysimage/etc/lilo.conf 로 경로가 변경되었기
때문이다.
그래서 chroot /mnt/sysimage 라는 명령을 입력한다.
이 명령은 change root 디렉토리라는 의미로 chroot 뒤의 경로에 해당하는 인수를 “/” 로 변경하겠다는 것이다.
그러면 / 파티션이 / 디렉토리에 마운트 된 것과 마찬가지가 되므로 lilo 명령을 실행하는데 아무런 문제가 없다.
만약 lilo 실행할 때 에러가 난다면 lilo 설정파일인 /etc/lilo.conf 파일을 확인한 후 문제가 있다면 수정 후 다시
lilo 명령을 아무런 옵션 없이 입력한다. lilo 명령은 부트로더를 설치하는 명령어이다

======================================================
예제.

#!/bin/bash
case "$1" in
        start)
        echo "testsvr started [ok]" > /tmp/start.txt
                ;;
        stop)
                echo "testsvr stopped [ok]" > /tmp/stop.txt
                ;;
        *)
          echo "Usage:$0 {start|stop}"
                ;;
esac


'Log > Linux' 카테고리의 다른 글

서비스 운영방식 - standalone / inetd(xinetd)  (0) 2011.11.28
리눅스 네트워크  (0) 2011.11.28
shell 및 shell script  (0) 2011.11.28
디스크 Quota  (0) 2011.11.28
LVM / RAID  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:24 Log/Linux

shell 및 shell script

Shell

사용자와 Unix 커널사이의 인터페이스 역할을 하는 프로그램.
사용자가 내린 명령어를 해석하여 커널에게 전달하는 역할을 한다
명령어 해석기로도 불린다.

shell 의 역할
- 입력을 읽고 해당 명령행을 분석
- 특수문자 평가
- 파이프, 리디렉션, 백그라운드 프로세스를 처리

unix 주요 shell

1.bash(bourne again shell) : 리눅스의 기본셀. 편리한 사용자 인터페이스 및 본셀과 비교하여 확장된 문법제공.
본셀과는 기본적으로 호환됨. 명령행 편집기능 제공. GNU 프로젝트에 의해 만들어지고 배포됨.

2. sh(bourne shell) : steven bourne 이 개발한 최초의 대중화 된 유닉스 셀
명령행 편집기능을 제공하지 않는다.

3.csh(c shell) : billy joy에 의해 개발된 셀로 프로그래머들이 선호하는 셀.
linux 의 기본셀인 본셀과는 호환되지 않는다.

4. ksh(korn shell) : david korn이 개발. 사용자 인터페이스가 뛰어나고 본셀과도호환되어 유닉스에서 가장 많이
사용하는 셀로 알려짐 명령행 편집기능 제공.

*. shell (login shell인경우)설정 파일.

bash shell

로그인 셀이 bash 인경우 로그인하면
/etc/profile => $HOME/.bash_profile => .bashrc => /etc/bashrc file이 실행된다.

login shell 을 끝낼때 => $HOME/.bash_logout 그리고 bash shell 사용기록을 저장하는
$HOME/.bash_history 라는 파일이 실행된다

* bash shell 변수

환경변수

- 주로 대문자만 사용
- 미리 정의되어 있다.
- shell 환경을 편리하게 사용할 수 있게 env 명령어로 볼수 있다.
- sub shell에서도 사용.

사용자정의변수

- 사용자가 필요할때마다 임시로 만들어서 사용
- 주로 소문자만 사용
- 현재셀에서만 사용가능

shell 내장변수

- shell 에 내장되어 있다.
- 변수명이 특수문자나 숫자로 되어 있다.

$0 $1 .... $n => 위치매개변수
$# => 인수의 갯수
$* => 모든 인수
$@ => 모든 인수
$? => return value
$$ => 현재 process id

조건 판단명령어

test - check file types and compare values

*. 아래는 참고사항입니다.
===============================================================

bash shell 문법

* 변수: 할당과 치환
a=375
hello=$a

* 변수를 초기화 할 때, = 양쪽에는 빈 칸이 들어가면 안 됩니다.
echo hello    # 변수 참조가 아니고 그냥 "hello"란 문자열입니다.
echo $hello
echo ${hello} # 위와 똑같습니다.
echo "$hello"
echo "${hello}"
echo
hello="A B  C   D"
echo $hello
echo "$hello"
echo '$hello'
hello=    # 널 값을 갖도록 세팅.
여러 변수들을 공백문자로 구분해서 한 줄에서 세트할 수 있습니다.
하지만 이렇게 하면 코드의 가독성이 떨어지고 
다른 시스템으로 이식할 수가 없을 수도 있기 때문에 조심해서 써야 됩니다.
var1=variable1  var2=variable2  var3=variable3
numbers="one two three"
other_numbers="1 2 3"
# 변수에 공백문자가 들어 있다면 쿼팅을 해줘야 합니다.
echo "numbers = $numbers"
echo "other_numbers = $other_numbers"
echo "uninitialized_variable = $uninitialized_variable"
# 초기화 안 된 변수는 널 값을 갖습니다(아무 값도 없습니다).

for a in 7 8 9 11
do
  echo -n "$a 입니다."
done

# 'read' 문에서(역시 일종의 할당임)
echo -n "a" 를 넣으세요."
read a
echo "a" 의 값은 이제 $a 입니다."

a=`echo Hello!`   # 'echo' 명령어의 결과를 'a' 로 할당
echo $a
a=`ls -l`         # 'ls -l' 명령어의 결과를 'a' 로 할당
echo $a

$(...) 기법을 써서 변수 할당하기(역따옴표(backquotes)보다 새로운 방법)
# /etc/rc.d/rc.local 에서 발췌
R=$(cat /etc/redhat-release)
arch=$(uname -m)

연산자

문자열비교

[string] : string이 빈 문자열이 아니라면 참
["string1" = "string2"] : 두 문자열이 같으면 참
[“string1" != "string1" ] : 두 문자열이 같지 않으면 참.
[ -n "string" ] : 문자열이 null(빈 문자열) 이 아니라면 참.
[ -z "string" ] : 문자열이 null(빈 문자열)이라면 참

산술비교

[ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참.
[ expr1 -ne expr2 ] : 두 표현식 값이 않다면 참.
[ expr1 -gt expr2 ] : expr1 이 expr2 보다 크다면 참
[ expr1 -ge expr2 ] : expr1 이 expr2 보다 크거나 같으면 참
[ expr1 -lt expr2 ] : expr1 이 expr2 보다 작다면 참
[ expr1 -le expr2 ] : expr1 이 expr2 보다 작거나 같으면 참

파일조건

[ -b file ] : file이 block device file이면 참
[ -c file ] : file이 character device file 이면 참
[ -d file ] : file이 directory file이면 참
[ -f file ] : file이 정규파일이면 참
[ -r file ] : file이 읽기권한이면 참
[ -w file ] : file이 쓰기권한이면 참
[ -x file ] : file이 실행권한이면 참
[ -L file ] : file이 symbolic link file이면 참
[ -e file ] : file이 존재하면 참

2. if 구문.

단순 if 문

if [ 조건 ]
then
실행문장
fi

if ~else 문

if [ 조건 ]
then
실행문장
else
실행문장
fi

if ~ else if 문

if [ 조건 ]
then
실행문장
elif [ 조건 ]
then
실행문장
fi

다중 if 문
if [ 조건 ]
then
if [ 조건 ]
then
실행문장
fi
fi

3. and list / or list

and list

실행문장 && 실행문장 && 실행문장 && ....

=> 참이 될 때까지 실행문장을 실행한다.

or list

실행문장 || 실행문장 || 실행문장 || ...

=> 실행문장이 거짓이 될 때까지 실행한다.

4. case 구문

case 변수 in
패턴 | 패턴 | ... )
문장 ;;
패턴 | 패턴 | ...)
문장;;
*) 문장 ;;
esac

5. while 구문

단순 while 문

while [ 조건 ]
do
실행문장
done

다중 while 문

while [ 조건 ]
do
while [ 조건 ]
do
실행문장
done
done

ex)
echo -n "input password : "
read password1
echo -n "retype password : "
read password2

while [ "$passowrd" != "$password2" ]
do
echo "password miss match try again"
read password2
done
ecoh "OK ! password Match complete"

6. until 구문

until [ 조건 ]
do
실행문장
done

ex)

until who | grep "$1" > /dev/null
do
sleep 5
done
echo "user $1 just logged in"

6 for 문

단순for 문

for 변수 in list
do
실행문장
done

다중 for 문

for 변수 in list
do
for 변수 in list
do
실행문장
done
done

ex)

for string in "hello" "unix" "world"
do
echo -n "$string "
done

7. select 문.
select 변수 in list
do
실행문장
done

8. 함수

함수명 () {
실행문장
[ return value ]
}

또는

function 함수명 {
실행문장
[ return value ]
}

break / continue

break 제어문이나 조건문의 루프를 빠져나갈 때 사용한다.
continue : 제어문이나 조건문의 처음으로 돌아가서 다시 수행한다.
: 의미 없는 명령. 논리 값 true를 대신해서 쓰기도 한다.

. 명령 - 스크립트를 실행. 스크립트 내에서 다른 파일을 include하는 경우에도 사용

exec - 현재 shell을 다른 shell 로 대체
exit n : 현재 shell 종료 시 리턴 값 n 반환
shift : shell의 인자를 오른쪽으로 하나 shift 한다.

ex)

echo $1
shift
echo $1
shift 3
echo $1

./script 1 2 3 4 5 6 7

1
2
5

정규표현식

정규표현식
정규 표현식이란 어떤 문자열의 집합을 표시하는 텍스트 스트링을 말하는 것으로 일반적으로 
텍스트 형식 문서등에서 문자열을 찾아내고 치환하는데 많이 사용된다.
정규 표현식은 vi.ex,ed,sed,grep 등에서 사용되며 윈도우의 찾기 기능이나 바꾸기 기능과는 비교할
수 없는 편리함이나 강력한 기능을 갖고 있다.

“[문자열]”의 의미
정규 표현식에서 문자열이 “[ ]"로 둘러싸여 있으면 이문자열들중 하나를 의미하게 된다.
ex [0-9]
   [a-z]
[A-Z]
[a-Z]
[Oo]wl

"[ ]"안에서 “^”는 문자열중 ^이하를 포함하지 않는 문자열을 말한다.
 ex) [^0-9] : 숫자가 아닌 문자 하나를 의미한다. 
     [-0-9] : 숫자 한 개 또는 - 기호를 의미한다.
     [^-0-9] : 숫자나 - 기호가 아닌 문자 하나를 의미한다
     [^A-Z] : 대문자를 제외한 문자
     c[a-z0-9]t : 두 번째 문자가 임의의 소문자나 숫자.

“^”와 $의 의미
“^”는 라인의 시작 부분을 의미하는 것인 반면 “$”는 라인의 끝 부분을 의미한다. 만약 “new"로 
시작하는 부분을 찾고 싶다면 ”^new"라고 표현한다.

“\”
정규표현식에서는 특별한 의미를 지니고 있는 <>,()등의  기호들의 표현하기 위해 해당 문자의 바로 
앞에 역슬래시를 사용하여 구분한다. 
ex) \$$ : $로 끝나는 라인을 의미한다.
 
“.” : 아무문자나 한 개의 문자를 의미.

ex) [0-9]* : 숫자가 들어 있거나 그렇지 않은 부분을 의미.

확장 정규식
+ : + 기호 바로 이전의 글자나 정규식이 1회이상 반복   
ex. abc+ (c가 1회이상 반복) ==> abc, abcc, abcc 등
? : ? 기호 바로 이전의 글자나 정규식이 없거나 한번 존재 
ex. abc? (c가 있거나 없거나) ==> ab,abc
( ) : 부분 정규식의 시작과 끝을 표시
ex. a(bc)* (bc가 0회 이상 반복) ==> a, abc, abcbc등
    a(bc)+ (bc가 1회 이상반복) ==> abc,abcc등
    a(bc)? (bc가 있거나 없거나) ==> a, abc 등
| (  ) 내의 단어들 중 최소 하나가 존재 
ex. a(b|c) (b 또는 c가 최소 하나 존재 : ab, ac, abc, acb)

*. 텍스트 조작 및 필터명령
grep(get regular expression)
: 특정한 문자열을 포함하고 있는 라인을 찾기위해 사용한다.
자주사용되는 옵션
-v(invert) ; 찾고자 하는 문자열과 일치하는 라인을 제외한 모든 라인을 출력한다.
-n(number) ; 문자열이나 패턴을 일치시키는 라인들의 라인번호를 표시해준다.
-l(listfile) ; 특정한 패턴을 찾기위해 여러개의 파일을 검색할 때 편리하게 사용할 수 있다.
이 옵션은 패턴을 갖고 있는 줄을 찾아 보여주는 것이 아니라 그러한 줄이 발견된 파일명을 결과로 
보여준다.

egrep(Extended grep) : 확장 정규식을 사용해서 grep 명령어로 표현할 수 없는 다양한 패턴을 나타낼
 수 있다.

fgrep(Fixed grep) : grep, egrep 명령어와 달리 정규식을 전혀 사용하지 않는다. 모든 패턴의 문자를 
그대로 인식하므로 *, +, ^, $, [ ] 등의 문자도 모두 단순 문자로서만 인식한다.

'Log > Linux' 카테고리의 다른 글

리눅스 네트워크  (0) 2011.11.28
boot procedure(부팅 진행과정)  (0) 2011.11.28
디스크 Quota  (0) 2011.11.28
LVM / RAID  (0) 2011.11.28
파일시스템 점검 및 복구  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:24 Log/Linux

디스크 Quota

quota - 사용자 또는 그룹이 가질 수 있는 파일 갯수나 디스크 사용량을 제한하는것이다.
특정 사용자가 디스크 공간을 무제한 사용하는 것을 방지한다.

먼저 quota 를 사용하려면 quota 패키지가 설치되어 있어야 한다.
아래와 같이 rpm으로 확인해본다.
[qtuser1@star ~]$ rpm -qa | grep quota
quota-3.12-6 <= 설치되어 있다.

그리고 커널에서도 quota를 지원해야 한다. 커널이 지원하지 않는다면
quota 명령 실행시 kernel not supported 라는 에러 메시지가 출력될것이다.
그런 경우 커널을 quota 를 지원하도록 새로 컴파일 해야 한다.
(대부분의 커널에서 quota를 지원하도록 되어 있으므로 신경 안써도 될듯)

Quata 설정 방법(아래와 같은 순서로 한다)
1. 용량을 제한할 파티션을 정한다.
2. /etc/fstab 에 용량을 제한할 파티션을 등록하고 쿼터옵션을 설정한다.
3. 리부팅하거나 /etc/fstab 를 다시 읽을수 있게 'remount' 옵션으로 다시 마운트한다.
4.쿼터 db file을 만든다.
5. 쿼터를 활성화 시킨다.
6. 사용자별 쿼터 설정을 한다.

참고예제)
/dev/sda6 을 디스크 사용량을 제한할 파티션으로 정하고
마운트포인터는 /qthome 으로 한다.
그리고 /qthome에 있는 사용자들중 qtuser1 계정에 쿼터 설정을 한다.

1. 쿼터 설정을 제한할 파티션을 정한다.
[root@star test_vg]# mkdir /qthome
[root@star test_vg]# mount -t ext3 /dev/sda6 /qthome

2. /etc/fstab 에 용량을 제한할 파티션을 등록하고 쿼터옵션을 설정한다.
테스트를 위해 qtuser1 계정이 없다면 생성한다.
[root@star test_vg]# useradd -d /qthome/qtuser1 qtuser1

/etc/fstab 파일에 /dev/sda6 장치에 아래출력결과처럼 usrquota 옵션을 추가한다.

[root@star ~]# grep sda6 /etc/fstab
/dev/sda6 /qthome ext3 defaults,usrquota 1 2
[root@star ~]#

3.리부팅하거나 /etc/fstab 를 다시 읽을수 있게 'remount' 옵션으로 다시 마운트한다.
[root@star ~]# mount -o remount /qthome

[root@star ~]# mount | grep qthome
/dev/sda6 on /qthome type ext3 (rw,usrquota)
[root@star ~]#
usrquota 옵션이 적용된것을 확인할 수 있다. 이 옵션이 적용되지 않으면
쿼터 설정을 할 수 없다.

4. quota db 파일 생성
[root@star ~]# touch aquota.user ; quota.user 파일 생성
(quota 를 적용할 계정 설정을 위한 파일.
그룹에도 quota 를 적용하려면 aquota.user 파일도 생성하면 된다.)

*. quota version 1 에서는 quota.user, quota,group 이다
version1 형식을 버전2 형식(커널 2.6.x 에서 지원)으로 변환하는 경우에는
convertquota 명령을 사용하면 된다.
(ex. convertquota /qthome)

[root@star qthome]# quotacheck -v /qthome =>( quotacheck 명령은 quota 가 비활성화 되어 있는 상태에서 하는것이 안전하다. 만약 활성화 되어 있다면 quotaoff -v /qthome 하고 나서 실행)
(* quotacheck -a 옵션을 사용한다면 target 을 지정하는대신 /etc/fstab 에 usrquota 옵션이 설정되어 있는 파티션에 다 적용하겠다는 의미)

quotacheck: WARNING - Quotafile /qthome/aquota.user was probably truncated. Can't save quota settings...
quotacheck: Scanning /dev/sda6 [/qthome] quotacheck: Old group file not found. Usage will not be substracted.
done
quotacheck: Checked 5 directories and 11 files
[root@star qthome]#

(*. 출력된 경고 메시지나 Old group file 이 없다는것은 무시하기 바람.)

5. 쿼터 활성화
quotaon -v /qthome 또는 리부팅.( 비활성화 시킬때는 quotaoff -v /qthome)

6. 사용자별 쿼터 설정

edquota -u qtuser1 => 쿼터 설정을 위한 vi 편집기가 실행된다.

Disk quotas for user qtuser1 (uid 506):
Filesystem blocks soft hard inodes soft hard
/dev/sda6 5 0 0 5 0 0

===> 테스트를 위해 이것을 아래처럼 변경후 확인해본다.

Filesystem blocks soft hard inodes soft hard
/dev/sda6 5 2000 3000 5 20 30


[root@star ~]# repquota /qthome
*** Report for user quotas on device /dev/sda6
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 5664 0 0 4 0 0
qtuser1 -+ 6 2000 3000 40 30 40 6days
qtuser2 -- 5 0 0 5 0 0
qtuser5 -- 5 0 0 5 0 0

[root@star qthome]# edquota -u qtuser1

Disk quotas for user qtuser1 (uid 506):
Filesystem blocks soft hard inodes soft hard
/dev/sda6 5 0 0 5 0 0


[root@star qthome]# ls
lost+found/ qtuser1/ qtuser2/ quota.user
[root@star qthome]#
[root@star qthome]# touch quota.user
[root@star qthome]# chmod 600 quota.user


[root@star qthome]# quotacheck -v /qthome
(* quotacheck -a 옵션을 사용한다면 target 을 지정하는대신 /etc/fstab 에 usr.quota 옵션이 설정되어 있는
파티션에 다 적용하겠다는 의미)

quotacheck: WARNING - Quotafile /qthome/aquota.user was probably truncated. Can't save quota settings...
quotacheck: Scanning /dev/sda6 [/qthome] quotacheck: Old group file not found. Usage will not be substracted.
done
quotacheck: Checked 5 directories and 11 files
[root@star qthome]#

* quotacheck
- 타겟으로 지정된 파일시스템의 쿼터를 검사하고 aquota.user 와 aquota.group 파일에 필요한 설정을 저장한다.
그리고 손상된 쿼터 파일이 있다면 복구한다.

아래의 repquota 명령의 출력결과는 qtuser1 계정이 파일을 몇개 생성한후의 결과이다.
* repquota 명령어는 quota report 를 작성해서 보여준다.
[root@star qthome]# repquota /qthome
*** Report for user quotas on device /dev/sda6
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 5664 0 0 4 0 0
qtuser1 -- 6 2000 3000 11 30 40 6days
qtuser2 -- 5 0 0 5 0 0


* 출력결과중
used 는 사용중인 디스크 용량 및 inode 갯수(생성할 수 있는 파일수로 보면 된다)
soft 는 soft limit 로서 grace time 동안에는 soft limt 값에 도달하더라도 파일이 생성된다.
그러나 grace (유예기간) 이 되면 더 이상 파일이 만들어 지지 않는다.

hard limit 는 grace time과 관계없다. hard limit 에 도달하면 파일은 생성되지 않는다.
quota 설정으로 제한 할 수 있는 것은 디스크 사용량 및 파일 생성 갯수이다.



[qtuser1@star test]$ touch 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27
sda6: warning, user file quota exceeded. => soft 값 초과에 따른 에러
[qtuser1@star test]$

[qtuser1@star test]$ touch 28 29 30 31 => hard limit 에는 도달하지 않았으므로 파일은 생성된다.

그러나 grace time을 초과하게 되면...
[qtuser1@star ~]$ touch aa
sda6: write failed, user file quota exceeded too long.
touch: cannot touch `aa': 디스크 할당량이 초과됨


[qtuser1@star test]$ touch 32 33 34 35
sda6: write failed, user file limit reached. => hard limit 에 도달하게 되면 파일은 생성되지 않는다.
touch: cannot touch `35': 디스크 할당량이 초과됨
[qtuser1@star test]$


*. 쿼터 설정 제거

제거하려면 quota 를 비활성화 시킨다음에 제거해야 한다.

rm: cannot remove `aquota.user': Operation not permitted => 쿼터가 활성화 되어 있어서 안됨.
[root@star qthome]# ls -l
[root@star qthome]# quotaoff -v /qthome
/dev/sda6 [/qthome]: user quotas turned off
[root@star qthome]# rm aquota.user
rm: remove regular file `aquota.user'? y
[root@star qthome]#

그다음 /etc/fstab 에서 usr.quota 옵션을 제거한다음 reboot 또는 remount 하면 끝.

======================================================
그룹쿼터 설정 및 test

/etc/fstab 파일에서 아래처럼 해당 파티션에 grpquota 옵션을 추가한다.
[root@star qthome]# tail -1 /etc/fstab
/dev/sda6 /qthome ext3 defaults,usrquota,grpquota 1 1
그런다음
[root@star qthome]# mount -o remount /qthome

[root@star qthome]# touch aquota.group
[root@star qthome]# quotacheck -v /qthome
quotacheck: Scanning /dev/sda6 [/qthome] done
quotacheck: Checked 7 directories and 47 files

(*. 주의 - quotacheck 명령을 사용하기전에 쿼터는 비활성화 되어 있어야한다.
그렇지 않으면 쿼터로 지정된 파일시스템에 손상을 입힐 수 있다.
)
아래는 메뉴얼 페이지에 있는 내용
It is strongly recommended to run quotacheck with quotas turned off for the filesystem. Otherwise, possible damage or loss to data in
the quota files can result.
그래서 쿼터가 활성화 되어 있는 상태이라면 quotaoff -v /qthome. 그리고 quotacheck 가
끝나면 quotaon 으로 다시 활성화 시켜주면 된다)


[root@star qthome]# quotacheck -ugv /qthome => 여기서 g 옵션은 생략하면 안된다.
quotacheck: WARNING - Quotafile /qthome/aquota.group was probably truncated. Can't save quota settings...
quotacheck: Scanning /dev/sda6 [/qthome] done
quotacheck: Checked 9 directories and 55 files
[root@star qthome]# quotaon -v /qthome
/dev/sda6 [/qthome]: group quotas turned on
/dev/sda6 [/qthome]: user quotas turned on

*. quotacheck 옵션
-v verbose의 의미 체크중 옵션 사용하지 않았을때보다 자세한 내용 출력
-u 특정 uid가 사용하는 파일과 디렉토리를 카운트하게한다 (디폴트 옵션)
-g 특정 gid가 사용하는 파일과 디렉토리를 카운트하게한다
-a /etc/fstab 파일에 usrquota,grpquota 옵션이 포함된 파일 시스템을 모두 체크한다
(타겟을 지정하지 않고 모두 체크할때 이 옵션 사용)


edquota -g qtgroup

Disk quotas for group qtgroup (gid 509):
Filesystem blocks soft hard inodes soft hard
/dev/sda6 0 3000 4000 0 0 0
~
==> 테스트를 위해 3000 과 4000 으로 지정하였다

[root@star qthome]# repquota -g -v /qthome
*** Report for group quotas on device /dev/sda6
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
Group used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 5664 0 0 4 0 0
qtuser1 -- 8 0 0 37 0 0
qtuser2 -- 5 0 0 5 0 0
qtuser5 -- 5 0 0 5 0 0
qtgroup -- 1 3000 4000 6days 1 0 0
qtuser10 -- 6313 0 0 13 0 0
qtuser11 -- 5 0 0 5 0 0
qtuser12 -- 5 0 0 5 0 0

==> 왼쪽에 출력된것은 계정명이 아니라 그룹명이다.
==> 계정과 그룹 쿼터 정보를 다 출력해 보려면 repquota -ugv /qthome 으로 실행하면 된다.

[root@star qthome]#

[root@star qthome]# usermod -G qtgroup qtuser10 =>
qtuser10 사용자는 그룹쿼터 적용을 받지 못한다.
(위에 repquota 의 출력결과를 보면 qtuser11 그룹에 속한 사용자는 쿼터 설정이 되어 있지 않다.
즉, 그룹 쿼터 설정을 적용받으려면 primary group 만 영향을 미친다)

[root@star qthome]# usermod -g qtgroup qtuser11 =>
qtuser11 사용자는 그룹쿼터 적용을 받는다.

설정이 다 되었으므로 테스트 해보면
[root@star qthome]# su - qtuser11
[qtuser11@star ~]$ cp /bin/ksh 1
[qtuser11@star ~]$ cp /bin/ksh 2
[qtuser11@star ~]$ cp /bin/ksh 3
[qtuser11@star ~]$ cp /bin/ksh 5
sda6: warning, group block quota exceeded. <= 쿼터가 적용되고 있음을 알 수 있다.
[qtuser11@star ~]$

'Log > Linux' 카테고리의 다른 글

boot procedure(부팅 진행과정)  (0) 2011.11.28
shell 및 shell script  (0) 2011.11.28
LVM / RAID  (0) 2011.11.28
파일시스템 점검 및 복구  (0) 2011.11.28
파일시스템 생성작업  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:23 Log/Linux

LVM / RAID

LVM - Logical Volume Manager

- lvm을 이용하면 여러개의 디스크를 하나의 디스크 처럼 사용할 수 있다.
예를들면 1G 용량의 디스크 세개를 하나의 3G 용량의 디스크 처럼 사용할 수 있다.
그리고 추가용량이 필요하면 파일시스템을 새로 생성하지 않고도 동적으로 용량을
늘릴수 있다.

Volume Group(VG): Logical Volumes 과 Physical Volumes 를 하나의 관리할수있는 group 으로 만든것.
- 여러개의 PV 를 합친것이고 가상의 디스크라고 보면 된다.
Physical Volume(PV): 일반적으로 하드디스크나 파티션을 의미.
Logical Volume(LV) : LVM 으로 구성되지 않은 시스템에서의 디스크 파티션과 같은것이다.
- 가상디스크(VG) 의 분할영역으로 보면 된다.
Physical Extent(PE) : PV에 나뉘어져 있는 데이터 블럭
volume 그룹에서 PE 의 크기는 LE의 크기와 같다.
Logical Extent(LE) : LV에 나뉘어져 있는 데이터 블럭

LVM 구성형태

hda1 hdc1 (PV:s on partitions or whole disks)
\ /
\ /
diskvg (VG)
/ | \
/ | \
usrlv rootlv varlv (LV:s)
| | |
ext2 reiserfs xfs (filesystems)


*. LVM 관련 명령어
pvcreate - LVM 구성을 위해서 PV 를 만들고 초기화한다.
vgcreate - pvcreate 에 생성된 PV 장치명으로 새로운 Volume Group(VG)를 만든다.
vgdisplay - VG 정보를 출력한다.
lvcreate - 하나의 VG 로 새로운 logical volume 을 생성한다.
lvremove - logical volume 을 삭제한다. 삭제할때는 mount 를 끊어야 한다.
vgremove - volume groupd 을 제거한다.

*. LVM 구성 순서

1. 하나로 묶을 디스크를 정한다.
2. 정해진 디스크를 각각 fdisk 로 파티션을 하나 잡고 파티션 타입을 lvm 으로 한다.
3. physical voume을 만든다.
4. 각각의 physical volume 을 하나의 volume group으로 묶는다.
5. vgdisplay 로 volume group 이 제대로 생성되었는지 확인한다.
6. lvcreate 로 volume group 에 logical volume 을 생성한다.
7. logical volume 에 파일시스템을 생성한다.
8. mount 하여 사용.


ex)
200mb 용량의 디스크 두개를 하나로 구성하여 사용하기 위한 lvm 구성

사용할 디스크
/dev/sdb
/dev/sdc

[root@star /]# fdisk /dev/sdb <= 파티션은 전체용량으로 하나만 설정한다.
Command (m for help): p

Disk /dev/sdb: 213 MB, 213909504 bytes
64 heads, 32 sectors/track, 204 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot Start End Blocks Id System

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-204, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-204, default 204):
Using default value 204

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sdb: 213 MB, 213909504 bytes
64 heads, 32 sectors/track, 204 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 204 208880 8e Linux LVM

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@star /]#

그리고 두번째 디스크도 똑 같은 방법으로 파티션을 구성한다.
그리고 다음

[root@star /]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created

[root@star /]# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created

[root@star /]#
[root@star /]# vgcreate test_vg /dev/sdb1 /dev/sdc1
Volume group "test_vg" successfully created

[root@star /]# vgdisplay -v => 제대로 구성었는지 확인할 수 있다.

[root@star /]#

[root@star /]# lvcreate -L 400M -n test_lg1 test_vg
Logical volume "test_lg1" created

[root@star /]#
[root@star /]# vgdisplay -v => 다시 확인.

[root@star /]#

[root@star /]# mkfs -t ext3 /dev/test_vg/test_lg1 (또는 mke2fs -j /dev/test_vg/test_lg1 )

[root@star /]#

[root@star /]# mkdir /mnt/lvmdata


[root@star /]# mount -t ext3 /dev/test_vg/test_lg1 /mnt/lvmdata
[root@star /]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 6520216 4553532 1630124 74% /
/dev/sda6 194442 5664 178739 4% /data2
/dev/sda7 194442 5664 178739 4% /data3
/dev/shm 127808 0 127808 0% /dev/shm
/dev/sda3 497861 10603 461554 3% /home
/dev/hdc 649838 649838 0 100% /media/cdrom
/dev/sda5 202219 1917 189862 1% /data1
/dev/mapper/test_vg-test_lg1
396672 10544 365648 3% /mnt/lvmdata
[root@star /]#

리부팅하였을 경우에도 계속 사용하려면
/etc/fstab 파일에

/dev/test_vg/test_lg1 /mnt/lvmdata ext3 defaults 1 1
이 한줄을 추가한다.

그리고 lvm 구성이 완료된후에도 용량이 더 필요하면 데이터 이동이나 손상없이
쉽게 늘릴 수 있다.

ex)
[root@titan mnt]#pvcreate /dev/sdd1
[root@titan mnt]#vgextend test_vg /dev/sdd1 <= 기존의 VG 에 추가하는 경우에는 vgextend 로 하여야 한다.
Volume group "test_vg" successfully extended
[root@titan mnt]# lvresize --size +100M /dev/test_vg/test_lg1
Extending logical volume test_lg1 to 500.00 MB
Logical volume test_lg1 successfully resized
[root@titan mnt]# resize2fs /dev/test_vg/test_lg1
resize2fs 1.35 (28-Feb-2004)
Please run 'e2fsck -f /dev/test_vg/test_lg1' first.
*. resize2fs 를 하기전에 filesystem check를 먼저해야 한다. 그렇지 않으면
resize2fs 가 실행되지 않고 위에처럼 메세지가 출력된다.

[root@titan mnt]# fsck -fy /dev/test_vg/test_lg1
fsck 1.35 (28-Feb-2004)
e2fsck 1.35 (28-Feb-2004)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/test_vg/test_lg1: 82/76912 files (1.2% non-contiguous), 20424/307200 blocks
[root@titan mnt]#
[root@titan mnt]# resize2fs /dev/test_vg/test_lg1

*. LVM 구성 제거.

[root@star /]# umount /mnt/lvmdata
[root@star /]# lvremove /dev/test_vg/test_lg1
Do you really want to remove active logical volume "test_lg1"? [y/n]: y
Logical volume "test_lg1" successfully removed
[root@star /]#

[root@star /]# vgremove test_vg
Volume group "test_vg" successfully removed
[root@star /]#

그리고 /etc/fstab 파일에서 등록된 lvm 정보 제거.

[root@star /]# vgdisplay -v
Finding all volume groups <= 아무런 volume group 정보도 없으므로 다 지워졌음을 알수 있다.

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

RAID

[root@centos1 ~]# fdisk /dev/sdb

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-512, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-512, default 512):
Using default value 512

Command (m for help): p

Disk /dev/sdb: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 512 524272 83 Linux
Command (m for help): p

Disk /dev/sdb: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 512 524272 fd Linux raid autodetect

Command (m for help):

[root@centos1 ~]# ls -l /dev/md0
brw-r----- 1 root disk 9, 0 8¿&ugrave; 29 22:15 /dev/md0
[root@centos1 ~]#

[root@centos1 ~]# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm: /dev/sdb1 appears to contain an ext2fs file system
size=98288K mtime=Fri Jul 16 06:01:25 2010
mdadm: /dev/sdc1 appears to contain an ext2fs file system
size=524272K mtime=Sun Aug 29 22:28:52 2010
Continue creating array? y
mdadm: array /dev/md0 started.
[root@centos1 ~]#
[root@centos1 ~]# mdadm --detail --scan
ARRAY /dev/md0 level=raid0 num-devices=2 UUID=e5c9fc56:b8962bf1:c6f4ad04:0a23a9a3
[root@centos1 ~]#
[root@centos1 ~]# mkfs -t ext3 /dev/md0
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
131072 inodes, 262080 blocks
13104 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@centos1 ~]#


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

[root@centos1 dev]# mknod md1 b 9 1
[root@centos1 dev]# ls -l md1
brw-r--r-- 1 root root 9, 1 8¿&ugrave; 29 22:46 md1
[root@centos1 dev]# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd1 /dev/sde1
mdadm: array /dev/md1 started.
[root@centos1 dev]# mdadm --detail --scan
ARRAY /dev/md0 level=raid0 num-devices=2 UUID=e5c9fc56:b8962bf1:c6f4ad04:0a23a9a3
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=9607e571:30f84644:05a52c29:723425f6
[root@centos1 dev]#

[root@centos1 etc]# mdadm --detail --scan -v
ARRAY /dev/md0 level=raid0 num-devices=2 UUID=e5c9fc56:b8962bf1:c6f4ad04:0a23a9a3
devices=/dev/sdb1,/dev/sdc1
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=9607e571:30f84644:05a52c29:723425f6
devices=/dev/sdd1 ; /dev/sde °&iacute;&Agrave;&aring; (½&Ccedil;&Aacute;&brvbar;´&Acirc; sdd °&iacute;&Agrave;&aring;)
[root@centos1 etc]#

[root@centos1 ~]# mdadm /dev/md1 --add /dev/sdd1
mdadm: added /dev/sdd1
[root@centos1 ~]# mdadm --detail --scan -v
ARRAY /dev/md0 level=raid0 num-devices=2 UUID=e5c9fc56:b8962bf1:c6f4ad04:0a23a9a3
devices=/dev/sdb1,/dev/sdc1
ARRAY /dev/md1 level=raid1 num-devices=2 spares=1 UUID=9607e571:30f84644:05a52c29:723425f6
devices=/dev/sdd1,/dev/sde1
[root@centos1 ~]#

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

raid 5

[root@centos1 ~]# mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdd1 /dev/sde1 /dev/sdf1
mdadm: array /dev/md5 started.
[root@centos1 ~]# mdadm --detail --scan -v
ARRAY /dev/md5 level=raid5 num-devices=3 spares=1 UUID=3639187d:d7eb011f:4df7428a:7e44acfb
devices=/dev/sdd1,/dev/sde1,/dev/sdf1
[root@centos1 ~]#


[root@centos1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 4.8G 4.5G 12M 100% /
/dev/sda5 487M 11M 451M 3% /data
/dev/sda2 1.6G 717M 812M 47% /home
tmpfs 252M 0 252M 0% /dev/shm
/dev/md5 1008M 18M 940M 2% /r5data
[root@centos1 ~]# mdadm --detail --scan -v
ARRAY /dev/md5 level=raid5 num-devices=3 UUID=3639187d:d7eb011f:4df7428a:7e44acfb
devices=/dev/sdd1,/dev/sde1,/dev/sdf1
[root@centos1 ~]# fdisk -l /dev/sdd

Disk /dev/sdd: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot Start End Blocks Id System
/dev/sdd1 1 512 524272 fd Linux raid autodetect
[root@centos1 ~]# fdisk -l /dev/sde

Disk /dev/sde: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot Start End Blocks Id System
/dev/sde1 1 512 524272 fd Linux raid autodetect
[root@centos1 ~]# fdisk -l /dev/sdf

Disk /dev/sdf: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot Start End Blocks Id System
/dev/sdf1 1 512 524272 fd Linux raid autodetect
[root@centos1 ~]#


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

raid 0 + 1

[root@centos1 ~]# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1
[root@centos1 ~]# mdadm --create /dev/md1 --level=0 --raid-devices=2 /dev/sdd1 /dev/sde1
mdadm: array /dev/md1 started.
[root@centos1 ~]# mdadm --create /dev/md01 --level=1 --raid-devices=2 /dev/md0 /dev/md1
mdadm: /dev/md0 appears to contain an ext2fs file system
size=98288K mtime=Fri Jul 16 06:01:25 2010
Continue creating array? y
mdadm: array /dev/md01 started.
[root@centos1 ~]# md
-bash: md: command not found
[root@centos1 ~]# mdadm --detail --scan -v
ARRAY /dev/md0 level=raid0 num-devices=2 UUID=23f38967:54f10aa2:c7facd0d:f0afc274
devices=/dev/sdb1,/dev/sdc1
ARRAY /dev/md1 level=raid0 num-devices=2 UUID=df3f180c:fbcaf03c:bbbbdc34:0d5f4343
devices=/dev/sdd1,/dev/sde1
ARRAY /dev/md01 level=raid1 num-devices=2 UUID=f98ef347:3ea6295a:64a8d04a:52015a93
devices=/dev/md0,/dev/md1
[root@centos1 ~]#

=====================================================
raid 옵션

--remove : raid disk 제거 ex) mdadm /dev/md0 --remove /dev/sdc1
--add : raid disk 추가 ex) mdadm --add /dev/sdc1
--fail : raid disk 강제 fail ex) mdadm --fail /dev/sdc1
-S : raid 정지 ex) mdadm -S /dev/md0
-r : raid 제거 ex) mdadm -r /dev/md0

'Log > Linux' 카테고리의 다른 글

shell 및 shell script  (0) 2011.11.28
디스크 Quota  (0) 2011.11.28
파일시스템 점검 및 복구  (0) 2011.11.28
파일시스템 생성작업  (0) 2011.11.28
리눅스 파일시스템 및 마운트  (0) 2011.11.28
Posted by logwatch
이전버튼 1 2 3 4 5 이전버튼

블로그 이미지
내가 나에게 확인 하는 블로그
logwatch

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.11
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함