*. 서비스 운영방식은 크게 두가지로 나뉜다.
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
- e2fsck
기타 : fsck,fsck.ext2,fsck.ext3,fsck.msods,fsck.vfat

- e2fsck 로 파일시스템 점검시 점검하는 항목
- inode
- blocks
- size
- 디렉토리 구조
- 디렉토리 연결성
- 파일링크 정보
- 전체파일갯수
- 천체블록중 사용중인 블록
- 기타점검.


파일시스템 점검 및 복구
e2fsck /dev/sdb1
e2fsk -j ext3 /dev/sdb1
e2fsck -y /dev/sdb1 / e2fsck -j ext3 -y /dev/sdb1 => 비대화식 모드로 command 수행


파일시스템 점검 및 복구

- 백업슈퍼블록을 이용한 복구
e2fsck -b 백업슈퍼블록번호 장치명
e2fsck -b 32768 /dev/sdb1

[root@star ~]# e2fsck /dev/sda5
e2fsck 1.37 (21-Mar-2005)
Couldn't find ext2 superblock, trying backup blocks...
Superblock has a bad ext3 journal (inode 8).
Clear<y>? cancelled!

e2fsck: Illegal inode number while checking ext3 journal for /data1
[root@star ~]# e2fsck -j ext3 /dev/sda5
e2fsck 1.37 (21-Mar-2005)
Couldn't find ext2 superblock, trying backup blocks...
Superblock has a bad ext3 journal (inode 8).
Clear<y>? yes

*** ext3 journal has been deleted - filesystem is now ext2 only *** <== 파일시스템 타입이
ext2 로만 사용가능하게 변경됨.

Resize inode not valid. Recreate<y>? yes

/data1 was not cleanly unmounted, check forced.
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
Free blocks count wrong for group #0 (7677, counted=7678).
Fix<y>? yes

Free blocks count wrong (200391, counted=200392).
Fix<y>? yes


/data1: ***** FILE SYSTEM WAS MODIFIED *****
/data1: 27/52208 files (0.0% non-contiguous), 8420/208812 blocks
[root@star ~]# mount -t ext3 /dev/sda5 /data1
mount: wrong fs type, bad option, bad superblock on /dev/sda5,
missing codepage or other error
In some cases useful info is found in syslog - try
dmesg | tail or so

[root@star ~]#
[root@star ~]# mount -t ext3 /dev/sda5 /data1 <= 파일시스템 체크 후 타입이 ext2 로 변경됨.
그래서 마운트가 안됨.
mount: wrong fs type, bad option, bad superblock on /dev/sda5,
missing codepage or other error
In some cases useful info is found in syslog - try
dmesg | tail or so

[root@star ~]# mount -t ext2 /dev/sda5 /data1 <= 마운트 성공.
*. /dev/sda5 가 /etc/fstab 에 등록되어 있었다면 파일시스템 타입이 변경되었으므로 ext2 로 바꾸어야 함. /etc/fstab 의 내용중 아래부분.

LABEL=/data1 /data1 ext3 defaults 1 2 <= ext2 로 바꾸어야 함.

그렇지 않으면 부팅이 제대로 안될 수 있다.

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

디스크 Quota  (0) 2011.11.28
LVM / RAID  (0) 2011.11.28
파일시스템 생성작업  (0) 2011.11.28
리눅스 파일시스템 및 마운트  (0) 2011.11.28
작업예약 schedule - cron / at  (0) 2011.11.28
Posted by logwatch
*. 아래 예제는 두번째 스카시 디스크 장치에 하나의 주 파티션과 하나의 확장파티션
두개의 논리 파티션을 만드는 과정이다.

*. 주파티션은 하나의 디스크에 대해 4개까지 만들수 있다.
*. 확장 파티션은 주파티션을 제외한 나머지 모든 영역이다.
*. 논리 파티션은 확장파티션 내의 파티션이다.


[root@star ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklab
el
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): m <= m 을 입력하면 명령어 리스트를 볼수 있다.
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

Command (m for help):
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):
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): +50M

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 49 50160 83 Linux

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

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 49 50160 83 Linux
/dev/sdb2 50 204 158720 5 Extended

Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (50-204, default 50):
Using default value 50
Last cylinder or +size or +sizeM or +sizeK (50-204, default 204): +50M

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 49 50160 83 Linux
/dev/sdb2 50 204 158720 5 Extended
/dev/sdb5 50 98 50160 83 Linux

Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (99-204, default 99):
Using default value 99

Last cylinder or +size or +sizeM or +sizeK (99-204, default 204): +50M
(* .참고 50 이라고 적으면 last cylinder 번호,+ 50 이라고 적으면 실린더 갯수를 50개 할당, + 50K 라고 적으면 50K 바이트를 할당한다는 의미)


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 49 50160 83 Linux
/dev/sdb2 50 204 158720 5 Extended
/dev/sdb5 50 98 50160 83 Linux
/dev/sdb6 99 147 50160 83 Linux

Command (m for help): w <= 작업한 내용을 저장하지 않고 그냥 빠져나가려면 q 만 입력하면 된다.
The partition table has been altered!

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

*. 그리고 파티션을 삭제하려면 d 명령을 사용하면 된다.

* 확인은 -l 옵션으로 할 수 있다.

[root@star ~]# fdisk -l /dev/sdb

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 49 50160 83 Linux
/dev/sdb2 50 204 158720 5 Extended
/dev/sdb5 50 98 50160 83 Linux
/dev/sdb6 99 147 50160 83 Linux
[root@star ~]#

파일시스템 생성은
mkfs -t ext3 /dev/sdb1 => ext3 파일시스템 생성
mkfs -t ext2 /dev/sdb1 => ext2 파일시스템 생성

또는
mke2fs -j /dev/sdb1 => ext3 파일시스템 생성

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

swap file system 생성 및 추가

swap 영역 생성하기
os 설치후에 swap 영역이 더 필요하다라고 생각되면
스왑파티션을 생성하거나 빈 디스크 블럭을 할당하여
swap 영역을 추가할 수 있다.

1. swap 파티션을 생성하고 swap 영역 추가하는 경우
[root@titan p2]# fdisk -l /dev/sdc
Disk /dev/sdc: 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/sdc1 1 49 50160 82 Linux swap
/dev/sdc2 50 98 50176 83 Linux
/dev/sdc3 99 204 108544 83 Linux
[root@titan p2]#

/dev/sdc1 을 swap 파티션으로 사용하기 위해 파일시스템 타입을 Linux swap으로
지정하였다.

그런다음

[root@titan ~]# mkswap /dev/sdc1
Setting up swapspace version 1, size = 51359 kB
[root@titan ~]#
[root@titan ~]# swapon -v /dev/sdc1 (v 옵션을 생략해도 되지만 그 밑에 있는 실행결과를 보여주지 않는다)
swapon on /dev/sdc1
[root@titan ~]#
[root@titan ~]# swapon
usage: swapon [-hV]
swapon -a [-e] [-v]
swapon [-v] [-p priority] special|LABEL=volume_name|UUID=uuid ...
swapon [-s]
[root@titan ~]# swapon -s
Filename Type Size Used Priority
/dev/sda5 partition 522072 3096 -1
/dev/sdc1 partition 50152 0 -5
[root@titan ~]#

swap 영역이 활성화 되었음을 알수 있다.

2. swap 파일을 swap 영역을 할당하려면

[root@titan p2]# dd if=/dev/zero of=./swapfile bs=1024 count=30000

swap file 은 dd 명령으로 생성한다.
약 30메가 크기로 디스크 블럭을 할당하고 디스크 블럭을 0으로 초기화 하였다.

이 디스크 영역을 swap 영역으로 할당하기 위해서는

[root@titan p2]# mkswap swapfile
Setting up swapspace version 1, size = 30715 kB

[root@titan p2]# mkswap swapfile
Setting up swapspace version 1, size = 30715 kB
[root@titan p2]# chmod 600 swapfile <= swap file은 보안상 퍼미션을 600으로 하는것이 좋다.
[root@titan p2]# swapon -v swapfile <= swap file 퍼미션이 600 이 아니면 보안경고메세지가 출력될것이다.
swapon on swapfile
[root@titan p2]# swapon -s
Filename Type Size Used Priority
/dev/sda5 partition 522072 3876 -1
/dev/sdc1 partition 50152 0 -5
/mnt/p2/swapfile file 29992 0 -7
[root@titan p2]#
swap 영역이 활성화 되었음을 알수 있다.

그리고 리부팅후에도 계속 사용하기 위해서는 fstab 파일에 등록해두어야 한다.

/dev/sdc1 swap swap defaults 0 0
/mnt/p2 swap swap defaults 0 0
[root@titan p2]#
기존의 등록되어 있는 swap 영역 한줄을 복사해서 사용하면 간단히 추가할수 있다.

그리고 swap 파티션 장치명을 label 명으로 fstab 에 등록하려면
mkswap 명령어를 사용할 때 아래와 같이 레이블명을 넣어주면 된다.

mkswap -L SWAP-sdc1 /dev/sdc1

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

LVM / RAID  (0) 2011.11.28
파일시스템 점검 및 복구  (0) 2011.11.28
리눅스 파일시스템 및 마운트  (0) 2011.11.28
작업예약 schedule - cron / at  (0) 2011.11.28
process 관리  (0) 2011.11.28
Posted by logwatch

파일시스템 관리

리눅스 file system 구조

부트블록
(Boot Block)
Block group 0 Block group 1

....

Block group n - 1 Block group n


그리고 각 block 그룹은 아래처럼 구성되어 있다.

>
super block group descriptor block bitmap

inode bitmap

inode table data blocks

*. 이러한 파일시스템 구조는 파일시스템 생성시 만들어진다.

부트블록(부트섹터)

- 운영체제를 부팅시키기 위해 필요한 코드를 저장
- 대부분의 파일스템들은 부트블록으로 시작
- 하드웨어가 부팅에 필요한 코드를 부트블록에서 찾는다.

슈퍼블록

- 블록 그룹의 가장 앞에 위치.
- 파일시스템과 관련된 정보를 담고 있음. 파일 시스템의 전체 크기,마운트정보 등..
- 리눅스 운영체제는 슈퍼블록의 정보를 사용하여 파일시스템을 관리함.
- 다른 블록그룹에 있는 슈퍼블록도 똑 같은 내용을 가지고 있는 사본이다.

. 매직넘버 - ext 파일시스템의 슈퍼블록임을 의미하는 숫자
. 마운트횟수 - 얼마나 많이 마운트 되었는지를 나타낸다.
.블록그룹번호 - 파일시스템내에서 몇 번째 블록인지를 나타내는 번호

블록크기 - 파일시스템의 기본 블록크기를 바이트 단위로 표시(예를들면 1024byte)

그룹당 블록수 - 하나의 그룹에 속하는 블록 갯수
free blocks - 할당되지 않은 block 갯수
free inode - 할당되지 않은 inode 갯수
first inode - 파일시스템내의 가장 첫 번째 inode 번호

group 디스크립터 table

- 해당 파일시스템 내의 모든 블록 그룹에 대한 정보를 기록.
- 다른 블록그룹에 있는 group 디스크립터 영역도 똑 같은 내용을 가지고 있는 사본이다.

. 첫 번째 inode table block 의 블록번호
. 그룹내의 free block 갯수
. 그룹내의 inode 갯수
. 디렉토리갯수

block bitmap - 블록 그룹에서 블록의 할당 상태를 나타내는 맵, 블록을 할당하거나 해제 할 때 사용된다.
inode bitmap - inode 의 할당 상태를 나타내는 맵, inode를 할당하거나 해제 할 때 사용


아이노드(inode = index node) 블록

- 파일의 정보[접근권한/소유주/파일크기/inode 번호 등]를 저장하고있는 부분.
- 파일 하나당 하나의 아이노드가 사용됨.
- 파일의 형태와 무관하게 아이노드 블록을 가지게 됨

데이터 블록

- 실제 데이터 내용이 저장되는 디스크 영역

filesystem mount

- 리눅스에서 파일시스템에 접근하기 위해서 마운트라는 개념을 사용한다.
- 모든 블록장치파일은 마운트를 하지 않으면 사용할 수 없다.
- mswindows 의 C: 나 D: 같은 드라이버 문자를 통해서 장치파일에 접근할 수는 없다.

시스템의 마운트 정보는 df(disk free) 명령으로 확인할 수 있다.

man mount

MOUNT(8) Linux Programmer's Manual MOUNT(8)

NAME

mount - mount a file system

SYNOPSIS

mount [-lhV]

mount -a [-fFnrsvw] [-t vfstype] [-O optlist]

mount [-fnrsvw] [-o options [,...]] device | dir

mount [-fnrsvw] [-t vfstype] [-o options] device dir

DESCRIPTION

All files accessible in a Unix system are arranged in one big tree, the

file hierarchy, rooted at /. These files can be spread out over sev-

eral devices. The mount command serves to attach the file system found

on some device to the big file tree. Conversely, the umount(8) command

will detach it again.

[root@river root]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/hda2 2016044 117772 1795860 7% /

/dev/hda1 295564 13284 267020 5% /boot

/dev/hda5 3020140 1987440 879284 70% /home

/dev/hda8 1004024 24536 928484 3% /private1

/dev/hda10 1004024 16428 936592 2% /private2

none 256900 0 256900 0% /dev/shm

/dev/hda7 2016016 34572 1879032 2% /tmp

/dev/hda3 10080520 2924472 6643980 31% /usr

/dev/hda6 3020140 112892 2753832 4% /var

/dev/hdb2 10807976 845260 9413696 9% /home1

기본출력은 block 단위이다.

대부분의 사용자에게 좀 더 익숙한 byte 단위로 출력하려면 아래처럼 -h 옵션을 추가하면 된다.

[root@river root]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/hda2 2.0G 116M 1.8G 7% /

/dev/hda1 289M 13M 261M 5% /boot

/dev/hda5 2.9G 1.9G 859M 70% /home

/dev/hda8 981M 24M 907M 3% /private1

/dev/hda10 981M 17M 915M 2% /private2

none 251M 0 251M 0% /dev/shm

/dev/hda7 2.0G 34M 1.8G 2% /tmp

/dev/hda3 9.7G 2.8G 6.4G 31% /usr

/dev/hda6 2.9G 111M 2.7G 4% /var

/dev/hdb2 11G 826M 9.0G 9% /home1

[root@river root]#

각 파일시스템의 총 용량,현재 사용량, 남은 공간등의 정보를 확인할 수 있다. /dev/shm 을 제외한 각 라인은
리눅스 파일시스템 정보이다. 파티션 설정은 되어 있으나 마운트 되지 않은 정보는 출력되지 않는데 그러한 정보는
파티션 설정 명령어인 fdisk 명령으로 확인할 수 있다.

[root@river root]# fdisk -l

Disk /dev/hda: 40.0 GB, 40060403712 bytes

255 heads, 63 sectors/track, 4870 cylindevs

Units = cylindevs of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/hda1 * 1 38 305203+ 83 Linux

/dev/hda2 39 293 2048287+ 83 Linux

/dev/hda3 294 1568 10241437+ 83 Linux

/dev/hda4 1569 4870 26523315 f Win95 Ext'd (LBA)

/dev/hda5 1569 1950 3068383+ 83 Linux

/dev/hda6 1951 2332 3068383+ 83 Linux

/dev/hda7 2333 2587 2048256 83 Linux

/dev/hda8 2588 2714 1020096 83 Linux

/dev/hda9 2715 2779 522081 82 Linux swap

/dev/hda10 2780 2906 1020096 83 Linux

Disk /dev/hdb: 20.0 GB, 20060135424 bytes

255 heads, 63 sectors/track, 2438 cylindevs

Units = cylindevs of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/hdb1 * 1 51 409626 83 Linux

/dev/hdb2 52 1418 10980427+ 83 Linux

/dev/hdb3 1419 2055 5116702+ 83 Linux

/dev/hdb4 2056 2438 3076447+ f Win95 Ext'd (LBA)

/dev/hdb5 2056 2372 2546271 83 Linux

[root@river root]#

이 시스템은 ide 타입은 디스크가 2개 연결되어 있으며 각각 primary master와 primary slave 이다.
그리고 첫 번째 디스크에는 10개의 파티션 정보가 있으며 주 파티션의 세 개, 확장 파티션 1개, 그리고
확장 파티션 안에 있는 논리 파티션이 6개 있다. 그 중 하나는 스왑파티션으로(/dev/hda9) 가상메모리로
사용될 영역이다. 리눅스에서 주 파티션은 최대 4개까지 만들 수 있으며 나머지는 확장 파티션 안에 있어야
한다.
출력결과에서

/dev/hda4 1569 4870 26523315 f Win95 Ext'd (LBA)

이 부분이 확장 파티션을 의미한다.

마운트는 파일시스템을 붙이는 것을 의미한다. 쉽게 생각하면 파일시스템이 생성되어 있는

블록장치 파일을 특정 디렉토리에 연결하는 작업으로 생각해도 된다.

마운트 명령어 자체는 단순하며 디바이스 이름과 파일시스템 타입을 알고 있으면 된다.

그 두 가지만 알면 리눅스에서 지원하는 모든 파일시스템에 접근할 수 있다. 그 두 가지를 알아보자

장치명

마운트 대상은 하드디스크, 시디롬, 플로피디스크등 블록장치 파일이 일반적인 대상이다.

하드디스크는 ide 타입과 scsi 디스크 타입으로 나눠볼 수 있는데

ide 타입의 디스크 장치는

hda : primary master

hdb : promary slave

hdc : secondary master

hdd : secondary slave

위와 같은 이름을 갖는다. scsi 디스크인 경우에는 첫번째가 sda 두 번째 디스크는 sdb 와 같은 형태로 이름이
붙게 되며 디스크 안에 분할된 파티션의 이름은 순서대로 sda1, sda2 와 같은 이름을 갖는다.

ide 타입인 경우에는 hda1, hda2 ... 의 이름을 갖는다.

파일시스템의 종류.

minix : 과거에 리눅스가 minix 머신에서 돌아갈 때, 리눅스가 사용한 파일시스템. 현재는 사용안됨.

xiafs,extfs : 과거의 리눅스 파일시스템. 지금은 사용하지 않는다.

ext2fs : 리눅스 파일시스템. 현재는 많이 사용하지는 않는다.

ext3fs : 리눅스 파일시스템. ext2 파일시스템에 이어서 나온 파일시스템, 요즘은 ext2fs 대신 이 파일시스템이 많이 사용된다.

vfat : fat16, fat32를 리눅스에서 지원하기 위해서 개발된 가상의 파일시스템.

ntfs : windows nt 파일시스템

iso9660 : 시디롬 파일 시스템

nfs : network file system. 이 파일 시스템을 사용하기 위해서는 nfs 서버가 구성되어 있어야 한다.

*. ext2 와 ext3 파일시스템 비교

ext2 의 단점

- 갑작스러운 시스템 다운(정전)이 되었을 경우 마운트해제되지 않은 데이터들에 대한 데이터가 유실되는 일이 종종 있었다.

-. 모든 파일시스템은 마운트할 수 있는 횟수가 제한되어 있었다.
그래서 ext2 파일 시스템에서는 마운트 제한(maximum mount)에 도달하였을 경우에 데이터 유실을 방지하기 위해서
fsck를 실행하도록 되어 있었다.

- fsck를 실행하더라도 한계가 있었다

즉, 파일시스템의 크기에 따라서 fsck를 실행하는 것이 무의미한 작업일 경우가 있었다.
파일시스템의 크기가 너무 작을 경우 fsck로 점검하는 것이 무의미했다.
그리고 파일시스템의 크기가 너무 큰 경우에는 시간이 너무 오래 걸려서
복구작업과 부팅시간이 너무 오래 걸리는 단점이 있었다.

ext3의 장점 :

- ext3 파일시스템에서는 기록된 인덱스 로그를 이용하여 복구할 수 있도록 하였다.
그래서 갑작스러운 시스템 다운시 부팅시간을 단축할 수 있게 되었다.
즉, fsck로 파일시스템을 일일이 채크하지 않아도 인덱스로그를 이용하기 때문에
복구시간과 부팅시간이 단축된다는 점이다.

*. 저널링 파일 시스템의 종류에는 ext3, reiserfs, XFS등이 있다.대표적인 것이 ext3이다.

마운트 명령어 형식.

mount -t 파일시스템타입 디바이스명 마운트포인터

ex)

mount -t vfat /dev/hda1 /mnt/mswin

mount -t iso9660 /dev/hdc /mnt/cdrom

mount -t ext3 /dev/sad5 /home

블록장치가 더 이상 필요하지 않으면 마운트 해제(흔히 unmount 라고도 한다) 할 수 있다.
unmount 한 장치는 다시 마운트 할때까지 아무도 사용할 수 없다. 만약 시디롬을 다 사용하고
시디를 꺼내려면 반드시 시디롬 장치파일을 unmount 해야 한다. unmount 하는 명령어는 umount 이다

umount

umount 마운트포인터 또는 디바이스파일명. 일반적으로 마운터 포인터를 많이 사용한다.

umount 마운트포인터 또는 디바이스파일명. 일반적으로 마운터 포인터를 많이 사용한다.

ex)

[root@river private1]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/hda2 2016044 117772 1795860 7% /

/dev/hda1 295564 13284 267020 5% /boot

/dev/hda5 3020140 1987440 879284 70% /home

/dev/hda8 1004024 24536 928484 3% /private1

/dev/hda10 1004024 16428 936592 2% /private2

none 256900 0 256900 0% /dev/shm

/dev/hda7 2016016 34572 1879032 2% /tmp

/dev/hda3 10080520 2924472 6643980 31% /usr

/dev/hda6 3020140 112896 2753828 4% /var

/dev/hdb2 10807976 845260 9413696 9% /home1

[root@river private1]#

테스트로 /hda8을 언마운트해보자.

[root@river private1]# umount /private1

umount: /private1: device is busy

[root@river private1]#

[root@river private1]# pwd

/private1

[root@river private1]#

사용중이라는 메세지가 출력되었다. 사용 중인 장치파일은 언마운트 되지 않는다.

현재의 디렉토리가 /private1 이므로 hda8 장치는 사용 중이다.

[root@river private1]# cd ..

[root@river /]# umount /private1

[root@river /]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/hda2 2016044 117772 1795860 7% /

/dev/hda1 295564 13284 267020 5% /boot

/dev/hda5 3020140 1987440 879284 70% /home

/dev/hda10 1004024 16428 936592 2% /private2

none 256900 0 256900 0% /dev/shm

/dev/hda7 2016016 34572 1879032 2% /tmp

/dev/hda3 10080520 2924472 6643980 31% /usr

/dev/hda6 3020140 112904 2753820 4% /var

/dev/hdb2 10807976 845260 9413696 9% /home1

[root@river /]#

/private1 디렉토리가 보이지 않는다. 마운트 해제 되었다.

이제 다시 마운트 해보자.

[root@river /]# mount -t ext3 /dev/hda8 /private1

[root@river /]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/hda2 2016044 117772 1795860 7% /

/dev/hda1 295564 13284 267020 5% /boot

/dev/hda5 3020140 1987440 879284 70% /home

/dev/hda8 1004024 24536 928484 3% /private1

/dev/hda10 1004024 16428 936592 2% /private2

none 256900 0 256900 0% /dev/shm

/dev/hda7 2016016 34572 1879032 2% /tmp

/dev/hda3 10080520 2924472 6643980 31% /usr

/dev/hda6 3020140 112920 2753804 4% /var

/dev/hdb2 10807976 845260 9413696 9% /home1

[root@river /]#

다시 mount 된 것을 확인 할 수 있다. 이 상태에서 /private1 디렉토리에 파일을 만들면
/dev/hda8 영역에 만들어진다.
그리고 마운트가 해제 된 상태에서 파일을 만들면 그 파일은 /dev/hda2 만들어진다.
다른 장치파일들도 다 마찬가지이다.
장치명과 파일시스템이 다르더라도 마운트 형식과 의미는 같다.
마운트 설정 파일이 etc 디렉토리 밑에 있다. 파일명은 fstab 이며 아래와 같은 포맷으로 되어 있다.

[root@river /]# cat /etc/fstab

LABEL=/ / ext3 defaults 1 1

LABEL=/boot1 /boot ext3 defaults 1 2

none /dev/pts devpts gid=5,mode=620 0 0

LABEL=/tmp /home ext3 defaults 1 2

LABEL=/var1 /private1 ext3 defaults 1 2

LABEL=/private2 /private2 ext3 defaults 1 2

none /proc proc defaults 0 0

none /dev/shm tmpfs defaults 0 0

LABEL=/tmp1 /tmp ext3 defaults 1 2

LABEL=/usr /usr ext3 defaults 1 2

LABEL=/var /var ext3 defaults 1 2

/dev/hdb2 /home1 ext3 defaults 1 2

/dev/hda9 swap swap defaults 0 0

/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0

[root@river /]#

* 자세한 내용은 메뉴얼 페이지를 참조

가장 왼쪽은 디바이스명이나 LABEL 명이 온다. 두 번째는 마운트 포인터, 그리고 세 번째는 파일시스템타입,
네번째는 옵션으로 defaults 는 읽기, 쓰기에 해당된다. 그리고 마지막에 숫자는 부팅 시 파일시스템 체크 여부에 관한
것으로 숫자 0이 적혀있는 장치명에 대해서는 부팅 시 파일시스템 검사를 하지 않겠다는 의미이다.

부팅 시 /etc/fstab 파일이 읽혀지며 fstab에 설정되어 있는 마운트 장치명은 자동으로 마운트 되게 할 수 있다.
그리고 fstab는 mount 명령이 참조하는 파일이기도 하다. fstab 설정이 잘못되면 부팅이 정상적으로 되지 못한다.

fstab 파일설정이 위와 같다면

mount -t ios9660 /dev/cdrom /mnt/cdrom 대신에

mount /dev/cdrom 또는 mount /mnt/cdrom 으로 해도 된다. mount 명령은 mount 명령의 인수를
fstab 파일의 각 행에서 찾은 후 일치하는 부분이 있다면 mount 명령의 생략된 부분을 그것으로 대체한다.

fedora 9 에서는 내용이 조금 다릅니다. 아래와 같습니다.

[root@bega /]# cat /etc/fstab
UUID=8bd23abd-ca18-4609-a374-c407bf0b84b2 /                       ext3    defaults        1 1
UUID=1e12d149-8e26-401c-aa12-64fc2b5c0fdc /data                   ext3    defaults        1 2
UUID=69a544e6-4c4a-4a6f-a16a-0b3e6cb99d10 /home                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
UUID=30aa3f23-7e43-4599-9e1a-a2700c26b77e swap                    swap    defaults        0 0
/dev/sdb1       /d2p1   ext2    defaults        1 1
LABEL=/d2p2     /d2p2   ext3    defaults        1 1
UUID=9fd45246-21fd-4b55-8e09-585d7741b363       /d2p6   ext3    defaults 1 1
[root@bega /]#

UUID 라는것으로 LABEL 명이나 장치명을 대신할 수 있습니다.
UUID (Universal Unique IDentifier) 는 네트워크 상에 있는 개체 식별자라는 의미로
디스크 장치도 서버상에서 하나의 개체 식별자로서 구분하겠다는 의미입니다.

*. 장치명에 label 을 보거나 설정하는 명령은 아래와 같습니다.
[root@bega /]# e2label
Usage: e2label device [newlabel] <= label 을 설정하거나 수정할때.
[root@bega /]# e2label /dev/sda1 <= 장치의 label을 확인할때.
/
[root@bega /]# e2label /dev/sda3
/home
[root@bega /]#

UUID 값은 파일시스템 생성시 자동으로 할당되며 수정할 수도 있습니다.
UUID 값 수정 및 확인은 tune2fs 명령어로 할 수 있습니다.

[root@bega /]# tune2fs -l /dev/sda3 | grep UUID
Filesystem UUID:          69a544e6-4c4a-4a6f-a16a-0b3e6cb99d10

*. UUID 값을 변경하려면 아래와 같이 하면 됩니다.
[root@bega /]# tune2fs -l /dev/sdb5 | grep UUID
Filesystem UUID:          5c20e325-6c0f-48e5-b22c-621a450182fb
[root@bega /]# tune2fs -U random /dev/sdb5
tune2fs 1.40.8 (13-Mar-2008)
[root@bega /]# tune2fs -l /dev/sdb5 | grep UUID
Filesystem UUID:          f75ca609-97c1-4802-b8fe-164d376aed8d <= 변경되었습니다.
[root@bega /]#
*. UUID 값을 제거하는것은 위에 random 대신에 clear 를 적어주면 됩니다.
그리고 random 대신에 time 을 적어주더라도 마찬가지로 무작위로 UUID 값을
할당하게 됩니다. 그러나 file system 생성시 UUID 값이 할당되므로 굳이 직접
생성하는 경우는 잘 없으리라고 생각됩니다.

*. UUID 값을 다른 값으로 변경하는 경우 그 장치명이 사용하는 UUID 값이
fstab 에 등록되어 있는 장치라면 fstab 파일을 열어서 UUID 값을 일치하게 직접 수정해 
주어야 합니다.

그렇지 않으면 부팅시 그 장치가 마운트가 되지 않고 정상적인 부팅이 안될 수 있습니다.

** 마운트할때 디폴트로 적용되는 옵션과 fstab 에 설정되어 있는 defaults 항목은
메뉴얼 페이지를 보면 아래의 옵션이 적용된다고 되어있습니다.

defaults
 Use default options: rw, suid, dev, exec, auto, nouser, and async.

옵션설명 -
rw : 읽기,쓰기
ro : 읽기전용
suid : setuid 퍼미션 허용
nosuid:setuid 퍼미션 허용하지 않음
exec : 실행파일 실행권한 허용
noexec: 실행파일 실행권한 허용하지 않음
user:일반유저에게 마운트권한 허용
nouser : 일반사용자에게는 마운트 권한 허용하지 않음
auto : mount -a 명령어로 마운트할 경우 자동마운트 허용

*. 나머지 옵션에 대해서는 fstab file및 mount 명령의 메뉴얼 페이지를 
참고 바랍니다.

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

파일시스템 점검 및 복구  (0) 2011.11.28
파일시스템 생성작업  (0) 2011.11.28
작업예약 schedule - cron / at  (0) 2011.11.28
process 관리  (0) 2011.11.28
파일 권한(Permission)  (0) 2011.11.28
Posted by logwatch

cron - 주기적으로 실행될 작업 예약
at - 한번만 실행될 작업 예약

cron 서비스 데몬은 crond.
at 서비스 데몬은 atd.

crontab 형식 및 옵션

#crontab --help
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)

crontab 설정은 아래와 같다.

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

#--- 여기까지는 cron 작업을 위한 환경변수

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

#-- 여기는 주기적인 실행을 위한 설정 및 실행할 디렉토리.

형식:

분 시 일 월 요일 권한 실행명령 실행파일및 디렉토리

분: 0 ~ 59
시: 0 ~ 23
일: 1 ~ 31
월: 1 ~ 12
요일 : 0 ~ 6

예를 들면 아래내용은

22 4 * * 0 root run-parts /etc/cron.weekly

일요일 오전 4시 22분이 되면 root 권한으로 /etc/cron.weekly 에 있는 파일을 실행한다는 의미.

cron 사용 권한 설정

/etc/cron.allow 파일이 있는경우 cron.allow 에 기록이 된 사용자만 cron 을 사용할 수 있다.
/etc/cron.allow 이 없고 /etc/cron.deny 파일만 있는경우 /etc/cron.deny 에 기록이 안된 사용자만 cron을 사용할 수 있다.
두 파일이 모두 없으면 root 를 제외하고 아무도 cron을 사용할 수 없다.

EXAMPLE CRON FILE
# use /bin/sh to run commands, no matter what /etc/passwd says
SHELL=/bin/sh
# mail any output to 'paul', no matter whose crontab this is
MAILTO=paul
#
# run five minutes after midnight, every day
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month -- output mailed to paul
15 14 1 * * $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
5 4 * * sun echo "run at 5 after 4 every sunday"

at

- 주기적으로 반복 실행할 수 없고 예약된 시간에 한번만 실행한다.

주요옵션

at -l ; 예약된 작업 보기
atq ; 예약된 작업보기
atrm ; 예약된 작업삭제하기

작업예약하기 형식

at 예약날짜 및 시간

ex) at 03pm
at 07am
at -t 0809201830 => 2008년 9월 20일 18시 38분 , -t 날짜 및 시간을 표기하기 위한 옵션
at now + 1 hour
at now + 10 min
at now + 2 days
at now + 1 hour -f /usr/sbin/poweroff => 1 시간뒤에 시스템을 끈다.(-f 는 실행파일명을 적기 위한 옵션)

ex 2)

[root@/]# at -t 09201830
at> httpd start
at> <EOT>
job 19 at 2008-09-20 18:30

at 사용권한 (man at 중에서...)

If the file /etc/at.allow exists, only usernames mentioned in it are allowed to use at.
If /etc/at.allow does not exist, /etc/at.deny is checked, every username not mentioned in it is then allowed to use at.
If neither exists, only the superuser is allowed use of at.
An empty /etc/at.deny means that every user is allowed use these commands, this is the default configuration.


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

파일시스템 생성작업  (0) 2011.11.28
리눅스 파일시스템 및 마운트  (0) 2011.11.28
process 관리  (0) 2011.11.28
파일 권한(Permission)  (0) 2011.11.28
계정관리  (0) 2011.11.28
Posted by logwatch
이전버튼 1 2 3 4 이전버튼

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

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.12
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 31

최근에 올라온 글

최근에 달린 댓글

글 보관함