1. 실무환경을고려한엔터프라이즈 Linux 운영체제설치 1.5 엔터프라이즈 Linux Kernel 구성하기 1.5.1 Kernel 과시스템최적화 시스템 Kernel이란실제운영체제의핵심코어부분으로실제 OS 기능의대부분의역할을담당하는부분이다. 운영체제란컴퓨터하드웨어를사용자가어플리케이션을통해바로인식하여작업에사용할수없기때문에이런하드웨어자원을어플리케이션에서인식하여프로그램상에서사용할수있는중계역할을하는프로그램으로볼수있다. 이런운영체제의구성으로는크게하드웨어의기능을인식하여그기능을관리, 제어하는 Kernel 부분과기본적인어플리케이션부분으로구성이되어진다. 즉 Kernel 부분은실제운영체제의가장큰역할인하드웨어의어떻게인식하고, 어떤방식으로관리, 제어를하는가를결정하는중요한부분이다. 이런 Kernel 구성방식에따라동일한하드웨어를가진시스템이라도그성능의차이가생기게된다. 이장에서는 Kernel의최적화요소와해당요소별성능에미치는영향에대해살펴보고실제엔터프라이즈시스템환경의맞는 Kernel을구성해보도록할것이다. Kernel의최적화기술은시스템엔지니어의고급능력중에하나이며, 이는실제엔지니어의기술력차이를통해, 동일시스템의성능의차이를가져올수있는요소중의하나이다. Linux의여러배포판이존재하는데이중엔터프라이즈급 Linux 배포판이라는명칭이붙는배포판의차이가바로이 Kernel 구성에서있는것이다. 즉 SMP 시스템을인식하고대용량메모리를인식하고, 메모리 I/O, 디스크 I/O, 시스템 I/O 성능을개선하며, 보다안정적인고대용량파일을제어할수있는파일시스템을지원토록하며, 프로세스처리제한이나파일 OPEN 제한수치를확장시키는등대용량서비스를수행할수있게 Kernel 환경을구성함으로엔터프라이즈 Linux 환경이라할수있다. 이장에서는실제 Kernel 컴파일에대한기본적인기술에대해서는언급하지않는다. Kernel 컴파일에대한기술부분은인터넷상의기술문서나다른서적을참고하길바란다. 1/29 페이지
1.5.2 엔터프라이즈 Kernel 구성요소 대용량서비스를할수있는시스템구성을위한 Kernel 튜닝에대해알아보도록하겠다. http://www.kernel.org 에서최신 Kernel 소스를다운받으면기본적으로범용시스템에맞는 Kernel 구성으로되어져있다. 이는보편적으로일반시스템에적합한 Kernel 구성이라대용량시스템에바로사용하면실제시스템의하드웨어성능을최대한활용할수없게된다. 그러므로시스템하드웨어에서지원하는성능을최대한효율적으로활용가능하도록 Kernel을튜닝을해주어야한다. 여기서다루는 Kernel 튜닝방법은대용량 SMP 시스템을대상으로하는방법이기때문에보편적인일반시스템에서는 Kernel의서비스한계치가하드웨어실제지원한계치를넘게되어문제가발생할수있으니주의하길바란다. - Kernel 한계수치수정을통한최적화작업 이는 Kernel 소스에기본적으로정의된 process, socket, file open 제한수치를해당시스템에맞게확장하여시스템의수용성능을향상시키는방법이다. # vi /usr/src/linux/include/linux/fs.h -----------------------------------------------------------------------------------. -#define INR_OPEN 1024 /* Initial setting for nfile rlimits */ +#define INR_OPEN 4096 /* Initial setting for nfile rlimits */.. -#define NR_FILE 8192 /* this can well be larger on a larger system */ +#define NR_FILE 65536 /* this can well be larger on a larger system */ ------------------------------------------------------------------------------------ # vi /usr/src/linux/include/linux/limits.h ------------------------------------------------------------------------------------ 2/29 페이지
. -#define NR_OPEN 1024 +#define NR_OPEN 4096.. -#define OPEN_MAX 256 +#define OPEN_MAX 4096. ------------------------------------------------------------------------------------- # vi /usr/src/linux/include/linux/posix_types.h -------------------------------------------------------------------------------------. -#define FD_SETSIZE 1024 +#define FD_SETSIZE 4096. ------------------------------------------------------------------------------------- - System I/O 최적화작업 해당작업은 Linux 시스템상의 I/O 성능개선을위한바운스버퍼관련패치및 SCSI 병렬큐잉패치등의작업이있다 - File System 최적화작업 SGI UNIX System 의기본파일시스템으로알려진 XFS 파일시스템을리눅스에서사용할수있도록하는작업이다. 리눅스의기본파일시스템은 Ext3를사용하는데이는일반적인리눅스시스템에서적절한성능과안정성을보장하기에주로사용을하나대용량시스템이고대형파일을작업에주로사용하는경우대용량파일제어에탁월한성능을가진 XFS 파일시스템을채택해보는것도시스템성능개선에효과를볼수있을것이다. XFS 파일시스템을사용해보도록하자. 3/29 페이지
XFS 파일시스템은 CVS를통해서다운받을수있다. 아래의절차를통해 XFS source를다운받도록한다. # cd /usr/src # export CVSROOT=':pserver:cvs@oss.sgi.com:/cvs' # cvs login Logging in to :pserver:cvs@oss.sgi.com:2401/cvs CVS password: < 'cvs'> # cvs -z3 co linux-2.4-xfs 실제 XFS Kernel의경우리눅스기본 Kernel에도포함이되어져있으므로굳이 XFS 전용Kernel을이용할필요는없다. 하지만실제 XFS 파일시스템을관리하는프로그램이 XFS 전용 Kernel 안에포함되어져있기때문에위의절차를통해 XFS 전용 Kernel을다운받도록한다. Kernel 소스경로로디렉토리를변경하고 Kernel 컴파일을하도록한다. 먼저 Kernel 설정을해야한다. XFS 관련 Kernel 설정내용은모두 File System 항목안에있다. XFS 관련항목을체크한후 Kernel 컴파일을하면된다. ( 이장에서는 Kernel 컴파일에대한부분은생략합니다. Kernel 컴파일관련서적이나문서를참고하시길바랍니다.) XFS 관련프로그램은아래와같이다운받을수있다. # cvs -z3 co xfs-cmds # cd xfs-cmds # make && make install XFS 가적용된 Kernel로 Rebooting을한후 mkfs.xfs 명령으로 XFS 파일시스템을생성할수있다. 4/29 페이지
- Sysctl 을이용한 Kernel 파라메터최적화작업 일반시스템의안정성을위해기본적으로네트워크의성능임계치를하향조정해놓는다. 하지만실제고성능워크스테이션의경우시스템의재성능을 Kernel에서제한하는경우에해당할것이다. 이는시스템사양에맞게적절한서비스한계치를조절함으로최적성능을발휘할수있게설정을조절하여야한다. Kernel 파라메터를통한설정변경은 Kernel의소프트레벨에서수정이가능하며 sysctl 프로그램을이용하여설정변경이가능하다. Kernel의소프트레벨의수정이라함은실제 Kernel 소스상태에서의수치수정을통해적용하는것이아니라시스템이부팅되어져있는상태에서 Kernel의파라메터값을변경하여해당수치를적용하는방법이다. 먼저 sysctl 의사용법에대해간단히알아보도록하자. sysctl 은 Linux의가상파일시스템인 /proc 파일시스템내의파일들을직접수정하여 Kernel 옵션의변경을효율적으로관리하는명령어이다. 사용법은단순한다. # sysctl -a : Kernel 파라메터값확인하기 위의명령으로 Kernel 파라메터를확인을하면상당수의정보가출력된다. 원하는정보를확인하기위해서는 grep 명령을이용하여확인하면된다. # sysctl -a grep fs.xfs ------------------------------------------------------------------------------------- fs.xfs.stats_clear = 0 fs.xfs.age_buffer_centisecs = 1500 fs.xfs.xfsbufd_centisecs = 100 fs.xfs.inherit_noatime = 1 fs.xfs.inherit_nodump = 1 fs.xfs.inherit_sync = 1 fs.xfs.xfssyncd_centisecs = 3000 5/29 페이지
fs.xfs.error_level = 3 fs.xfs.panic_mask = 0 fs.xfs.irix_symlink_mode = 0 fs.xfs.irix_sgid_inherit = 0 fs.xfs.restrict_chown = 1 fs.xfs.refcache_purge = 32 fs.xfs.refcache_size = 128 -------------------------------------------------------------------------------------- # sysctl -w : Kernel 파라메터값을변경 -w 옵션을사용하여 Kernel 파라메터의값을변경할수가있다. 예를들면 TCP SYN_Flooding 공격차단을위해 net.ipv4.tcp_syncookies 값을기본 0에서 1로변경을해보도록하자 # sysctl -w net.ipv4.tcp_syncookies=1 위와같이시스템서비스현상황에맞게 Kernel 파라메터값을적절히수정하여시스템의최적화를만들수있다. soft level 의 Kernel 파레메터수정은부팅이후변경이가능하고만일 Rebooting이되어지면기본의설정내역이다시초기화된다. 설정을유지하는방법으로는 sysctl 명령행을 /etc/rc.d/rc.local 에등록하는방법과 /etc/sysctl.conf 설정파일을통한설정도가능하다. /etc/sysctl.conf 를통한설정방법은다음과같다. # vi /etc/sysctl.conf -------------------------------------------------------------------------------------- # Controls IP packet forwarding net.ipv4.ip_forward = 0 # Controls source route verification 6/29 페이지
net.ipv4.conf.default.rp_filter = 1 # Controls the System Request debugging functionality of the kernel kernel.sysrq = 0 kernel.core_uses_pid = 1 # Controls IP packet forwarding net.ipv4.ip_forward = 0 # Controls source route verification net.ipv4.conf.default.rp_filter = 1 # Controls the System Request debugging functionality of the kernel kernel.sysrq = 0 kernel.core_uses_pid = 1 ------------------------------------------------------------------------------------- 위의형식으로 Kernel 파라메터설정을 sysctl.conf 파일에설정해주면 Rebooting 시에도적용이가능하다. 아래는시스템성능과보안에관련된주요 Kernel 파라메터들이다. - 주요보안관련 Kernel 설정 net.ipv4.icmp_echo_ignore_all = 1 : ping 요청에반응막기. 외부에서특정시스템에대해 ping 보내시스템의운영체제정보를알고이를시점으로공격을시도하는경우가많다. 이를원천적으로차단하는방법이다. 7/29 페이지
net.ipv4.icmp_echo_ignore_broadcasts =1 : broadcast 로오는 ping 차단하기. smurf 공격에대응하는방법이다. 스머프공격은 echo request 패킷을특정네트워크대역의 broadcast 에보내는것을방지하는설정이다. 이는 ping 을수용하는시스템에문제가발생하는것이아니라 ping 을발송하는시스템에서부하가걸리서다운시키는문제를방지하는것이다. net.ipv4.conf.all.accept_source_route =0 : IP Source routing 막기. 해커가이기능을이용하여특정네트워크대역의소스라우팅을보내고응답하는패킷을중간에가로채상대방의호스트와신뢰관계를맺은것처럼속일수있다. 이를막지하는것이다. 기본값이 1 인데이를 0으로변경한다. net.ipv4.tcp_max_syn_backlog=1024 net.ipv4.tcp_syncookies = 1 위두설정은 SYN Attack DOS 공격을막지하기위한설정이다. 이는호스트간의 TCP 통신의원리를이용한공격으로서비스거부공격이라불린다. 즉하나의호스트에서다른호스트로 TCP 패킷을보내면 TCP 헤더에 SYN flag 를 on 한상태로연결요청을시도하게된다. 이때클라이언트에서는 SYN/ACK를보내고이를다시호스트에서받아 ACK 신호를보내게되어양방향간의통신이이루어진다. 이때 SYN/ACK 를다시받은호스트에서 ACK를보내지않는다고하면클라이언트쪽에서 ACK가돌아올때까지큐에발송된 SYN/ACK 패킷정보를보관해두게되는데이큐가 backlog 이다. 악으적으로서비스요청을하고응답된 SYN/ACK 신호에대한재응답을해주지않는경우상대호스트는 backlog 에서허용하는제한수까지큐에쌓아두지만이제한수치가넘어서게되면시스템에문제가발생하게되는것이다. 이를 SYN Flooding 이라고한다. syncookies 는이런 Syn flood 공격을방어하기위한설정이며, 이기능을사용하기위해서는 Kernel에서 syncookie 기능이 on 되어져있어야한다. net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.all.accept_redirects=0 : ICMP redirect 방지 net.ipv4.icmp_ignore_bogus_error_responses = 1 : bad icmp packet 차단 net.ipv4.conf.all.rp_filter = 1 : IP spoofing 방지. 서비스거부공격시해커들은공격소스의 IP 정보를속여서 8/29 페이지
공격하게된다. 이기능은본시스템이 spoofing 에이용되는것을방지한다. net.ipv4.conf.all.log_martians = 1 : IP spoofing 된패킷로그에남기기 - 네트워크성능에관련된 Kernel Parameter 설정 net.ipv4.tcp_fin_timeout = 30 : 연결종료시간단축. 특정호스트에서 TCP 연결이이루어진후두호스트간의서비스요청이완료되어도일정시간동안서버측에서는소켓을유지하면서재요청을기다린다. 이시간동안에실제서비스는되지않지만계속서버시스템의리소스를할당하고있기때문에다른요청자의요청이이로인해문제가발생할수있다. 이수치를현서버의서비스상태에맞게적절히단축시켜주는것이좋다. net.ipv4.tcp_keepalive_time = 1800 : Keepalive 시간줄이기. 이설정은웹서버의 keepalive와는별도로 TCP 자체의설정이고이설정값역시양호스트간의서비스관계가종료되었지만특정시간동안연결상태가대기상태로유지되면시스템리소스의낭비를불려온다. 기본값이 7200(2시간 ) 인데이를최적화하는것이좋다. net.ipv4.ip_local_port_range = 32768 61000 : Open port 갯수확장하기. 네트워크서비스에이용되는서비스포트의개수를변경하는것이다. 엔터프라이즈서버에서는일반서버에비해많은서비스요청을소화해야하기때문에서비스 Open port 수도많이필요하게될것이다. 이를시스템의보유리소스크기에맞게조정을해주는것이좋다. 위설정은 32768번 Port 에서 61000번 Port 까지열수있다는것이다. net.ipv4.tcp_max_syn_backlog = 8192 : Socket의 listen backlog 값조정으로동시접속이많을때최적화방법이다. 기본은 1024. net.core.rmem_default = 1048576 net.core.rmem_max = 1048576 : Socket 수신큐의최대값과기본값조정. 대용량서비스시최적화필요기본값은 65536. 9/29 페이지
net.core.wmem_default = 1048576 net.core.wmem_max = 1048576 : Socket 출력큐의최대값과기본값설정. 대용량서비스시최적화필요기본값은 65536. net.ipv4.tcp_rmem = 4096 87380 8388608 : TCP layer의수신버퍼값. 대량의테이터를클라이언트로전송할때위설정값사용권장기본값은 4096 16384 131072. net.ipv4.tcp_wmem = 4096 65536 8388608 : TCP layer 의송신버퍼를조정값. net.ipv4.tcp_mem = 4096 4096 4096 : TCP stack의메모리페이지단위설정, 설정값의의미는순서대로 min, pressure, max 를의미한다. tcp_wmem 과 tcp_rmem 설정에따라적절한크기를활당한다. net.ipv4.tcp_sack = 1 : selective acknowledgements 설정으로외부서비스용시스템에서는 on 내부전용서비스에서는 off 권장 net.ipv4.tcp_timestamps = 1 : timestamps 생성유무외부서비스시에는 on, 내부전용서비스에서는 off 권장 net.ipv4.tcp_orphan_retries = 7 : 유저파일핸들에할당되지않은커넥션에대해몇번을제거시도를할것인지를정하는파라메터, 시스템평균로드값이높은웹서버의경우에이값이 7이하로떨어지면 "TCP: toomany of orphaned sockets" 와 "Out of socket memory" 와같은 Kernel 메세지가나타난다. ifconfig lo mtu 1500 : loopback interface 에대한 MTU 값변경 localhost에접속시송수신최적화. 기본값은 16436. Gigabit 기반에서는 MTU 를 9000 으로해줌 10/29 페이지
- 파일, 메모리성능관련 Kernel Parameter 설정 kernel.msgmni = 1024 : 메시지큐크기조정. 기본값 16 kernel.sem = 1000 32000 32 512 : 세마포어최대값조정 kernel.shmmax = 1024483648 : 공유메모리최대값조정오라클과같은대형서비스에서는실제시스템메모리의 50% 이상을잡도록한다. 단위는 byte 단위. 위설정은메모리가 2G 일경우공유메모리를 1G로잡는설정 fs.file-max = 65535 : Kernel이활당할수있는파일핸들최대값 vm.bdflush = 100 1200 128 512 15 5000 500 1884 2 : 가상메모리및버퍼메모리관리에대한성능향상 - Securing and Optimizing Linux 권장 - 시스템 limit 설정을통한최적화작업 Kernel 구성과별도로시스템설정제한에서시스템의리소스를제한하는경우가있다. 앞에서언급했듯이 /etc/securetty/limits.conf 파일에서제한을하게되는데고성능서버의경우위제한치를기본설정에비해높게잡아주는것이재성능발휘에좋을것이다 # vi /etc/securetty/limits.conf ------------------------------------------------------------------------------------- * hard core 0 11/29 페이지
* hard rss 5000 * hard nproc 20 * hard cpu 5 * hard data 10000 * soft nofile 4096 * hard nofile 4096 * soft stack 8192 * hard stack 8192 ftp maxlogin 4 ------------------------------------------------------------------------------------ limits.conf 의값은실제성능을상향조정하는의미보다는개별유저, 프로세서에대한최대사용의제한값을주는의미가더강하다. 위의 ftp 계정의최대접속허용수는 4개이다. 즉 4개의 connection 에연결된상태라고하면다음 5번째 connection 은거절되는것이다. 1.5.3 Kernel 컴파일실무관련주요기술 - 시스템성능확장을위한주요기능 Linux Kernel 컴파일시시스템성능에중요한역할을하는기능에대해살펴보도록하자 - 엔터프라이즈 Kernel 버전관리방안시스템을관리하다보면보안이나성능이슈에의해여러개의 Kernel 버전을가지고시스템을유지하게된다. 여러개의 Kernel 버전을관리하는방법과 Kernel 컴파일후신규 Kernel 적용시유용한기술에대해알아보도록하자 - Linux Kernel 패치파일만들기 Linux 신규 Kernel이나올때마다엔터프라이즈패치를한다면매번작업에번거로움이생길것이다. 해당시스템에적절한 Kernel 소스튜닝방안이정해지면해당수정내용을패치파일로만들어패치적용방식으로관리하면편리하다여기서는 Kernel 패치파일을만드는방법과해당패치파일을신규파일에적용하는방법에대해살펴보도록하자. 12/29 페이지
1.6 운영체제설치후중요데이터백업정책 시스템엔지니어의가장비중높은역할중의하나로시스템을언제나정상적인서비스가능상태로유지하는임무가있습니다. 하지만사용자의실수나외부의악의적인행위에의해중요한데이터의손실이발생하게되고실제서비스의문제가발생하는경우가생깁니다. 백업은실제문제발생시정상적인서비스상태로복구를시키는데있어가장중요한역할중에하나입니다. 하지만엔지니어의입장에서는 " 문제가발생하니복구했다 " 라는가시적인엔지니어역할에대해논하기전에여러가지상황으로나타날수있는문제에대해얼마나빨리정상적인서비스로복구시킬수있는방법에대해고려를해야할것입니다. 백업은크게나아가시스템의가용성에중요한척도로작용하는요소로의미를가집니다. 백업의방식에따라문제발생상황시서비스동작에는영향을미치지않게할수도있고, 서비스에문제가발생하더라도수초에서수분사이에복구가가능하게할수도있습니다. 하지만백업에관련된비용은항상실제서비스외비용으로작용하기때문에엔지니어입장에서는본서비스의중요성과구축비용을고려하여상황에맞는백업방식을설계해야할것입니다. 이장에서는 1차백업에해당하는로컬데이터백업과 3차백업에해당하는원격데이터백업에대해살펴보도록할것입니다. 시스템의고가용성백업방식은이후엔터프라이즈 Linux 서버구축및운영의고가용성시스템구축부분에서다루도록할것입니다. 1.6.1 로컬데이터백업및복구방안 로컬데이터백업은자체시스템내에서중요한데이터를다른디스크장치에백업을하는방식을의미한다. 로컬데이터백업은시스템가용성단계의첫번째단계로사용자의부주의나서비스디스크의문제발생시최대한신속히시스템을복구시킬수있는방법중에하나로저렴한비용으로백업을진행할수있다. 로컬데이터백업방식은 RAID 장치를이용하여디스크 Mirroring 방식으로구성할수도있지만별도의하드디스크나백업미디어를통해주기적으로데이터를백업하는방식을주로사용한다. 13/29 페이지
데이터백업에주로사용하는명령은 tar, gzip, bzip 등이있는데 tar 는시스템파일과 Directory 구조를하나의파일로통합해주는명령이고 gzip, bzip은시스템데이터를압축하는역할을한다. 이명령과별도의자동화스크립터를통해백업스케줄링을만들어놓으면관리자의설계에따라시간별, 날짜별, 요일별백업이가능하다. 백업의시점과주기는시스템의성능에밀접한관계가있기때문에로컬데이터백업의경우시스템의백업시간을서비스가주로진행되는시간에서멀리하여야한다. 백업에사용되는시스템리소스로인해서비스에사용되는시스템리소스가줄어들기때문에현시스템의백업시점은서비스요청이가장적은시기에행해져야할것이다. 그럼간단한예제를통해백업명령어의사용법에대해알아보도록하자. 예제 ) # cd /backup # tar cvpfz /backup/home.tar.gz /home --exclude=/home/test 위의명령에서사용한옵션에대해하나씩알아보도록하자. 먼저백업파일은 /backup 이라는 Directory에서생성하기를원하므로 /backup 으로이동한후 tar 명령을이용해백업을시작한다. c" 는 Create a new archive 의뜻으로백업시새로운파일을생성하며 v" 는 Verbosely list files processed 의뜻으로백업시백업이진행되고있는상황및 Directory 리스트를보여주며 f" 는 archive file is local 의뜻이며명령어이후의이름이생성될파일의이름이라는뜻이며 p" 는 Preserve-Permissions 의뜻으로이전데이터의 Permission 정보를그대로보존한다는뜻이며 "z" 는 filter the archive through gzip의뜻으로 gzip 으로압축한다는뜻이다. 일반적으로 tar로백업시사용되는확장자규칙은압축되지않고단순히하나의파일로패킹 (packing) 한파일의경우에는 tar" 를, gzip 으로압축된파일의경우에는 tar.gz" 나 tgz" 를확장자로한다. 14/29 페이지
따라서확장자가 home.tar.gz 나 home.tgz 일경우 tar로packing ( 즉단순히하나의파일로묶기만함 ) 된후 gzip 으로압축되었음을뜻한다. 위예제 ) 와같이실행했을경우 /backup Directory에 /home/test 이하를제외한 /home의나머지모든파일과 Directory를압축하여 home.tar.gz 란파일로백업하게된다. tar 의경우파일을묶을때 Directory 구조에의해하위 Directory를모두묶는특성이있기때문에백업예외 Directory나파일이존재할경우 --exclude 란옵션을이용하여백업대상에서제외시킬수있다. 이것은거대한백업대상이존재할경우선별적으로꼭필요한데이터만을백업하여백업시간의단축및백업으로인한디스크수명연장등에의미가있다. 실제여러명의사용자가존재하는시스템에사용자데이터는대부분 /home 이란 Directory 밑에존재하게되는데실제백업의필요가있는사용자와백업이필요없는사용자가있을것이다. 혹은백업이필요한파일속성을가진데이터와백업이필요없는파일속성을가진데이터가하나의 Directory 안에존재할때위의방식을이용하여백업스크립터를제작하여운영하면보다효율적인 1차백업설계를할수있을것이다. 이밖에하나의백업파일의크기가수십기가바이트이상으로만들어질경우백업을하거나복구할때시스템에엄청난무리를주기때문에백업시하나의백업파일크기에제한을두는것도중요할것이다. 실제 /home 밑의데이터가 50G 정도된다고할때하나의파일로백업을하게되면파일속성에따라압축률은다르겠지만그래도 2~30Gbyte 크기의파일이생성될것이다. 이는나중에특정파일하나를복구할때 2~30Gbyte 에해당하는백업파일의압축을풀어야하는부담을가지게됨으로초기설계시분할하여백업정책을세워야할것이다. 예를들면.. # tar czvfp home_a_h.tar.gz /home/[a-h]* # tar czvfp home_i_p.tar.gz /home/[i-p]* 15/29 페이지
# tar czvfp home_q_z.tar.gz /home/[q-z]* 와같이 /home 밑의사용자홈Directory를 3등분하여 3개의백업파일로분할할수있을것이다. 시스템환경에따라위와같은선별적인백업방식을설계시잘응용하면보다효율적인백업시스템을구축할수있을것이다. - 전체 (Full) 백업방식 실제시스템에서간단한백업스크립트예제를만들어보도록하자. ------------------------------------------------------------------------------------ #!/bin/sh... (1) cd /backup... (2) rm -f *.tar.gz... (3) tar czvfp apache.tar.gz /usr/local/apache/*... (4) tar czvfp home.tar.gz /home/* --exclude=/home/test... (5) tar czvfp etc.tar.gz /etc/*... (6) tar czvfp mail.tar.gz /var/spool/mail/*... (7), chown backup.backup *.tar.gz... (8) chmod 700 *.tar.gz... (9) ls -alh mail -s www_backup_report backup@clunix.com... (10) df -sh mail -s www_df_report backup@clunix.com... (11) ------------------------------------------------------------------------------------ (1) 번은시작되는내용이 Shell Script 임을정의한다. (2) 백업작업이이루어지는파티션인 /backup 으로이동한다. (3) 새롭게백업을하여아하므로기존의백업된파일을모두삭제한다. (4) - (7) 번까지는백업을해야할 Directory 이하에대해데이터를각각백업한다. (8) 백업된파일의소유권을 backup 으로설정한다. (9) 백업된파일의권한을 700 으로설정한다. (10) 백업이제대로되었는지확인하기위해현재의 Directory내백업파일의리스트등의정보를백업담당자인 backup@clunix.com 에게메일로발송한다. (11) 혹파티션이가득찰수도있으니현재의파티션사용정보를백업담당자에게메일로발송한다. 16/29 페이지
별도의설명이필요하지않을정도로간단한스크립트이다. Shell 스크립트는실행되어야할명령어를순서대로나열하기만하면된다. 위예에서는 Full Backup을보여주고있는데, 필요에따라적절히 증가분백업 도이용하기바란다. 증가분 ( 변경분 ) 백업은풀백업을받은후기존의백업데이터와비교하여이미백업된이후변경되거나추가된부분만백업하는방식이다. - 증가분백업방식 먼저위예제예제형식의 Full 백업스크립터제일하단에아래구문을추가한다. -> echo `date +"%Y-%m-%d"` > FULL_BACKED_DAY # /root/bin/fullbk.sh ---------------------------------------------------------------------------------- #!/bin/sh cd /backup rm -f *.tar.gz tar czvfp home.tar.gz /home/* chown backup.backup *.tar.gz chmod 700 *.tar.gz ls -alh mail -s www_backup_report backup@clunix.com df -sh mail -s www_df_report backup@clunix.com echo `date +"%Y-%m-%d"` > FULL_BACKED_DAY ----------------------------------------------------------------------------------- 그런후아래스크립터구문을실행하면위스크립터로인해백업된이후새로생성되거나변동된데이터만백업을하게된다. # /root/bin/modbk.sh ----------------------------------------------------------------------------------- #!/bin/sh 17/29 페이지
cd /backup TODAY=`date +"%Y-%m-%d"` PREVIOUSDAY=`cat FULL_BACKED_DAY` tar czvfpg ${TODAY}_modified_home.tgz -N "$PREVIOUSDAY" /home ----------------------------------------------------------------------------------- 그런후 Cron 을이용하여백업스케줄링을정의하면될것이다. # crontab -e ----------------------------------------------------------------------------------- 0 3 * * 0 /root/bin/fullbk.sh 0 2 * * * /root/bin/modbk.sh ----------------------------------------------------------------------------------- # /etc/rc.d/init.d/crond restart 위와같이 Cron 설정을해두면매주일요일새벽 3시에 /home Directory의전체백업이진행될것이다. 그리고매일새벽 2시에전체백업에서변동된데이터만을선택적으로백업을할것이다. 이와같은방식으로백업을진행할경우매일전체백업을해야하는경우보다적은리소스로빠른백업및빠른복구가가능할것이다. 1.6.2 원격데이터백업및복구방안 로컬데이터백업의짧은주기의정기적인백업과부분문제발생시신속한복구를위해행하는백업의성격이강하다. 하지만로컬시스템의디스크용량의제한문제로인해특정시기에백업한데이터를오랜시간보관할수없는단점이있다. 관리자의실수로인해백업디스크나데이터에손상이가거나삭제가되었을경우, 혹은로컬시스템자체가물리적 ( 화재, 테러 ) 으로손상이갈경우그문제의심각성을말로표현하기힘들것이다. 18/29 페이지
그렇기에반드시시스템엔지니어는초기백업설계당시다양한백업방안을고려해야한다. 원격데이터백업은흔히 3차데이터백업이라한다. 1차데이터백업은실제로컬디스크백업에해당하고 2차데이터백업은시스템이중화혹은 High Availability 시스템구축에주로사용되는 Mirroring 기술로백업과동시에서비스고가용성까지고려한백업방식에해당하고 3차백업방식은흔히물리적으로다른매체를통한백업을의미한다. 실제지역적이나물리적으로다른백업시스템에일정주기로원격백업을하게되면위의제시한여러가지문제사항에대한피해를최소화할수있을것이다. 원격데이터백업에사용되는방법은여러가지가존재하지만여기서는실제공개된기본기술을이용하여손쉽게사용할수있는방법에대해소개하도록하겠다. 흔히원격백업에사용되는기술로는 FTP를이용한원격백업, Rsync를이용한원격백업, 그리고공개인증키를이용한 scp 백업등이있다. 위세가지유형에대한백업방법에대해간단한예제를제시하도록하겠다. - expect 를이용한 FTP 백업방법 # vi /root/bin/ftpbk --------------------------------------------------------------------------------- spawn ftp www.domain.com...(2) expect "Name :"...(3) send "backup\r"...(4) expect "Password:"...(5) send "123456\r"...(6) expect "ftp>"...(7) sleep 1... (8) send "bin\r"...(9) 19/29 페이지
expect "200 Type set to I."...(10) sleep 1...(11) expect "ftp>"...(12) send "get /backup/home.tar.gz /data/www/data_home.tar.gz\r"...(13) expect " Kbytes/sec)"...(14) sleep 1...(15) expect "ftp>"...(16) send "quit\r"...(17) expect "221 Goodbye."...(18) interact...(19) --------------------------------------------------------------------------------- (1) 먼저 expect 스크립트라는것을정의한후 (2) 백업을받으려는서버인 www.domain.com 에 ftp로접속한다. (3)"Name :" 이라는응답이오기를기대 (expect) 한다. (4) 데이터서버에접속하기위해 username 인 backup 을입력후엔터를입력한다. (5) username을입력했으므로 Password: 라는반응이오기를기다린다. (6) username 에해당하는암호인 tomorrow를입력한다. ( 이부분은각자의환경에따라다를것이다 ) (7) ftp> 라는반응이오기를기다린다. (8) 1초간대기를한후 (9) binary 로전송을받아야하므로 bin 입력을한다. (10) 서버로부터 200 Type set to I 라는반응이오기를기다린후 (11) 1초간대기를한후 (12) ftp> 라는반응이오기를기대 (expect) 한후 (13) 원격지데이터서버의 /backup/home.tar.gz 란백업데이터를백업서버의 /data/www/ 란 Directory에 data_home.tar.gz 라는파일로저장한다. (14) 사버로부터 Kbytes/sec) 라는메시지가출력되면 (15) 1초간대기를 (sleep) 한후 (16) ftp> 메시지가오기를기다린후 (17) quit를입력하여접속을끊고 (18) 221 Goodbye 메시지가나오기를기대한후 (19) 이후명령어입력정보를기다린다. 20/29 페이지
만약전송받는파일의사이즈가클경우에는 sleep 1 대신에 set timeout -1 를지정하여야정상적으로 ftp 전송이가능하다. Expect를이용한 FTP 백업의경우실제 ftp 란프로그램으로 ftp 접속을하여백업된데이터를다운받는과정을자동화시키는방식으로다소복잡할수도있다. 이밖에 ncftpget 을이용한보다간단한방법도있다. # vi /root/bin/ncftpbk ------------------------------------------------------------------------------------- #!/bin/sh ncftpget -u backup -p '123456' www.domain.com \ /data/www/data_home.tar.gz /backup/home.tar.gz ------------------------------------------------------------------------------------ FTP를이용한백업방법의장점은빠른네트워크백업이가능하다는점이다. 네트워크전송효율이가장놓은 FTP 프로토콜을이용하여백업을하기때문에빠른시간내에많은데이터를백업할때효율적이다. 하지만파일단위로다운이되기때문에증감백업과같은복잡한백업스케줄링을설계할경우에는비효율적인부분이많을것이다. - Rsync 를이용한원격백업방법 rsync를이용한백업방법은이중화시스템구축시데이터동기화방식으로많이사용되며실제 3차백업에서도 FTP 에비해다양한백업을지원하기때문에선호하는방식중에하나이다. 이런 Rsync 의고급기능을이용하여데이터를동기화하는내용은이후고가용성시스템구축부분에서상세히다루도록하겠다. 여기서는원격백업에대한부분만설명하도록하겠다. Rsync 패키지는다음사이트에서다운받을수있다. 21/29 페이지
http://rsync.samba.org/ftp/rsync 먼저서비스서버의 /etc/xinetd.d/rsync 파일을설정한다. # vi /etc/xinetd.d/rsync ---------------------------------------------------------------------- service rsync { disable = no socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID } ---------------------------------------------------------------------- # /etc/rc.d/init.d/xinetd restart 그런후 /etc/rsyncd.conf 설정파일에백업대상 Directory 의정보를설정한다. # vi /etc/rsyncd.conf ----------------------------------------------------------------------- [backup] path = /backup comment = www 웹서버 uid = root gid = root 22/29 페이지
use chroot = yes read only = yes hosts allow = 210.47.67.1 max connections = 1 timeout 600 ------------------------------------------------------------------------ [backup] : 서비스명 path : 전송될 data가들어있는경로 uid : data 를전송하는사용자의 uid 기본값은 nobody gid : data 를전송하는사용자의 gid 기본값은 nobody use chroot : path를 root Directory로사용. 보안상필요함. read only : 읽기전용 ( 클라이언트에서서버로올리는경우에는 read only= no로설정을해야합니다. ) hosts allow : 호스트별접속허용. 기본값은 all host이므로보안을유지하려면반드시설정함 max connections : 동시접속자수. timeout : 클라이언트에서접근시타임아웃시간. anonymous 로운영하는경우설정을해야클라이언트가죽었을때서버에서접속을해체할수있습니다. 이로서서비스서버에대한설정이완료되었다. 아래의실제백업서버에다음스크립터를만들도록한다. # /root/bin/rsyncbk -------------------------------------------------------------------------- #!/bin/sh /usr/bin/rsync -avz data.domain.com::backup /data/www -------------------------------------------------------------------------- 3차백업의좀더효율적인백업을위해서는서비스서버에이더넷카드를 2장을설치하여백업전용네트워크채널을분리하는방식을사용하면, 원격네트워크백업에사용되는네트워크리소스를서비스대역과분리시켜실제서비스할당리소스를최대한보장될수있도록한다. 23/29 페이지
1.7 긴급발생문제해결및주요관리이슈 파일시스템이깨졌거나해킹등의문제로정상부팅이안되는경우복구방법입니다. 24/29 페이지
실제 Linux Kernel로부팅을하는것이가장중요하다. 부팅을해서시스템상태를점검해야이다시설치를할지아님일부중요파일의백업을이용하여복구를할지결정이가능하다. 먼저시스템부팅이안된다. 이제부팅을시켜보자 - 긴급부팅시키기 1 장에서설정한 bootloader 설정내용도참조하세요. ** Linux 배포 CD 를통한부팅 단이때는기본적으로시스템의하드의파티션중 / 파티션의디바이스명을알고있어야한다. 1장에서언급한바와같이그래서초기셋팅후시스템정보를보관하는것은상당히중요하다. Linux Install CD 를넣고부팅한다. boot 프롬프트에다음내용을기재한다. boot : linux initrd= root=/dev/hda2 -> /dev/hda2 가실제 / 파티션의 device name 이는 Linux Install CD 에있는기본 Kernel로시스템을부팅하여현시스템의 root mount point ( / ) 에접근하는것이다. 이경우는 IDE 하드에 Linux가설치된경우주로사용한다. SCSI 의경우 Install CD Kernel에 SCSI 모듈정보가포함안되어져있어서 root device 를못찾는다면서실패할가능성이많다. 주로 Lilo 가깨졌을때많이사용한다. ** rescue mode booting 역시 Linux Install CD 를이용하여부팅할때 boot 프롬프트에서 rescue 라는옵션과같이부팅 boot : linux rescue 그럼 text 설치과정과비슷하게넘어가다가 bash prompt ( # ) 바로떨어진다. 25/29 페이지
하드디스크에크게문제가없을경우에는 /mnt/sysimage 폴더에 system root 파티션이 mount 되어있을것이다. # chroot /mnt/sysimage 하면마치정상적으로부팅한것처럼 mount 가된다. 이상태에서점검하면된다. 진짜중요한파일에문제가있어이것이안된다고하면수동으로 mount 하여중요파일의손상정도를파악한다. rescue 방식은주로 SCSI 하드디스크일경우많이사용함. 주로 Lilo 가깨진경우, 파일시스템깨진경우 ** single mode 로부팅하기 파일시스템에문제가발생하여파일시스템을체크하기위해부팅하는모드로 LILO Prompt 가뜨면.. Lilo : linux single 위와같이부팅한다. 그런후안정스럽게파일시스템을점검및복구한다. 이밖에파일시스템복구목적으로긴급부팅하는방법으로는 lilo: linux init=/bin/sh 도있다. - 부팅디스켓만들기 먼저부팅디스켓으로사용할 Kernel 이미지를선택한다. 그리고선택한 Kernel 이미지가 root 장치 (root mount point) 가재대로잡혀있는지 26/29 페이지
확인한다. # rdev /boot/vmlinuz Root device /dev/hda1 만일루트장치가현재잡혀있는거랑틀리다면아래와같이수정한다. # rdev /boot/vmlinuz /dev/hda3 # 이제깨끗한플로피디스켓하나준비하고포맷한다. # fdformat /dev/fd0 # dd if=/boot/vmlinuz of=/dev/fd0 bs=8192 - 일반유저에게장치 mount 허가하기 특정장치를일반유저에게 mount/umount 하게해주기위해서는 /etc/fstab 에서허가할장치의옵션에 user 이란옵션을추가해주어야한다. 혹은 mount/umount 명령어의 permission을 setuid 로해주어도가능하다. - 파일시스템만들기 mkfs 명령어사용 # mkfs -t ext2 /dev/hdb1 # mkfs -t ext2 /dev/fd0 플로피파일시스템만들기 # fdformat /dev/fd0 # mkfs -t ext2 -c /dev/fd0 -v -c : 블럭체크 27/29 페이지
-v : 진행과정 display - 파일시스템점검수리 # fsck -t [type] [device] fsck 파일점검은가능한 umount 한후에실행한다. 하지만 / 을 mount 하지않은면당근부팅이제대로될수없기에 / 를체크할때는플로피로부팅을하던지아님 single mode로부팅한후체크한다. 체킹후 mount -t -w -o remount / 해주면된다. - 긴급스왑메모리추가하기 # touch /swap # dd if=/dev/zero of /swap bs=1024 count=8192 # sync # mkswap -c /swap 8192 # swapon /swap 하면 8M 의스왑메모리를추가할수있다. 이밖에여유공간에파티션을나누고 /etc/fstab 에추가해주어도가능하다. - RPM 패키지상태초기화하기 누가해킹혹은실수로 RPM 패키지의 permission 이나권한등을변경하여정상적인작동을안할경우이를설치시상태로복구하는방법이다. # rpm --setperms -a 이로써실무환경을고려한엔터프라이즈 Linux 운영체제설치에대한교육과정을마치도록하겠습니다. 28/29 페이지
29/29 페이지