'Computer_language/Linux'에 해당되는 글 17건

  1. 2009.01.12 MAKE를 이용한 프로젝트 관리 (Managing Projects with make)
  2. 2009.01.12 우분투 사용 총집합서
  3. 2009.01.12 우분투에서 수도 (sudo) 사용자 추가방법, sudoers
  4. 2009.01.12 우분투에 메신저를 설치하다 (네이트온,MSN 등)
  5. 2009.01.12 swap 메모리를 설치후에도 설정할수 있나요?
  6. 2009.01.12 SSH 터널링 - putty의 plink 사용예esniper
  7. 2009.01.12 ubuntu souce list update

MAKE를 이용한 프로젝트 관리 (Managing Projects with make)

|

하나의 프로젝트에서 여러 파일을 다루고 다른 사람들과 함께 작업해 나가는 것은 개발자에게는 당연한 과정이며 꼭 필요한 부분이다. 그런 점에서 make를 사용하는 방법을 배우는 것은 상당히 중요한 일이라 할 수 있다.


make는 명령을 생성하는 유틸리티이다. 이들 명령은 주로 소프트웨어 개발 프로젝트를 수행하면서 작성되는 여러 파일들을 관리하는 것과 관련이 있다. 여기서 말하는 '파일 관리'란 상태를 보고하고 임시 파일을 제거하는데서부터 복잡한 프로그램 그룹의 최종 실행 파일을 만드는데 이르기까지 일련의 작업을 가리킨다.


콜론(:)을 포함하는 종속행탭 문자로 시작하는 하나 이상의 명령 행이 있다. 종속행에서 콜론 왼쪽은 target(program)이며, 콜론 오른쪽은 target의 필요 항목(prerequisite)이다. 탭 문자로 시작하는 명령 행은 필요 항목을 가지고 target을 작성하는 방법을 제시한다.


file.o : file.c                   --> 종속행(target : dependencies) (프로그램 : 필요 항목)

        cc -c file.c            --> 명령행(필요 항목을 가지고 target을 작성하는 방법을 제시)


탭 문자


make에서 가장 중요한 구문 규칙은 모든 명령들은 탭 문자로 시작한다는 것이다.


긴 행


행이 길어질 경우, 끝에 역슬래시(\)를 추가하여 계속 이어갈 수 있다. 역슬래시 뒤에는 어떤 여백 문자도 두어서는 안된다. 행을 계속 이어가기 위해 역슬래시를 사용하는 경우, make는 이를 하나의 공백 문자로 치환한다.


변수(매크로) 정의


변수(variable)란 텍스트 문자열(변수 값)을 표현하기 위해서 makefile에 정의된 이름이다. make의 어떤 버전에서는 변수를 매크로(macro)라고 부른다. 변수 정의는 등호를 포함하는 하나의 문장(행)이다. 문자열은 작은 따옴표('')나 큰 따옴표("")로 구분해서는 안된다. 변수 이름은 대소문자를 구분하므로  'foo', 'FOO', 'Foo'는 모두 서로 다른 변수가 된다. 변수 값 앞에 있는 공백은 변수 할당에서 무시된다. 변수 이름에 대해서 대문자 알파뱃을 사용하는 것이 전통적이지만 makefile 안에서 내부적인 목적으로 사용되는 변수 이름은 소문자 알파벳을 사용한다.

 

name = text string


변수를 참조할 때, 즉 make가 변수를 그 정의로 치환토록 할 때는 변수를 괄호(())나 중괄호({})로 둘러싸고, 그 앞에 달러 표시($)를 붙인다. $의 특별한 의미 때문에 단일 달러 기호의 효과를 가지기 위해서는 반드시 '$$'를 써야 한다.


$(name) 또는 ${name}


문자 하나로 이루어진 변수 이름에는 괄호나 중괄호를 사용할 필요가 없다.


A = XYZ


$A와 $(A) 그리고 ${A}는 모두 동일하다.


변수를 정의하지 않고 참조할 경우, make는 그것을 널 문자열로 치환한다. 따라서 정의하지 않은 변수를 사용해도 오류 메세지는 생기지 않는다. 변수는 반드시 사용할 항목보다 먼저 정의해야 한다.


다양한 소스에서, 한 변수에 서로 다른 정의를 내린 경우, 다음과 같은 우선 순위를 매겨 사용한다.


1. make 명령 입력시 make 명령 다음에 입력한 변수

2. 기술 파일의 변수 정의

3. 현재 셸 환경 변수

4. make의 내부(기본) 정의


변수의 특징


=  다른 변수에 대해 재귀적으로 확장

:= 단순 확장

+= 기존 변수에 값 추가


컴파일에 필요한 경로는 변수로 설정할 수 있다. 이를 통해 설치가 변경되더라도 쉽게 수정할 수 있다. 변수에는 두 가지 종류가 있다. 재귀적으로 확장되는 변수(Recursively expanded variable)와 간단히 확장되는 변수(Simply expanded variable)가 그것이다. 이 두 변수는 그것이 확장될 때 무엇을 하는가와 정의된 방법에 따라 구분된다.


재귀적으로 확장되는 변수(Recursively expanded variables)


재귀적으로 확장되는 변수는 이름과 값 사이에 '='를 사용하고 변수가 필요할 때 그 값이 결정된다. 이 변수는 재귀적으로 정의 될 수 없다. 왜냐하면 무한 루프에 빠지게 되기 때문이다. 이 변수가 다른 변수에 대한 참조를 담고 있다면 이런 참조는 그 변수가 대입될 때마다 확장된다. 이것이 일어날 때 이것을 recursive expansion이라고 부른다.


OK: class_example_d = $(class_d)/example
        (정의문에서 다른 변수를 참조한 경우)


Not OK: class_d = $(class_d)/example
        (재귀적 정의: 정의문에서 자신을 참조한 경우)


예를 들어,


foo = $(bar)

bar = $(ugh)

ugh = Huh?


all :

        @echo $(foo)


이것은 'Huh?'를 에코한다: '$(foo)'는 '$(bar)'로 확장된다. 그리고 이것은 '$(ugh)'로 확장된다.


이것의 장점은 다음과 같다:


CFLAGS = $(include_dirs) -O

include_dirs = -lfoo -lbar


이것은 'CFLAGS'가 명령행에서 의도된대로 '-lfoo -lbar -O'로 확장될 것이다. 그러나 가장 큰 단점은 변수의 마지막에 무언가를 덧 붙일 수 없다는 것이다. 다음과 같이:


CFLAGS = $(CFLAGS) -O


이것은 변수 확장 과정에서 무한 루프를 발생시킨다(실제로 make는 무한 루프를 검출하고 에러를 보고한다).


단순하게 확장되는 변수(Simply expanded variables)


단순하게 확장되는 변수는 이름과 값 사이에 ':='를 사용해서 정의하고 make가 이 변수를 만날 때 바로 값이 평가된다. 즉, 변수가 정의될 때 다른 변수와 함수에 대한 참조를 확장하면서 단 한번만 스캔된다. 재귀적 정의도 가능하며, 이때 오른쪽에 있는 변수 값은 이 변수의 이전 값이 된다. 단순하게 확장되는 변수는 GNU make의 고유한 기능이며 다른 버전의 make에는 존재하지 않을 수도 있다.


OK: class_example_d := $(class_d)/example


OK: class := $(class)/example
        (이전에 class가 정의되어 있다면 OK)


예를 들어,


x := foo

y := $(x) bar

x := later


all :

        @echo $(y)

        @echo $(x)


는 다음과 같다:


y := foo bar

x := later


단순하게 확장된 변수가 참조될 때 그것의 값은 있는 그대로 대입된다. 이것은 일반적으로 복잡한 makefile 프로그래밍을 좀 더 예측 가능하도록 만든다.


조건 변수 할당 연산자(Conditional variable assignment operator)


변수가 아직 정의되지 않았을 경우에만 효력을 가진다.


FOO ?= bar


다음과 정확하게 동일하다:


ifeq ($(origin FOO), undefined)

        FOO = bar

else

endif


변수에 텍스트를 덧 붙이기


이미 정의된 변수의 값에다 텍스트를 추가할 때, 다음과 같이 '+='을 사용한다.


object += another.o


이것은 objects 변수의 값을 취해서 텍스트 'another.o'를 그것에 더한다(앞에 하나의 공백을 붙인다). 그래서:


objects = main.o foo.o bar.o utils.o

objects += another.o


이것은 objects를 'main.o foo.o bar.o utils.o another.o'로 설정한다.


'+='을 사용하는 것은 다음과 비슷하다:


objects = main.o foo.o bar.o utils.o

objects := $(objects) another.o


변수 대입 참조(Substitution References)


대입 참조는 한 변수의 값을 지정하는 다른 값으로 대입한다. '$(var:a=b)' (또는 '${var:a=b}' 형식이며, 이것의 의미는 변수 var의 값을 취해서 한 단어의 뒤에 있는 각각의 a를 각각의 b로 교체하고 결과 문자열을 대입한다는 것을 의미한다.    


"한 단어의 뒤에 있는"이라고 말할 때, a가 대체되기 위해서는 이것이 공백 문자가 뒤에 있도록 또는 그 값이 마지막에 있도록 나타나야 한다는 것을 의미한다. 그 값안에서 다른 위치에 있는 a는 변경되지 않을 것이다.


예를 들어:


foo := a.o b.o c.o

bar := $(foo:.o=.c)


이것은 'bar'를 'a.c b.c c.c'로 설정한다.


아래는 또한 같은 결과를 나타낸다.


foo := a.o b.o c.o

bar := $(foo:%.o=%.c)


이것은 'bar'를 'a.c b.c c.c'로 설정한다.


변수 문자열 치환

 

SRCS = def.c redraw.c calc.c

FINAL_OBJS = ${SRCS:.c=.o}

DEBUG_OBJS = ${SRCS:.c=_dbg.o}


위 예제의 경우, make는 {SRCS}를 평가하고 콜론 바로 뒤에 오는 문자열을 찾은 다음, 등호 기호 뒤의 문자열로 치환한다. 이 기능을 이용하면 마지막에 첨부된 문자만 다른 여러 파일로 이뤄진 그룹을 쉽게 관리할 수 있다. 따라서 나중에 소스 파일을 추가하거나 제거해도, SRCS 변수 정의만 바꿔주면 된다.


${FINAL_OBJS}            --> def.o redraw.o calc.o

${DEBUG_OBJS}          --> def_dbg.o redraw_dbg.o calc_dbg.o


단순히 ${DEBUG_OBJS}의 항목들만 이용하여 실행 파일을 작성할 경우, 항목을 다음과 같이 사용하면 된다.


plot_debug: ${DEBUG_OBJS}

    ${CC} -o plot_debug ${DEBUG_OBJS}


문자열 치환은 매우 엄격하게 제한된다. 변수의 마지막 부분이나 공백 문자 바로 앞까지만 적용된다.

 

LETTER = xyz xyzabc abcxyz

...

echo ${LETTERS:xyz=DEF}


--> DEF xyzabc abcDEF


이는 abc가 xyz의 존재를 숨기기 때문이다.


치환에서 두 번째 문자열은 널 문자열이 될 수 있지만, 첫 번째 문자열은 불가능하다.

 

SOURCES = src1.c src2.c glob.c

EXEC = $(SOURECS:.c=)

echo ${EXEC}


--> src1 src2 glob


필요 항목과 target용 내부 변수


$@ 현재 target의 전체 이름(명령행에서만). 일반 기술 파일 항목과 확장자 규칙에서 사용할 수 있다.


  OBJS = basic.o prompt.o

  plot_prompt : basic.o prompt.o

      cc -o $@ ${OBJS}        --> cc -o plot_prompt basic.o prompt.o


    주의! cc 명령은 반드시 프로그램을 구성하는 모든 오브젝트 모듈을 링크해야 한다.

    위 $@ 예제에서 ${OBJS} 대신 $?를 사용하면 안된다.

    $?는 target보다 나중에 수정된 필요한 파일들만 표시할 뿐이다.


$? 현재 target보다 최근에 변경된 필요 항목들의 리스트(명령행에서만). 일반 기술 파일 항목에서만 사용할 수 있다.

  libops : interact.o sched.o gen.o

      ar r $@ $?                    --> ar r libops sched.o (나중에 sched.o 만 갱신되었다고 가정)


$$@ 현재 target의 이름(종속행의 필요 항목에서만). 하나의 소스 파일을 갖는 실행 파일들의 수가 많을 때  

   --> cc -O dd.c -o dd (나중에 dd.c 만 갱신되었다고 가정)


$< 현재 target보다 최근에 변경된 필요 항목의 전체 이름. 확장자 규칙과 .DEFAULT 항목에서만 사용될 수 있다는 점을 제외하면 $?와 유사하다.


$* 현재 target보다 최근에 변경된 필요 항목의 확장자를 제외한 이름. 확장자 규칙에서만 사용할 수 있다.


$% 현재 target이 라이브러리 모듈일 때 .o 파일에 대응되는 이름. 일반 기술 파일 항목과 확장자 규칙에서 사용할 수 있다.


$^ 모든 필요 항목의 리스트. 디렉토리 이름을 포함하고 이들 사이는 공백으로 구분된다. 일반 기술 파일 항목에서 사용할 수 있다.


또한 한 문자로 구성된 변수의 구문 규칙을 적용할 수도 있다. 즉, $@을 $(@)나 ${@}으로 쓸 수 있는 것이다.


확장자 규칙


미리 정의해 놓은 일반화한 기술 파일 항목. 필요 항목이 몇몇 확장자 가운데 하나를 갖거나, 사용자가 제공한 그 어떤 명시적인 명령도 가지고 있지 않을 경우, make는 적절한 확장자 규칙을 찾게 된다. 즉, program이 만들어지기 전에 필요 항목 파일 가운데 어떤 파일이 만들어져야 하는지 확인한다.


.SUFFIXES : .o .c .s

.SUFFIXES 행은 make가 중요하게 여길 확장자를 나타낸다.


.c :

    $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@

.c 확장자의 파일로부터 널 확장자의 파일(실행 프로그램)을 만드는 방법을 설명한다.(널 확장자가 .c와 콜론 사이에 있다고 생각) 이 규칙은 하나의 소스 파일에서 작성할 때 오브젝트 파일을 다루지 않도록 해준다.

 

.c.o :

    $(CC) $(CFLAGS) -c $<

이 규칙은 .c에서 .o파일을 만드는 방법을 설명하고 있다.


OBJS = main.o iodat.o dorun.o lo.o

LIB = /usr/proj/lib/crtn.a

 

program : ${OBJS} ${LIB}

    ${CC} -o $@ ${OBJS} ${LIB}

 

$ make program                    --> cc -o program main.o iodat.o dorun.o io.o /usr/proj/crtn.a


어떤 확장자에 대해 확장자 규칙이 정의되어 있더라도 .SUFFIXES 리스트에도 함께 정의되어야 효력이 있다. make는 .SUFFIXES 리스트의 확장자 순서에 따라 파일을 검색한다.


make는 현재의 작성에서 사용한 모든 변수와 확장자 규칙, 그리고 target을 출력하는 유용한 -p 옵션을 제공한다.


명령옵션


CFLAGS와 ASFLAGS 변수는 명령에 대한 플래그 옵션을 전달한다.


make program CFLAGS=-g                        --> cc -g -c main.c


make의 명령 행에서 단일 변수에 여러 옵션들을 주려면, 전체 정의에 큰따옴표("")를 쳐주면 된다.


make program "CFLAGS=-g -DTRACE"      --> cc -g -DTRACE main.c


기본으로 정의된 CFLAGS는 무효화한다.


주의! 기술 파일 항목에서 라이브러리 옵션들을 변경한 다음, target들에 대해 make를 실행하면, 최신 버전의 target들이 이미 존재할 경우, make는 그것을 다시 작성하지는 않는다. make는 무엇보다도 파일 이름과 변경 시간에서만 정보를 얻는다.


라이브러리


각 오브젝트 파일을 갱신한다.


libops : interact.o sched.o gen.o

    ar r $@ $?


사용자들이 라이브러리 내에서 각 파일을 지정할 수 있다.


libops(interact.o), ${LIB}(interact.o)


괄호를 중복 사용하여 라이브러리 내의 특정 모듈을 참조할 수 있다.

 

libops((_parse))

 

구문 내에서는 여백 문자를 사용해서는 안된다.


확장자 규칙은 또한 라이브러리를 다시 생성하는 것도 지원한다. 다음은 C 소스 파일이 변경되었을 때 라이브러리를 갱신하는 기본 규칙을 보여준다.


.c.a :

    $(CC) -c $(CFLAGS) $<

    ar rv $@ $*.o

    rm -f $*.o


특정 파일에 의존 관계들을 지정해주기만 하면 된다.


prog : libops(interact.o) libops(sched.o) prog_call.o

    ${CC} -o $@ prog_call.o libops


파일을 정확히 알지 못하더라도 다음과 같이 모듈을 지정할 수 있다.


prog : libops((_parse)) libops((_waitloop)) prog_call.o

    ${CC} -o $@ prog_call.o libops


이처럼 모듈을 지정하는 것은 make에 해당 파일을 가리켜 줄 뿐, 해당 모듈이 변경되었는지 여부를 점검토록 해주지는 않는다. interact.c 내에 있는 어떤 모듈 하나라도 바뀐 경우, _parse에만 관심이 있더라도 make는 libops(interact.o) 파일 전체를 다시 작성해야 한다.


libops가 마지막으로 작성된 이후 interact.c가 변경되었다고 가정해보자. 처음 세 명령은 .c.a 규칙에 의해 실행되었으며, 마지막 명령은 기술 파일에 명시되어 있다(ar 명령 다음 줄은 ar 명령이 라이브러리에서 interact.o를 치환할 때 표시하는 메세지이다).


$ make prog

cc -c -O interact.c

ar rv libops interact.o

r - interact.o

rm -f interact.o

cc -o prog prog_call.o libops


.c.a 규칙에 따라 libops를 작성하는 동안, make는 처음에는 내부 변수들을 아래와 같이 설정한다.


$@ = libops

$< = interact.c

$* = interact


공통된 정의(문장)의 사용


대형 프로젝트에서 기술 파일이 여러 군데서 사용되면 프로젝트 팀에서는 변수 정의와 확장자 규칙을 한 곳에 모으는 것에 대해 생각해 보아야만 한다. 이것을 지원하기 위해 make는 include문을 제공한다.

include file


여기서 include라는 단어는 반드시 줄의 처음에서 시작해야 하며 다음에 공백 문자나 탭이 따라와야 한다. 'file'의 모든 행을 현재의 기술 파일로 옮겨 적는 것과 동일하다.


include 파일에 의존 항목 행을 둔다면, 변수를 참조하는 의존 항목 행 이전에 해당 변수가 정의되어 있어야만 한다. 정의는 다음 중 하나의 위치에 있어야만 한다.


1. include 파일 내에 의존 항목 행 이전

2. 사용자 기술 파일에서 include문 이전

3. make 명령 행

4. 사용자의 환경 변수



에코


일반적으로 make는 각 명령 라인이 실행되기 전에 디스플레이한다. 이것을 echoing이라고 부른다.


어떤 라인이 '@'으로 시작할 때, 그 라인의 에코는 나타나지 않는다. '@'는 명령이 셸에 전달되기 전에 버려진다. Makefile을 통해서 진행되는 상황을 표시하기 위해서 echo와 같은 명령을 사용한다.


@echo About to make distribution files


make는 '-n' 또는 '--just-print' 플래그를 받으면 실행없이 에코만 한다. 이런 경우에는 '@'으로 시작하는 명령들 조차도 출력된다. make는 '- s' 또는 '-- silent' 플래그를 받으면 모든 명령이 마치 '@'으로 시작하는 것처럼 모든 에코를 금지시킨다.


와일드 카드


하나의 파일 이름을 wildcard character를 사용해서 많은 파일을 지정할 수 있다. make에서 와일드 카드 문자는 '*', '?', '[...]'이다. 예를 들어, '*.c'는 이름이 '.c'로 끝나는 모든 파일(현재 작업 디렉토리 안에서)의 리스트를 지정한다.


와일드 카드 문자의 특별한 용도는 그 앞에 역슬래시를 붙임으로써 없어진다.


다음은 의도한 바대로 작동하지 않는 와일드 카드 확장을 사용하는 간단한 예제이다. 실행 파일 'foo'가 모든 오브젝트 파일들로 부터 만들어지도록 하기 위해 다음과 같이 작성했다고 가정하자:


objects = *.o


foo : $(objects)

        cc -o foo $(CFLAGS) $(objects)


objects의 값은 실제 문자열 '*.o'이다. 와일드 카드 확장은 'foo'를 위한 규칙에서 일어난다. 그래서 각 현존하는 '.o' 파일은 'foo'의 필요 항목이 되고 필요하면 재컴파일 될 것이다. 그런데 모든 '.o' 파일이 지워져 버렸다면 어떻게 될 것인가. 와일드 카드가 어떤 파일과도 매치되지 않으면 이것은 있는 그대로 남게 된다. 그래서 'foo'는 이상한 이름의 파일 '*.o'에 의존하게 될 것이다. 이런 파일은 존재하지 않을 것이기 때문에 make는 '*.o'를 만드는 방법을 알 수가 없다는 에러를 낼 것이다. 이것은 의도하는 바가 아니다.


$(wildcard pattern...)


이 문자열은 makefile 안의 어떤 곳에서도 사용된다. 주어진 파일 이름 패턴들 중에서 하나와 매치되는 현존하는 파일 이름들을 공백으로 분리된 리스트로 만들어 대체한다. 어떤 파일 이름도 패턴과 매치되는 것이 없으면 그 패턴은 wildcard  함수의 결과로부터 제거된다.


wildcard 함수의 한가지 사용법은 한 디렉토리에 있는 모든 C 소스 파일들의 리스트를 획득하는 것이다. 다음과 같이:


$(wildcard *.c)


C 소스 파일들의 리스트를 가지고 `.c' 접미사를 `.o'로 변경해서 오브젝트 파일들의 리스트로 변경할 수 있다. 다음과 같이:


$(patsubst %.c, %.o, $(wildcard *.c))


그래서 한 디렉토리에 있는 모든 C 파일을 컴파일하고 이들을 모두 모아서 링크하려고 하는 makefile은 다음과 같이 작성될 수 있다:


objects := $(patsubst %.c, %.o, $(wildcard *.c))


foo : $(objects)

        cc -o foo $(objects)

 

텍스트 변환을 위한 함수(Functions for Transforming Text)


$(subst from, to, text)


text에 대해서 from을 to로 바꾼다. 예를 들어서


$(subst ee, EE, feet on the street)


의 결과는 'fEEt on the strEEt'이다.


$(patsubst pattern, replacement, text)


text 안에서 공백 문자로 분리된 단어 중에서 pattern과 매치되는 단어를 찾아 그것들을 replacement로 변경한다.


여기서 pattern은 와일드 카드 역활을 하는 '%'를 가질 수 있는데, 이것은 어떤 단어 내에 있는 임의 개수의 문자들과 매치된다.


replacement도 역시 '%'를 가질 수 있는데 '%'는 pattern 안에서 '%'와 매치된 텍스트로 대치된다.


$(findstring find, in)


in에서 find를 찾아 있다면 값은 find가 되고, 없다면 빈 값이 된다. 이 함수를 조건에서 사용하면 주어진 문자열 안에서 특정 문자열의 존재 여부를 검사할 수 있다. 그래서 다음과 같은 두 예제들은:


$(findstring a, a b c)

$(findstring a, b c)


'a'와 ''(빈 문자열) 각각을 만든다.


$(filter pattern...,text)

 

pattern 단어들 중의 임의의 것과 일치하지 않는, text 내의 공백 문자로 분리된 단어들을 모두 제거하고 일치하는 단어들만을 리턴한다. 패턴은, 위의 patsubst 함수에서 사용된 패턴과 마찬가지로, `%'을 사용하여 작성된다. filter 함수는 한 변수 안에서 (파일 이름과 같은) 다른 타입의 문자열들을 분리 제거하는데 사용될 수 있다. 예를 들어서:

sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
        cc $(filter %.c %.s,$(sources)) -o foo

 

는 `foo'가 `foo.c', `bar.c', `baz.s' 그리고 `ugh.h' 에 의존하지만 `foo.c', `bar.c' 그리고 `baz.s' 만이 명령안에서 컴파일러에 대해 지정되어야 한다는 것을 말한다.


$(origin variable)


variable은 질의하고 있는 변수의 이름으로 그 변수를 참조하는 것은 아니다. 그러므로 '$'나 괄호를 쓰지 않는다. 이 함수의 결과는 변수 variable이 정의된 방법을 말하는 문자열을 가진다:


'undefined'

변수 variable이 전혀 정의된 바가 없다면 이 값을 가진다.


'default'

변수 variable이 CC나 기타 등등처럼 디폴트 정의를 갖고 있다면 이 값을 가진다.


'environment'

variable이 환경 변수로써 정의된 것이고 '-e' 옵션이 켜진 것이 아니라면 이 값을 가진다.


'environment override'

variable가 환경 변수로 정의되었고 '-e' 옵션이 켜졌다면 이 값을 가진다.


'file'

variable가 makefile에서 정의된 것이라면 이 값을 가진다.


'command line'

variable가 명령행에서 정의된 것이라면 이 값을 가진다.


'override'

variable가 override 지시어로 makefile에서 정의된 것이라면 이 값을 가진다.


'automatic'

variable가 각 규칙의 명령의 실행에 대해서 정의된 자동 변수라면 이 값을 가진다.


헤더 파일(필요 항목을 자동으로 생성하기)


make는 숨겨진 의존 관계를 살펴보기 위해 파일 내부를 들여다 볼 수 없다. 따라서 어떠한 #include 지시자가 파일 내에 있는지 알지 못하며, 헤더 파일이 변경된 것을 확인하여 오브젝트 파일을 다시 작성할 수 없다. 이런 문제를 해결하기 위해 대부분의 기술 파일은 의존 관계를 직접 지정한다.


main.o: defs.h


make가 'defs.h'가 변할 때마다 'main.o'를 반드시 다시 만들어야 한다는 것을 알게 하기 위해 이 규칙이 필요하다. 어떤 커다란 프로그램에 대해서는 makefile 안에 그런 규칙 수십 개를 작성해야 할 것이다. 그리고 #include를 더하거나 제거할 때마다 makefile을 조심스럽게 업데이트 해야 한다.


대부분의 현대 C 컴파일러는 소스 파일에서 #include를 찾아 기술 파일에 포함하기 적합한 의존 파일 리스트를 만들어 내는 '-M' 옵션을 포함하고 있다.  예를 들어서 다음 명령은:


cc -M main.c


다음과 같은 출력을 생성한다:


main.o: main.c defs.h


이것은 .o가 종속하고 있는 모든 소스와 헤더 파일을 .o에 종속하도록 만든다. GNU C 컴파일러는 '-M' 플래그 대신 '-MM'을 사용하여 시스템 헤더 파일에 대해서는 종속물을 생략하도록 한다. 의존 파일 리스트를 만들었다면 그것을 모두 읽어 들이기 위해 include 지시어를 사용한다. 예를 들어:


include depend


.c.o :

        $(CC) $(CFLAGS) -c $<


depend : Makefile

        $(CC) -MM $(CFLAGS) $(wildcard *.c) > $@


명령에서 에러(Errors in Commands)


각 쉘 명령이 리턴한 후, make는 그것의 종료 상태 값을 조사한다. 그 명령이 성공적으로 종료하면 다음 명령 라인이 새로운 쉘에서 실행된다; 마지막 명령 라인이 종료된 후 그 규칙은 종료한다.


에러가 있으면(종료 상태 값이 0이 아니면), make는 현재 규칙을 그리고 아마도 모든 규칙들을, 포기한다.


때때로 어떤 명령의 실패가 문제를 가리키는 것은 아니다. 예를 들어서 mkdir 명령을 사용해서 어떤 디렉토리의 존재 유무를 검사할 수도 있다. 그런 디렉토리가 이미 존재한다면 mkdir은 에러를 보고할 것이다. 그러나 여러분은 아마도 make가 그것을 신경쓰지 않고 계속하기를 원할 것이다.


명령 라인에서 에러들을 무시하기 위해서 그 라인 텍스트의 시작부분(초기 탭 문자 뒤에)에 `-' 하나를 넣는다. `-'는 명령이 실행을 위해서 쉘로 전달되기 전에 무시된다.


예를 들어서,


clean:
        -rm -f *.o


이것은 rm이 어떤 파일을 제거할 수 없다하더라도 계속하도록 한다.

 

여러분이 make를 `-i'나 `--ignore-errors' 플래그를 써서 실행할 때 에러들이 모든 규칙의 모든 명령들에서 무시된다. makefile에 있는 특수 타겟 .IGNORE에 대한 규칙은, 종속물들이 없을 때, 동일한 효과를 낸다. 에러를 무시하는 이런 방법들은 `-'가 좀 더 유연하기 때문에 구식이 되버렸다.

 

에러들이 무시되어야 할 때, `-'나 `-i' 플래그 때문에, make는 에러 리턴을 성공처럼 취급한다. 단, 여러분에 그 명령이 exit한 상태 코드를 말해주는 메시지를 출력하고 에러가 무시되었다는 것을 말하는 것외는 그렇다.

 


출처: Managing Projects with make, O'REILLY 발췌

http://www.viper.pe.kr/docs/make-ko/make-ko_toc.html





%: force
        @$(MAKE) -f Makefile $@
force: ;


이것이 작동하는 방법은 패턴 규칙이 `%'와 같은 패턴을 가지고 있어서 임의의 타겟 어떤 것이든 매치된다는 것이다. 이 규칙은 `force'라는 종속물을 가지고 있도록 지정하고 있으며 이것은 타겟 파일이 이미 존재하더라도 명령들이 실행되도록 보장하기 위한 것이다. 우리는 make가 `force' 타겟을 빌드하기 위한 묵시적 규칙을 찾지 못하도록 금지하는, 빈 명령들을 주었다---그렇게 하지 않으면 `force' 자신에다 동일한 match-anything 규칙을 적용해서 종속물 루프를 만들것이다.


And

우분투 사용 총집합서

|
출처 : http://www.linuxers.net/156

[공식사이트]
http://www.ubuntu.com/

[한글사이트]
http://www.ubuntu.or.kr/wiki.php

[버젼고르기]
데스크탑: 원도우처럼 사용해 보고싶은분
서버:리눅스 서버 운영이나 공부 하실분
우분투 패키징 안내서 

[다운로드]
공식사이트 :
http://www.ubuntu.com/getubuntu/download
우분투 새로운 미러사이트.
우분투(ubuntu) CD
우분투 CD 신청 노하우.
데스크탑버전:공식사이트 : http://www.ubuntu.com/getubuntu/download
서버버젼:공식사이트 : http://www.ubuntu.com/getubuntu/download
onload_post += "var blog_extend_6=new blogInstance.WebExtend('blog_extend_6',{thumbImage : [['http://blogthumb3.naver.net/data20/2007/4/17/258/1_1-uranusk.jpg','http://blog.naver.com/uranusk?Redirect=Log&logNo=140036844717'], ['http://blogthumb3.naver.net/data17/2007/4/17/82/2_1-uranusk.jpg','http://blog.naver.com/uranusk?Redirect=Log&logNo=140036844717'], ['http://blogthumb3.naver.net/data17/2007/4/17/275/3_1-uranusk.jpg','http://blog.naver.com/uranusk?Redirect=Log&logNo=140036844717'], ['http://blogthumb3.naver.net/data19/2007/4/17/293/4_1-uranusk.jpg','http://blog.naver.com/uranusk?Redirect=Log&logNo=140036844717'], ['http://blogthumb3.naver.net/data20/2007/4/17/143/8_1-uranusk.jpg','http://blog.naver.com/uranusk?Redirect=Log&logNo=140036844717'] ]},blog_extend_CR_6,'bcl','bcr');"; function blog_extend_CR_6(){ var e = arguments[0]; e.target="_blank"; return goCR(e, 'rd', 'u='+urlencode('http://blog.naver.com/uranusk?Redirect=Log&logNo=140036844717')+'&a=blg.img&r=6&i=uranusk.140036844717'); }
네로 프로그램으로 이미지 파일 굽기.

[주의사항]
우분투 live cd로 Win XP 데이타 백업

Ubuntu is available for PC, 64-Bit and Mac architectures.
CDs require at least 256 MB of RAM.
Install requires at least 2 GB of disk space.

[설치하기]
설치가이드 : 우분투 대퍼 설치 가이드
더블 클릭으로 설치하는 유분투 리눅스  
우분투 서버 설치
우분투 데스크탑 설치기
[Ubuntu] Hoary - 우분투 리눅스 설치 가이드
우분투 리눅스 설치 가이드
하드 하나에 우분투 ubuntu 리눅스 linux와 윈도우즈 windows 서버 같이 깔기
우분투 설치하기(그림 첨부)
kt vdsl+ati X850 에서 우분투 제대로 설치하기 
컴팩v3026au에 우분투설치
우분투에서 Grub 부트로더 설치 실패기..ㅡㅡ;;;; 

[설치후]
onload_post += "var blog_extend_10=new blogInstance.WebExtend('blog_extend_10',{thumbImage : [['http://blogthumb3.naver.net/data20/2007/1/7/115/1.jpg-psknoid4u.jpg','http://blog.naver.com/psknoid4u?Redirect=Log&logNo=10012721131'] ]},blog_extend_CR_10,'bcl','bcr');"; function blog_extend_CR_10(){ var e = arguments[0]; e.target="_blank"; return goCR(e, 'rd', 'u='+urlencode('http://blog.naver.com/psknoid4u?Redirect=Log&logNo=10012721131')+'&a=blg.img&r=10&i=psknoid4u.10012721131'); }

오늘의 삽질 "우분투 & XGL & Veryl & Etc..." 
usb로 우분투 설치 성공기.
우분투 CD로 부팅 
[jwmx]윈도즈 기반의 우분투 사용 및 설치기
우분투와 Vista..
우분투 설치 한후 해야할 것들.. 
우분투 (Ubuntu) 사용하기 
[펌] 데스크탑 OS로의 우분투 간단 사용기
윈도우쟁이가 리눅스 우분투 1달 반 사용기를 남겨봅니다.
우분투 사용기 1 - 멀티 부팅~~!!
우분투 테마를 바꿔보았습니다.. 
우분투 쓰면서 느낀 장, 단점들
우분투 쓸때 제일 짜증나는 것!
우분투(Ubuntu) 6.10 "Edgy" 베타의 간단한 사용기
우분투 대퍼 사용소감!!!

[명령어]
우분투 유용한 명령어 모음
서버버젼 설치 하신분 (초보용) 명령어
종료 명령어
$sudo init 0

재부팅
$sudo init 6

[업그레이드]
우분투 7.04 업그레이드

[설정하기]
유분투(Ubuntu)리눅스 root유저로 로그인하기.. 
초급 - 우분투와 윈도우의 삼바를 이용한 폴더공유
우분투 MIDI 세팅
[펌] 우분투에서 Agere Systems의 ET131x 랜카드 인식 시키기
우분투에서 한영키사용하기
우분투 서버 - 네트워크 설정
우분투에서 RPM 패키지 설치하기.
초급 - 우분투 Raid 잡기 
우분투 feisty 한글 글꼴 문제
우분투에서 사운드가 안나올 때 
우분투 EUC-KR 설치하기
우분투 breezy 설치.
우분투(ubuntu)한영키 설정
우분투 내장랜카드(Marvell Yucon) 설치하기
우분투에서 jre 환경 바꿔주기.
초급 - 우분투 Beryl + Nvidia
우분투 사용시.... 기본 설정들~
우분투 소스 리스트
[펌]우분투에 한글 입력기 설치 리눅스
우분투에서 tftpd-hpa 설정
우분투에서의 한글설정과 바탕화면에 휴지통 등 나타내기 
[펌] 우분투 완전 초보 기본설정법
[우분투] 윈도우 글꼴 사용하기
우분투X60 밝기 조절 Fn+Home, Fn+End
우분투에서 무선 인터넷 설정 밥법입니다..
우분투, ssh에서 한글 깨짐 문제 해결하기
[설치] VMware에 우분투 설치 후 VMware Tools 설치하기
우분투 한글 설정 (nabi)
우분투 캠 사용하기
우분투 공유 폴더(윈도우)
우분투 - 한글입력기 nabi 설치
우분투 엣지 SCIM 설정과 vim 깔기, 그리고 gcc 헤더파일 설치
우분투에서 nvidia의 twinview (dual monitor) 셋팅

[활용하기]
우분투에서 한글2005 설치하기
우분투에서 ipod 사용하기
우분투 7.04 3D Desktop 환경 구성 성공!
우분투 Edgy Eft 설치.
우분투에서 윈도우 접근하기
우분투에서 와콤 타블렛 사용하기
우분투 7.04 에 vmware-server 깔기..
우분투에 XGL을 이용한 Beryl 를 설치하기 위한 문서
우분투 (Ubuntu Feisty) 에서 escript 사용하기
우분투에서 MP3 듣기.......
우분투 서버 - DNS 구축 (bind 설치)
우분투 설치 및 타블렛 설정 
리눅스(우분투 7.04) 에서 네이트온 설치하기...
우분투에 XGL을 이용한 Beryl 를 설치하기 위한 문서
[우분투] 동영상 감상하기
데비안 우분투 OS와 서버(APM) 설치
우분투 서버 - APM, FTP 설치 도우미
우분투 NFS 서버 설치
우분투 엣지 + nvidia-glx + 베릴
우분투 - root 권한 얻기 
우분투 서버 - 호스트네임(hostname) 설정
[우분투] 읽기권한 주고 ntfs 시스템 mount 하기 
비스타가 부럽잖은 우분투+XGL+Beryl 3총사
우분투에 포스트픽스(postfix) 설치
[펌]우분투, Apache+Tomcat+Mysql+php
우분투 네스팟 접속기(dapper drake)
우분투 부트로더 복구 방법
우분투에서 AVR 환경 구성하기... part 1.
우분투에서 동영상 코덱 설치 
우분투에서 소스 컴파일 방법..
우분투에서 GRUB 부트로더가 지워졌을 때
우분투에서 SUN JAVA JVM 사용하기
우분투에서 방화벽(IPTABLES)설정을 통한 인터넷 공유
우분투 코덱 설치 프로그램
우분투(ubuntu) BIND - DNS 도메인 등록 
우분투에서 telnetd 설치가 안될경우?
우분투 postgresql 설정 - ubuntu 5.10 


And

우분투에서 수도 (sudo) 사용자 추가방법, sudoers

|
우분투의 경우 설치시 기본적으로 root로긴을 허락치 않는다. 이를 대체할 sudo 명령을 주로 사용하며 root 권한으로 모든 것을 실행할 수 있으므로 필요치 않기 때문이다. 우분투 설치시에 계정을 추가하는 부분이 있는데 그때 넣어준 계정은 실제적으로 sudo 명령을 실행할 수 있는 권한을 자동적으로 부여받게 되어 있다. 이때 소속그룹admin 으로 되어 있다.

그러면 리눅스 박스를 2사람 이상이 공동으로 관리하고자 할 때 sudo  사용자를 추가해 줄 수 있는 방법은 무엇이 있을까? 리눅스 박스에서 일반사용자들의 경우 su 명령이나 sudo 명령을 거의 사용하지 않을 것이다. 따라서 이런 이유에서 수도사용자를 추가하는 방법이 몇가지 존재한다. 모로 가도 서울만 가면 된다는 말이 있듯이 해결방법은 다양한 듯 하다.

첫째, 우분투에서 사용자 추가시 새로 발급하는 계정(account)을 admin 그룹으로 넣어주는 것이다.

# sudo useradd -n -d /home/user1 -G admin user1
# sudo passwd user1
passwd:

위의 과정을 설명하면
-n : 새로운 계정을 추가하는 옵션
-d : 해당계정의 디렉토리를 만들어 주는 옵션
-G : 해당 그룹에 속하도록 하는 옵션
user1 : 발급하고자 하는 계정(account)

이렇게 하면 user1 계정은 sudo 명령을 root 권한으로 사용할 수 있게 된다.

둘째, 일반사용자를 추가한 후 /etc/group 파일을 편집하여 해당 계정 사용자의 구룹을 admin에 추가해 준다.

# sudo useradd -n -d /home/user1  user1
# sudo passwd user1
passwd :

# sudo vi /etc/group
...
(중략)
admin:x:115:isjang,user1
(중략)
....

:wq

admin 그룹의 id 는 115번이며 isjang은 우분투 설치시 생성해서 root 권한을 실행할 수 있는 이미 발급되어진 계정이다. user1 은 isjang옆에 코마(,) 로 추가해 준다.

그리고 나서 user1 으로 로긴하면 sudo 명령을 사용할 수 있게 된다.

셋째, 우분투 이외의 일반적인 리눅스 시스템에서 su 나 sudo 의 경우는 관리자 외의 일반계정 사용자들이 사용할 필요가 없는 것들이다. 그런데 그룹사용자 외에는 위 명령 자체를 실행하지 못하도록 하려면 해당 화일의 그룹을 wheel 로 변경한 다음 wheel 그룹에 사용자들을 넣어주고 그 외의 계정 사용자들은 명령어 접근 자체를 제한 시켜 시스템 보안을 높일 수 있다.

이것은 wheel 그룹을 생성하여 추가해 주는 방법인데 이때는 역시 해당되는 그룹을 추가해 넣기 위하여 visudo 명령어를 이용하여 /etc/sudoers 파일을 직접 편집하는 것이다. 이때 주의할 점은 편집시 조심해야 한다는 것이다. 잘못 편집하여 내용이 조금이라도 틀릴 경우가 발생하면 sudo를 아예 사용할 수 없는 불상사가 발생할 수 있을지도 모르기 때문이다. ^^;;

# su root
# visudo  하여 편집모드로 들어간 다음
맨 하단 부분에
%wheel ALL=(ALL) ALL 를 추가한 다음 빠져나온다.
# whoami
root
# chgrp wheel /bin/su /usr/bin/sudo  // 만일 우분투에서 sudo 를 이용하여 이 행을 실행하면 setuid 가 사라지므로 root 비밀번호를 주지 않았을 경우에는 실행하면 안된다.
# chmod o-rwx /bin/su /usr/bin/sudo
# vi /etc/group
...
wheel:x:1001:user2,user3
...

:wq


# /etc/sudoers
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults    env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL

# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
# %sudo ALL=NOPASSWD: ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
%wheel ALL=(ALL) ALL

혹시 우분투에서 위와 같이 세번 방법으로 구지 따라하다가 낭패를 보신 분들은 싱글모드로 부팅하여 root 비밀번호를 획득해야 하거나 root 비밀번호를 잃어버렸을 경우 최악의 경우 시스템을 재설치해야 할 수도 있다.

우분투 또는 리눅스에서 Grub 을 이용하여 멀티부팅을 할 경우 해당 리눅스라벨을 선택한 후 싱글모드로 부팅하기 위해서는
GRUB 메뉴에서 e 를 누르고

kernel 을 커서에 맞추고 다시 e 를 한번 더 누른다음
맨 끝줄에 single 을 타이핑 한 후 엔터키를 친다. 그리고 마지막으로
b 를 누르면 되는데 b 는 booting 의 약어다.


wheel 그룹에 대한 간단한 설명
출처 - http://www.kernel-panic.org/wiki/GroupWheel

그룹 (Wheel)

휠그룹은 무엇을 위한 것인가? 대부분 오랫동안 사용되어오면서 모호한 표현이라 생각한다. 이것은 사용자 권한을 나누기 위해 사용된다. root, 휠그룹, 그밖의 사용자로 3개의 계층으로 분류되어 있다.

보통 휠그룹은 그에 속한 그룹 사용자들만 su root 를 사용할 수 있도록 하는 기능이다. FSF(자유소프트웨어 재단) 그룹은 이 원칙에 별로 따르지 않는데 왜냐하면 그것이 수학적 알고리즘이 아니기 때문이다.

사용자를 최소로 구분하는 것은 sudo 에 의한다. 가장 많은 sudo 권한을 위한 자격으로 휠그룹 멤버쉽이라 불리는 것이 있다.

역사적으로 말하면 그것은 초기 BSD중의 하나에서 시작되었다 생각한다.

휠그룹을 만들므로써 휠의 기능을 쉽게 다시 만들 수 있으며 그리고 su 와 sudo (둘다 setuid 프로그램이다.)를 wheel 그룹으로 만들고 나서 다른 사용자에 대해서는 사용권한을 제거한다.

  # chgrp wheel /bin/su /bin/sudo
  # chown o-rwx /bin/su /bin/sudo

물론 이것은 실제적으로 정상적인 사용자들에게 su와 sudo 를 사용할 수 없게 만든다. 문제는 서버에 어떤 정상적인 사용자들이 있는가이다.

And

우분투에 메신저를 설치하다 (네이트온,MSN 등)

|
과거에 대세를 이루었던 인스턴트 메신저로는 MSN 그런데 어느순간 사람들은 SK의 무서운 저력을 보여주었던 네이트온을 선호하게 되었다. 아마도 네이트온을 통해 문자메시지와 각종 서비스를 동시에 사용할 수 있는 장점이 그렇게 만들었을 것이다. 우분투에서도 사용할 수 있는 프로그램이 있어 아래와 같이 설치하였다.

현재 내가 사용하고 있는 우분투 버젼은 8.04.1 (Hardy)  이므로 아래와 같이 메신저가 들어있는 소스가 들어 있는 링크를 넣어주어야 한다.

# sudo vi /etc/apt/sources.list  하여 맨 하단 부분에 아래 두 줄을 추가해 넣는다.

deb http://ppa.launchpad.net/pidgin-nateon/ubuntu hardy main
deb-src http://ppa.launchpad.net/pidgin-nateon/ubuntu hardy main

: wq

한 다음 닫고서

# sudo apt-get update
# sudo apt-get install pidgin-nateon

하여 네이트온을 설치한다. 프로그램 리스트에서 Pidgin 인터넷 메신저를 실행시키면 아래와 같이 나타난다.

 

여기서 추가 버튼을 누른 후 사용하고 싶은 메신저를 선택한 후 해당하는 아이디와 비밀번호를 넣어주면 된다.

 
 

위와 같이 설정되었다. 네이트온을 맨 처음 추가한 후 두번째로 MSN을 추가하였다. 마지막으로 구글토크계정을 추가하니 상당히 많은 리스트가 존재한다.

인스턴트 메신저가 한창 편리할 때는 긴급한 일을 처리할 때 요청자의 입장에서는 무척 편리하다. 해외에 있을 경우 도움 요청하기도 물론 쉽다. 그렇지만 때때로 일을 할 때 방해받고 싶지 않으므로 종종 자신을 숨기기도 한다.

대한민국 돌아가는 모습을 돌아보며

국부론을 출간한 아담 스미스의 보이지 않는 시장에 의해 세계 경제질서가 흘러가고 있다고 믿고 있었던 수많은 가리워진 진실의 실체를 서서히 깨닫는다. 신자유주의의 허상이다. 영국이 자유무역을 실행할 수 있었던 것은 이미 타국에 비해 월등한 경쟁력을 갖춘 상태에서 시작된다. 물론 타국 미국을 비롯한 독일,프랑스,일본도 마찬가지였다. 우리나라는 대표적인 보호무역과 관세로부터 국가주도형 산업을 키운 덕에 발전해 나간 대표적인 나라중 하나였다. 그런데 지금 우리나라의 경쟁력있는 부분이 얼마나 될까? 신자유주의체제안에서 전세계와 경쟁해서 이길 수 있다고 자신하는 허상을 믿고 있는 현 제도권 안의 정치인들이 무섭다. 결국 잘사는 사람들은 일부가 될 것이고 종국에는 사회 양극화를 극대화 시킬 수 있는 정책들만 쏟아져 나온다. 무역장벽을 허물면 사라지는 관세수입과 부자들의 세금에서 떼어냈던 종합부동산세의 줄어든 세 수입은 어떻게 만회할까?

결국 지난 대선에서 경제대통령으로 선택했던 그 분께 일반 서민들은 더 많은 세금을 내도록 보이지 않는 장치를 만들어 가고 있을 음지에서 활동하는 그들의 횡포를 언제까지 참아주고 기다려야 할지 모른다.

"과거에 어떤 일이 이루어졌는지를 알지 못한다면 항상 어린아이처럼 지내는 셈이다. 과거의 노력을 무시한다면 세계는 늘 지식의 유아기에 머물러 있을 것이다 (키케로)"

장하준은 나쁜 사마리아인들이라는 책에서 어린아이의 성장을 예로 들어 보호무역과 자유무역의 예를 적나라하게 보여준다. 우리 자녀를 6세부터 경쟁할 수 있도록 완전한 경쟁 체제안으로 내보낼 것인지 아니면 자신이 경쟁력을 갖출 수 있는 성인이 될 때까지 돌봐 주어야 하는지에 대한 멋진 비유를 들었다. 우리는 6세때부터(유아기) 돈벌고 경쟁력을 갖고 생존해 나갈 수 있는 기반이 마련되어 있다고 자신하다가 현재처럼 우스운 꼴을 맞이하게 되었다. 제2의 환난사태와 경제침체의 나락으로 달려가고 있다. 현재를 돌아보면서 모두가 함께 잘 살 수 있는 세상은 결코 부의 축적이 가져다 주지 않는다는 단순한 진리를 깨달아야 할 것 같다.

아직 우리는 부자나라가 아니다. 부자나라라고 착각하며 가입했던 클럽 OECD 그런데 환율 급등으로 가까스로 유지했던 1인당 국민소득 20,000 달러에서 15,000 달러대로 떨어지는 것도 시간 문제다. 지금처럼 무단 질주해 가다보면....-_-;;

And

swap 메모리를 설치후에도 설정할수 있나요?

|
두가지 방법이 있습니다.

1. Gparted 같은 유틸리티를 사용해서 파티션을 조절 하시던가
2. 스왑 파일을 만들어 두는 겁니다. 파티션을 건드리기가 꺼림직하시면 이쪽이 더 간편할겁니다. 터미널에서:

Code:
sudo su
dd if=/dev/zero of=/swapfile bs=1024k count=[메가바이트]
mkswap /swapfile
swapon /swapfile


이렇게 입력하세요. 원하는 크기의 파일을 임시로 만들어서 그걸 스왑 파일로 정의하고 스왑을 사용하게 하라는 의미입니다.

* 저 [메가바이트] 를 원하는 스왑 크기 (메가바이트 단위)로 대체하세요. 예를 들어 1기가바이트를 주려면 1024를 입력하면 되겠죠

이대로는 부팅마다 swapon /swapfile을 입력해 줘야 하니:

Code:
sudo gedit /etc/fstab


을 입력하시고 열린 파일에 이걸 추가하세요.

Code:
/swapfile none swap sw 0 0


정상적으로 적용되었는지는 터미널에서

Code:
free


를 입력해 보면 됩니다.


출처: http://ubuntuforums.org/archive/index.php/t-265051.html


And

SSH 터널링 - putty의 plink 사용예esniper

|

Contents
1 이 문서가 필요한 곳
2 필요한 것
3 방법
3.1 ssh -R 에 대해
3.2 ssh -L 에 대해
3.3 접속
4 실제의 예 1 (ssh서비스 이용하기)
4.1 my_office_pc 에서
4.2 my_home_adsl_pc 에서
5 실제의 예 2 (터미널 서비스 이용하기)
5.1 my_office_pc 에서
5.2 my_home_adsl_pc 에서
6 맺는 말
7 질문과 답변
8 토론


작성 : 김원일


[edit]1 이 문서가 필요한 곳 ¶


회사나 가정에서 작업하던 환경을 그대로 쓰고 싶지만 vpn 이나 firewall 등의 제한으로 외부에서 접근하기가 쉽지 않은 경우가 있다. proxy 가 있거나 vpn 이라면 별 다른 문제가 없을 수도 있겠으나 firewall 같은 경우 넷웍 관리자에게 요청하지 않는 이상, 또는 요청한다고 해도 그다지 쉽게 허가를 얻지 못할 것이다. vpn 이라고 해도 외부의 누군가에게 잠깐 내부의 자원을 이용하게 하기위해 자신의 vpn 접속 방법을 가르쳐 주는 것도 양심상, 보안상 그다지 권장하고 싶은 일은 아니다. 이 문서는 그러한 경우 외부에서 접근 가능한 ssh계정을 이용해 터널을 만들어 vpn, firewall 외부에서 그 안쪽으로 접근을 가능하게 하는 방법이다.


[edit]2 필요한 것 ¶


OpenSSH (ssh protcol 2 이상을 가정)
vpn 및 firewall 외부에 ssh 로 접속이 가능한 계정
임은재님이 작성하신 ssh Howto, ssh + mini proxy 등을 미리 읽어 두는 것이 도움이 된다.


[edit]3 방법 ¶


[edit]3.1 ssh -R 에 대해 ¶
ssh -R 은 원격서버의 특정 포트를 자신이 접근 가능한 서버 및 포트 (이문서에서는 vpn 안쪽의 자신의 서버 또는 작업을 하려는 서버)로 포워딩 하는 것이다. ssh -L 의 역이라고 봐도 무방하다 (ssh -L 에 대해서는 ssh mini proxy 문서를 참조하자)


vpn 또는 firewall 안쪽의 PC 에서


ssh -R port:host:hostport ssh_user@ssh_server


와 같은 명령을 사용한다.


ssh_server서버에 ssh_user라는 계정으로 접속하되 port로 지정한 포트로 들어오는 패킷을 host의 hostport로 포워딩한다는 것이다. 언뜻 알기 어렵지만 차근 차근 이해해 보자.


port : ssh_server에서 열 포트 번호다. (여기서 ssh_user가 ssh_server의 루트가 아니라면 1024번 이상의 포트번호를 지정해야 한다)
host : vpn 및 firewall 안쪽에 있는 우리가 바깥에서 사용할 서버의 ip 또는 이름이다. (꼭 안쪽에 있을 필요는 없다. ssh -R ... 명령을 내리는 자신의 컴퓨터에서 접근 가능해야 한다)
hostport : 위의 host 에서 우리가 이용하려는 서비스가 열려있는 포트 번호다. (역시 접근 가능해야 한다)


이상과 같이 하면 hostname의 loopback 주소(127.0.0.1)에서 port를 리스닝하게 된다. nestat -nl 로 확인해보라. loopback 주소로만 listening하는 것은 sshd 설정상 기본이다.
[edit]3.2 ssh -L 에 대해 ¶
이제 우리가 원하는 우회로의 반은 열린 셈이다. 나머지 반을 열어보자.


ssh -L localport:localhost:port ssh_user@ssh_server


이 명령은 vpn 또는 firewall 바깥의 환경에서 쓰이게 된다. 즉 집이나 외부업체의 회의실 또는 외딴 섬마을 학교의 pc실에서 쓰인다는 것이다.


localport : 현재 작업 중인 컴퓨터에서 열릴 포트이다. (netstat -nl 에서 Listen 중인 것으로 나타날 것이다)
localhost : 말 그대로 localhost라고 적는 것이다. 127.0.0.1 도 무방하다. 여기서 localhost 는 ssh_server의 루프백 주소를 가리킨다.
port : ssh -R 에서의 port 와 같다.


이제 모든 우회로가 열렸다!


[edit]3.3 접속 ¶


우회로를 이용하는 건 다음과 같다.


telnet localhost localport (telnet 서비스를 우회해서 접속할 경우)
http://localhost:localport/ (http 서비스의 경우)
ssh -p localport localhost (ssh 서비스의 경우)
smbclient -p localport localhost (삼바 서비스의 경우)


즉 모든 접속은 localhost로 ssh -L 에서 지정한 localport를 이용하게 된다.


[edit]4 실제의 예 1 (ssh서비스 이용하기) ¶
여기서는 실제로 명령어를 다루는 예를 들겠다. 다음과 같은 컴퓨터들이 등장한다.


my_office_pc (IP : 224.20.X.22 under Firewall)
ssh_server (IP : 210.32.X.221)
my_home_adsl_pc (IP: 61.78.X.226)


지금 시각은 오후 5:32분, 내일 오전까지 끝내야할 작업이 거의 다 끝나가지만 잔업은 하기 싫다. 집에서 작업하고 싶지만 방화벽 때문에 외부에서는 접속할 수가 없는 처지다.


[edit]4.1 my_office_pc 에서 ¶


my_office_pc ~$ ssh -R 22:localhost:22 210.32.X.221
myaccout@210.32.X.221's password: _ <-- ssh_server 패스워드 입력

ssh_server ~$ _


이제 짐을 싸고 정리한 후 퇴근한다!


[edit]4.2 my_home_adsl_pc 에서 ¶


my_home_adsl_pc ~$ ssh -L 2222:localhost:22 210.32.X.221
myaccout@210.32.X.221's password: _ <-- ssh_server 패스워드 입력
ssh_server ~$ _


다른 터미널을 열고


my_home_adsl_pc ~$ ssh -p 2222 localhost
myaccout@localhost`s password: _ <-- my_office_pc 의 패스워드 입력
my_office_pc $ _ <--- 사무실에 ssh 로 연결 되었다!!!


마무리 작업을 하고 맥주 한잔!


[edit]5 실제의 예 2 (터미널 서비스 이용하기) ¶


여기서는 실제로 명령어를 다루는 예를 들겠다. 다음과 같은 컴퓨터들이 등장한다.


my_office_pc (IP : 224.20.X.22 under Firewall,Windows XP)
ssh_server (IP : 210.32.X.221)
my_home_adsl_pc (IP: 61.78.X.226)


지금 시각은 오후 5:45분, 내일 오전까지 끝내야할 작업이 거의 다 끝나가지만 잔업은 진짜!! 하기 싫다. 집에서 작업하고 싶지만 방화벽 때문에 외부에서는 접속할 수가 없는 처지다.


[edit]5.1 my_office_pc 에서 ¶
지금의 사무실의 컴퓨터는 윈도우 환경이다. 윈도우에서는 별도의 ssh 프로그램이 필요하다.


putty (터널링이 가능한 최신 버젼)
plink (putty 의 자매 프로그램, windows console 에서 사용 가능하다. plink -R 또는 plink -L 로 unix 에서와 유사하게 사용한다.
ssh (cygwin 환경에서 사용가능)


plink 를 사용해보기로 하자.


> plink -R 3389:localhost:3389 210.32.X.221
myaccout@210.32.X.221's password: _ <-- ssh_server 패스워드 입력

ssh_server ~$ _


이제 짐을 싸고 정리한 후 퇴근한다!


[edit]5.2 my_home_adsl_pc 에서 ¶
집의 PC는 linux 또는 rdesktop 을 사용해야 한다. 이유는 MS에서 제공하는 windows용 terminal client는 별도로 IP를 확인하기 때문에 인증이 이루어지고도 사용은 불가능하다.


my_home_adsl_pc ~$ ssh -L 3389:localhost:3389 210.32.X.221
myaccout@210.32.X.221's password: _ <-- ssh_server 패스워드 입력
ssh_server ~$ _


다른 터미널을 열고


my_home_adsl_pc ~$ rdesktop localhost:3389 (포트번호는 생략가능)
//rdektop에서 my_office_pc의 윈도우 계정 패스워드 입력
//rdesktop이 시작된다.


마무리 작업을 하고 맥주 한잔!


[edit]6 맺는 말 ¶
원래는 친구 회사의 PC에서 작업을 하기 위해서 이런 방법을 생각해 보았다(어디까지나 친구 본인의 요청에 의해서). 꽤 귀찮아 보이지만 어쩔 수 없는 상황에서는 유용하리라고 생각한다. 외부에 ssh계정이 있어야 하는 단점이 있긴 하지만 그런 경우에는 각자의 집에 ssh 서비스를 이용하는 방법도 있으므로 큰 문제는 없으리라 생각한다.


[edit]7 질문과 답변 ¶
Q: IP 공유기를 사용하고 있습니다. 사설망 IP로도 접근 가능한 방법이 있나요?


A: 네. 공유기 아래의 사설망으로도 위 방법을 사용하면 가능합니다. 하지만 공유기라면 DMZ 설정이나 port forwarding이 더욱 간단하겠지요. 이 문서는 공유기나 방화벽, vpn 설정을 고칠 수 없는 일반 유저를 위한 내용입니다.


Q: 잘 사용한 후, 열어둔 터널을 닫고 싶습니다. 어떻게 해야 하나요?


A: 아~. ssh -R/-L 로 열어둔 터미널에서 나오면 되는군요.


And

ubuntu souce list update

|
deb http://kr.archive.ubuntu.com/ubuntu/ feisty main restricted universe
deb-src http://kr.archive.ubuntu.com/ubuntu/ feisty main restricted
deb http://kr.archive.ubuntu.com/ubuntu/ feisty-updates main restricted universe
deb-src http://kr.archive.ubuntu.com/ubuntu/ feisty-updates main restricted
deb http://kr.archive.ubuntu.com/ubuntu/ feisty multiverse
deb-src http://kr.archive.ubuntu.com/ubuntu/ feisty multiverse
deb http://security.ubuntu.com/ubuntu feisty-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu feisty-security main restricted
deb http://security.ubuntu.com/ubuntu feisty-security multiverse
deb-src http://security.ubuntu.com/ubuntu feisty-security multiverse

deb http://packages.ubuntu-eee.com intrepid main
deb http://ppa.launchpad.net/netbook-remix-team/ubuntu intrepid main
deb http://www.array.org/ubuntu intrepid eeepc
deb http://ppa.launchpad.net/openoffice-pkgs/ubuntu intrepid main

##--------------------
## UBUNTU REPOSITORIES
## -------------------
deb http://my.archive.ubuntu.com/ubuntu/ hardy main restricted
deb-src http://my.archive.ubuntu.com/ubuntu/ hardy main restricted
deb http://my.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
deb-src http://my.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
deb http://my.archive.ubuntu.com/ubuntu/ hardy universe
deb-src http://my.archive.ubuntu.com/ubuntu/ hardy universe
deb http://my.archive.ubuntu.com/ubuntu/ hardy-updates universe
deb-src http://my.archive.ubuntu.com/ubuntu/ hardy-updates universe
deb http://my.archive.ubuntu.com/ubuntu/ hardy multiverse
deb-src http://my.archive.ubuntu.com/ubuntu/ hardy multiverse
deb http://my.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
deb-src http://my.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
deb http://my.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
deb-src http://my.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
deb http://archive.canonical.com/ubuntu hardy partner
deb-src http://archive.canonical.com/ubuntu hardy partner
deb http://security.ubuntu.com/ubuntu hardy-security main restricted
deb-src http://security.ubuntu.com/ubuntu hardy-security main restricted
deb http://security.ubuntu.com/ubuntu hardy-security universe
deb-src http://security.ubuntu.com/ubuntu hardy-security universe
deb http://security.ubuntu.com/ubuntu hardy-security multiverse
deb http://my.archive.ubuntu.com/ubuntu/ hardy-proposed restricted main multiverse universe
deb-src http://security.ubuntu.com/ubuntu hardy-security multiverse
deb http://ppa.launchpad.net/ubuntume.team/ubuntu hardy main # Ubuntu Muslim Edition
deb-src http://ppa.launchpad.net/ubuntume.team/ubuntu hardy main # Ubuntu Muslim Edition
deb http://www.linuxmint.com/repository romeo/
deb http://tskariah.000webhost.com/ubuntu ubuntu main
deb http://ppa.launchpad.net/kubuntu-members-kde4/ubu...gutsy main
## +++ Backports & Proposed (Ubuntu Unstable) +++
deb http://archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ hardy-proposed main restricted universe multiverse
## +++ Source Repositories +++
deb-src http://archive.ubuntu.com/ubuntu/ hardy main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ hardy-updates main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu/ hardy-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
deb http://ppa.launchpad.net/kubuntu-members-kde4/ubu...hardy main
deb http://us.archive.ubuntu.com/ubuntu/ hardy main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ gutsy main restricted
deb http://us.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
##Universe
deb http://us.archive.ubuntu.com/ubuntu/ hardy universe
deb-src http://us.archive.ubuntu.com/ubuntu/ hardy universe
deb http://us.archive.ubuntu.com/ubuntu/ hardy-updates universe
deb-src http://us.archive.ubuntu.com/ubuntu/ hardy-updates universe
## Multiverse
deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ hardy multiverse
deb http://us.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
## Backports
deb http://us.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
## Canonical Partner Repository
deb http://archive.canonical.com/ubuntu hardy partner
deb-src http://archive.canonical.com/ubuntu hardy partner
deb http://security.ubuntu.com/ubuntu hardy-security main restricted
deb-src http://security.ubuntu.com/ubuntu hardy-security main restricted
deb http://security.ubuntu.com/ubuntu hardy-security universe
deb-src http://security.ubuntu.com/ubuntu hardy-security universe
deb http://security.ubuntu.com/ubuntu hardy-security multiverse
deb-src http://security.ubuntu.com/ubuntu hardy-security multiverse
## PLF REPOSITORY
deb http://packages.medibuntu.org/ gutsy free non-free
deb http://ppa.launchpad.net/reacocard-awn/ubuntu gutsy main
## +++ Medibuntu +++
deb http://packages.medibuntu.org/ hardy free non-free
deb http://packages.medibuntu.org/ feisty free non-free
deb http://ppa.launchpad.net/kubuntu-members-kde4/ubu...hardy main
deb http://playonlinux.botux.net/ hardy main
And
prev | 1 | 2 | next