리눅스
주제 : 소프트웨어 설치
미러사이트 : 외국에 있는 배포사이트를 똑같이 만들어 놓은 것.
http://vault.centos.org
-> 모든 버전의 배포판이 있는 사이트
http://rpmfind.net
rpm (redhat package manager) 약자로 미국의 RedHat 사가 개발한 패키징 방식이다.
tar.gz, tar.bz2, tar.xz(최신) 은 압축을 해제해야 소스인지, 컴파일한 파일인지 알 수 있다.
그러니 rpm 으로 끝나는 확장자는 파일명만 보고도 소스인지, 컴파일한 파일인지 알 수 있다.
~.tar.gz : tar + gzip (소스형태, 컴파일형태)
~.tar.bz2 : tar + bzip2 (소스형태, 컴파일형태)
~.tar.xz : tar + xz (소스형태, 컴파일형태)
~.rpm : rpm (소스형태, 컴파일형태)
~.src.rpm : (소스형태) >> 전체가 다 C언어로 되어 있어서 분석을 할 수 있다.
~.i386.rpm, ~.i586.rpm, ~.i686.rpm : (컴파일형태) >> 이미 컴파일 되어 있는 형태(intel 계열)
~.deb : 데비안계열의 패키징 방식
rpm 의 가장 큰 단점.
- 패키지의 의존성이 존재하면 설치하기가 어렵다.
ex) 리눅스에서 네이트온 한번 깔아 볼 것 -> 설치가 되면 잘하는 것
~.rpm : rpm 명령어로 설치
yum : rpm 파일을 설치 >> 어떤 소프트웨어를 설치할 때 의존성 있는 것들을 자동으로 설치해준다.
yum : 이미 컴파일이 되어있는 패키지를 인터넷으로 다운받아서 설치하는 방식
의존성 : 패키지끼리 서로 연관 되어있는 형태이다.
- 리눅스용 웹브라우저(firefox 를 설치했다.)
- 강제로 설치했다고 해도 firefox 가 실행이 안된다.
- 이것을 실행하기 위해서는 의존성이 걸린 Xwindow system 의 관련된 패키지들을
- 모두 설치해야 firefox 를 설치하고 사용할 수 있다.
chrome 설치
>> 설치해야 하는 패키지가 많다.
~~~~.i386.rpm <-- 컴파일된 rpm 파일
~~~~.src.rpm <-- 소스 rpm 파일
~~~~.tar.gz <-- 압축된 파일 (tar + gzip)
~~~~.tar.bz2 <-- 압축된 파일 (tar + bzip2)
~~~~.tar.xz <-- 압축된 파일 (tar + xz)
아카이브 : 여러개의 파일을 하나로 묶어 놓은 것.
o gzip (파일을 압축하는 명령어)
- gzip은 GNU 프로젝트를 통해 배포되는 유틸리티
- gzip으로 압축한 파일은 파일명이 : 파일명.gz 확장자를 갖는다.
- 또한 여러 파일들을 지정하면 각각의 파일명.gz 파일로 저장한다.
>> 원본파일은 사라지고 압축 파일만 남게 된다.
사용법 : gzip 옵션 파일들...
옵션 :
-d --decompress decompress (압축해제)
-1 --fast compress faster (빠르게 압축 -> 대신 압축률은 떨어짐)
-9 --best compress better (최고로 압축 -> 압축률은 좋지만 속도가 느리다)
옵션을 주지 않게 되면 몇번으로 압축을 하게 될까?
사용예 : gzip filename
- filename 을 압축해서 filename.gz 파일이 생성된다.
- 여러 파일을 gzip으로 압축해도 각각 filename.gz 이 생성이 된다.
- 여러개의 파일을 하나의 파일로 묶이지 않는다.
- 여러개의 파일을 하나로 묶는 것은 tar의 역할이다.
압축해제 : gunzip filename or gzip -d filename
o bzip2
- 압축하면 나오는 파일명 : 파일명.bz2
- 대체로 gzip보다 10~20% 뛰어난 압축률이 더 좋다.
사용법 : bzip2 OPTION 파일들...
옵션 :
-d --decompress force decompression
-1 .. -9 set block size to 100k .. 900k
--fast alias for -1
--best alias for -9
사용예 : bzip2 filename
- filename 을 압축해서 filename.bz2 파일이 생성된다.
- 여러 파일을 bzip2로 압축해도 각각 filename.bz2 가 생성이 된다.
- 여러개의 파일을 하나의 파일로 묶이지 않는다.
- 여러개의 파일을 하나로 묶는 것은 tar의 역할이다.
>> 원본파일은 사라지고 압축 파일만 남게 된다.
ex) bzip2 filename
압축해제 : bzip2 -d filename or bunzip2 -d filename
o xz
- 요즘 나온 압축 프로그램
- 사용법은 비슷하다.
- 리눅스 커널 소스가 이 압축프로그램으로 압축되어 있다.
linux-3.17.2.tar.xz
** 커널 컴파일을 할 줄 알아야한다**
https://www.kernel.org/
아카이브 : 여러개의 파일을 하나로 묶어 놓은 것.
o tar (압축하는 프로그램이 아님!!!)
- tar는 단순히 하나의 아카이브 파일로 묶어 주는 역할만 할 뿐,
파일의 크기를 줄여주는 압축 기능은 없으므로
tar 명령어 안에서 gzip이나 bzip2 명령어와 함께 사용한다.
- 파일을 원래 상태로 복원하기 위해 파일의 퍼미션이나 소유권 등의 정보를 유지하면서 여러개의 파일들을 하나의 파일로 묶는 기능을 가진다.
Usage: tar [OPTION...] [FILE]...
ex) tar options 파일.tar 파일들 ... (반드시 확장자를 써줘야 한다!)
tar cvf tarfile files
gzip -9 tarfile >> tarfile.tar.gz 파일이 생성
option
c : 새로운 아카이브의 생성
x : 아카이브로부터 파일 추출
v : 파일을 묶거나 풀 때 정보를 출력
f : 읽거나 기록할 tar 파일을 정의
z : gzip으로 압축한다 >> 압축 프로그램을 옵션으로 사용
j : bzip2 로 압축한다 >> 압축 프로그램을 옵션으로 사용
C <DIR> : 압축을 해당 <DIR> 로 해제한다
=============================================================================
LAB1> 압축 연습 (사용자와 그룹에 관련된 중요 파일 3개를 현재 디렉토리에 복사한다)
# rsync /etc/passwd . >> /etc/shadow파일을 현재 디렉토리에 복사한다.
# install -m 644 /etc/group . >> >> /etc/group파일을 현재 디렉토리에 복사한다.
# cat /etc/shadow > shadow >> /etc/shadow파일을 현재 디렉토리에 복사한다.
-- 복사한 파일을 확인하는 명령어--
cmp
diff
--각 파일을 압축한다.
gzip group
bzip2 passwd
xz shadow << yum -y install xz
- 압축된 파일을 확인한다.
- 중요한 것은 원본 파일이 삭제되고 각 파일명에 압축프로그램의 고유 확장자가 붙어있다는 것.
# chmod 400 shadow
o 첫 번째 압축해제
- 각 압축 프로그램의 명령어의 -d 옵션을 이용해서 압축을 해제한다.
# gzip -d group.gz
# bzip2 -d passwd.bz2
# xz -d shadow.xz
o 두 번째 압축해제
- 각 압축 프로그램의 해제 명령어를 이용해서 압축을 해제한다.
# gzip group
# bzip2 passwd
# xz shadow
>> 먼저 압축을 한뒤
# gunzip group.gz
# bunzip2 passwd.bz2
# unxz shadow.xz
>> 해제 명령어를 이용해서 압축 해제
=============================================================================
o 하드/심볼릭링크 확인하기
- 압축 프로그램과 압축해제 프로그램의 하드링크와 심볼릭링크를 확인하는 부분.
# ls -li `which gunzip`
# ls -li `which gzip`
# ls -li `which zcat`
# ls -li `which bzip2`
# ls -li `which bunzip2`
=============================================================================
LAB2>tar + gzip 으로 압축하기 (단일 파일인 경우)
- tar 와 gzip 을 각각 실행하는 경우
# tar cvf test.tar passwd shadow group
# gzip test.tar <-- test.tar.gz
>> tar로 묶고 gzip으로 압축
- tar 와 gzip 을 한번에 실행하는 경우
# tar cvzf test2.tar.gz * <-- test2.tar.gz ==> z 옵션은 gzip 호출
>> tar 명령어에 z 옵션을 넣어주게 되면 한번에 실행된다.
tar 명령어에 z옵션을 주게 되면 tar프로그램 내부에서 외부의 gzip을 호출하게 되어 압축까지 한다.
- tar 와 bzip2 를 각각 실행하는 경우
# tar cvf test3.tar passwd shadow group
# bzip2 test3.tar <-- test3.tar.bz2
- tar 와 bzip2 를 한번에 실행하는 경우
# tar cvjf test4.tar.bz2 * <-- test4.tar.bz2 ==> j 옵션은 bzip2호출
=============================================================================
=============================================================================
** 디렉토리로 묶어서 배포를 하지 않으면 불편할 때가 있다
(ex. 500개 파일을 디렉토리로 묶지 않고 배포를 하게 된다면 압축을 해제하는 폴더에 500개의 파일이 생성 될 것이다)
대부분의 배포는 디렉토리를 묶어 놓고 묶어놓은 디렉토리를 배포를 한다.
LAB3> tar + gzip으로 압축하기 ( 디렉토리에 넣고 묶을 경우)
*** 항상 인터넷 상에서는 어떤 프로그램을 압축해서 배포하는 경우에는 디렉토리에 넣고 그 디렉토리를 묶어서 배포한다.
192 tar czf etc.tar.gz *
193 mv etc.tar.gz /tmp/
194 cd /tmp/
195 ls
196 tar xzf etc.tar.gz
197 ls
198 rm -rf *
199 ls
200 cd /
201 ls
202 tar czf etc.tar.gz etc
203 ls
204 cd /tmp/
205 ls
206 cd /etc
207 ls
208 cd ..
209 ls
210 mv etc.tar.gz /tmp/
211 cd /tmp/
212 ls
213 tar xzf etc.tar.gz
=============================================================================
=============================================================================
LAB4> 인터넷에서 받은 tar.gz 파일을 시스템에 설치하기
http://httpd.apache.ogr
>> 최신판만 있음
1. 압축 해제
- 압축파일로 된 아파치 웹서버를 압축해제 한다.
tar xzf apache_1.3.41.tar.gz
2. 환경설정
- ./configure 명령어를 이용해서 환경을 설정한다
#cd apache_1.3.41
# ./configure
>> UNIX (LINUX)에서는 보안 적인 이유로 현재 디렉토리의 실행파일들은 실행할 수 없게 기본값으로 막혀있다. -> 이를 풀수도 있지만 보안상의 이유로 안푸는 것이 좋다.
>> 항상 현재 디렉토리의 실행파일은 ./실행파일명 으로 실행을 해야한다.
3. 컴파일
- make 는 플젝트 단위로 컴파일을 한다.
#make
4. 설치
- make 뒤에 install 이라는 인자를 준다 > 그러면 컴파일된 파일들을 시스템에 자동으로 설치해준다.
#make install
5. 웹서버 실행
- apachectl 명령어는 웹서버를 실행시켜주는 명령어이다.
#/usr/local/apache/bin/apachectl start
6. 웹서버 확인
- netstat 명령어는 현재 서버에 LISTEN 되어 있는 포트를 출력해준다.
#netstat -nltp
[11:28:36@localhost ~/apache_1.3.41]#netstat -nlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:825 0.0.0.0:* LISTEN
tcp 0 0 :::22
>> 0 0.0.0.0:80 -> 이 부분이 나오면 된다.
LISTEN >>
소켓통신
socket : 전화기에 해당
bind : 전화번호에 해당
listen : 외부에서 전화가 오기를 기다리는 상태에 해당
accept : 전화가 받아지는 상태에 해당 (blocking 상태 : 다른 사람에게 전화 오는 것을 막는다)
connetc : 전화를 거는 상태에 해당
7. 메인 페이지 생성
#cd /usr/local/apache/htdocs/
#ls
#rm -rf *
#echo Welcome to Lim Ho-Young Sercer > index.html
i#fconfig eth1
#iptables -F
8. 브라우저로 접속
http://192.168.56.102 (자신의 VirtualBox eth1 IP)
=============================================================================
=============================================================================
LAB5> 인터넷에서 받은 tar.gz 파일을 시스템에 설치하기****중요하다 꼭 알아 둘 것 *****
http://netcat.sourceforge.net
netcat-0.7.1.tar.gz
>> netcat에 관한 공부는 개인적으로 많이 할 것 -> 소스 분석 해볼 것.
-- 순서 --
1. 압축을 해제한다.
2. 환경설정을 한다.
3. 컴파일을 한다.
4. 설치한다.
5. 실행한다.
- - - - - -
1. 압축을 해제한다.
# tar xvzf netcat-0.7.1.tar.gz
netcat-0.7.1/
netcat-0.7.1/m4/
netcat-0.7.1/m4/lib-link.m4
netcat-0.7.1/m4/inttypes_h.m4
netcat-0.7.1/m4/lcmessage.m4
netcat-0.7.1/m4/inttypes.m4
:
:
2. 환경설정을 한다.
- 압축이 해제된 netcat 디렉토리에 들어가서 환경설정을 한다.
# cd netcat-0.7.1
# ./configure
3. 컴파일을 한다.
# make
!!(rmp -q nc 해서 결과가 나오면 그거 지워야 함)
4. 설치한다.
- 시스템에 설치한다.
# make install
5. 실행한다.
- 실행하기 전에 이미 설치된 nc 패키지를 삭제한다.
pts/0# rpm -q nc
pts/0# rpm -e nc
- 방화벽정책으로 인해서 접속이 안되면 모두 해제한다.
pts/0# iptables -F
(리눅스에서는 넷필터가 방화벽 역할을 한다. iptables 는 넷필터를 제어하는 역할.)
- 8888 포트를 대기한다. (server 개념)
pts/0# nc -l -v -p 8888
Connection from 127.0.0.1:57059
Hello
Hi~~
- 리슨된 포트로 접속한다. (client 개념)
pts/1# nc localhost 8888
Hello
Hi~~
(pts0, pts1 두개의 터미널을 이용)
** 프로그램 간의 통신에서는 IP주소와 포트번호가 반드시 필요하다
=============================================================================
==================================================================
LAB1> tar 에서 -z(gzip) 옵션과 -j(bzip2) 옵션을 확인해보자.
tar 의 z 옵션 : 외부의 gzip 명령어인 /bin/gzip 을 호출한다.
tar 의 j 옵션 : 외부의 bgzip2 명령어인 /usr/bin/bzip2 를 호출한다.
o tar의 x 옵션 테스트
- gzip 명령어를 이동시키고 tar 의 x 옵션을 호출하면 tar 명령어
- 내부에서 /bin/gzip을 호출하는 것을 알 수 있다.
# mv /bin/gzip .
# ls -l /bin/gzip
ls: /bin/gzip: No such file or directory
# tar czf etc.tar.gz /etc
tar: gzip: Cannot exec: No such file or directory tar: Error is not recoverable: exiting now
tar: Removing leading `/' from member names
//exec : 프로그램 내부에서 다른 프로그램을 호출할 때 사용하는 명령어
- 다시 원래대로 복구한다.
# mv gzip /bin
# tar czf etc.tar.gz /etc
# ls -l etc.tar.gz
-rw-r--r-- 1 root root 4958956 Nov 4 17:11 etc.tar.gz
o tar의 j 옵션 테스트
- bzip2 명령어를 이동시키고 tar 의 j 옵션을 호출하면 tar 명령어
- 내부에서 /usr/bin/bzip2 를 호출하는 것을 알 수 있다.
# mv /usr/bin/bzip2 .
# ls /usr/bin/bzip2
ls: /usr/bin/bzip2: No such file or directory
# tar cjf etc.tar.bz2 /etc
tar: Removing leading `/' from member names
tar: bzip2: Cannot exec: No such file or directory
tar: Error is not recoverable: exiting now
- 다시 원래대로 복구한다.
# mv bzip2 /usr/bin
# tar cjf etc.tar.bz2 /etc
# ls -l etc.tar.bz2
-rw-r--r-- 1 root root 3183126 Nov 4 17:18 etc.tar.bz2
===================================================================
===================================================================
LAB2> 위에서 exec 를 이해하기 위한 프로그램을 한번 짜보자.
- program 을 실행하면 외부의 ls 가 실행된다.
- 이때는 프로그램에서 exec 계열의 함수를 이용해서 외부 명령어를 실행한다.
- man execl 을 이용해서 exec 계열의 함수들을 확인할 수 있다.
# vi program.c
-- program.c --
#include <unistd.h>
int main()
{
execl("/bin/ls", "ls", NULL); // (실행파일의 절대경로, 실행파일, 인자)
return 0;
}
-- program.c --
# gcc -Wall -o program program.c
# ./program
:
:
# cp -v program.c program2.c
# vi program2.c
-- program2.c --
#include <unistd.h> // execl
#include <stdio.h> // printf
int main()
{
execl("/bin/ls", "/bin/ls", NULL);
fprintf(stderr, "program: /bin/ls: Cannot exec: No such file or directory\n");
return 0;
}
-- program2.c --
# gcc -Wall -o program2 program2.c
# ./program2
:
:
# mv /bin/ls .
# ./program2
program: /bin/ls: Cannot exec: No such file or directory
# mv ls /bin
# cp -v program.c program3.c
# vi program3.c
-- program3.c --
#include <unistd.h> // execl
#include <stdio.h> // printf
int main(int argc, char *argv[]) // 명령행 인자를 쓸 때 반드시 넣어주어야 한다.
{
// # gunzip fstab
// ~~~~~~ ~~~~~
// argv[0] argv[1]
execl("/bin/gzip", "/bin/gzip", argv[1], NULL); // execl함수는 환경변수 세팅이 안된다.
fprintf(stderr, "program: /bin/gzip: Cannot exec: No such file or directory\n");
return 0;
}
-- program3.c --
- 정상 테스트
# gcc -Wall program3 program3.c
# cp /etc/fstab
# ./program3 fstab
# ls fs*
# gunzip fstab.gz
- 에러발생 테스트
# mv /bin/gzip .
# ./program3 fstab
program: /bin/gzip: Cannot exec: No such file or directory
- 원상복귀
# mv gzip /bin
=================================================================