[시스템] 시스템 관리자가 익혀야 할 필수 테크닉
=======================================================================
LINUX SYSTEM ADMIN TIPS
작성자 : 서진우(alang@sysmng.com)
=======================================================================
1. 부팅 디스켓 만들기
먼저 부팅디스켓으로 사용할 커널 이미지를 선택한다.
그리고 선택한 커널 이미지가 root 장치(root mount point)가 재대로 잡혀 있는지
확인한다.
# rdev /boot/vmlinuz
Root device /dev/hda1
만일 루트 장치가 현재 잡혀 있는거랑 틀리다면 아래와 같이 수정한다.
# rdev /boot/vmlinuz /dev/hda3
#
이제 깨끗한 플로피 디스켓 하나 준비하고 포맷한다.
# fdformat /dev/fd0
# dd if=/boot/vmlinuz of=/dev/fd0 bs=8192
2. 일반유저에게 장치 mount 허가하기
특정 장치를 일반유저에게 mount/umount 하게 해주기 위해서는 /etc/fstab 에서
허가할 장치의 옵션에 user 이란 옵션을 추가 해 주어야 한다.
혹은 mount/umount 명령어의 퍼미션을 setuid 로 해주어도 가능하다.
3. 파일 시스템 만들기
mkfs 명령어 사용
# mkfs -t ext2 /dev/hdb1
# mkfs -t ext2 /dev/fd0
플로피 파일 시스템 만들기
# fdformat /dev/fd0
# mkfs -t ext2 -c /dev/fd0 -v
-c : 블럭체크
-v : 진행과정 display
파일시스템 점검 수리
# fsck -t [type] [device]
fsck 파일 점검은 가능한 umount 한 후에 실행한다. 하지만 / 을 mount 하지 않은
면 당근 부팅이 제대로 될수 없기에 / 를 체크할때는 플로피로 부팅을 하던지 아님
single mode 로 부팅한후 체크 한다.
체킹후 mount -t -w -o remount /
해주면 된다.
4.긴급 스왑 메모리 추가 하기
# touch /swap
# dd if=/dev/zero of /swap bs=1024 count=8192
# sync
# mkswap -c /swap 8192
# swapon /swap
하면 8M 의 스왑메모리를 추가 할수 있다.
이밖에 여유공간에 파티션을 나누고 /etc/fstab 에 추가 해 주어도 가능하다.
5. 파일을 묶고 압축하기
리눅스 시스템 관리자가 반드시 숙지하고 있어야 할 기술중 하나가 파일을
묶고, 압축하는 기술이다. 보다 효율적인 안정된 시스템 관리를 위해서는
파일이나 디렉토리를 이동하거나 백업하기 위해 파일의 속성과 디렉토리
구조들을 유지한체 이동하게 하는데 필요한 tar 나 대용량의 파일을 압축
하는 gzip 등의 명령어를 자유자재로 다루어야 할것이다.
[ gzip 사용하기 ]
[root@zzang911 alang]# ls -l tttt
-rw-rw-r– 1 alang alang 1228 7월 25 13:58 tttt
[root@zzang911 alang]# gzip tttt
[root@zzang911 alang]# ls -l tttt*
-rw-rw-r– 1 alang alang 747 7월 25 13:58 tttt.gz
위에서 보는 바와 같이 gzip file_name 적으면 file_name.gz 란 압축파일이 만들어
진다. tttt 파일을 압축시켜서 tttt.gz 란 파일을 만들고 tttt 파일을 지워버리게
된다.
하나 유의해야 할점이 있다. gzip 은 zip 처럼 여러개의 파일을 하나로 묶어서 압축
하지 않고 파일별로 gz 란 확장자를 붙이며 압축해 버린다. 그렇기 때문에 파일을
묶는 tar 와 같이 사용해야 한다.
gzip 파일로 묶인것을 확인하기 위해서는 -l 옵션을 사용한다.
[root@zzang911 alang]# gzip -l tttt
compressed uncompressed ratio uncompressed_name
747 1228 41.0% tttt
그리고 압축을 풀기 위해서는 gunzip 이나 gzip -d 를 사용하여 압축을 해제할수가
있다. 그리고 압축을 해제하면 압축된 파일은 제거 되어 진다.
이밖에 gzip 은 표준출력을 바로 압축할수도 있다.
# ls -alR $HOME | gzip > home.gz
이와 같이 하면 $HOME 디렉토리 하위 파일을 home.gz 으로 압축하게 된다.
이밖에 다른 옵션으로 -1 ~ -9 까지의 옵션이 있는데 이는 압축률을 정하는 옵션
이다. gzip -1 file_name 하면 압축속도는 빠르나…압축률은 낮다. 그리고 -9
옵션을 사용하면 압축속도는 느리지만 압축률은 상당히 높게 되어진다.
[ tar 사용하기 ]
tar 는 파일의 허가권이나 소유권등의 정보를 유지하면서 많은 파일들을 하나의 파일로
묶어 주는 기능을 가진 아카이브 유틸리티이다. 예전엔 여러파일을 하나로 묶어 테잎에
백업을 받기 위한 도구로 사용되어졌지만 지금은 여기에 국한되는 것이 아니라 다양한
기능들을 제공한다. 다음 형식으로 사용되어진다.
tar [옵션] [묶은 파일명] [묶을 파일들]
옵션에는
c : 새로운 아카이브의 생성
x : 아카이브로 부터 파일 추출
t : 아카이브에 담긴 내용을 나열
r : 아카이브의 마지막 부분에 파일 추가
u : 아카이브에 있는 기존 파일보다 새로운 파일로 업데이트
d : 아카이브에 있는 파일과 비교
v : 아카이브 생성이나 추출시 과정을 보여준다.
k : 아카이브를 추출시 기존에 같은 파일이 있으면 그 파일을 보존한다.
디들중 c,x,v,t 를 제외한 나머지는 자주 사용되지 않는다.
파일을 묶고 푸는 대표적인 예를 하나씩 들어본다.
# tar cvf file.tar /home/file
/home/file 이란 디렉토리에 있는 모든 파일과 디렉토리를 그대로 file.tar
란 파일로 묶어버린다.
# tar x
# tar cvf bin.tar /bin
로 파일을 묶은후 bin.tar 로 풀때는 다음과 같은 경고 메세지가 출력하게 된다.
tar: Removing leading / from absolute path names in the archive.
이는 만약에 있을 위험을 방지하기 위해서 나타나는 현상이다.
다시말해 bin.tar 를 풀었을때 압축 디렉토리와 같이 /bin 에다가 압축이 풀리면
시스템에 이상이 생길지도 모른다. 그래서 tar 로 파일을 풀때는 현재 디렉토리를
기준으로 하여 파일이 풀리게 되어져 있다. 이점을 유의하길 바란다.
[ tar 와 gzip 같이 사용하기 ]
위에서 본바와 같이 특정 디렉토리나 파일들을 tar 로 묶은후 gzip 을 사용하여
압축하는 방식이다. 과정을 풀어서 본다면 다음과 같다.
# tar cvf file_name.tar /home
# gzip -9 file_name.tar
이와 같이 하면 된다. 하지만 이방법은 번거로울뿐아니라 gzip 으로 압축되기전까지
tar 파일을 보관할 충분한 디스크 공간이 확보되어 있어야 한다.
# tar cvf file_name.tar /home | gzip -9 > file_name.tar.gz
이와 같이 하면 된다.
GNU tar 버젼에서는 gzip 기능을 포함하여 사용할수 있도록 되어져 있다.
# tar czvf file_name.tar.gz /home
위와 같이 z 옵션을 사용하면 된다.
6. 라이브러리에 대하여
라이브러리란 시스템에서 프로그램을 직접 컴파일 할때 많은 프로그램에서 공통으
로 사용할수 있는 유용한 기능을 포함하고 있는 파일이다.
많은 프로그램들이 이런 라이브러리를 각 프로그램마다 포함하고 있지 않고 정보
만 가지고 있다 컴파일 당시 시스템 자체에 있는 라이브러리를 이용하여 컴파일이
되어지는 것이다.
어떤 경우에는 컴파일시 위와 같은 공유라이브러리를 이용하지 않고 자체적인 라이
브러리 루틴을 사용하기도 하는데 이런 프로그램을 정적으로 링크된(statically
linked) 프로그램이라고 하며 공유 라이브러리를 이용해 만들어진 것은 동적으로
링크된 프로그램이라고 한다.
동적으로 링크된 실행 파일은 공유라이브러리가 디스크에 존재하느냐에 의존한다.
이와 같은 방법으로 구현된 공유 라이브러리로 컴파일돈 프로그램은 일반적으로
현재 라이브러리의 버전에 의존하지 않는다. 즉 공유라이브러리를 업그레이드시
키면 프로그램 역시 업그레이드된 기능을 적용받게 되어져 있다.
단..라이브러리에 큰 변화가 있다면 오래된 프로그램은 새로운 라이브러리와 같
이 작동안할수도 있다. (glic-2.1.x 와 glibc-2.2.x 대에서의 문제와 같이..)
ldd 명령은 실행파일에 의존되는 라이브러리 목록을 보여주는 명령어 이다.
[root@zzang911 /root]# ldd /usr/bin/X11/xterm
libXft.so.1 => /usr/X11R6/lib/libXft.so.1 (0x4002d000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x40052000)
libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x40088000)
libXaw.so.7 => /usr/X11R6/lib/libXaw.so.7 (0x4008d000)
libXmu.so.6 => /usr/X11R6/lib/libXmu.so.6 (0x400e2000)
libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x400f8000)
libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x40145000)
libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x4014f000)
libXpm.so.4 => /usr/X11R6/lib/libXpm.so.4 (0x40166000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40175000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40183000)
libncurses.so.5 => /usr/lib/libncurses.so.5 (0x40263000)
libutempter.so.0 => /usr/lib/libutempter.so.0 (0x402a5000)
libc.so.6 => /lib/i686/libc.so.6 (0x402a7000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
/etc/ld.so.conf 파일은 공유라이브러리 파일을 찾는 ld.so 에 대한 디렉토리
목록을 포함하고 있다.
[root@zzang911 /root]# cat /etc/ld.so.conf
/usr/local/lib
/usr/lib
/usr/kerberos/lib
/usr/X11R6/lib
ld.so.conf 에서 빠진 내용은 각 계정의 환경변수 설정에서 LD_LIBRARY_PATH에
검색경로로 디렉토리를 추가해 주면 된다. 환경변수 설정은 .bash_profile 나
.bashrc 에 추가해주면 된다.
아무튼 ld.so.conf에 새로운 항목을 추가 하였다면 다음명령어를 사용하여 적용
을 시켜 주어야 한다.
# ldconfig
이 명령어는 ld.so 의 검색 경로에서 공유 라이브러리 캐시를 재생성하게 된다.
이캐시 내용을 참조하여 보다 빨리 라이브러리를 찾기위해서 이다.
[ 라이브러리 업그레이드 하기 ]
먼저 /lib 디렉토리 내용을 보도록 하자.
-rwxr-xr-x 1 root root 1236396 4월 7 06:58 libc-2.2.2.so*
lrwxrwxrwx 1 root root 13 5월 5 04:23 libc.so.6 -> libc-2.2.2.so*
라이브러리를 업그레이드 할때는 라이브러리에 부합되는 .a 와 .so.version 파일
을 반드시 대체해야 한다.
.a 파일은 새로운 대체파일로 복사해 주면 되지만 공유라이브러리를 대체할때는
보다 주의를 요한다. .so.version 의 경우는 위에서 보는 바와 같이 libc.so.6 파일이
실제 파일인 libc-2.2.2.so* 에 링크되어져 있다. 새로 업그레이드 하여 libc-2.2.3.so
파일을 적용하기 위해서는 그냥 링크를 깨난던지 아님 파일 이름을 바꾼다던지 하면
시스템의 모든 명령어가 먹히지 않는 경우가 발생하게 된다. 그렇기 때문에 새로 업그레
이드 된 파일을 /lib 디렉토리에 옮겨놓고 ln -sf 명으로 링크의 연결을 새로운 파일이
있는곳으로 한번에 가도록 변경한다.
# ln -sf libc-2.2.3.so libc.so.6
7. 백업 하기
데이타 백업하기에 대해서 간단히 적겠습니다.
보통 데이타 백업은 하드나 테잎장치,혹은 플로피 디스켓등에 하는데…
플로피는 빼도록 하죠…요즘에 플로피 쓰는 곳은 없으니깐..
[ 테잎장치에 빽업하기..]
보통 백업은 tar, gzip 을 이용하여 백업을 합니다. 상용 백업 프로그램이라고
하더라도..이 두 명령어를 잘 이용한거라고 볼수 있습니다.
테잎에 백업하는 대표적인 예는 ..
# tar cvf /dev/rft0 /home
와 같은 형식입니다.
/dev/rft0 는 테잎 디바이스 명입니다.
테잎 하나에 tar 파일 하나 저장하는 사람은 없을거라 봅니다. 여러개의 tar
파일을 하나의 테잎에 저장할 경우 첫번째 tar 파일이 테잎에 저장된후 다시
처음으로 감기는 것을 방지하기 위해 다음 파일의 시작점을 표시해 두게 됩니다.
테잎이 다시 감기는 것을 방지하려면, 플로피 테잎 드라이브인 경우 /dev/nrft0
, /dev/nrft1을, SCSI 테잎 드라이브라면 /dev/nrst0 와 /dev/nrst1 이라는
이름으로 된 테잎 장치를 사용해야 합니다.
이렇게 자동으로 감기지 않는 테잎 장치를 사용한다면 용량이 허락하는 만큼의
많은 파일을 저장할수 있다.
이런 테잎 장치에서 테잎을 다시 감을려면…
# mt /dev/nrtf0 rewind 혹은
# mt /dev/nrtf0 reten
테잎의 다음 파일로 건너뛰기는(테잎은 순차적 접근 방식이기 때문에…)
# mt /dev/nrft0 fsf 1
두개의 파일 건너뛰기..
# mt /dev/nrft0 fsf 2
이런식으로 제어 하면 된다.
대부분의 리눅스 서버 관리자들은 테잎은 안쓰는 걸루 안다..^^;; 왜~~
느리니깐…귀찮아서…새로운 장비 살 돈이 없어서…여러가지 이유가
있지만…속도문제가 큰거 같더군요..가끔 한번식하는 전체 백업같은
경우엔 상관없지만..웹호스팅 업체나 매일 백업을 해야 하는 자료 업로드
량이 많은 사이트 경우엔..비합리적일수도 있는거 같더군요.
그냥 싼 IDE 하드 하나 달아 놓고…백업장치로 사용하는게 속 편한거 같네요.
그럼..실질적인 백업 기법에 대해서 설명하도록 하겠습니다.
일단 파일을 묶는 tar 에 대해서 알아보자..
tar 는 단순히 파일이나 디렉토리들을 속성을 유지한체 하나의 파일로 만드는
기능을 합니다. 옵션에 따라 ..gzip처럼 압축도 할수 있습니다.
# tar cvf test.tar /home/test
/home/test 디렉토리를 test.tar 이란 파일로 묶는다.
# tar czvf test.tar.gz /home/test
/home/test 디렉토리를 test.tar 로 묶은 다음 gzip 으로 압축한다.
# tar czvfp test.tar.gz /home/test
/home/test 디렉토리를 모든 속성과 권한을 현재 그대로 유지한체 압축한다.
이정도면 압축하는데 무리가 없을것이다.
누적 백업시에는 find 명령어를 잘 활용해야 한다.
먼저 날짜별로 변경된 파일을 찾아서 리스트를 만들고 이 리스트를 참조하여
백업을 할수 있다.
# find /home/test -mtime -1 \\! -type d -print > filelist
# tar -cv -T “filelist” -f test.tar
위의 예문은 find 로 /home/test 밑의 파일들중 하루(-mtime -1) 동안 변경된
모든 파일을 검색하고 그중 디렉토리는 제외 (\\! -type d)하여 출력하고 출력
내용을 filelist 에 저장하라는 뜻이다.
그런후 작성된 filelist 속의 기재된 파일들을test.tar 로 묶으라는 의미입니다.
이와 같은 명령어를 잘 응용하면 여러가지 백업스크립트를 만들수 있을것입니다.