2011. 8. 7. 06:38

■ cp 명령

♧ cp명령어는 파일을 새로운 이름으로 복사하거나, 새로운 디렉토리에 동일한 파일명

(복사된 파일은 새로운 시간정보를 가짐) 으로 복사할 수 있다.

cp 명령어에는 날짜 . 시간 정보를 유지하게 하거나,

재귀적으로 복사 하거나, 기존에 동일한 파일이 있는 경우 덮어 쓸지 여부를 사용자에게 확인

하도록하는 옵션들을 가지고 있다.

 

▶ cp명령을 사용한 몇 가지 예제:

$ cd ; touch index.html

$ mkdir /tmp/html

/* cp -i : 만약 /tmp/html 디렉토리에 index.html 파일이 존재하면 사용자에게 확인 */

$ cp -i index.html /tmp/html/

/* cp -l : index.html 파일이 /tmp/html디렉토리에 동일한 이름의 파일로 하드링크 됨 */

$ rm /tmp/html/index.html

$ cp -il index.html /tmp/html/

/* cp -a : /tmp/html 디렉토리에 있는 모든 파일의 소유권과 퍼미션 설정을 그대로 유지한 상태로 복사 */

$ mkdir /tmp/back

$ cp -a /tmp/html /tmp/back/

/* cp -R : 디렉토리 구조를 바탕으로 지정된 디렉토리 이하 모든 파일과 디렉토리를 재귀적으로 복사 */

$ cp -R /tmp/html /tmp/back/

 

■ dd 명령

♧ dd 명령어는 데이터를 복사하는 또 다른 방법.

리눅스 시스템은 하드웨어 디바이스를 포함해 모든 것을 파일로 간주하기 때문에

dd는 매우 강력한 명령어이다.

 

▶ null문자로 채워진 512 바이트크기의 파일을 만듬.

$ dd if=/dev/zero of=/tmp/mynullfile count=1

1+0 레코드 들어옴

1+0 레코드 나감

512 바이트 (512 B) 복사됨, 0.000108411 초, 4.7 MB/초

/dev/zeronull 문자를 만들어내는 특별한 파일.

dd 명령어는 /dev/zero파일을 입력파일로 하고, /tmp/mynullfile을 출력파일로 실행.

count는 출력파일의 블록 개수를 설정하는 옵션이고 기본적으로 하나의 블록은 512 바이트.

☞ 결과 확인 : $ od -vt x1 /tmp/mynullfile ( 파일을 8진수로 덤프하여 출력 )

 

▶ 블록사이즈를 2바이트로 설정하고 10블록(20 바이트)을 복사.

$ dd if=/dev/zero of=/tmp/mynullfile count=10 bs=2

10+0 레코드 들어옴

10+0 레코드 나감

20 바이트 (20 B) 복사됨, 0.000241805 초, 82.7 kB/초

 

▶ 마스터 IDE 드라이브의 첫 번째 파티션의 복사본을 만듬

$ sudo dd if=/dev/hda1 of=/dev/hdb2

☞ 이 명령은 하드드라이브의 일부를 덮어쓸 수 있으므로 매우 조심스럽게 사용

 

▶ 마스터 IDE 드라이브의 첫 번째 파티션에 대한 압축된 백업 파일을 만듬

$ sudo umount /dev/hda1

$ sudo dd if=/dev/hda1 | gzip > bootpart.gz

 

▶ 마스터 IDE 하드드라이브의 마스터 부트 레코드(MBR)를 mymbrfile파일로 복사

$ dd if=/dev/hda of=mymbrfile bs=512 count=1

 

▶ CD나 DVD로부터 ISO 이미지 복사본 생성

$ dd if=/dev/cdrom of=whatever.iso

☞ 우분투는 /dev/cdrom뿐만 아니라 /dev/cdrw/dev/dvd 디바이스 파일도 생성

 

▶ CD 또는 DVD로부터 생성한 ISO 이미지 파일을 USB 디스크로 복사

$ sudo dd if=whatever.iso of=/dev/sdb1

(USB 디스크는 /dev/sdb1과 같은 장치파일로 나타날 것이다)

☞ 이 명령은 파일 내에 있는 데이터를 바이너리 복사하기 때문에

의도와 다른 결과를 가져올 수 있으므로 주의

 

 

맨 페이지(man page) 참조 : man cp, man dd, man 4 null

Posted by devanix
2011. 8. 7. 05:25

♧ 파일시스템 이동에 사용되는(cd, pwd, pushd, popd ..등) 이러한 명령어가 가진 조금 덜 알려진 옵션에 초점.

 

▶ cd 명령을 사용한 몇 가지 예제:

$ cd

홈 디렉토리 이동

$ cd $HOME

홈 디렉토리 이동

$ cd ~

홈 디렉토리 이동

$ cd ~devanix devanix

유저의 홈 디렉토리로 이동

$ cd -

이전에 작업한 디렉토리로 이동

$ cd $OLDPWD

이전에 작업한 디렉토리로 이동

$ cd ~/public_html

홈 디렉토리의 public_html 디렉토리로 이동

$ cd ..

현재 디렉토리의 상위(부모) 디렉토리로 이동

$ /usr/bin

루트 디렉토리에서 usr/bin 디렉토리로 이동

$ cd usr/bin

현재 디렉토리 밑에 있는 usr/bin 디렉토리로 이동

 

▶ 심볼릭 링크를 생성하고, 링크된 디렉토리가 어떻게 표현되는지 보여주는 몇 가지 예제:

$ cd $HOME

/* 홈 디렉토리에서 /tmp 디렉토리를 향하는 심볼릭 링크 생성 */

$ ln -s /tmp tmp-link

/* ls -l 출력하여 심볼릭 링크가 가리키는 곳을 확인 */

$ ls -l tmp-link

lrwxrwxrwx 1 devanix devanix 4 2011-08-07 04:56 tmp-link -> /tmp

/* tmp-link/로 이동 */

$ cd tmp-link/

/* 현재 디렉토리 확인 */

$ pwd

/home/devanix/tmp-link

/* -P : 심볼릭 링크된 디렉토리에서 고정된 위치를 기준으로 pwd 출력 */

$ pwd -P

/tmp

/* -L : 링크된 위치를 기준으로 pwd 출력 */

$ pwd -L

/home/devanix/tmp-link

/* cd -L역시 pwd -L과 같이 링크된 기준에서 상위디렉토리(..) 이동 */

$ cd -L ..

$ pwd

/home/devanix

$ cd tmp-link

/* cd -P 역시 pwd -P와 같이 목적지의 고정된 위치를 기준으로 상위디렉토리(..) 이동 */

$ cd -P ..

$ pwd

/

 

 

♧ bash는 작업 디렉토리 목록을 기억할 수 있다.

이 목록은 이전에 방문했던 디렉토리로 돌아가려는 경우 유용 하다.

저장된 목록은 스택(stack)의 형태로 구성되어 있기 때문에

pushdpopd 명령어를 사용하여 디렉토리를 추가하거나 제거할 수 있다.

 

▶ pushd와 popd 명령어 사용 예제:

$ pwd

/home/devanix

$ pushd /usr/share/man/

/usr/share/man ~

$ pushd /var/log/

/var/log /usr/share/man ~

$ dirs

/var/log /usr/share/man ~

$ dirs -v

0 /var/log

1 /usr/share/man

2 ~

$ popd

/usr/share/man ~

$ pwd

/usr/share/man

$ popd

~

$ pwd

/home/devanix

dirs, pushd, popd 명령어는 스택에 저장된 디렉토리를 순서대로 저작하는데 사용될 수 있다.

pushd -0은 스택에 있는 마지막 디렉토리를 스택의 제일 위에 넣는다(현재 디렉토리로 만든다)

pushd -1은 스택에 있는 맨위의 디렉토리를 스택의 제일 마지막에 넣는다(pushd -0과 반대)

pushd -2 명령은 스택 밑에서 세 번째에 위치한 디렉토리를 스택 제일 위에 넣는다.

Posted by devanix
2011. 8. 7. 03:05

리다이렉션(Redirection)

♧ 명령이 실행되기에 앞서 쉘에 의해 특별하게 해석되는 표시를 사용하여

입력과 출력을 방향 전환 또는 리다이렉트 할 수 있다.

 

stdin

키보드 (표준입력, 0)

stdout

모니터 (표준출력, 1)

stderr

모니터 (에러출력, 2)

>

출력 리다이렉션 (stdout 만을 보냄)

<

입력 리다이렉션 (stdin 파일로부터 데이터를 받음)

>>

추가 출력 리다이렉션 (새로 덮어쓰지 않고 추가)

2>

표준에러 리다이렉션 (stderr 만을 보냄)

&>word

>& word

>word 2>&1

표준 출력과 표준에러를 동시에 리다이렉트 함

 

▷ 표준출력은 파일 output.txt로 리다이렉트

$ ls /tmp /tmmp > output.txt

ls: /tmmp에 접근할 수 없습니다.: 그런 파일이나 디렉터리가 없습니다

 

▷반대로 표준에러를 error.txt 파일에 리다이렉트.(표준출력은 그대로 화면 출력)

$ ls /tmp /tmmp 2> errors.txt

/tmp:

keyring-QC9vEx pulse-2L9K88eMlGn7 rsync_1007

orbit-devanix pulse-PKdhtXMmr18n ssh-jbzyRBjE1162

 

▷ 앞의 두 예제를 합쳐놓은 것.

$ ls /tmp /tmmp 2> errors.txt > output.txt

/* cat으로 errors.txt 와 output.txt 출력 */

$ cat errors.txt

ls: /tmmp에 접근할 수 없습니다.: 그런 파일이나 디렉터리가 없습니다

$ cat output.txt

/tmp:

keyring-QC9vEx

orbit-devanix

pulse-2L9K88eMlGn7

pulse-PKdhtXMmr18n

rsync_1007

ssh-jbzyRBjE1162

 

▷ 두 스트림(stdout, stderr) 출력을 모두 everything.txt 파일에 쓰도록 함.

$ ls /tmp /tmmp > everything.txt 2>&1

/* cat으로 everything.txt 출력 */

$ cat everything.txt

ls: /tmmp에 접근할 수 없습니다.: 그런 파일이나 디렉터리가 없습니다

/tmp:

keyring-QC9vEx

orbit-devanix

pulse-2L9K88eMlGn7

pulse-PKdhtXMmr18n

rsync_1007

ssh-jbzyRBjE1162

 

▷ 두 개의 그레이터 댄(>>) : 새로 덮어쓰지 않고 추가 되도록 하기

$ ls /tmp >> output.txt

 

▷ 에러 출력을 화면에 출력 하지 않기 (비트버킷 파일(/dev/null) 보내기)

$ ls /tmp /tmmp 2> /dev/null

/tmp:

keyring-QC9vEx pulse-2L9K88eMlGn7 rsync_1007

orbit-devanix pulse-PKdhtXMmr18n ssh-jbzyRBjE1162

 

/etc/hosts 파일을 mail 명령어의 표준 입력 스트림으로 보내기

$ mail chris < /etc/hosts

 

 

■ 파이프( | )를 사용

♧ 하나의 프로세스 출력을 파일이 아닌 다른 프로세스로 리다이렉트.

 

▷ ls명령의 표준출력이 파이프를 통해 sort 명령어로 보내져 실행결과가 정렬되어 출력.

$ ls /tmp | sort

▷ 파이프 리다이렉션을 조합하여 ls 명령어의 표준출력은 정렬되고 에러출력은 비트버킷(/dev/null)으로 비운다.

$ ls /tmp /tmmp 2> /dev/null | sort

▷ 그밖에 다양한 활용.

/* 설치되어 있는 모든 패키지 에서 sql 문자열이 포함되어 있는 패키지 개수 */

$ dpkg-query -l | grep -i sql | wc -l

/* Firefox 문자를 포함하고 있는 프로세스 출력 */

$ ps auwx | grep firefox

/* 프로세스 목록 한 화면씩 출력 */

$ ps auwx | less

/* 순수하게 맨 페이지 경로만을 출력 */

$ whereis -m bash | awk '{print $2}'

 

 

■ 작은 인용부호( ` )를 사용

♧ 인용부호로 묶인 명령어의 실행결과를 나머지 명령어의 입력으로 사용

/* ps 명령어의 전체경로를 찾은 후에 이 명령어를 포함하고 있는 패키지를 찾음 */

$ dpkg-query -S `which ps` → dpkg-query -S /bin/ps

/* bash 명령어의 전체경로를 찾아 해당 명령어의 상세 목록을 보여줌 */

$ ls -l `which bash` → ls -l /bin/bash

☞ 작은 인용부호( ` )는 키보드 느낌표(!) 왼쪽에 있음.

 

 

■ xargs명령을 이용

♧ 하나의 명령의 실행결과를 다른 명령어의 인자로 넘겨주기

 

▷ ls명령의 /bin/b*의 실행결과는 dpkg-qeury -S 명령어의 인자로 전달

$ ls /bin/b* | xargs -t dpkg-query -S

dpkg-query -S /bin/bash /bin/bunzip2 /bin/busybox /bin/bzcat /bin/bzcmp /bin/bzdiff /bin/bzegrep /bin/bzexe /bin/bzfgrep /bin/bzgrep /bin/bzip2 /bin/bzip2recover /bin/bzless /bin/bzmore

bash: /bin/bash

bzip2: /bin/bunzip2

busybox-static: /bin/busybox

bzip2: /bin/bzcat

bzip2: /bin/bzcmp

bzip2: /bin/bzdiff

bzip2: /bin/bzegrep

bzip2: /bin/bzexe

bzip2: /bin/bzfgrep

bzip2: /bin/bzgrep

bzip2: /bin/bzip2

bzip2: /bin/bzip2recover

bzip2: /bin/bzless

bzip2: /bin/bzmore

-t 옵션을 적용하면 명령어 실행시 화면에 좀 더 상세한 정보가 출력.

 

▷ -I{}를 이용하여 ls명령이 출력하는 각 문자열을 하나씩 dpkg-query 명령어의 입력으로 보냄.

$ ls /bin/b* | xargs -t -I{} dpkg-query -S {}

dpkg-query -S /bin/bash

bash: /bin/bash

dpkg-query -S /bin/bunzip2

bzip2: /bin/bunzip2

dpkg-query -S /bin/busybox

busybox-static: /bin/busybox

dpkg-query -S /bin/bzcat

…[중략]…

☞ 실행결과에서 볼 수 있듯이 dpkg-query -S 명령어는

ls로부터 인자로 전달된 각 개별 문자열을 사용해 반복적으로 실행.

 

 

※ 맨 페이지(man page) 참조 : man bash, man xargs

Posted by devanix
2011. 8. 6. 23:49

■ 명령어 감시

♧ 만약 명령어의 출력이 어떻게 변화 하는지 지켜봐야 한다면 watch 명령어를 사용.

 

▶ 시스템 평균 부하에 대한 정보를 감시해야 하는 경우

$ watch 'cat /proc/loadavg'

Every 2.0s: cat /proc/loadavg Sat Aug 6 23:18:58 2011

 

0.00 0.01 0.05 1/237 6626

watch 명령으 cat 명령어를 매 2초마다 실행. <Ctrl + c> = 종료

▷ -n <초> 옵션 : 재실행 간격을 10초로 변경

$ watch -n 10 'cat /proc/loadavg'

▷ -d 옵션 : 화면이 업데이트될 때 이전 결과와의 차이점을 강조

$ watch -d 'cat /proc/loadavg'

Every 2.0s: cat /proc/loadavg Sat Aug 6 23:18:58 2011

 

0.00 0.01 0.05 1/237 6739

 

 

■ 파일 감시

watch 명령어를 사용하여 파일의 크기를 지켜볼 수도 있다.

$ watch 'ls -l mydownload.iso'

tail 명령어를 사용하면 시간이 지남에 따라 변화하는 일반 텍스트 파일의 내용을 지켜볼 수 있다.

/var/log/messages 파일에 새로운 메시지가 추가되는 것을 관찰

$ tail -f /var/log/messages

 

자세한 내용은 man page 참조 : man watch, man tail

Posted by devanix
2011. 8. 6. 23:28

■ bash 쉘 사용자 환경

♧ 텍스트 기반의 로그인 환경을 이용하든 터미널 윈도우를 이용하든 관계없이,

쉘이 실행된 후에는 쉘을 시작한 유저를 위한 환경으로 초기화 된다.

 

- bash 쉘은 몇 개의 파일을 통해 사용자 설정을 지원하며,

스타트업(startup) 파일초기화 파일 등 두가지 형태를 가짐.

- bash는 모든 로그인 쉘에 대해서 스타트업 파일을 실행.

이 파일은 사용자의 로그인 전체에 걸쳐 적용되는 설정내용을 정의하고 있다.

- bash는 또한 대화식으로 실행되는 쉘을 위해 초기화 파일들을 실행하는데,

이 파일들은 쉘 스크립트로 실행되지 않는다.

 

▶ 스타트업(startup) 파일

시스템 전역 초기화 파일 : /etc/profile

개인 초기화 파일 : .bash_profile > .bash_login > .profile

(3개 파일이 동시에 존재 할경우 우선순위 별로 하나의 설정 파일만 실행)

※ 다른 리눅스 배포판에서는 시스템 전체에 적용되는 설정 파일을

/etc/profile/etc/profile.d/ 디렉토리에 저장.

 

▶ 초기화 파일

시스템 전역 초기화 파일 : /etc/bash.bashrc

개인 초기화 파일 : ~/.bashrc

※ 다른 리눅스 배포판에서는 시스템 전체에 영향을 주는 초기화 파일로

/etc/bashrc 를 사용

 

▶ 쉘이 종료될 때: ~/.bash_logout

(파일에 기술되어 있는 모든 명령어들을 실행)

 

 

■ bash쉘 history 기능

♧ 히스트로는 과거에 실행했던 명령들을 보거나, 변경하여 재사용할 수 있도록 해주는 기능.

 

$HISTFILE : 히스토리 파일 설정

$ echo $HISTFILE

/home/devanix/.bash_history

bash는 실행될 때 ~/.bash_history 파일에 기록되어 있는 히스토리를 메모리로 읽어 들임.

bash 세션이 유지되는 동안에 실행되는 명령들은 모두 메모리에 있는 히스토리에 추가.

$HISTSIZE : bash 세션동안 히스토리로 저장되는 명령어의 수

$ echo $HISTSIZE

1000

$HISTFILESIZE : 히스토리 파일에 실제적으로 저장되는 명령어의 수

$ echo $HISTFILESIZE

1000

 

▶ history[n] 명령을 실행

$ history 5

975  mkdir extras

976   mv *doc extras/

977   ls -CF

978   vi house.txt

979   history

☞ 숫자와 함께 실행하면 최근 실행했던 명령어를 숫자만큼 보여줌.

 

▶ bash 히스토리로부터 명령어를 호출하여 다시 실행시키는 몇 가지 방법들

$ !!

이전에 실행한 명령을 다시 실행

$ !997

ls -CF

히스토리에 저장된 997번 명령을 실행

$ !997 *doc

히스토리에 저장된 997번 명령에 *doc를 추가.

ls -CF *doc

 

$ !?CF?

ls -CF *doc

이전에 실행된 명령중에 CF문자열을 포함한 명령을 실행

$ !ls

ls -CF *doc

이전에 실행한 ls명령을 실행

$ !ls:s/CF/l

이전에 실행된 ls 명령에서 CF문자열을 l로 대체하여 실행

ls -l *doc

 

 

▶ fc명령어를 이용한 명령어 히스토리 편집

$ fc 978

Edit 978번 명령을 편집한 후에 실행

$ fc

Edit 이전에 실행된 명령을 편집한 후에 실행

$ fc -e /usr/bin/nano 989

989번 명령을 나노 에디터로 편집

(다른 에디터를 사용하고 싶다면 $FCEDIT 환경변수 이용 : 예) $ FCEDIT=vi)

 

▶ 히스토리 문자열을 검색 : <Ctrl + r>

( <Ctrl + r>반복적으로 누르면 히스토리 목록열 역방향으로 검색)

 

 

■ 알리아스(alias) 사용

♧ alias 명령어를사용하여 알리아스를 설정하너가 기존의 알리아스 설정을 볼 수 있다.

일부 알리아스는 앞에서 시스템 또는 사용자 쉘 초기화 파일에 미리 설정 되어 있다.

 

▶ 현재 설정되어 있는 알리아스를 보기

$ alias

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

alias egrep='egrep --color=auto'

alias fgrep='fgrep --color=auto'

alias grep='grep --color=auto'

alias l='ls -CF'

alias la='ls -A'

alias ll='ls -alF'

alias ls='ls --color=auto'

 

▶ 현재 bash 세션에서 자신이 원하는 알리아스 정의

$ alias la='ls -la'

(~/.bashrc 파일에 앞의 내용을 추가하면, 새로운 bash 세션이 실행될 때마다 적용)

 

▶ 현재 bash 세션에서 알리아스 제거

$ unalias la

이전에 만들어진 알리아스 la 명령어 제거

$ unalias -a

만들어져 있는 모든 알리아스 해제

Posted by devanix
2011. 8. 6. 20:43

♧ 우분투가 멀티유저 모드(런 레벨 2, 3, 5)로 부팅되었을 때,

텍스트 기반 로그인 환경에서 [ tty1 ~ tty6 ]으로 알려진 6개의 가상 콘솔(Virtual console)이 생성.

X 윈도우 시스템이 실행중이라면, X는 가상 콘솔 7에서 실행.

X GUI환경에서 → 텍스트 가상 콘솔로 전환 :

< Ctrl+Alt+F1 > ~ < Ctrl+Alt+F6 >

텍스트 가상 콘솔에서의 이동 :

< Alt+F1 > ~ < Alt+F6 >

텍스트 가상 콘솔 → X GUI 환경 전환 :

< Alt+F7 >

 

▶ 각각의 가상 터미널은 getty 프로세스가 관리.

$ ps awx | grep -v grep | grep getty

675

tty4

Ss+

0:00

/sbin/getty

-8 38400

tty4

683

tty5

Ss+

0:00

/sbin/getty

-8 38400

tty5

397

tty2

Ss+

0:00

/sbin/getty

-8 38400

tty2

702

tty3

Ss+

0:00

/sbin/getty

-8 38400

tty3

712

tty6

Ss+

0:00

/sbin/getty

-8 38400

tty6

4004

tty1

Ss+

0:00

/sbin/getty

-8 38400

tty1

 

▷ 첫 번째 콘솔에 로그인한다.(이 사용자 로그인은 getty에 의해 관리되며, 바로 bash 쉘을 활성화)

$ ps awx | grep -v grep | grep tty

675

tty4

Ss+

0:00

/sbin/getty

-8 38400

tty4

683

tty5

Ss+

0:00

/sbin/getty

-8 38400

tty5

397

tty2

Ss+

0:00

/sbin/getty

-8 38400

tty2

702

tty3

Ss+

0:00

/sbin/getty

-8 38400

tty3

712

tty6

Ss+

0:00

/sbin/getty

-8 38400

tty6

1111

tty7

Ss+

0:19

/usr/bin/X :0

-nr -verbose -auth …[생략]…

3794

tty1

Ss

0:00

/bin/login --

 

3888

tty1

S

0:01

-bash

 

 

☞ 개별 가상 콘솔은 /etc/event.d 디렉토리에 있는 tty1, tty2 …등의 콘솔 스크립트 파일을 통해 설정.

☞ 대부분의 다른 리눅스 배포판에서는 /etc/inittab 하나의 파일로 콘솔을 설정.

/etc/inittab 파일은 시스템 초기화를 담당하는 init 데몬이 사용하는 설정파일로,

우분투 리눅스에서는 init 프로그램이 upstart라는 새로운 프로그램으로 교체되었다.

upstart 프로그램은 /etc/event.d 디렉토리에 있는 설정파일들을 사용하고 있다.

 

※ 버전의 차이인지 패포판의 차이인지는 확인 못했으나 주분투11.04(Xubuntu) 같은 경우

/etc/event.d 이나 /etc/inittab 은 존재 하지 안았고 /etc/init/tty[숫자].conf 로 존재하였다.

맨 페이지 검색 : man upstart 으로 참조

 

▷ /etc/init/tty1.conf 내용

# tty1 - getty

#

# This service maintains a getty on tty1 from the point the system is

# started until it is shut down again.

 

start on stopped rc RUNLEVEL=[2345]

stop on runlevel [!2345]

 

respawn

exec /sbin/getty -8 38400 tty1

Posted by devanix
2011. 8. 6. 19:14

♧ 데비안 패키지를 만드는데 사용되는 .deb 파일을 재빌드하면, 현재 사용하고 있는

소프트웨어를 좀 더 유용하게 활용할 수 있다(md5sum 파일을 포함 등…).

 

① 재빌드 하기위해 피캐지 다운로드

$ aptitude download rsync

Get:1 http://ftp.daum.net/ubuntu/ natty/main rsync i386 3.0.7-2ubuntu3 [285 kB]

Fetched 285 kB in 0초 (1,773 kB/s)

 

② 다운로드 받은 .deb 파일에서 패키지 내용과 제어파일들을 풀어 놓는다.

$ sudo dpkg -x rsync_3.0.7-2ubuntu3_i386.deb /tmp/rsync_$RANDOM

$ sudo dpkg -e rsync_3.0.7-2ubuntu3_i386.deb /tmp/rsync_2752/

$ cd /tmp/rsync_2752/

$ ls -lrt

합계 40

-rwxr-xr-x 1  root root    494      2011-04-08 23:31   prerm

-rwxr-xr-x 1  root root    113      2011-04-08 23:31   postrm

-rwxr-xr-x 1  root root    712     2011-04-08 23:31   postinst

drwxr-xr-x 4 root root    4096   2011-04-08 23:32   usr

drwxr-xr-x 4 root root    4096   2011-04-08 23:32   etc

-rw-r--r-- 1   root root    37        2011-04-08 23:32   conffiles

-rw-r--r-- 1  root root     901      2011-04-08 23:32   control

-rw-r--r-- 1  root root    1676    2011-04-08 23:32   md5sums

$RANDOM 디렉토리는 실행 될 때마다 랜덤한 숫자가 출력되므로 사용자마다 다를 것.

/tmp/rsync_<탭키> 누르면 자동으로 찾을 수 있다.

 

③ 새로운 .deb 파일을 만들기 위해서 dpkg의 포맷에 맞는 패키지 디렉토리 구조 설정.

/* rsync_3.0.7.2cn3/DEBIAN이라는 이름의 하위 디렉토리 생성후 설치 파일들을 이동 */

$ sudo mkdir -p rsync_3.0.7-2cn3/DEBIAN

$ sudo mv con* md5sums post* prerm rsync_3.0.7-2cn3/DEBIAN/

/* 또한 etc/와 usr/ 디렉토리 역시 rsync_3.0.7-2cn3로 옮김 */

$ sudo mv usr etc rsync_3.0.7-2cn3/

 

④ 만약 md5sums 파일이 없을 경우 : 이전 챕터(Chap2 #06)에서

[누락된 md5sum 생성 & 체크]를 참조하여 md5sums 파일을 만들어

DEBIAN 하위 디렉토리에 md5sum이라는 이름으로 이동 시킴.

(이는 debsums 검사에 사용할 수 있도록 md5sum 파일을 패키지에 포함시키는 작업)

$ sudo mv /var/lib/dpkg/info/rsync.md5sums rsync_3.0.7-2cn3/DEBIAN/md5sums

 

⑤ 제어 파일을 편집하여 필요한 정보를 변경

$ sudo vi rsync_3.0.7-2cn3/DEBIAN/control

Package: rsync

Version: 3.0.7-2cn3

Architecture: i386

…[중략]…

Description: Modified by CN 2011-08-06 to include md5sums.

fast remote file copy program (like rcp)

…[중략]…

md5sums 파일이 포함된 새rsync 패키지가 기존 패키지와 동일한 버전으로 설치될 경우,

이들 두 버전을 구분할 수 없게 되는 등의 문제가 발생할 수 있다.

이는 시스템 관리 측면에서 매우 큰 문제이다.

따라서 텍스트 편집기(vi등)를 이용해 제어 파일을 열고 Version필드를 변경하도록 한다.

(Version 단어 다음에 콜론이 붙은 형태는 헤더 필드를 의미하므로 변경되지 않도록 주의)

정보 필드는 이러한 헤더 필드 다음에 따라오는데, 패키지 제어 파일 서식은 매우 까다롭기 때문에

콜론 문자 다음에 불필요한 공백문자나 줄 바꿈 문자가 들어가지 않도록 관리한다.

Description: 필드는 패키지에 대해 좀 더 상세한 정보를 제공하는 필드이다.

(fast remote… 구문 바로 이전의 공백문자에 주의.)

이 공백문자는 dpkg가 여러 라인의 헤더와 설명문을 구분할 수 있도록 알려주는 특별한 의미를 가진 포맷이다.

만약 이 설명문이 여러 라인에 걸쳐 기술된다면 모든 라인 앞에 공백문자를 하나씩 입력.

 

⑥ dpkg -b 옵션을 이용해 새로운 패키지를 빌드

$ sudo dpkg -b rsync_3.0.7-2cn3/

dpkg-deb: 경고: 'rsync_3.0.7-2cn3//DEBIAN/control'에 사용자 정의 필드

`Original-Maintainer'이(가) 들어 있습니다

dpkg-deb: 경고: 컨트롤 파일과 관련된 1개 경고를 무시합니다

 

dpkg-deb: `rsync' 패키지 빌드하는 중입니다 (`rsync_3.0.7-2cn3.deb'에서).

☞ (사용자 정의 필드 관련하여 패키지 담당자에 대한 경고 메시지는 무시해도 무방하다)

 

⑦ dpkg -I 옵션을 이용해 새 패키지에 대한 정보 확인

$ dpkg -I rsync_3.0.7-2cn3.deb

new debian package, version 2.0.

size 284678 bytes: control archive= 2121 bytes.

37 bytes, 2 lines conffiles

944 bytes, 21 lines control

1676 bytes, 23 lines md5sums

712 bytes, 30 lines * postinst #!/bin/sh

113 bytes, 8 lines * postrm #!/bin/sh

494 bytes, 30 lines * prerm #!/bin/sh

Package: rsync

Version: 3.0.7-2cn3

Architecture: i386

…[중략]…

 

⑧ 시스템에 새로 만들어진 rsync 패키지를 설치 & 확인

$ sudo dpkg -i rsync_3.0.7-2cn3.deb

dpkg: 경고: rsync 패키지를 3.0.7-2ubuntu3 버전에서 3.0.7-2cn3 버전으로 다운그레이드.

(데이터베이스 읽는중 ...현재 170333개의 파일과 디렉터리가 설치되어 있습니다.)

rsync 3.0.7-2ubuntu3 패키지를 대체할 준비하는 중입니다 (rsync_3.0.7-2cn3.deb 사용) ...

대체되는 rsync 패키지를 푸는 중입니다 ...

rsync (3.0.7-2cn3) 설정하는 중입니다 ...

man-db에 대한 트리거를 처리하는 중입니다 ...

ureadahead에 대한 트리거를 처리하는 중입니다 ...

ureadahead will be reprofiled on next reboot

 

/* md5sum 파일들을 바탕으로 패키지 파일 검사*/

$ debsums rsync

/usr/bin/rsync OK

/usr/share/doc/rsync/examples/rsyncd.conf OK

/usr/share/doc/rsync/examples/logrotate.conf.rsync OK

 

/* 새 버전이 정상적으로 설치되었는지 rsync 패키지 정보 확인 */

$ dpkg -l rsync

희망상태=알수없음(U)/설치(I)/지우기(R)/깨끗이(P)/고정(H)

| 상태=아님(N)/설치(I)/설정(C)/풀림(U)/절반설정(F)/일부설치(H)/트리거대기(W)/

|  /     트리거밀림(T)

|/ 오류?=(없음)/다시설치필요(R) (상태, 오류가 대문자=불량)

||/ 이름 버전 설명

+++-=================-=================-==================================================

ii      rsync                              3.0.7-2cn3                     Modified by CN 2011-08-06 to include md5sums.

☞ 이 실습은 사용자 정의 패키지를 만들기 위한 기본적인 부분만을 다룬 것으로,

시스템 해킹을 위해 필요한 실제 작업내용은 포함하지 않았다. 그렇지만, 다음 예제에서 볼 수 있듯이

이렇게 만들어진 패키지도 역시 보통의 데비안 패키지와 같이 설치되고 동작한다.

물론 추가적으로 debsums 작업도 가능해졌다.

(dpkg가 다운그레이드에 대해 말해주므로 주의)

 

 

데비안 바이너리 패키지 만들기 하우투 문서 :

http://www.tldp.org/HOWTO/Debian-Binary-Package-Building-HOWTO

Posted by devanix
2011. 8. 6. 05:46

♧ 시스템에 설치되어 있지만 정상적으로 동작하지 않거나 실행조차 되지 않는

바이너리 파일이나 패키지를 만나는 경우. 불안정한 네트워크나 전력 환경 등의

여러 가지 원인으로 인해 패키지가 훼손될 수 있다.

또는 악의적인 의도로 조작한 버전으로 피해를 입힐 목적으로 교체하려고 노력할 때

패키지 속에 포함된 정보와 실제 파일시스템에 존재하는 파일들을 검사해볼 필요가 있다.

 

debsums 프로그램은 /var/lib/dpkg/info 디렉토리에 있는 md5sum 파일을 바탕으로

모든 설치된 패키지의 MD5 검사를 수행할 수 잇는 데비안 기반의 시스템 유틸리티이다.

 

▷ 설치 : $ sudo aptitude install debsums

 

▶ debsums의 일반적 옵션

debsums 명령

내 용

debsums -a

모든 파일들을 검사한다(기본적인 설정파일들을 포함)

debsums -e

패키지 설정 파일들만 검사.

debsums -c

변경된 파일 목록만 표준출력을 통해 보여준다.

debsums -l

md5sum 정보를 가지고 있지 않은 파일들을 보여준다.

debsums -s

에러가 발생한 목록만 보여준다.

debsums <package names>

주어진 패키지에 대한 검사를 수행.

 

 

▷ 별다른 옵션 없이 debsums 명령어만 실행할 경우. (시스템에 있는 모든 파일 검사)

$ debsums

/usr/bin/acpi

/usr/share/man/man1/acpi.1.gz

/usr/share/doc/acpi/AUTHORS

…[중략]…

debsums: no md5sums for bsdutils

debsums: no md5sums for bzip2

debsums: no md5sums for cdrecord

…[중략]…

/usr/share/locale-langpack/en_AU/LC_MESSAGES/adduser.mo

/usr/share/locale-langpack/en_AU/LC_MESSAGES/alsa-utils.mo

…[중략]…

 

OK

OK

OK

 

 

 

 

 

REPLACED

OK

☞ 성공하면 오른쪽에 OK 상태 표시.

md5sum 정보가 일치하지 않을 경우 : FAILED 상태 표시.

다른 패키지 파일에 대체 되었을 경우: REPLACE 상태 표시.

 

-a옵션 : 각각의 패키지에서 배포한 설정파일이 변경되었는지 여부 검사

$ debsums -a

/usr/bin/acpi

/usr/share/man/man1/acpi.1.gz

/usr/share/doc/acpi/AUTHORS

…[중략]…

 

OK

OK

OK

 

-e옵션 : 다른 것은 모두 무시하고 오직 설정파일만 검사

$ debsums -e

…[중략]…

/etc/X11/Xresources/x11-common

/etc/X11/Xsession

/etc/X11/rgb.txt

…[중략]…

 

 

OK

FAILED

OK

☞ 의도하지 않았거나 부주의하게 수정된 설정파일은 없는지 검사할 수 있는 좋은 방법.

 

-c옵션 : 시스템에서 변경된 파일만 표준 출력을 통해 보여줌

$ debsums -c

debsums: no md5sums for at

debsums: no md5sums for base-files

debsums: no md5sums for bc

…[중략]…

☞ 위의 명령 실행결과에서 파일들에 대한 md5sum 정보가 없다는 것을 알 수 있다.

 

-l옵션 : md5sum 정보가 없는 파일 목록을 확인

$ debsums -l

binutils

e2fslibs

g++

gcc-4.5-base

…[중략]…

 

-s옵션 : 에러가 발생할 경우에만 출력

$ debsums -s

debsums: no md5sums for at

debsums: no md5sums for base-files

debsums: no md5sums for bc

…[중략]…

☞ 에러가 발생하지 않는다면 별다른 출력 없이 조용히 실행.

 

▷ 해당 패키지에 한해서 검사

$ debsums coreutils

/bin/cat

/bin/chgrp

/bin/chmod

…[중략]…

 

OK

OK

OK

☞ 해당 패키지가 가진 md5sum 파일에 기술된 파일 목록에 대해서만 검사를 수행.

이 파일은 /var/lib/dpkg/info 디렉토리에서 찾을 수 있다.

☞ 만약 패키지가 md5sum 파일을 가지고 있지 않다면 에러 발생.

$ debsums binutils

debsums: no md5sums for binutils

 

 

[ binutils 패키지에서 누락된 md5sum 데이터들을 생성&체크 ]

md5sum 데이터들을 생성(dpkg, md5sum과 약간의 쉘 프로그래밍 조합 활용)

$ for file in `dpkg -L binutils | grep ^/`; do

> test -f "$file" && md5sum "$file";

> done > binutils.md5sums

추후 md5sum 검사가 필요할 때에 md5sum -c 옵션과 해당 데이터베이스 파일명을 지정.

$ md5sum -c ./binutils.md5sums

/usr/share/man/man1/ar.1.gz: 성공

/usr/share/man/man1/as.1.gz: 성공

/usr/share/man/man1/elfedit.1.gz: 성공

…[중략]…

 

debsums에서 binutils.md5sums 파일을 사용하기 위해서는 문제가 발생할 수 있는 부분 즉,

아래와 같이 '/' 문자로 시작되는 파일명부분을, sed를 이용하여 삭제 할 수 있다.

f5fe354fe982a10cf584d5cc175b0a29 /usr/share/man/man1/ar.1.gz

sed를 사용하여 문제가 되는 '/' 부분을 제거후 확인.

$ sed -e 's# /# #g' binutils.md5sums > binutils.debsums

$ cat binutils.debsums

f5fe354fe982a10cf584d5cc175b0a29 usr/share/man/man1/ar.1.gz

이렇게 적절히 수정된 파일을 /var/lib/dpkg/info 디렉토리에 복사해주면, debsums 명령어를 사용하게 됨.

$ sudo mv binutils.debsums /var/lib/dpkg/info/binutils.md5sums

$ debsums binutils

/usr/share/man/man1/ar.1.gz

/usr/share/man/man1/as.1.gz

/usr/share/man/man1/elfedit.1.gz

…[중략]…

 

 

OK

OK

OK

 

Posted by devanix