안녕하세요
뚱보프로그래머 입니다.
리눅스 시험이 한달 조금 넘게 남았군요
화이팅입니다.
메모리와 백업
메모리 관리
초창기 컴퓨터부터 메모리 관리 시스템은 운영체제에서 가장 중요한 부분중의 하나이다.
1. 가상 메모리
메모리를 필요로 하는 프로세스들 사이에 메모리를 공유토록 하여 시스템이 실제 가진 것보다 더 많은 메모리를 가진 것처럼 보이게 하는 기법이다. 하드 디스크의 일부를 마치 확장된 RAM처럼 사용한다.
물리적 메모리의 한계를 극복하기 위한 기법중의 하나이다. 가상적인 메모리로 쓰이는 하드디스크의 영역을 스왑이라 한다.
2. 스와핑
비어있는 물리적 메모리가 없을 때 운영체제가 물리적 메모리에서 다른 페이지를 제거하여 공간을 마련한다. 물리적 메모리에서 제거될 페이지가 변경되었을 때 재사용을 위해 보존된다. 리눅스에서는 시스템에서 제거될 페이지를 다루기 위해 가장 최근에 사용되지 않은(Least Recently Used, LRU) Page Aging 기법을 사용한다.
캐시(Cache)
데이터를 임시로 저장해두는 장소이며 최근에 요구한 정보를 재 요청할 때 캐시로부터 가져와 속도 개선과 부담 감소의 장점이 있다.
메모리 관련 캐시
1) 버퍼 캐시
버퍼 캐시는 블록 디바이스 드라이버가 사용하는 데이터 버퍼들을 갖고 있다. 이들 버퍼는 고정된 크기로(예를 들어 512 bytes) 블록 장치에서 읽거나 블록 장치에 쓰는 자료의 블록을 갖고 있다. 블록 장치는 고정된 크기의 데이터 블록 단위로 읽기/쓰기만을 할 수 있는 장치이다.
모든 하드 디스크는 블록 장치이다. 버퍼 캐시는 장치 식별자와 원하는 블록 번호에 의해 색인되어 있고, 이 색인을 통하여 데이터 블록을 빨리 찾을 수 있다. 블록 장치는 버퍼 캐시를 통해서만 접근된다. 데이터가 버퍼 캐시에서 발견되면 하드디스크 같은 물리적 블록 장치에서 읽을 필요가 없으며 따라서 휠씬 빠르게 접근된다.
2) 페이지 캐시
페이지 캐시는 디스크상의 이미지와 데이터에 접근하는 속도를 높이기 위해 사용된다. 이것은 파일의 논리적인 내용을 페이지 단위로 캐시하기 위해 사용되며, 파일과 파일내의 offset을 통해 접근된다. 디스크에서 메모리로 페이지들을 읽어들이면 페이지는 페이지 캐시에 캐시된다.
3) 스왑캐시
dirty page들만이 swap 파일에 저장된다. 이들 페이지가 swap 파일에 기록된 다음 더 이상 변경되지 않았다면 그 페이지가 다음에 swap 아웃될 때는 이미 그 페이지가 (동일한 내용으로) 스왑 파일에 있으므로 스왑 파일에 기록할 필요가 없다. 대신 그 페이지는 그냥 폐기하면 된다. 스와핑이 심하게 일어나는 시스템에서는 이렇게 함으로써 불필요하고 값비싼 디스크 연산을 많이 줄일 수 있다.
4) 하드웨어 캐시
하드웨어 캐시는 프로세서 내부에 있는 페이지 테이블 엔트리(PTE)의 캐시이다. 이 경우 프로세서는 항상 페이지 테이블을 직접 읽는 것이 아니라, PTE를 필요로 할 때 마다 페이지에 대한 변환 결과를 캐시한다. 이들은 변환 참조 버퍼(Translation Look-aside Buffers, TLB)라고 불리며 시스템의 여러 프로세스의 페이지 테이블 엔트리의 캐시된 복사본을 갖고 있다.
스왑 공간의 생성
시스템을 운영하다 보면 설치시 설정했던 swap 공간이 부족한 경우가 발생할 수 있다. 이를 해결하기 위해 램을 추가시킬 수 있지만 하드디스크의 여유공간을 이용해서 스왑공간을 만들어 활용할 수 있다.
kernel은 최대 8개의 swap partitions을 지원하고, 단일 파티션에서 2 기가를 넘지 못한다.
1. 스왑 파일 생성 및 사용
[root @edu00 linux]#dd if=/dev/zero of=/swap bs=1024 count=10240
: if는 input file의 의미, of는 output file의 의미
[root @edu00 linux]#file /swap
[root @edu00 linux]#mkswap /swapfile 10240
: 스왑공간을 설정, 커널이 가상 메모리로 사용할 수 있도록 준비만 마친 상태이다.
[root @edu00 linux]#file /swap
[root @edu00 linux]#free
: 스왑의 상황을 모니터링한다.
: top 명령이나 /proc/meminfo 파일에서도 같은 정보를 볼 수 있다.
[root @edu00 linux]#chmod 600 /swap
[root @edu00 linux]#swapon /swap
: 커널에게 해당 공간을 스왑으로 사용됨을 지정
[root @edu00 linux]#free
[root @edu00 linux]#swapoff /swap
: 스왑 공간의 사용을 중지
2. swap 파티션의 추가 및 사용
disk에 swap 파티션을 생성한 후 파티션 ID를(-t 옵션) 83(Linux native)에서 82(Linux swap)로 바꾼 후 저장(w )하고 종료한다.
[root @edu00 /root]#mkswap –c /dev/hda5
; mkswap 명령어를 이용하여 swap 파일 시스템을 생성한다.
[root @edu00 /root]#swapon /dev/hda5
; swapon을 이용하여 활성화시킨다. (- swapoff)
압축
1 압축
1) 압축파일 만들기
통신상에서 빠른 전송속도를 위해서 압축된 파일을 전송한다. 리눅스에서도 역시 네트워크에서 압축 파일들을 사용한다.
주로 gnu zip format을 많이 사용한다.
[root @edu00 linux]#cat > file1
linux hi
I love linux
^D
[root @edu00 linux]#ls -l
[root @edu00 linux]#gzip file1
[root @edu00 linux]#ls -l
-rw-r--r-- 1 root root 41 May 17 02:03 file1.gz
[root @edu00 linux]#gzip -l file1.gz
[root @edu00 linux]#gunzip file1.gz
[root @edu00 linux]#gzip file1
[root @edu00 linux]#mv file1.gz file_new.gz
[root @edu00 linux]#gunzip file_new.gz
[root @edu00 linux]#ls
[root @edu00 linux]#gzip file_new
[root @edu00 linux]#mv file_new.gz file_mv.gz
[root @edu00 linux]#gunzip -N file_mv.gz
: 원래의 파일명으로 압축을 푼다.
[root @edu00 linux]#ls
[root @edu00 linux]#gzip file_new
[root @edu00 linux]#gunzip -c file_new.gz
: 압축을 풀지 않고 파일의 내용을 본다. zcat과 동일하다.
2) archive 파일 만들기
archive 파일은 여러 파일을 하나의 파일로 묶은 파일이다. tar가 있다.
[root @edu00 linux]#tar czf public.tar.gz public_html
[root @edu00 linux]#tar tzf public.tar.gz public_html
[root @edu00 linux]#tar zvf public.tar.gz public_html
[root @edu00 linux]#tarx public.tar.gz
: tar 압축파일을 tarx로 한번에 해제
3) 형태별 압축 해제
tar xf *.tar
tar xzf *.tar.gz
tar xIf *.tar.bz2
4) tarx로 한번에 압축 해제(bash용)
[root @edu00 linux]#vi tarx.sh
-----------------------------------
=============== Start ==============
__tar()
{
if [ `basename $2 .tar` != $2 ]; then
COMPRESS=
elif [ `basename $2 .tgz` != $2 -o `basename $2 .tar.gz` != $2 ]; then
COMPRESS=z
elif [ `basename $2 .tbz2` != $2 -o `basename $2 .tar.bz2` != $2 ]; then
COMPRESS=I
else
echo "Wrong filename"
return
fi
OPT="$1$COMPRESS"vvf
TARFILE=$2
shift 2
tar $OPT "$TARFILE" "$@"
}
alias tarc='__tar c'
alias tart='__tar t'
alias tarx='__tar x'
---------------------------------------
백업
데이터나 정보가 지닌 가치를 보존하는 것이 백업이다.
백업은 시스템 관리자의 중요한 책임중 하나로 시스템에 저장된 데이터를 안전하게 보존하는 것이다.
데이터는 여러 이유로 인해 삭제 또는 변경될 수 있으며 이런 손실의 기회를 최소화하려면 항상 주의를 기울이고 백업 매체 및 대상, 방법에 주의를 기울여야 한다.
데이터 손실을 가져오는 주요 원인은 다음과 같다.
1]하드웨어적인 사유
2]소프트웨어적인 사유
3] 사용자의 부주의
4] 해커 침입
5] 도난 및 자연 재해
1. 주요 백업 대상
1] 전체 파일 시스템
2] 마지막 백업후의 변경된 파일 시스템
3] 애플리케이션
4] 각종 환경 설정 파일
5] 사용자 파일
2. tar
Unix와 Linux 시스템에서 가장 널리 쓰이는 backup tool이다. cpio보다 사용하기 쉬우며 소수의 파일을 손쉽게 백업할 수 있다.
tar를 이용한 백업 및 복구시 항상 최상위 /에서 실행하도록 한다.
1] tar를 이용한 백업
[root @edu00 linux]#fdformat /dev/fd0H1440
[root @edu00 linux]#tar -cMf /dev/fd0H1440 /etc
tar: Removing leading '/' from members names
Prepare volume #2 for '/dev/fd0H1440' and hit return:
백업용 하드 디스크가 있을 때 5분에 한번 /home, /etc, /usr/src를 백업
[root @edu00 linux]#vi /etc/crontab
----------------------
01-59/5 * * * * root /bin/testbackup.sh
----------------------
[root @edu00 linux]#mount -t ext2 /dev/hda2 /mnt/hard
[root @edu00 linux]#vi /bin/testbackup.sh
----------------------
tar cf /mnt/testbackup /home /etc /usr/src
-----------------------
home 디렉토리에 /etc를 백업할 때
[root @edu00 linux]#tar cvzf backup.tar.gz /etc
2] tar를 이용한 복구
[root @edu00 linux]#tar -zxvf backup.tar.gz /etc
3] 백업 파일의 정보
[root @edu00 linux]#tar -ztvf backup.tar.gz
3. cpio
Unix 세계에서 fbackup이 나오기 전까지 널리 사용되던 backup tool이다. 많은 양의 데이터에 대해서는 tar보다 빠른 속도를 가지고 있다. 장치 파일이나 네트워크 파일 등 특수 파일도 백업이 가능하다.
1] 옵션
[root @edu00 linux]#man cpio
-d : 디렉토리 생성
-I : 표준 입력으로부터 cpio 형식의 파일을 읽어서, 명시된 pattern에 일치하는 파일들 모두를 재생(input)
-l file : 입력으로 file을 받는다.
-o : 표준 입력으로부터 복사(백업)할 파일명의 목록을 받아 복사한다.
-t : 복사 대신 목차
-v : 파일을 복사하는 동안 각 파일의 이름을 보여준다.
-u : 무조건 복사
2] 예제
[root @edu00 linux]#cpio -ov > backupFile
: 백업할 파일명의 목록을 표준 입력으로 받아 백업
[root @edu00 linux]#ls *.c | cpio -ov > backup1
[root @edu00 linux]#cpio -i < backup1
[root @edu00 linux]#find . -name \*.c -print | cpio -ov > backup2
4. dump
특별히 백업만을 위해 만들어진 유틸리티로 파일 시스템 서비스를 사용하지 않고 파일 시스템 자체를 직접 읽어낸다는 점에서 특별하다.
다단계 백업 레벨을 지원한다.
[root @edu00 linux]#dump –0u –f /home/edu00/a /usr
5. shell script를 이용한 백업
[root @edu00 linux]#vi /etc/crontab
--------------------------
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# 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
# Backup
01 4 1 * * root backup.sh month /test /dev/fd0
01 3 * * 6 root backup.sh week /test /dev/fd0
01 3 * * 1-5 root backup.sh day /test /dev/fd0
-----------------------------------
[root @edu00 linux]#vi /bin/backup.sh
------------------------------------
#!/bin/bash
# 변수 설정 및 함수 로딩
TERM=$1
DIR=$2
DEV=$3
MNT=/mnt/backup
ADMIN=root
DATE1=`date +%Y-%m-%d-%H-%M`
DATE2=`date +%Y년%m월%d일`
# source function library
[ -f /bin/function.sh ] || exit 0
. function.sh
# 장치 마운팅 및 용량 확인
[ "$TERM" = "month" ] || mnt
[ "$TERM" = "month" ] || storage first
# 작업 파일 검색 및 백업
backup
# 백업 결과 및 용량 확인
check
[ "$TERM" = "month" ] || storage second
# 보고서 작성 및 메일 전송
report ; mailto
# 언마운팅 및 임시 파일 삭제
umnt ; remove
--------------------------------------
[root @edu00 linux]#vi /bin/function.sh
--------------------------------------
#!/bin/bash
# 마운팅 함수 정의
mnt() {
if [ ! -d $MNT ] ; then
mkdir -p $MNT
[ -f /tmp/$TERM.create ] || touch /tmp/$TERM.create
[ -d $MNT ] && echo "\t$MNT directory created" >> /tmp/$TERM.create
fi
mount -t ext2 $DEV $MNT
if [ ! -d $MNT/$TERM ] ; then
mkdir $MNT/$TERM
[ -f /tmp/$TERM.create ] || touch /tmp/$TERM.create
[ -d $MNT/$TERM ] && echo "\t$TERM directory created" >> /tmp/$TERM.create
fi
}
umnt() {
if [ -d $MNT/$TERM ] ; then
umount $MNT
fi
}
# 용량 확인 함수 정의
storage() {
if [ "$1" = "first" ]; then
STO1=`du -sh $MNT | cut -c1 -4`
STO2=`du -sh $MNT/$TERM | cut -c1 -4`
elif [ "$1" = "second" ]; then
STO3=`du -sh $MNT | cut -c1 -4`
STO4=`du -sh $MNT/$TERM | cut -c1 -4`
fi
}
# 백업 함수 정의
backup() {
case $TERM in
month)
tar -cMpf $DEV $DIR;;
week)
find $DIR -mmin -7 \! -type d -print > /tmp/$TERM.work
;;
day)
find $DIR -mmin -1 \! -type d -print > /tmp/$TERM.work
;;
esac
if [ -s /tmp/$TERM.work ]; then
tar -cP -T /tmp/$TERM.work -f $MNT/$TERM/$DATE1.tar
fi
}
# 백업 결과 확인 함수 정의
check() {
case $TERM in
month)
tar -df $DEV $DIR > /tmp/$TERM.problem
;;
*)
tar -tf $MNT/$TERM/$DATE1.tar > /tmp/$TERM.backup
diff /tmp/$TERM.work /tmp/$TERM.backup > /tmp/$TERM.problem
esac
}
# 프린팅 함수 정의
## 보고서 헤더 출력
print_header() {
cat /etc/backup/$TERM.header > /tmp/$TERM.result
}
## 사용량 출력
print_storage() {
echo -e "\t백업 전, $DEV의 총사용량 : $STO1" >> /tmp/$TERM.result
if [ -s /tmp/$TERM.work ]; then
echo -e "\t백업 후, $DEV의 총사용량 : $STO3" >> /tmp/$TERM.result
fi
echo -e "\t백업 전, $DEV의 $TERM 디렉토리 총사용량 : $STO2" >> /tmp/$TERM.result
if [ -s /tmp/$TERM.work ]; then
echo -e "\t백업 후, $DEV의 $TERM 디렉토리 총사용량 : $STO4" >> /tmp/$TERM.result
fi
}
## 메시지 출력
print_message() {
echo -e "\n" >> /tmp/$TERM.result
cat /etc/backup/$TERM.$1 >> /tmp/$TERM.result
}
## 수행 결과 출력
print_result() {
cat /tmp/$TERM.$1 >> /tmp/$TERM.result
}
## 보고서 작성 함수 정의
report() {
case $TERM in
month)
print_header
if [ ! -s /tmp/$TERM.problem ]; then
print_message ok
else
print_message sorry; print_result problem
fi;;
*)
print_header
[ -s /tmp/$TERM.create ] && print_message create
print_storage
if [ -s /tmp/$TERM.work ]; then
print_message work; print_result work
print_message backup; print_result backup
if [ ! -s /tmp/$TERM.problem ]; then
print_message ok
else
print_message sorry
print_result problem
fi
else
print_message nothing
fi;;
esac
}
# 관리자에게 메일 보내는 함수
mailto() {
case $TERM in
month)
mail -s "[ 월간 백업 결과 보고서 ] ($DATE2)" $ADMIN < /tmp/$TERM.result
;;
week)
mail -s "[ 주간 백업 결과 보고서 ] ($DATE2)" $ADMIN < /tmp/$TERM.result
;;
day)
mail -s "[ 일일 백업 결과 보고서 ] ($DATE2)" $ADMIN < /tmp/$TERM.result
;;
esac
}
# 임시 파일 삭제 함수
remove() {
rm -f /tmp/$TERM.*