이제 Project를 Checkout 받았으니 Eclipse를 통해서 Project source를 관리할 수 있습니다. Subclipse의 기본적인 개념은 Subversion의 그것과 동일합니다. Subversion을 잘 모른다면 KLDP의 Wiki page를 참고하면 도움이 될 것입니다. 간단하게 Subclipse의 주요 기능에 대해서 알아봅시다.

1. Team Synchronizing Perspective

Team Synchronizing Perspective는 Eclipse IDE를 변경시켜 Subclipse에서 제공하는 CVS, SVN 등의 소스관리 툴과 연동을 위한 동작을 처리하기 위한 작업환경입니다.

fb4-subclipse19

Perspective 를 변경하기 위해서는 Package Explorer에서 해당 Project위에서 Mouse 오른쪽 button으로 Popup을 띄운 후, Team->Synchronize with Repository를 클릭합니다.

fb4-subclipse20

처음으로 Team Synchronizing Perspective를 실행한 경우 아래와 같은 Message가 표시됩니다. Yes를 클릭합니다.

fb4-subclipse21

Team Synchronizing Perspective를 IDE에 설정한 화면입니다. 왼쪽에 Source관리를 위한 Synchronize View와 Task Repositories View가 표시됩니다. Synchronize View에서는 SVN의 각 동작을 처리할 수 있고, Task Repositories에서는 Local 저장소를등록하고 관리할 수 있습니다.

2. Update

Project를 저장소로 부터 Update 받기 위해서는, Package Explorer에서 Update 받을 Project의 Folder위에서 Popup을 띄운 후, Team->Update to HEAD 또는 Update to version을 클릭하면 됩니다.

여기서 Update to HEAD는 저장소에서 현재 최신의 Source를 Update하며, Update to version은 저장소에서 해당 Revision의 Source를 가지고 현재 Source를 Update합니다.

3. Commit

Project를 개발하다가 저장소에 변경된 내용을 저장하기 위해서는 Commit을 해야 합니다. Commit하기 전에는 먼저 저장소에 변경된 내용이 없는 지 확인하기 위해서 먼저 Update를 수행하는 것 좋습니다. 변경된 Source file은 Package Explorer에서 해당 Source의 Icon이 변경되어 있는 것으로 확인할 수 있습니다.

Commit을 하기 위해서는 Package Explorer에서 Commit할 Source가 존재하는 Project의 Folder위에서 Popup을 띄운 후, Team->Commit을 클릭합니다.

fb4-subclipse22

클릭하면 위와 같은 Commit Dialog가 화면에 표시됩니다. 위에 Textarea에는 변경사항을 텍스트로 적을 수 있고 아래의 Tree에는 변경된 Source의 목록이 표시됩니다. 여기서 Check된 항목만 Commit되기 때문에 Commit시에 필요한 파일만 Commit할 수도 있습니다. OK를 누르게 되면 Commit이 완료됩니다.

4. History

저장소의 History를 확인할 수 있습니다. 누가 어떤 Source의 무슨 내용을 변경했는지에 대한 정보를 확인할 수 있습니다. 누가 저장소에 Source를 잘못 올려놓아서 Update를 했는데 Compile이 되지 않거나 문제가 생긴다면 추적하는데 사용할 수 있습니다.ㅋㅋ

Package Explorer에서 Project Folder위에서 Popup을 띄운 후, Team->Show History를 클릭하면 아래와 같이 History View가 아래에 표시됩니다.

fb4-subclipse23

5. Revert

현재 변경된 Source의 수정된 내용을 무시하고 저장소에 저장된 이전 Source로 돌리고 싶을 때 사용합니다. Package Explorer에서 변경된 Source위에서 Popup을 띄우고 Team->Revert를 클릭하면 아래와 같이 Revert Dialog가 뜹니다.

fb4-subclipse24

되돌릴 Source에 체크한 후 OK를 누르면 저장소의 최신버전으로 선택한 Source를 변경합니다.

6. Branch/Tag 생성하기

쉽게 이야기 하면 Branch는 현재 Project에서 다른 가지로 나와서 새로운 기능을 시도하는 등의 변종 Project를 의미하고, Tag는 현재 Project를 Release하는 시점의 Source를 보관하고 Version tag를 붙인 Source를 의미합니다. Branch와 Tag를 생성하기 위해서는, Branch와 Tag를 할 Folder의 상위 Folder를 선택한 후, Mouse 오른쪽 Popup에서 Team->Branch/Tag를 클릭합니다.

fb4-subclipse25

Branch/Tag Dialog에서 Copy to URL에는 해당 Branch 또는 Tag가 저장될 저장소의 주소를 입력하고 Next를 클릭합니다.

fb4-subclipse26

저장소의 어떤 Revision을 Branch 또는 Tag로 등록할지에 대해서 선택합니다. 위의 그림에서는 최신 Revision에 대하여 Branch/Tag를 등록하는 설정입니다. Next를 클릭합니다.

fb4-subclipse27

마 지막으로 Comment를 작성하고 Finish를 클릭하면 저장소의 해당 위치에 Branch/Tag가 등록됩니다. 등록이 최종 완료되면 위와 같은 그림처럼 Package Explorer에서 해당 위치에 등록 된 것을 확인할 수 있습니다.

fb4-subclipse28

7. 마치면서

이상으로 Eclipse 3.5 Galileo에 설치된 Subclipse 1.6의 각 기능들을 간단하게 살펴보았습니다. Subclipse로 Eclipse에서 작업하는 모든 Project의 Source를 효율적으로 관리하시길 바랍니다.

– God Bless..

지난 Post에 이어서 Ubuntu에서 Valgrind로 Memory Leak을 검사하는 방법의 활용편으로 Valgrind의 GUI Front-end로 Memory Leak을 검사하는 방법과 Callgrind를 사용하는 간단한 방법, 그리고 Eclipse 내에서 Valgrind를 사용하는 방법을 알아보도록 하겠습니다.

5. 유용한 Front-end

Valgrind를 사용해서 Terminal에서 Memory Leak을 검사하는 방법을 알아봤지만, 아무래도 좀 더 보기 편리하고 사용하기 쉬운 쪽이 생산성이 좋을 것입니다. 그래서 이번에는 Valgrind를 위한 유용한 Front-end를 소개하려 합니다.

5.1. Alleyoop Memory Checker

Alleyoop은 GTK+ 기반으로 만들어진 GUI Front-end입니다. 이 Program은 Valgrind의 Memcheck Tool의 결과를 좀 더 보기 쉽게 표현해 주고 해당 Code를 쉽게 확인할 수 있습니다.

먼저 설치를 위해서 Terminal에서 다음과 같이 입력합니다.

1
$ sudo apt-get install alleyoop

위에서 작성한 Test Program을 가지고 Alleyoop을 사용해서 Memory Leak을 검사해 봅시다. Terminal에서 다음과 같이 입력합니다. (아래의 예는 Source의 Directory가 ~/test, 실행 File이 ./test일 경우)

1
$ alleyoop -R ~/test/ ./test

-R Option을 사용하면 해당 Directory 내에서 Memory Leak이 발생한 Source Code를 찾게 됩니다. 만약 Memory Leak을 검사할 Program이 Argument(명령행 인자)를 가지고 있다면, 위의 명령에서 검사할 Program 뒤에 그대로 이어서 적으면 됩니다.

Alleyoop - Preferences

Alleyoop - Preferences

실행한 다음, 설정 -> 기본 설정에서 Memory Leak을 검사하기 위한 설정을 해야 합니다. 위의 그림과 같이 Memcheck Tab에서 Leak Check를 full로, Leak Resolution을 high로 설정하고 OK를 누릅니다.

Alleyoop - Run

Alleyoop - Run

그 다음 상단 Toolbar의 Run을 누르면 Program이 실행됩니다. Test Program이 종료된 후에는 위의 그림과 같이 Valgrind의 Memcheck Tool을 통해 얻은 정보가 아래의 Treeview에 표시됩니다.

Memory Leak이 발생한 경우에는 위의 그림과 같이 해당 Source의 일부분과 발생한 Line을 표시해 주기 때문에 쉽게 문제가 발생한 부분을 확인할 수 있습니다.

Gedit

Gedit

그리고 Memory Leak을 나타내는 Code를 Double-Click하면 문제가 발생한 부분을 쉽게 편집할 수 있도록 Gedit가 실행되면서 해당 Source에서 Memory Leak이 발생한 Line에 Cursor를 위치시켜 줍니다.

이외에도 Alleyoop을 사용하면 NCURSES(Console 화면 출력을 쉽게 다루기 위한 Library)를 사용한 Console Program도 쉽게 Memory Leak을 검사할 수 있습니다.

NCURSES를 사용한 Program의 경우, Alleyoop에서 Run을 누르면 Alleyoop을 실행한 Terminal에서 Program이 실행되며 Program이 종료되면 결과가 Alleyoop에 표시되게 됩니다.

5.2. KCachegrind

KCachegrind는 정확하게 말하면 Memory Leak을 검사하기 위한 Front-end는 아닙니다. 하지만, Program의 Performance 향상을 위해 사용되는 상당히 좋은 Tool로 Valgrind에 대해서 설명하는 이 Post에서 잠깐 다뤄보려 합니다.

KCachegrind는 Valgrind의 도구 중 하나인 Callgrind가 생성한 Profile Data를 시각화하여 보여주는 Tool입니다.

이 Program을 사용하면 AQTime 방식과 유사하게 Callgrind로 분석한 ASCII Data를 보기 편리하게 GUI를 통해 시각화하여 보여줌으로서 사용자에게 편의를 제공합니다. 또한 이 것을 통해서 각 Function 별 Cost(비용)와 호출 관계등을 알 수 있습니다.

먼저, 설치를 위해서 Terminal에서 다음과 같이 입력합니다.

1
$ sudo apt-get install kcachegrind

설치가 완료되었다면 이제 KCachegrind를 사용하기 위한 Profile Data를 얻어봅시다.

다음과 같이 Terminal에서 입력하여 Test할 Application의 Data를 얻습니다. (아래는 이전에 작성한 test Program의 예)

1
$ valgrind --tool=callgrind ./test

Callgrind도 마찬가지로 Runtime에 수행이 되기 때문에 Program 실행 시에 수행되지 않은 Function에 대한 Data를 얻지 못하는 것을 유의해야 합니다.

실행이 완료되면 Callgrind를 통해서 얻은 Data는 Console에 표시되는 것이 아니라 File(일반적인 경우 callgrind.out.*)로 저장됩니다.

Unity - KCachegrind

Unity - KCachegrind

이제 Data도 얻었으니 분석을 위해서 KCachegrind를 실행해 봅시다. Unity Dash에서 개발자 도구를 선택한 다음, KCachegrind를 Click합니다.

KCachegrind

KCachegrind

KCachegrind를 실행한 화면입니다. 일부 한글로 번역이 되어있으나 완전치는 않습니다.

분석한 Data를 Load하기 위해서 위의 그림과 같이 Toolbar의 열기를 누릅니다.

Select Callgrind Profile Data

Select Callgrind Profile Data

Dialog에서 Callgrind Data가 생성된 Directory로 이동한 다음 Data File을 선택하고 열기를 누릅니다.

만약 Data의 이름을 다른 것으로 변경했다면 아래의 Filter에서 Callgrind Profile Data 대신 All Files를 선택하여 모든 File이 List에 표시되도록 변경한 후 선택하면 됩니다.

KCachegrind - Callee Map and Call Graph

KCachegrind - Callee Map and Call Graph

Data를 제대로 Load했다면 위의 그림과 같이 표시될 것입니다.

분석을 위해서 간단하게 설명하면, 왼쪽 위의 최고비용 호출 스택은 Program 수행 시에 Cost가 가장 많이 발생한 Function의 순서대로 List에 표시합니다.
(Ir은 CPU에서 계산을 위해 Memory에서 Instruction을 가져오는 것을 나타내는 Instruction Fetch의 Cost(%)를, 호출은 호출 횟수를 나타냅니다.)

그리고 왼쪽 아래의 균일한 프로파일은 Runtime에 수행된 거의 모든 Function(Cost가 너무 낮은 것은 제외됨)의 Cost(%)와 호출 횟수를 표시합니다.
(포함은 각 Function 내에서 호출된 다른 Function의 Cost(%)까지를 포함한 값입니다. 그리고 Self는 호출된 다른 Function을 제외한 Function 자체의 Cost(%)를 나타내며, 호출됨은 해당 Function이 호출된 횟수를 나타냅니다.)

이 외에도, 오른쪽 상단과 하단에서는 균일한 프로파일에서 선택한 Function에 대하여 다음과 같은 정보를 제공합니다.

  • Callers: 해당 Function을 호출한 호출자를 List로 표시합니다.
  • All Callers: 호출자 뿐만 아니라 호출자를 호출한 호출자까지 포함한 List입니다.(Recursive)
  • Callee Map: Function 내부에서 호출한 다른 Function의 Cost값을 가지고 Visual한 Map을 표시합니다.
  • Source Code: Function의 Source가 존재할 경우, 해당 Function의 Code를 표시하며 각 Line 별로 Cost를 표시합니다. Source가 다른 곳에 위치할 경우, 설정 -> KCachegrind 설정 -> Annotations Tab에서 Source Directory를 추가할 수 있습니다.
  • Callee: Function 내부에서 호출한 다른 Function의 List입니다.
  • Call Graph: 해당 Function과 호출자와 호출한 다른 Function간의 호출 관계도를 표시합니다.
  • All Callees: Function 내부에서 호출한 다른 Function에서 또 다른 Function을 호출한 것까지 List로 표시합니다. (Recursive)
  • Caller Map: 호출자의 Cost값을 가지고 Visual한 Map으로 표시합니다.

KCachegrind로 얻은 위와 같은 정보를 통해서 Cost가 많이 발생하거나 호출 빈도가 높은 Function에 대해서 최적화를 수행하거나 설계 구조를 변경함으로서 Application의 Performance 향상을 꾀할 수 있을 것입니다.

KCachegrind의 자세한 기능및 분석 방법을 알고 싶다면 KCachegrind의 Documentation을 참고하기 바랍니다.

6. Eclipse CDT와 함께 사용하기

Eclipse CDT를 사용하여 개발하는 C/C++ Project에서도 IDE와 통합하여 쉽게 Valgrind로 Memory Leak을 검사할 수 있습니다.

Eclipse Classic 3.7.1 Indigo의 Linux version(또는 Eclipse IDE for C/C++ Linux Developers 1.4.1)을 통해 사용법을 간단하게 설명해 보도록 하겠습니다.

만약 Eclipse가 System에 설치되어 있지 않다면, Ubuntu에서 Eclipse CDT를 사용하여 Autotools Project 만들기 (Part 1)을 참고하여 설치하기 바랍니다.

Install Valgrind Tools Integration

Install Valgrind Tools Integration

Eclipse Classic에서 CDT를 설치한 경우라면 Valgrind를 사용하기 위한 Plugin을 설치해야 합니다. (Eclipse IDE for C/C++ Linux Devlopers를 설치했다면 이 과정은 무시해도 좋습니다.)

먼저 Help -> Install New Software를 Click하면 위와 같은 설치 Dialog가 표시됩니다.

위의 그림에서와 같이 Work with에서 Indigo를 선택하면 아래에 설치 가능한 Plugin의 List가 표시됩니다.

List에서 Linux Tools -> Valgrind Integration (Incubation)을 Check하고 Next를 눌러 설치과정을 모두 진행하면 기본적인 준비는 모두 완료됩니다.

Memory Leak Code

Memory Leak Code

Memory Leak을 검사하기 위한 Source Code가 위와 같다고 가정해 봅시다.

위의 Code에서 malloc() 호출 후에 System에 반환하지 않았기 때문에 Memory Leak이 발생할 것을 알 수 있습니다.

Eclipse - Profile

Eclipse - Profile

이제 이 Program을 Valgrind를 통해 Memory Leak을 검사해 봅시다. Run -> Profile을 Click합니다.

Profile As

Profile As

처음 Profile을 실행하게 되면 Profile As Dialog가 위와 같이 표시됩니다. 여기서 Profile With Valgrind를 선택하고 OK를 누릅니다.

Valgrind - Memcheck

Valgrind - Memcheck

아래의 Console View에 Program이 실행되면서 출력된 내용이 표시되고, Program이 종료된 이후에 Valgrind View에 Memory Leak이 발생한 내용이 표시됩니다.

Memory Leak이 발생한 내용을 Double-click하거나 Problems View에서 해당 Problem을 Double-click하면 위의 그림과 같이 Memory Leak이 발생한 Line이 선택되면서 쉽게 확인이 가능하게 됩니다.

7. 마치면서…

지금까지 Ubuntu에서 Valgrind를 사용하여 Memory Leak을 검사하는 여러가지 방법들을 알아봤습니다. Console 기반이라 쓰기 어렵다고 느껴질 수도 있지만, Front-end와 같이 사용하면 그다지 어렵게만 느껴지지 않을 것입니다.

Valgrind를 사용하여 Debugging과 Profiling을 수행함으로서, 개발하는 Application에 대한 안정성과 성능을 높이는 계기가 될 수 있기를 바랍니다.

Subclipse는 형상관리 툴인 Subversion을 Eclipse와 통합하여 사용할 수 있게 도와주는 Eclipse Plug-in입니다. 최신 Eclipse인 3.5 Galileo에서 Subclipse를 사용하여 기존 SVN 저장소와 연동하여 프로젝트를 관리하는 방법을 설명하도록 하겠습니다.

Flash/Flex Builder도 Eclipse 기반으로 되어 있기 때문에 마찬가지로 Subclipse를 통하여 Flex Project를 관리할 수 있습니다. Plug-in version이 아닌 Flash/Flex Builder를 설치할 경우에는 Subclipse가 제대로 설치되지 않을 수도 있습니다.

1. Eclipse의 Software Update로 Subclipse 설치

먼저 Eclipse Galileo를 실행시킨 후, Window->Preferences를 클릭합니다. Preferences Dialog에서 Install/Update의 Available Software Sites를 클릭하면 아래와 같은 화면이 나옵니다.

fb4-subclipse01

Subversion Site를 추가하기 위해서 Add button을 클릭합니다.

fb4-subclipse02

Name 과 Location에 다음과 같이 입력합니다.

1
2
Name : Subclipse 1.6.x (Eclipse 3.2+)
Location : http://subclipse.tigris.org/update_1.6.x

Subclipse 1.8.x를 사용하려면 다음과 같이 입력합니다. (Eclipse 3.2 이상)

1
2
Name : Subclipse 1.8.x (Eclipse 3.2+)
Location : http://subclipse.tigris.org/update_1.8.x

OK를 누르면 Subclipse site가 추가됩니다. Test Connection button을 누르면 Connection 확인을 할 수 있습니다. Connection이 올바르게 되었다면 아래와 같은 Dialog가 표시됩니다.

fb4-subclipse03

이제 주소가 등록되었으니 Preferences Dialog를 OK를 눌러서 닫은 후에, Help->Install New Software를 클릭하면 아래와 같은 Dialog가 화면에 표시됩니다.

fb4-subclipse04

Dialog에서 Work with Combobox의 버튼을 눌러서 방금 추가한 Subclipse의 주소를 선택한 후, 밑에 표시되는 Plugin을 모두 Check 표시하고 Next를 클릭합니다.

fb4-subclipse05

설치될 Plugin이 목록으로 표시됩니다. Next를 클릭합니다.

fb4-subclipse06

License의 동의하는지 여부를 물어봅니다. I agree the terms of the license agreements를 선택하고 Finish를 클릭합니다. 그러면 Download및 Install이 실행됩니다.

fb4-subclipse07

도중에 Plugin의 Security관련 경고가 뜨는데 그냥 OK를 누르세요.

fb4-subclipse08

설치가 완료되면, Eclipse를 다시 실행해도 되겠냐고 물어봅니다. Yes를 클릭하여 Eclipse를 다시 실행하면 Subclipse 설치는 완료됩니다.

2. 기존의 SVN 저장소를 등록하기

이제 설치가 완료되었으니 SVN 저장소에 올려져 있는 Project를 Checkout 받기 위해서는 저장소를 등록을 위해 SVN Repositories View를 통해 작업해야 합니다. SVN Repositories View를 Eclipse에 표시하기 위해서 Window->Show View->Other를 클릭하면 아래와 같은 Dialog가 표시됩니다.

fb4-subclipse09

SVN->SVN Repositories를 클릭하고 OK를 누릅니다.

fb4-subclipse10

SVN Repositories View가 Eclipse 하단에 표시됩니다. 이제 저장소를 등록하기 위해서 SVN Repositories View 위에 Add SVN Repository button을 클릭합니다.

fb4-subclipse11

SVN 저장소를 추가하는 Dialog입니다. Location의 URL에 SVN저장소의 URL을 입력하고 Finish를 클릭합니다.

Linux에서 Eclipse를 사용하는 경우 Failed to load JavaHL Library라는 Error가 발생하는 경우가 있습니다. Ubuntu에서 Eclipse에 Subclipse 1.6.x를 설치한 경우(1.8.x는 아직 해결할 수 없음), Terminal에서 다음과 같이 입력합니다.

1
# sudo apt-get install libsvn-java

그리고, Eclipse Directory의 eclipse.ini에서 -vmargs 다음 줄에 아래의 내용을 추가한 후, Eclipse를 실행하여 Add SVN Repository를 다시 실행하면 됩니다.

1
2
-Djava.library.path=/usr/share/java
-Djava.library.path=/usr/lib/jni

fb4-subclipse12

SVN 저장소에 접근시에 로그인이 필요하다면 위와 같은 Dialog가 표시됩니다. Username, Password를 입력합니다. Password를 계속 입력하는 것이 귀찮으면 Save Password를 Check 하고 OK를 누릅니다. 정상적으로 SVN 저장소와 연결되었다면 아래의 화면과 같이 저장소의 정보를 SVN Repositories View에 표시됩니다.

fb4-subclipse13

3. 등록된 SVN 저장소에서 Project를 Checkout 받기

Checkout을 간단하게 말하면, 저장소에 있는 Project를 내 PC로 Download받는 것을 의미합니다. 방금 등록한 저장소에 있는 Project를 Checkout하기 위해서 SVN Repositories View에서 받은 폴더 위에 Mouse 오른쪽 클릭으로 Popup을 띄우면 아래와 같이 나옵니다.

fb4-subclipse14

여기서 Checkout을 클릭하면 아래와 같이 Checkout Dialog가 화면에 표시됩니다.

fb4-subclipse15

Checkout Dialog에서는 Checkout을 받는 여러가지 Option들이 있는데, Check out as a project in the workspace를 Click하고 Next를 누릅니다.

fb4-subclipse16

Eclipse Workspace Location에 Project를 Checkout하게 되는데, 다른 곳에 받는 다면 Check를 해제하고 경로를 지정합니다. 여기서는 그냥 Default workspace에 Checkout할 것이기 때문에 그냥 Finish를 클릭합니다.

fb4-subclipse17

저장소의 Root directory를 Checkout할 경우 위와 같은  Message가 표시됩니다. 여기서는 Root Directory부터 받을 것이기 때문에 Yes를 클릭합니다. (저장소의 Root를 Checkout하는 경우 외에는 이 Message가 표시되지 않습니다.)

fb4-subclipse18

저장소에서 Project를 Download하여 workspace에 저장하는 Dialog가 표시되면서 Checkout이 완료됩니다. 완료된 후에는 Project Explorer에 해당 Checkout 받은 Project가 표시됩니다.

4. 마치면서

이상으로 Eclipse 3.5 Galileo에서 Subclipse plugin을 설치하고 저장소를 등록하여 SVN에 등록된 Project를 Checkout하는 방법을 알아보았습니다. 다음에는 Subclipse의 기능에 대한 Post를 올리도록 하겠습니다.

– God Bless..

Doxygen은 여러 Programming Language를 위한 문서화 도구입니다. Source Code를 문서화한다는 것은 Code내의 주석을 통하여 Code의 구조와 Interface를 문서로 만드는 것을 의미합니다.

Doxygen을 사용하면 C++, C, C#, Fortran, Java, Objective-C, PHP, Python 등의 언어를 사용한 Source Code에 Doxygen에서 정의한 Style로 주석을 작성하면 자동으로 문서를 생성할 수 있게 됩니다.

생성된 문서는 마치 MSDN이나 기타 Live API Document와 같은 형식으로 Web Browser, PDF Reader, CHM Help 등으로 열람이 가능합니다. 이것은 여럿이 동시에 작업하는 Project에 더욱 유용합니다.

이번 Post에서는 Borland C++ Builder 6로 작성한 Project를 Doxygen을 사용하여 문서화하는 방법을 다루도록 하겠습니다.

1. Doxygen 설치

Doxygen 자체는 Source Code의 주석을 사용하여 문서를 자동으로 생성하는 도구로서 IDE와 통합되어 동작하지 않습니다. 다만 Doxygen에서 정의한 Style에 주석을 Project 개발시에 Source Code에 작성하면 됩니다. (Java, Flex의 경우에는 문서화 도구인 JavaDoc, ASDoc Style로 작성한 주석을 바로 Parsing하여 Eclipse에서 해당 Class나 Method에 대한 주석을 바로 확인할 수 있습니다.)

또한 Doxygen은 Cross-Platform Tool로서 Windows, Mac OS X, Linux (or Unix-like OS)에서 사용이 가능합니다. 이것은 Windows Application의 Source Code를 Doxygen에서 지정한 형식으로 주석을 작성해 놓으면, Web Server가 동작하는 다른 OS에서 Doxygen을 사용하여 Source Code 문서를 생성할 수 있다는 것을 말합니다. 한마디로 해당 Project에 대한 API Web Service(like MSDN)를 운영할 수 있게 됩니다.

이제 어느정도 설명이 끝났으니 설치를 해보도록 합시다. Doxygen의 Homepage에 접속합니다.

Doxygen Site

Doxygen Site

Program을 Download하기 위해서 오른쪽의 Download를 Click합니다.

Doxygen Download

Doxygen Download

여러 OS에 대한 Binary가 존재하는데 여기에서는 32-bit binary distribution for Windows XP/Vista/7 Section의 설치 File을 Download합니다.

Doxygen Install

Doxygen Install

Download한 설치 File을 설치합니다. 설치 중간에 위와 같이 Doxygen 구성요소가 나오는데 여기에서 Doxywizard GUI를 선택합니다.

Doxywizard를 사용하면 Command-line 기반의 Doxygen을 좀 더 편리하게 쓸 수 있습니다.

Graphviz Site

Graphviz Site

그리고 한 가지 더 설치해야 할 Tool이 있습니다. Doxygen은 문서를 생성할 때 Class나 Method의 관계를 나타내기 위해서 Graphviz라는 Tool을 사용합니다. 이번에는 Graphviz를 설치하도록 합시다.

Graphviz의 Homepage에서 왼쪽 Download를 Click합니다.

Graphiviz License Agreement

Graphiviz License Agreement

License 동의를 위해서 맨 아래쪽의 Agree를 Click합니다.

Graphviz Download

Graphviz Download

Windows – Stable and Development Windows Install Packages를 Click하여 Download한 후 설치하면 모든 준비는 완료됩니다.

2. Source Code에 문서화를 위한 Comment 작성

BCB6 - Doxygen Test Project

BCB6 - Doxygen Test Project

설치가 모두 끝났으니 이제 Source Code에 Doxygen Style의 주석을 달아봅시다. Style 및 사용하는 Metatag는 여러가지가 있는데 여기서는 간단하게 주로 사용하는 것을 Template 형태로 적어보도록 하겠습니다.

좀 더 자세한 내용을 알기 원한다면 아래의 Doxygen Manual을 참조하기 바랍니다.

2.1 Class comment template

Class에 대한 주석을 작성할 때는 아래와 같이 작성하면 됩니다. 아래의 예제에서는 Class에 대한 주석 뿐만 아니라, 전역 변수, Method에 대한 주석도 설명하고 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * 짧은 Class 설명
 *
 * @author  ioriy2k <ioriy2k@ioriy2k.pe.kr>
 *
 * 긴 Class 설명을 여기에 적습니다.
 */

class Test {

private:

    /// 전역변수에 대한 한 줄 설명
    bool test_flag;

    /**
     * 전역변수에 대한 긴 설명을 작성할 수 있습니다.
     * 여러 줄로 표현이 가능합니다.
     */

    bool test_flag1;

public:

    /// Method에 대한 한 줄 설명    
    Test();
};

위와 같은 주석을 작성한 후, Doxygen으로 문서를 생성한 모습은 다음과 같습니다.

HTML - Class Description

HTML - Class Description

2.2 Method comment template

Class의 Metho에 대한 주석을 작성할 때는 다음과 같이 작성하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
/**
 * 짧은 Method 주석
 *
 * 긴 Method 주석을 여기에 작성합니다.
 *
 * @param    run    Parameter명을 먼저 적고 그 이후에 변수에 대한 정보를 적습니다.
 * @return return 값이 존재하는 경우 Return 값에 대한 정보를 적습니다.
 */

bool Test::RunTest(int run) {

}

Parameter가 여러 개일 경우에는 Parameter의 순서대로 @param을 사용하여 설명을 적습니다. 개인적으로는 Debugging을 하기 위해서 header를 반복해서 살펴야 하는 Case를 가능하면 피하기 위해서 Method 주석은 header보다는 cpp에 적는 편입니다.

위와 같이 작성한 주석을 가지고 Doxygen으로 문서를 생성한 모습은 다음과 같습니다.

HTML - Method Description

HTML - Method Description

2.3 Mainpage comment template

Mainpage는 Doxygen 문서의 Mainpage(index.html)를 주석으로 생성하는 것을 의미합니다. Mainpage 주석은 Source에 오직 한 군데만 작성해야 하며 이 곳은 주로 Project의 개관, 알아두어야 할 정보나 Compile 방법 등을 적어 놓는데 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * @mainpage Project 제목
 *
 * @section overview Overview
 *
 * Section에 대한 설명을 여기에 적습니다.
 *
 * @section list List
 *
 * 다음과 같이 순서가 없는 List를 작성할 수 있습니다.
 *
 * - List 1
 * - List 2
 *
 * 다음과 같이 순서가 있는 List를 작성할 수 있습니다.
 *
 * -# List 1
 * -# List 2
 */

위와 같은 Mainpage Comment를 Doxygen으로 문서화하면 다음과 같은 모습이 됩니다.

HTML - Mainpage

HTML - Mainpage

3. 마치면서…

이상으로 Doxygen을 설치하는 방법과 문서 생성을 위해 Source Code에 주석을 다는 방법을 알아봤습니다. 다음 Post에서는 Source Code에 작성한 주석을 Doxywizard를 사용해서 HTML과 CHM 문서로 만드는 방법을 알아보도록 하겠습니다.

이전 Post에 이어서 이번 Post에서는 Eclipse를 사용하여 Autotools Project를 직접 만들어 보면서 개발하는데 발생하는 여러가지 문제들을 해결해 보도록 하겠습니다.

5. Autotools Project 생성

설치 및 설정을 마쳤으니 이제 Eclipse를 사용해서 Autotools Project(C Project)를 만들어 봅시다.

Eclipse - New Project

Eclipse - New Project

C Project를 새로 만들기 위해서 Eclipse를 실행한 다음, File -> New -> C Project를 Click합니다.

C Project

C Project

C Project Dialog에서 다음의 항목을 입력한 후 Next를 누릅니다.

  • Project Name : Project의 이름을 입력합니다.
  • Project Type : GNU Autotools -> Hello World ANSI C Autotools Project를 선택합니다. Empty Project를 선택하면 거의 처음부터 Autotools Project를 만드는 것이나 마찬가지이기 때문에 편의를 위해서 이것을 선택합니다.
  • Toolchains : GNU Autotools Toolchain을 선택합니다.
C Project - Basic Settings

C Project - Basic Settings

그 다음에는 Project의 기본 정보를 입력하고 Next를 Click합니다. Author, Copyright notice은 Main Source File에 주석으로 추가되는 내용이니 편하게 적으면 됩니다. 각 항목에 다음과 같이 입력합니다.

  • Author : Project의 개발자의 이름을 입력합니다.
  • Copyright notice : Project의 License를 입력합니다.
  • Hello world greeting : Hello World 대신 다른 Text를 Console에 출력하려면 여기에 Text를 입력합니다.
  • Source : Project Directory에서 Source File들이 위치할 Directory 이름을 입력합니다.
C Project - Select Configurations

C Project - Select Configurations

마지막으로 Project의 설정을 지정할 수 있습니다. 여기서는 Finish를 눌러 그대로 진행합시다.

Eclipse - Created Project

Eclipse - Created Project

Project가 생성된 모습은 위의 그림과 같습니다. 이전 Post에서 언급한 configure.ac, Makefile.am 등이 생성되어 있는 것을 볼 수 있습니다.

GNU Autotools가 적용된 Project는 Build System을 자동으로 생성하기 위한 File들 외에 다음과 같은 Text File들이 기본적으로 포함되어 있어야 합니다.

  • AUTHORS : Project 개발에 참여한 사람들의 이름을 적습니다.
  • ChangeLog : Project의 각 Version Release에 대한 변경사항을 적습니다.
  • COPYING : Project License를 적습니다. License 원문이 대부분 여기에 위치합니다.
  • NEWS : Project와 관련된 소식을 여기에 적습니다.
  • README : Project에 대해서 사용자에게 알려야 할 기본적인 사항을 여기에 적습니다.

그림에서 방금 언급한 Text File들이 자동으로 추가된 것을 확인할 수 있습니다. (세부적인 내용은 본인이 직접 작성해야 합니다.) 그리고 생성 시에 입력한 Source Directory에 Main Source File(예제에서는 hello.c)이 위치한 것을 볼 수 있습니다.

Eclipse - Project Properties

Eclipse - Project Properties

하지만, Autotools에 관련된 설정이 Project에 제대로 적용되지 않았기 때문에 지금 상태에서는 Build도 제대로 수행되지 않을 것입니다. 설정을 위해서 Project -> Properties를 Click합니다.

Properties - Autotools Settings

Properties - Autotools Settings

Project Properties에서 Autotools -> General을 선택한 다음, Tools Settings Tab에서 위의 그림과 같이 입력하여 해당 Program의 경로(/usr/bin)를 추가하고 OK를 누릅니다.

Eclipse - Makefile.am

Eclipse - Makefile.am

그 다음, Project Explorer에서 src/Makefile.am을 Double-Click하여 엽니다. 이전에도 설명했지만 Makefile.am은 Makefile을 자동으로 생성하기 위해 필요한 File들을 만들어 주는 Automake를 위해서 필요한 File입니다.

src/Makefile.am을 열어보면 위와 같은 내용을 하고 있을 것입니다. 2가지의 Macro가 표시되어 있는데 각각은 다음과 같은 의미가 있습니다.

  • bin_PROGRAMS : 최종 결과물(Binary)의 이름을 입력합니다. Default로 위의 그림과 같이 a.out이 설정되는데 원하는 이름으로 바꾸면 됩니다.
  • a_out_SOURCES : 최종 결과물을 Build하기 위해서 Compile해야 할 Source를 적습니다. 주의해야 할 것은 위에서 최종 결과물의 이름을 바꾸었다면 _SOURCES 앞을 그 이름으로 변경시켜줘야 한다는 것입니다.

최종 결과물이 a.out으로 나오는 것은 너무 옛날 방식이니 이름을 바꿔보도록 합시다. 위의 예제에서의 Project 이름이 hello이니 최종 결과물의 이름도 동일하게 바뀌도록 다음과 같이 Makefile.am을 수정합니다.

1
2
bin_PROGRAMS=hello
hello_SOURCES=hello.c
Eclipse - Build Project

Eclipse - Build Project

src/Makefile.am을 저장한 다음, 이제 Build를 수행해 봅시다. Project -> Build Project를 Click합니다.

Eclipse - Build Finished

Eclipse - Build Finished

설정이 제대로 되었다면 위의 그림과 같이 Build가 완료되면서 여러가지 File이 생성될 것입니다. 여기서 생성된 File들은 Build를 명령을 통해서 내부적으로 Automake, Autoconf가 실행되면서 생긴 File들입니다.

그리고 생성된 Build System을 사용해서 configure Script와 make를 실행하여 Build가 완료되면 최종 결과물이 생성됩니다. 그림에서 보면 src/Makefile.am에 지정한 hello라는 최종 결과물(Binary)가 생성된 것을 Project Explorer를 통해 확인할 수 있습니다.

Eclilpse - Run

Eclilpse - Run

이제 생성된 최종 결과물을 실행해 봅시다. Run -> Run을 Click합니다.

Launch Debug Configuration Selection

Launch Debug Configuration Selection

처음 Run이나 Debug를 실행하게 되면 위의 그림과 같은 Dialog가 표시됩니다. 이 Dialog에서는 Debugging을 위한 Debugger를 선택할 수 있습니다. Remote Debugging을 사용하지 않기 때문에 gdb/mi를 선택하고 OK를 누릅니다.

Eclipse - Run (Finished)

Eclipse - Run (Finished)

정상적으로 실행되었다면, 위의 그림과 같이 아래의 Console View에 Hello World가 출력될 것입니다.

6. Source 추가하기

Eclipse CDT를 통해 생성한 다른 C/C++ Project와는 다르게 Autotools를 사용한 Project에서는 새로운 Source를 추가하더라도 Build에 자동으로 포함되지 않습니다.

지금부터 Source를 직접 추가해보면서 새로 생성한 Source File을 Build에 포함하는 방법을 알아봅시다.

Eclipse - hello.c

Eclipse - hello.c

Main Source File(위의 예에서는 hello.c)을 열어보면 위와 같은 내용일 것입니다. 위에서 Hello World를 출력하는 Code를 변경해서 새로 추가한 Source에서 Hello World를 출력하도록 만들어 보겠습니다.

Eclipse - New Header File

Eclipse - New Header File

새로 정의할 Function의 Prototype을 Include해서 사용할 수 있도록 먼저 Header File을 새로 만들어 봅시다. File -> New -> Header File을 Click합니다.

New Header File

New Header File

New Header File Dialog에서는 Header File을 생성하기 위한 기본적인 정보를 입력합니다.

기본적으로 Source Folder에는 Project를 생성 시에 지정한 Source Directory가 기본적으로 입력되어 있으며, Template은 C의 기본적인 Header의 내용이 입력된 Template이 설정되어 있습니다.

Header File에 새로 생성할 Header File의 이름(위의 예에서는 hello1.h)을 적고 Finish를 누릅니다.

Eclipse - hello1.h

Eclipse - hello1.h

새로 생성된 Header File의 모습입니다. 중복으로 이 File을 Include했을 경우를 위해서 Header File의 이름을 Symbol로 Define한 것을 할 수 있습니다.

이제 여기에 새로 생성할 Hello, World 출력 함수를 위해서 #define과 #endif 사이에 다음과 같이 입력하고 저장합니다.

1
2
3
4
#include <stdio.h>

/* Say hello */
extern void say_hello(char *);
Eclipse - New Source File

Eclipse - New Source File

Hello World를 출력할 함수의 Prototype을 Header에 정의했으니 이제 이 함수를 구현할 Source File을 만들어 봅시다. File -> New -> Source File을 Click합니다.

New Source File

New Source File

New Source File Dialog에서는 Source File을 생성하기 위한 기본적인 내용을 입력합니다.

Source Folder는 Project 생성 시에 설정한 Source Directory가 기본적으로 입력되어 있으며, Template은 C Source의 Template이 설정되어 있습니다.

Source File에 새로 생성할 Source File의 이름(위의 예에서는 hello1.c)를 입력하고 Finish를 누릅니다.

Eclipse - hello1.c

Eclipse - hello1.c

새로 생성된 Source File의 모습입니다. 주석으로 생성된 File의 이름과 작성자, 그리고 생성 날짜가 자동으로 입력된 것을 알 수 있습니다.

이제 이 Source에 Header에서 선언한 함수를 다음과 같이 구현해 봅시다.

1
2
3
4
5
6
7
8
9
#include "hello1.h"

/**
 * Say hello
 */

void say_hello(char *str)
{
    printf("%s\n", str);
}
Eclipse - hello.c (Modified)

Eclipse - hello.c (Modified)

새로운 추가한 Source에 원하는 Code를 구현했으니 Main Source File을 수정해 봅시다.

Main Source File(위의 예에서는 hello.c)에서 새로 생성한 Source의 함수(위의 예에서는 hello1.c의 say_hello())를 호출하여 Hello World를 출력하도록 수정하면 다음과 같습니다.

1
2
3
4
5
6
7
8
#include <stdlib.h>
#include "hello1.h"

int main(void) {

    say_hello("Hello World");
    return EXIT_SUCCESS;
}
Eclipse - Makefile.am (Modified)

Eclipse - Makefile.am (Modified)

이제 새로운 Source File을 추가해서 Hello World를 구현하는 과정은 모두 마쳤습니다. 하지만 이대로는 Build에 포함되지 않기 때문에 Build에 새로 추가한 Source를 추가해 봅시다.

위의 그림과 같이 src/Makefile.am을 열어서 _SOURCES에서 Main Source File(위에서는 hello.c) 뒤에 한 칸 띄어서 새로운 추가한 Source File(위에서는 hello1.c)을 적어줍니다.

Eclipse - Build Project

Eclipse - Build Project

src/Makefile.am을 수정하기만 하면 그 이후에 나머지 필요한 과정은 Build 시에 자동으로 실행됩니다. 이제 모든 준비가 끝났으니 Project -> Build Project를 Click합시다.

Eclipse - Run

Eclipse - Run

Build가 완료된 후, Run -> Run을 Click하여 Build된 Binary를 실행하면 위와 같이 동일하게 Console View에 Hello World가 출력되는 것을 확인할 수 있습니다.

7. Debugging

이번에는 Debugging에 대해서 한 번 살펴봅시다. 기존의 다른 Project와는 다르게 Autotools Project에서는 Breakpoint와 상관없이 Program Counter가 이러저리 왔다갔다 하면서 제대로 Debugging이 이루어지지 않습니다. 왜 그럴까요?

Eclipse - Compiler Option

Eclipse - Compiler Option

Build 시에 Console의 내용들을 살펴보면 답을 쉽게 찾을 수 있습니다. 위의 그림에 표시한 것과 같이 Compile과 Link 시에 Compiler(GCC)에 사용된 Option을 보면 -g -O2가 적용되어 있는 것을 확인할 수 있습니다.

-g는 Debugging을 가능하게 Compile하는 Option, -O2는 Code를 Optimizing하는 Option입니다. 두 개를 동시에 쓰게 되면 Debugging을 위한 Data가 제대로 생성되지 않아서 Debugging를 제대로 할 수 없게 됩니다. (-O2로 인해 -g가 상쇄되는 효과)

Compile 시에 -g -O2 Option이 들어가는 것은 Shell의 환경변수인 CFLAGS와 관계되어 있습니다. CFLAGS는 C Source File을 Compile할 때 Compiler에 설정하는 Option을 지정하는 Shell 환경변수입니다. (C++의 경우는 CPPFLAGS)

기본적으로 사용자가 CFLAGS를 지정하지 않을 경우 configure Script에서는 Code Optimizing을 위해서 -g -O2를 사용하도록 되어 있습니다. 그러나 이 설정으로는 Debugging이 불가능하니 CFLAGS를 새로 지정하여 configure Script를 실행해 주면 문제가 해결될 것입니다.

Eclipse - Manage Build Configurations

Eclipse - Manage Build Configurations

이것을 응용해서 Build Configuration(Project의 Properties를 묶어놓은 Group을 의미)을 생성해서 Debugging을 위한 설정을 따로 관리해 봅시다.

Build Configuration으로 관리하게 되면 MS의 Build System에서 Release와 Debug를 구분하는 것과 유사하게 Release Build와 Debugging을 위한 Build를 쉽게 구분하여 Build 할 수 있게 됩니다.

Debugging을 위한 Build Configuration을 생성하기 위해서 Project -> Build Configurations -> Manage를 Click합니다.

Manage Configurations

Manage Configurations

Manage Configurations Dialog에서 New를 누릅니다.

Create New Configuration

Create New Configuration

Create New Configuration Dialog에서 Name에는 새로 생성할 Configuration의 이름인 Debug를 입력합니다.

그리고 기본적으로 생성되어 있는 Configuration인 Build (GNU)을 토대로 변경하기 위해서 Copy settings from에서 Existing configuration을 선택한 다음 Build (GNU)를 선택하고 OK를 누릅니다.

Eclipse - Project Properties

Eclipse - Project Properties

그 다음 OK를 눌러 Manage Configuration Dialog를 닫은 후, Debug Configuration의 설정을 수정하기 위해서 Project -> Properties를 Click합니다.

Properties - configure Settings

Properties - configure Settings

Project Properties에서는 각각의 Build Configuration을 따로 설정할 수 있습니다. 위에서 configure Script 실행시 CFLAGS를 지정해 주면 된다고 언급했기 때문에 Autotools -> Configuration Settings를 통해 설정해 봅시다.

그 다음, Configuration Combobox에서 방금 생성한 Build Configuration인 Debug를 선택하고, 아래의 Treeview에서 configure를 선택합니다. 그리고 Command에 다음과 같이 입력하고 Apply를 Click합니다.

1
CFLAGS="-g3 -O0" configure
Properties - C/C++ Build

Properties - C/C++ Build

그리고 생성된 Debug Configuration의 설정으로는 Build 시에 Compile된 결과물을 저장하기 위한 Directory가 따로 생성됩니다.

하지만 굳이 구분할 필요는 없기 때문에 생성하지 않도록 변경하기 위해서 Build location을 수정합시다. (취향에 따라 다른 이름을 입력해서 사용해도 됩니다.)

Project Properties Dialog에서 C/C++ Build의 Configuration Combobox에서 Debug를 선택한 다음, Builder Settings Tab의 Build Location -> Build Directory를

1
${workspace_loc/hello}/build-Debug

에서,

1
${workspace_loc/hello}

로 변경합니다. (위의 내용은 hello Project의 예임)

Eclipse - Set Active Configuration

Eclipse - Set Active Configuration

Project Properties Dialog를 OK를 눌러 닫은 후에, 현재 지정된 Build Configuration을 변경하기 위해서 Project -> Build Configurations -> Set Active -> Debug를 Click합니다.

그리고 변경된 Build Configuration이 Project에 적용될 수 있도록 Project -> Reconfigure Project를 Click하여 configure Script를 다시 실행하도록 합시다.

Eclipse - Compiler Option (Changed)

Eclipse - Compiler Option (Changed)

이제 준비가 완료되었습니다. Project -> Build Project를 눌러 Build를 완료하면 위의 그림과 같이 Compile 시에 Compiler Option이 -g -O2에서 -g3 -O0로 변경된 것을 확인할 수 있습니다.

Eclipse - Toggle Breakpoint

Eclipse - Toggle Breakpoint

이제 Breakpoint를 설정해 봅시다. 위의 그림과 같이 Main Source File (위의 예에서는 hello.c)의 say_hello()를 호출하는 Line에 Breakpoint를 설정하기 위해서 Cursor를 위치하고 Run -> Toggle Breakpoint를 Click합니다.

Eclipse - Debug

Eclipse - Debug

그리고 Debugging을 위해서 Run -> Debug를 Click합니다.

Debugging

Debugging

Debug가 시작되면 위의 그림과 같이 Eclipse의 Perspective가 Debug로 변경되면서 설정한 Breakpoint에 Program Counter가 위치하는 것을 확인할 수 있습니다.

8. 마치면서…

지금까지 간단하게 Ubuntu에서 Eclipse를 사용해서 Autotools Project를 만드는 방법을 알아봤습니다.

아직은 Autotools Support Plugin 자체가 Incubation 단계라서 부족한 부분들이 보이지만, 이 Plugin을 사용하면 Eclipse를 통해서 조금은 편리하게 Autotools가 적용된 Project를 개발할 수 있는 것 같습니다.

Eclipse CDT에서 Autotools를 사용하는 방법에 대한 더 자세한 내용을 알기 원한다면 아래의 Link를 방문해 보기 바랍니다.


이전에 Eclipse CDT를 사용하여 개발했던 Project에 Autotools를 적용하기 위한 방법을 찾다가 Eclipse Plugin을 살펴보니 Incubation 중에 Autotools Support for CDT를 찾을 수 있었습니다.

그것을 사용해서 기존의 Project를 Autotools Project로 만들어 보니, 기존에 Autotools를 조금 사용할 줄 알면 편리하게 개발할 수 있다는 생각이 들더군요.

그래서 이번 Post에서는 Project를 만들면서 경험했던 삽질들을 정리할 겸해서, Ubuntu에서 Eclipse CDT를 사용하여 Autotools Project를 생성하여 개발하고 Debugging하는 방법을 적어보도록 하겠습니다.

1. Autotools?

먼저 Autotools가 무엇인지 모르는 분들을 위하여 간단하게 설명해 보겠습니다. Linux에서 Apache나 PHP와 같은 Open-source Project를 Compile 해 본 경험이 있다면 대부분 다음과 같은 과정을 거쳤을 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... yes
(blah blah....)

# make
make  all-recursive
make[1]: Entering directory `/home/ioriy2k/workspace/test'
Making all in src
make[2]: Entering directory `/home/ioriy2k/workspace/test/src'

gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT test.o -MD -MP -MF .deps/test.Tpo -c -o test.o test.c
mv -f .deps/test.Tpo .deps/test.Po
gcc  -g -O2   -o test test.o  
(blah blah...)

# sudo make install
Making install in src
make[1]: Entering directory `/home/ioriy2k/workspace/test/src'
make[2]: Entering directory `/home/ioriy2k/workspace/test/src'

test -z "/usr/local/bin" || /bin/mkdir -p "/usr/local/bin"
  /usr/bin/install -c test '/usr/local/bin'
(blah blah...)

물론 Project Source에 따라 약간씩 차이가 있겠지만 위와 유사한 방법으로 Compile하여 설치하는 것이 보통일 것입니다. Autotools는 위와 같은 Build System을 Source Code에 만들어 주는 Tool입니다.

그러면 Autotools로 위와 같은 Build System을 만드는 이유는 무엇일까요? 이 Build System을 사용하게 되면 여러 Unix 계열 OS에 Porting 할 수 있도록 편의를 제공합니다.

그리고 Source Package를 Build할 System이 Build에 필요한 Library나 Tool을 가지고 있는 지를 Check하여 없을 경우에는 미리 경고를 표시할 수 있습니다. 또는 Source Code와 연계하여서 OS에 따라 제공하지 않는 Method를 따로 구현해서 제공할 수도 있습니다.

이 외에도 Autotools를 사용하면 여러가지 이득을 볼 수 있습니다. 물론 Autotools를 사용하여 Source Package에 Build System을 구축해 놓으면 다른 사람들에게 전문적인 Project인 것처럼 보이게 하는 효과도 있습니다. :)

Autotools는 Automake, Autoconf, Libtool 등의 Package로 구성되어 있으며 각 Package는 다음과 같은 기능을 합니다.

  • Automake : Source Code를 Build하기 위해 사용되는 make를 위해서 여러 OS에 Porting할 수 있는 Makefile을 자동으로 생성합니다. 생성을 위해서는 Makefile.am을 작성해야 합니다.
  • Autoconf : 각 OS의 환경을 Check하고 Build에 필요한 환경 File을 생성해 주는 configure Script를 자동으로 생성합니다. 생성을 위해서는 configure.ac를 작성해야 합니다.
  • Libtool : Source Code의 최종 결과물이 실행 File이 아닌 Shared Library나 Static Library를 만드는데 사용하는 Tool입니다. Automake와 Autoconf와 같이 사용될 경우, configure.ac와 Makefile.am을 통해서 간접적으로 사용됩니다.

Autoconf - Automake Process (from Wikipedia)

Source Code에 Autotools로 Build System을 구축하는 방법은 위의 그림과 같은 순서로 이루어 집니다. 약간 복잡해 보이지만 다음과 같이 설명할 수 있습니다.

  1. Makefile.am : automake를 실행하기 위해서 Makefile.am을 만듭니다.
  2. autoscan : Source code가 있는 Directory에서 autoscan을 실행하여 configure.ac를 자동으로 생성합니다.
  3. aclocal : configure.ac에 지정한 Macro에 대한 정보를 가지고 m4 macro를 생성합니다.
  4. autoheader : configure.ac에 지정한 정보를 가지고 config.h.in을 생성합니다. 이것은 나중에 config.h를 만드는 기초자료로 사용되며, Source code에서 config.h를 include하여 해당 Symbol의 상태를 이용하여 System dependent한 구현들을 상황에 맞게 처리할 수 있게 됩니다.
  5. automake : Makefile.am과 configure.ac의 정보를 가지고 Makefile.in을 생성합니다.
  6. autoconf : aclocal.m4와 configure.ac를 가지고 configure Script를 자동으로 생성합니다.
  7. configure : System을 Check하고 Build를 하기 위한 정보를 수집하여 저장하고 make를 위한 Makefile을 생성합니다.
  8. make : configure를 통해 생성된 Makefile을 가지고 Buld를 수행합니다.

어느 정도 감이 오신 분도 있을 것이고, 아닌 분도 있을 것이라고 생각이 됩니다. (Unix-like System에서 개발해 본 경험이 없는 분들은 좀 어려울 지도..) 저의 부족한 설명보다 더 자세하고 쉽게 설명한 아래의 문서들을 보시면 좀 더 쉽게 이해할 수 있을 겁니다.

2. 설치

Autotools가 무엇인지 알게 되었다면 이제 개발에 필요한 Eclipse와 Autotools를 설치해 봅시다.

Autotools의 전부를 이해하지 못한다 해도 이 Post에 순서도 차근차근 따라하다 보면 쉽게 Project를 만들 수 있으니 걱정하지 않아도 됩니다. :)

2.1. Eclipse 설치

Autotools Project를 만들기 위해서 Eclipse를 설치합니다. 설치 방법은 2가지가 있는데 개인의 취향에 따라 아래의 2가지 방법 중 하나를 선택하면 됩니다.

Method 1: Eclipse IDE for C/C++ Linux Developers 설치

첫 번째 방법은 C/C++ 개발을 Eclipse 상에서 수행하기 위해 필요한 Plugin을 미리 설치해 놓은 Package를 Download해서 사용하는 것입니다. 굳이 Plugin Download에 시간을 들일 필요가 없이 한방에 설치할 수 있습니다.

먼저 Eclipse의 Download Page에 Web Browser로 접속합니다.

Eclipse Downloads

Eclipse Downloads

Eclipse IDE for C/C++ Linux Developer의 오른쪽에 Linux 32bit, Linux 64bit 중에서 설치된 OS의 Architecture에 맞는 것을 Click합니다.

Eclipse Downloads - Mirror Selection

Eclipse Downloads - Mirror Selection

그 다음, Download를 위한 Mirror가 Page 상단에 위의 그림과 같이 표시되는데 그 Link를 Click하면 Download가 시작됩니다.

Download한 Eclipse Package는 Terminal에서 다음과 같이 입력하여 압축을 해제합니다.

1
# tar xvzf eclipse*.tar.gz -C ~

위의 명령을 사용하면 ~/Eclipse Directory에 설치됩니다. Directory를 변경하고 싶다면 -C Option 뒤에 설치할 Directory를 입력하면 됩니다.

이제 설치는 모두 완료되었습니다. 그러나 Eclipse를 실행하기 위해서는 JRE 또는 JDK가 필요합니다. Ubuntu Natty Narwhal 11.04의 경우는 다음 Post를, Ubuntu Oneiric Ocelot 11.10의 경우는 다음 Post를 참고하여 설치하면 됩니다.

Method 2: Eclipse CDT Plugin 설치

두번째 방법은 기존에 사용하던 Eclipse에 Plugin 형태로 설치하여 사용하는 방법입니다. Eclipse의 최신 Version인 Eclipse Classic 3.7.1 Indigo를 예로 들어 설명하겠습니다.

Eclipse - Install New Software

Eclipse - Install New Software

Eclipse를 실행한 후, Help -> Install New Software를 Click합니다.

Available Software

Available Software

Available Software Dialog에서 Work With Combobox의 Indigo를 선택합니다. 잠시 기다리면 아래에 설치 가능한 Plugin List가 표시되는데, 여기서 위의 그림과 같이 Programming Langauages의 다음 항목을 Check한 다음 Next를 누릅니다.

  • Autotools support for CDT (Incubation)
  • C/C++ Development Tools
  • C/C++ Library API Documentation Hover Help (Incubation)
Install Details

Install Details

설치될 Plugin의 구체적인 목록이 표시됩니다. Next를 누릅니다.

Review Licenses

Review Licenses

설치될 Plugin의 License가 표시됩니다. 오른쪽 아래의 I accept the terms of the license agreement를 Check하고 Finish를 누릅니다.

Installing Software

Installing Software

Plugin Site에서 설치할 Plugin을 자동으로 Download한 후 설치됩니다.

Restart

Restart

설치가 완료되면 Eclipse를 다시 시작하겠는지 물어보는 Dialog가 표시되는데 Restart Now를 Click하여 재시작하면 Plugin 설치가 모두 완료됩니다.

2.2. Autotools 설치

개발을 위한 IDE인 Eclipse를 설치했다면 이제 Autotools를 System에 설치해 봅시다. Ubuntu의 Repository에 Package가 등록되어 있으므로 Terminal에서 아래와 같이 입력하면 Autotools가 System에 설치됩니다.

1
# sudo apt-get install build-essential autoconf automake libtool

3. Eclipse 설정

설치가 완료되었으니 Eclipse로 Project를 만들기 이전에 개발에 편리한 Setting으로 설정해 봅시다. 먼저, 내용을 설명하기 이전에 Test 환경에 대한 정보를 적어보면 다음과 같습니다.

  • Ubuntu Natty Narwhal 11.04 64bit
  • Eclipse 3.7.1 Indigo
  • Eclipse IDE for C/C++ Linux Devlopers 1.4.1 (C/C++ Development Tools 8.0)
  • Autotools support for CDT (Incubation) 3.0.1
  • autoconf 2.67, automake 1.11.1 and libtool 2.2.6b

위에서 Home Directory의 eclipse Directory에 Eclipse의 압축을 해제했다면 다음과 같이 입력하여 Eclipse를 실행합니다.

1
2
$ cd ~/eclipse
eclipse$ ./eclipse
Workspace Launcher

Workspace Launcher

처음 실행한 경우 위의 그림과 같이 Workspace를 설정하는 Dialog가 표시됩니다. Workspace는 Project를 개발하기 위한 작업공간(Directory)을 나타냅니다. 원하는 Directory를 선택한 다음 OK를 누릅니다.
(실행할 때마다 묻는 것이 귀찮다면 use this as the default and do not ask again을 Check하면 됩니다.)

Eclipse - Open Perspective

Eclipse - Open Perspective

먼저 C/C++ Project를 개발할 환경으로 설정해야 합니다. (Plugin으로 설치한 경우에만 필요) Window -> Open Perspective -> Other를 Click합니다.

Open Perspective

Open Perspective

Open Perspective Dialog에서 C/C++을 선택하고 OK를 누릅니다.

Eclipse - Preferences

Eclipse - Preferences

C/C++을 개발할 환경이 표시되면 이제 개발에 편리한 설정을 해 봅시다. Window -> Perferences를 Click합니다.

Preferences - Key Scheme

Preferences - Key Scheme

CDT가 Eclipse에 설치되면 Key Scheme으로 Visual Studio 항목이 생기게 됩니다. Visual Studio의 단축키에 익숙하다면 General -> Keys -> Scheme -> Microsoft Visual Studio를 선택하면 편리하게 Eclipse를 사용할 수 있습니다.

Visual Studio Key Scheme을 설정하게 되면 Debugging 시에 F10 Key(Step Over)가 Unity의 단축키와 맞물려서 제대로 동작하지 않을 것입니다. F10 Key를 제대로 사용하려면 아래와 같이 Terminal에서 입력하면 됩니다.

1
$ gconftool-2 --type string --set /apps/compiz-1/plugins/unityshell/screen0/options/panel_first_menu ""
Preferences - Documentation Tool

Preferences - Documentation Tool

그리고 C/C++ -> Editor의 Option 중에 Documentation tool comments라는 Section이 있습니다. C/C++ Project를 개발할 경우, Project의 문서화를 위해서 문서화 도구에서 지정한 주석을 사용하게 되는데 여기서 문서화 도구의 종류를 설정하면 주석 입력시 자동으로 해당하는 문서화 도구에 맞는 주석양식이 자동으로 입력됩니다.

또한 그 주석의 내용을 가지고 주석이 해당하는 Class나 Method에 Mouse Cursor가 위치했을 때 주석을 내용을 Tooltip으로 자동으로 표시합니다.

C/C++ 개발시 문서화 도구로 Doxygen을 주로 사용하기 때문에 위의 그림과 같이 Workspace default에 Doxygen을 선택하면 됩니다. Doxygen의 주석 양식과 사용방법이 궁금하다면 Borland C++ Builder 6: Doxygen으로 Source Code 문서화하기 (Part 1)을 참고하기 바랍니다.

이 외의 Preferences 설정은 자신에 맞게 설정해 주면 됩니다. 잘 모르겠다면 나머지는 변경하지 말고 위에 언급한 설정만 적용해도 충분합니다.

4. 마치면서…

이제 Eclipse를 사용해서 Autotools Project를 생성하기 위한 모든 준비가 끝났습니다. 다음 Post에서는 직접 C/C++ Project를 생성해 보고, 새로운 Source를 추가하는 방법과 Debugging을 하는 방법 등을 알아보도록 하겠습니다.

▶ route CMD
리눅스 커널에 설정된 IP 라우팅테이블(Routing Table)을 보여준다.
<명령어위치> : /sbin/route
<옵션>
man route

route<- 라우팅 정보가 나온다.

# route add default gw 192.168.10.3 /* GW IP 추가 */
<사용예제>
# route add -net 127.0.0.0
# route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0
# route add default gw mango-gw
# route add ipx4 sl0
# route add -net 192.57.66.0 netmask 255.255.255.0 gw ipx4
# route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
# route add -net 10.0.0.0 netmask 255.0.0.0 reject

▶ 리눅스시스템의 라우팅테이블 확인 및 이해
아래 두 가지 방법으로 리눅스시스템의 라우팅테이블을 확인할 수 있다.

# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
0.0.0.0 192.168.10.2 0.0.0.0 UG 0 0 0 eth0


# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
172.16.0.0 * 255.255.0.0 U 0 0 0 eth1
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
default 192.168.10.2 0.0.0.0 UG 0 0 0 eth0

① 첫번째행부터 시작하여 행단위로 한 행씩 차례대로 읽어서, 처리할 패킷을 어디로 보낼것인가를 결정한다.

② default 라는 것은 시스템의 기본 게이트웨이 설정행을 의미하며, 그 행의 Gateway 항목값이 기본게이트웨이의 IP 주소이다. (default는 0.0.0.0 을 의미한다.)

③ 보낼 데이터(패킷)의 목적지 IP 주소와 Genmask 값(Subnet Mask)과의 AND 연산을 해서 그 결과가 해당행의 Destination 항목과 동일 할 경우에 해당행의 Iface 항목에 있는 인터페이스로 해당 패킷을 보낸다.

④ Iface 항목의 값이 lo 인 행(Destination 값이 127.0.0.1인 행)은 이 시스템의 루프백(loopback) 데이터를 처리하기 위한 설정이다. 즉, 자기 자신에게로 데이터를 보낼 때에 처리를 담당하는 인터페이스이다.
※ 가장 윗줄의 행부터 차례대로 패킷을 보내고 맞는다면 Iface 로 패킷을 보낸다.

[02] 리눅스 시스템의 네트워크 파일들
■ 기본 게이트웨이(Default Gateway) 설정파일
# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=localhost.localdomain GATEWAY=192.168.10.X

<항목설명>
NETWORKING=yes
- 통신이 되도록 지원할 것인가의 설정(yes or no)

NETWORKING_IPV6=no
- IPv6를 사용할 것인지를 설정(yes or no)

HOSTNAME=localhost.localdomain
- 서버의 호스트네임(hostname)을 설정

GATEWAY=192.168.10.X
- 시스템전체에 대한 Global 한 기본게이트웨이 IP 주소

# cat /etc/sysconfig/network-scripts/ifcfg-eth1

# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth1
BOOTPROTO=static
IPADDR=172.16.8.250
NETMASK=255.255.0.0
ONBOOT=yes
HWADDR=00:0c:29:a4:5b:92


<항목설명>
DEVICE=eth1
- 네트워크디바이스 장치명을 말한다.
리눅스에서 첫번째 NIC : eth0
리눅스에서 첫번째 NIC : eth1
리눅스에서 첫번째 NIC : eth2


BOOTPROTO=static
- 정적(static)한 고정 IP 주소 할당
동적(dhcp)로 한다면 dhcp로 설정


IPADDR=172.16.8.250
- 시스템의 IP 주소


NETMASK=255.255.0.0
- 넷마스크값(NetMask)값을 의미


ONBOOT=yes
- 부팅시 활동화하여 사용할 것인가를 설정(yes or no)


HWADDR=00:0c:29:a4:5b:92
- 현재 이더넷의 하드웨어주소를 의미


MAC 주소를 의미하는 것으로 유일한 값을 가지는 물리적인 주소값이다.


GATEWAY
- 이더넷에 대한 게이트웨이 IP 주소를 설정
eth0,eth1 등에 대한 게이트웨이 설정이 없으면 /etc/sysconfig/network 설정이 우선


BROADCAST
- 브로드캐스트 IP 주소를 설정


NETWORK
- 호스트가 속한 네트워크의 IP 주소


USERCTL
- root 사용자뿐 아니라 일반사용자들도 이 네트워크 인터페이스(eth0)를 ON/OFF 할 수 있는가의 권한설정항목이다. (yes = 모두 사용 가능 // no = root 사용자만 사용 가능)

■ DNS 설정파일
기본 DNS 설정파일이다.
# cat /etc/resolv.conf
; generated by /sbin/dhclient-script
search localdomain <= 반드시 들어가야함
nameserver 192.168.10.2
이 설정파일에는 1차 네임서버, 2차 네임서버를 적어줄수도 있다.


[04] 리눅스 네트워크 실무
(01) ifconfig CMD
네트워크 인터페이스를 설정한다.
<명령어위치> : /sbin/ifconfig

<사용형식> :
ifconfig [interface]
ifconfig interface [aftype] options | address ...

<사용예제>
# ifconfig
# ifconfig eth0
# ifconfig eth1 172.16.8.253 netmask 255.255.0.0 up
# ifconfig eth1


② eth1 네트워크카드 down & up
# ifconfig eth1 down
# ifconfig eth1

# ifconfig eth1 up
# ifconfig eth1

(02) system-config-network CMD
X 윈도우 환경에서 네트워크 설정(리눅스 시스템의 런레벨 확인 # runlevel)
# runlevel
N 5
# who -r
run-level 5 2009-11-02 15:24 last=S
# system-config-network-tui

(03) hostname CMD
리눅스시스템의 HOSTNAME 변경한다.

hostname - show or set the system’s host name
domainname - show or set the system’s NIS/YP domain name
dnsdomainname - show the system’s DNS domain name
nisdomainname - show or set system’s NIS/YP domain name
ypdomainname - show or set the system’s NIS/YP domain name


<명령어위치> : /bin/hostname

① /etc/sysconfig/network 설정내용
# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=arirang
GATEWAY=192.168.10.2


<항목설명>
NETWORKING=yes
- 시스템이 네트워크를 활성화한다.(yes or no)
NETWORKING_IPV6=no
- IPv6 기반의 통신을 사용안한다.(yes or no)
HOSTNAME=arirang
- 호스트네임을 설정한다.(서버명 기입)
GATEWAY=192.168.10.2
- 이 시스템에서 Global 한 기본 게이트웨이 설정한다.


[참고] 호스트네임의 입력은 FQDN(Fully Qualified Domain Name) 형식으로도 할 수 있다.
QDN[에프큐디엔]은 시스템을 지칭하는 완전한 이름으로서, 호스트 이름과 그것의 도메인 이름으로 구성된다. 예를 들어, "www"가 호스트 이름이고, "terms.co.kr"이 도메인 이름이라면, FQDN은 "www.terms.co.kr"가 된다. FQDN은 인터넷상의 특정 호스트를 지칭하기 위한 고유한 인터넷 주소를 가져야한다. 인터넷상에 있지 않지만, 전자우편 주소를 위한 이름공간을 공유하는 일부 호스트를 위해서도, 동일한 이름 구조가 사용된다. FQDN을 가지고 있지 않은 호스트는 뱅 경로를 사용하여 지칭되어야한다.
모든 인터넷 컴퓨터들과 대부분의 UUCP 사이트들은1980년부터 작성된 막후의 많은 량의 소프트웨어 덕분에 이제 FQDN을 해석할 수 있다.


<실습>
# hostname
localhost.localdomain

# hostname www.itclass.com

# hostname
www.itclass.com
/* 이 상태에서 시스템 재부팅하면 원상태로 되돌아 간다. */


② HOSTNAME 쉘변수의 의미 및 변수값 확인 및 재설정
# echo $HOSTNAME
localhost.localdomain


# env | grep HOSTNAME
HOSTNAME=localhost.localdomain
[참고] 리눅스 시스템에서 특정 쉘변수값을 확인할 때에는 echo 명령어를 사용한다.

# export HOSTNAME="www.itclass.com"
/* export 명령어를 이용하여 특정 쉘변수의 값을 변경할 수 있다. */
/* [예제] # export HOSTNAME="변수값"

# echo $HOSTNAME
www.itclass.com

# env | grep HOSTNAME
HOSTNAME=www.itclass.com

(04) 네트워크 설정파일들 활용(IP 설정과 네트워크 재설정)
① /etc/sysconfig/network
② /etc/resolv.conf
③ /etc/sysconfig/network-scripts/ifcfg-lo
④ /etc/sysconfig/network-scripts/ifcfg-eth0
⑤ /etc/sysconfig/network-scripts/ifcfg-eth1
⑥ /etc/sysconfig/network-scripts/ifcfg-eth2
⑦ /etc/sysconfig/network-scripts/ifcfg-ethN (N=갯수)
⑧ 네트워크 콘트롤 스크립트 : /etc/rc.d/init.d/network restart | stat | stop | status
⑨ 변경된 IP 주소 확인 : ifconfig eth0
⑩ 변경된 IP 주소의 통신여부 확인 : ping www.linux.co.kr


① /etc/sysconfig/network
시스템 호스트네임 설정과 기본 게이트웨이를 설정한다.


② /etc/resolv.conf
도메인 네임 쿼리를 위한 DNS 서버를 설정한다.
# cat /etc/resolv.conf
; generated by /sbin/dhclient-script
search localdomain
nameserver 192.168.10.2

 

③ /etc/sysconfig/network-scripts/ifcfg-lo
시스템의 루프백주소에 대한 설정파일이다.
# cat /etc/sysconfig/network-scripts/ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

 

④ /etc/sysconfig/network-scripts/ifcfg-eth0
리눅스 시스템에서의 첫번째 물리적인 네트워크카드 설정파일이다.
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
HWADDR=00:0c:29:a4:5b:88


<항목설명>
DEVICE=eth1
- 네트워크디바이스 장치명을 말한다.
리눅스에서 첫번째 NIC : eth0
리눅스에서 첫번째 NIC : eth1
리눅스에서 첫번째 NIC : eth2

BOOTPROTO=static
- 정적(static)한 고정 IP 주소 할당
동적(dhcp)로 한다면 dhcp로 설정

IPADDR=172.16.8.250
- 시스템의 IP 주소

NETMASK=255.255.0.0
- 넷마스크값(NetMask)값을 의미

ONBOOT=yes
- 부팅시 활동화하여 사용할 것인가를 설정(yes or no)

HWADDR=00:0c:29:a4:5b:92
- 현재 이더넷의 하드웨어주소를 의미
MAC 주소를 의미하는 것으로 유일한 값을 가지는 물리적인 주소값이다.

GATEWAY
- 이더넷에 대한 게이트웨이 IP 주소를 설정
eth0,eth1 등에 대한 게이트웨이 설정이 없으면 /etc/sysconfig/network 설정이 우선

BROADCAST
- 브로드캐스트 IP 주소를 설정

NETWORK
- 호스트가 속한 네트워크의 IP 주소

USERCTL
- root 사용자뿐 아니라 일반사용자들도 이 네트워크 인터페이스(eth0)를 ON/OFF 할 수 있는가의 권한설정항목이다. (yes = 모두 사용 가능 // no = root 사용자만 사용 가능)


⑧ 네트워크 콘트롤 스크립트 : /etc/rc.d/init.d/network restart | stat | stop | status
<실습>
리눅스 시스템의 모든 네트워크 인터페이스를 재시작한다.
# /etc/rc.d/init.d/network restart
인터페이스 eth0 (을)를 종료 중: [ OK ]
인터페이스 eth1 (을)를 종료 중: [ OK ]
loopback 인터페이스를 종료 중: [ OK ]
loopback 인터페이스를 활성화 중: [ OK ]
eth0 인터페이스 활성화 중:
eth0에 관한 IP 정보를 얻고 있음... 완료. [ OK ]
eth1 인터페이스 활성화 중: [ OK ]


# service network status
설정된 장치들:
lo eth0 eth1
현재 사용 중인 장치들:
lo eth0 eth1
[주의]
# ifconfig eth0 down & up /* 네트워크카드 1개만 재시작된다. */

# service network restart /* 리눅스 시스템의 모든 네트워크 카드가 재시작된다. */


(05) IP alias 기능
물리적인 하나의 랜카드에 여러개의 IP 주소 할당(IP alias 기능사용)
장점: 돈이 안든다
단점: etho이 고장나면 연결한 eth2도 고장이 난다.

용도: 네트워크 모니터링으로 사용한다.

# cd /etc/sysconfig/network-scripts/

# pwd
/etc/sysconfig/network-scripts

# ls -al ifcfg-eth*
-rw-r--r-- 3 root root 117 10월 21 13:39 ifcfg-eth0
-rw-r--r-- 3 root root 159 10월 21 13:41 ifcfg-eth1

# cp ifcfg-eth1 ifcfg-eth3

# ls -al ifcfg-eth*
-rw-r--r-- 3 root root 117 10월 21 13:39 ifcfg-eth0
-rw-r--r-- 3 root root 159 10월 21 13:41 ifcfg-eth1
-rw-r--r-- 1 root root 117 11월 2 20:28 ifcfg-eth3
※ 추가로 생성한 eth3 설정파일의 내용수정

# vi ifcfg-eth3
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth1:1 #<-: 이 가장 중요!!
BOOTPROTO=static
IPADDR=172.16.8.253
NETMASK=255.255.0.0
ONBOOT=yes
HWADDR=00:0c:29:a4:5b:92


# service network restart
인터페이스 eth0 (을)를 종료 중: [ OK ]
인터페이스 eth1 (을)를 종료 중: [ OK ]
loopback 인터페이스를 종료 중: [ OK ]
loopback 인터페이스를 활성화 중: [ OK ]
eth0 인터페이스 활성화 중:
eth0에 관한 IP 정보를 얻고 있음... 완료.
[ OK ]
eth1 인터페이스 활성화 중: [ OK ]
eth3 인터페이스 활성화 중: [ OK ]
※ 추가로 할당한 네트워크카드(eth3) IP 주소로 통신 테스트


# ping 172.16.8.253
PING 172.16.8.253 (172.16.8.253) 56(84) bytes of data.
64 bytes from 172.16.8.253: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 172.16.8.253: icmp_seq=2 ttl=64 time=0.124 ms
(중간생략)
--- 172.16.8.253 ping statistics ---
32 packets transmitted, 32 received, 0% packet loss, time 31014ms
rtt min/avg/max/mdev = 0.032/0.113/0.908/0.214 ms
/* <Ctrl> + C 로 작업 종료 */


(06) 네트워크 인터페이스 설정과 설정확인을 위한 ifconfig 명령어
<명령어위치> : /sbin/ifconfig
<자세한 정보> : # man ifconfig
<기능과 역할>
- 시스템에 장착된 이더넷 카드의 설정확인
- 시스템에 장착된 이더넷 카드의 설정변경
- 시스템에 장착된 이더넷 카드의 활성화 또는 비활성화
- 이더넷카드의 MTU 등과 같은 옵션값들 변경
- 이더넷 카드의 네트워크 설정


# ifconfig /* 네트워크의 상황내역 확인 */
eth0 Link encap:Ethernet HWaddr 00:0C:29:A4:5B:88
inet addr:192.168.10.138 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fea4:5b88/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7470 errors:0 dropped:0 overruns:0 frame:0
TX packets:4789 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:921505 (899.9 KiB) TX bytes:698706 (682.3 KiB)
Interrupt:75 Base address:0x2000


① MAC 주소 : 00:0C:29:A4:5B:88
② eth0에 할당된 주소 : 192.168.10.138
③ 브로드캐스트(BroadCast) : 192.168.10.255
④ 서브넷마스크(Subnet Mask) : 255.255.255.0
⑤ MTU(Maxium Transfer Unit) : 최대 전송단위
⑥ RX Packets : 부팅후 현재까지 받은 패킷수
⑦ TX Packets : 부팅후 현재까지 보내어진 패킷수
⑧ Collisions : 충돌된 데이타가 있는지 확인
⑨ Interrupt 주소 : 75 번을 사용
⑩ 현재 UP(사용가능) 되어 있는가?


▶ ifconfig로 특정 이더넷 MTU 값 변경
<실습>
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:A4:5B:88
inet addr:192.168.10.138 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fea4:5b88/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7662 errors:0 dropped:0 overruns:0 frame:0
TX packets:4916 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:939050 (917.0 KiB) TX bytes:722460 (705.5 KiB)
Interrupt:75 Base address:0x2000


# ifconfig eth0 mtu 1000

# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:A4:5B:88
inet addr:192.168.10.138 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1000 Metric:1
RX packets:7708 errors:0 dropped:0 overruns:0 frame:0
TX packets:4955 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:942780 (920.6 KiB) TX bytes:727314 (710.2 KiB)
Interrupt:75 Base address:0x2000

# ifconfig eth0 mtu 2000
SIOCSIFMTU: 부적절한 인수

# ifconfig eth0 mtu 1500 /* 원상 복구 */


(07) route CMD
현재 사용주인 서버의 라우팅경로를 설정하기 위한 것으로 특정 네트워크 인터페이스에 라우팅 정보를 설정한다.

<명령어 위치> /sbin/route

① 기본 게이트웨이 설정하고 확인하기

<사용 형식> # route add default gw 게이트웨이 IP주소 dev 네트워크인터페이스장치명
# route add default gw 172.16.8.1 dev eth0
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.50.0 * 255.255.255.0 U 0 0 0 eth1
192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
172.16.0.0 * 255.255.0.0 U 0 0 0 eth0
default 172.16.8.1 0.0.0.0 UG 0 0 0 eth0
default 192.168.50.2 0.0.0.0 UG 0 0 0 eth1
현재 서버가 외부와 통신을 할 때에는 172.16.8.1 게이트웨이로 보내진다.


[참고] 게이트웨이가 2개일 경우 위에줄부터 우선순위가 된다.
▶ 게이트웨이 설정 삭제
# route del default gw 172.16.8.1 dev eth0
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.50.0 * 255.255.255.0 U 0 0 0 eth1
192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
172.16.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.50.2 0.0.0.0 UG 0 0 0 eth1


② 현재 시스템에 네트워크 라우팅경로 추가 설정
# route add -net 192.168.100.0 netmask 255.255.255.0 dev eth1
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 * 255.255.255.0 U 0 0 0 eth1
192.168.50.0 * 255.255.255.0 U 0 0 0 eth1
192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
172.16.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.50.2 0.0.0.0 UG 0 0 0 eth1
192.168.100.0 네트워크와의 모든 통신 패킷(데이터)은 eth1 이라는 네트워크 인터페이스를 이용하기 위한 설정이다.


▶ 라우팅 데이블 삭제
# route del -net 192.168.100.0 netmask 255.255.255.0 dev eth1
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.50.0 * 255.255.255.0 U 0 0 0 eth1
192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
172.16.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.50.2 0.0.0.0 UG 0 0 0 eth1


③ 시스템 관리자들이 실무에서 route 명령어를 이용하여 주로 하는 작업들과 작업방법
[작업] 라우팅 테이블 확인작업
<사용 형식> # route 또는 route -n
<사용예> # route

[작업] 새로운 라우팅경로 추가작업
<사용 형식> # route add -net 네트워크주소 netmask 넷마스크값 dev 인터페이스
<사용예> # route add -net 192.168.33.0 netmask 255.255.255.0 dev eth1


[작업] 기존 라우팅경로 제거작업
<사용 형식> # route del -net 네트워크주소 netmask 넷마스크값 [dev 인터페이스명]
<사용예> # route del -net 192.168.33.0 netmask 255.255.255.0


[작업] 기본 게이트웨이 추가 작업
<사용 형식> # route add default gw 기본게이트웨이주소 dev 인터페이스명
<사용예> # route add default gw 192.168.33.1 eth1


[작업] 기본 게이트웨이 제거 작업
<사용 형식> # route del default gw 기본게이트웨이주소 [dev 인터페이스명]
<사용예> # route del default gw 192.168.33.1 eth1


[작업] 루프백 인터페이스(loopback interface) 추가 작업
<사용 형식> # ifconfig lo 127.0.0.1
<사용예> # route add -net 127.0.0.1


(08) 네트워크 인터페이스의 설정확인 및 재설정 유틸리티 mii-tool
mii-tool은 리눅스 네트워크 인터페이스(NIC)의 상태를 확인하거나 설정하는 명령어이다.
- mii-tool은 랜카드에 설정된 속도(10M, 100M)를 확인
- Duplex Mode(전이중, 반이중모드)를 확인
- 자동감지설정(autonegotiation)의 ON/OFF 를 확인


<명령어 위치> /sbin/mii-tool


[주의] 현재 mii-tool은 100M급 이하에서 작동됩니다. GB급에서는 작동되지 않습니다.
# mii-tool
SIOCGMIIPHY on 'eth0' failed: Operation not supported
SIOCGMIIPHY on 'eth1' failed: Operation not supported
no MII interfaces found


[참고] 가상머신에서 이용을 할려면 VMWare-Tools를 설치해야 한다.
(주로 사용되는 옵션)
# mii-tool /* 현 시스템에 설정한 이더넷 설정상태 확인 */
# mii-tool -v /* 자세한 정보 출력 */
# mii-tool -R /* 네트워크 인터페이스의 autonegotiaton 재시작 */
# mii-tool -w /* 네트워크 인터페이스를 계속 모니터링하면서 연결 상태 확인 */


(09) 네트워크 인터페이스의 speed와 mode 설정
- 속도설정 문제에 있어서의 10M, 100M, 1G로 설정할 것인가?
- 전송모드에 있어서 half duplex 또는 full duplex로 설정할 것인가?
- 장비간 인식방식을 직업 설정할 것인가? auto 모드(negotiaton)로 할 것인가?


<명령어 위치> /sbin/ethtool
위 3가지를 익혀두면 장비간 속도저하 문제를 해결할 수 있다.


① 랜카드 속도 및 전송모드 확인
# ethtool eth0
Settings for eth0:
Current message level: 0x00000007 (7)
Link detected: yes
# ethtool eth1
Settings for eth1:
Current message level: 0x00000007 (7)
Link detected: yes
[참고] 가상머신에는 정상적으로 표현이 되지 않습니다.
<링크> http://blog.naver.com/goody80?Redirect=Log&logNo=30012554067


▶ ethtool을 이용한 eth0 설정 확인


▶ eth0의 "Duplex : half"를 "Duplex : full" 설정으로 변경
# ethtool -s eth0 speed 1000 duplex full autoneg on
<항목별 설명>
eth0 : 설정을 적용 할 NIC
speed 1000 : 1G Speed로 설정
duplex full : 전이중 모드로 설정
autoneg on : 네트워크 상태에서의 변화를 자동 감지 후 설정
(예) cable On,OFF 자동감지, Switch에서 Speed 및 Duplex 변화에 따른 자동설정
(주의) Switch 설정이 Auto일 경우 autoneg off로 고정 설정
(주의) intel NIC(e1000)을 사용하는 장비에 따라서는 적용안될수 있음


(10) 네트워크 이중화 Bonding 구성(이중화)
여러개의 NIC를 논리적으로 하나로 묶어 NIC 갯수만큼 대역폭을 가장하는 기술로 다른 말로 네트워크의 이중화라고 한다.
- 네트워크를 이중화함으로써 한쪽의 NIC 문제 발생이 서비스 이용 가능
- NIC의 대역폭을 모두 이용 가능
[참고] 이중화 네트워크 카드는 같은 종류가 더욱 안전합니다.

■ 구성 방법
[조건] Network device support 에서 --> Bonding driver support 가 체크되어 있어야 한다.

① # /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=(실제호스트이름적을것)
GATEWAY=(게이트웨이아이피)
GATEDEV=bond0 <--- 라인 추가


② 이중화 인터페이스로 사용할 가상 인터페이스 셋팅(ifcfg-bond0)
# /etc/sysconfig/network-scripts/ifcfg-bond0 <--- vi 명령어로 가상의 bonding NIC 설정
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=static
IPADDR=(서버아이피)
NETMASK=(서버넷마스크)
NETWORK=(서버네트워크아이피)


③새로운 네트워크 카드(eth1)
# /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
[참고] USERCTL=no
일반 계정이 해당 인터페이스를 비활성화 가능 여부


④ /etc/modprobe.conf
alias bond0 bonding
alias eth0 3c59x <-- 현재 장착되어 있는 이더넷
alias eth1 3c59x <-- 새로 장착할 두번째 이더넷
options bonding max_bonds=2 <--- 두개의 이더넷으로 이용할 경우

---------------------------------------------------------------------------------------------------------------------
[참고] /etc/modprobe.conf 내용
alias bond0 bonding : bond0를 bonding으로 알기 쉽게 별명 정의
Options bonding mode=1 : bonding 1번 모드로 설정
Options bond0 miimon=100 : NIC 상태 체크 시간(1/100 sec)


[참고] bonding 모드 종류 및 특징
0 : balance-round robine : 두개의 NIC를 통한 분배 + Fault Tolerance
1 : active-standby : Active 상태의 NIC에 문제 발생시 standby NIC에서 Fault Tolerance
2 : balance-xor : 0 모드와 비슷하지만 xor 연산을 이용한 목적지 MAC과 근원지 MAC을 이용한 분배
+ Fault Tolerance
3 : broadcast : 두개의 NIC에 어떤 규칙없이 데이터 통신 + Fault Tolerance
4 : 802.3ad : link aggregation switch에 aggregation 그룹생성이 필요
---------------------------------------------------------------------------------------------------------------------

⑤ modprobe 명령어로 bonding 적용
# modprobe bonding


⑥ lsmod 명령어로 bonding 확인
# lsmod | grep bonding


⑦ service network restart 네트워크 재시작
# service network restart


⑧ /proc/net/bonding/bond0 파일에서 구성상태 확인 및 검증
- Bonding Driver Version
- Bonding Mode
- Slave Interface 등의 정보를 확인할 수 있다.


<실습>
네트워크 카드 1개를 더 추가하여 eth1,eth2를 서로 bonding 작업해 보기 바란다.
그리고 각각 네트워크카드를 다운시켜보고 윈도우에서 ping 날려서 확인하기 바란다.


[참고] VMWare에서는 Fail Over가 제공되지 않기 때문에 두개의 카드중 먼저 패킷을 받아들이는 eth0이 죽어버리면 Network 자체가 죽어버린다.
인터넷 유저가 설정한 bonding 예제


[root@Spring Server]# cat ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.10.200
NETMASK=255.255.255.0
NETWORK=
BROADCAST=
USERCTL=no
GATEWAY=192.168.10.1


[root@Spring Server]# cat ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.10.200
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
OLDPROTO=static


[root@Spring Server]# cat ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.10.1
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
USERCTL=no
MASTER=bond0
SLAVE=yes
OLDPROTO=static
BONDMODE = 1
MIIMON = 100
BONDOPTIONS = mode=1 miimon=100
mode=0 (balance-rr)
mode=1 (active-backup) (* fail-over)
mode=2 (balance-xor)
mode=3 (broadcast)
mode=4 (802.3ad)
mode=5 (balance-tlb)
mode=6 (balance-alb)
# /sbin/modprobe bonding ${BONDOPTIONS}
# /sbin/service network start
# /sbin/ifenslave bond0 eth0
# /sbin/ifenslave bond0 eth1


[root@Spring Server]# lsmod
Module Size Used by
bonding 86516 0
3개의 MacAddress가 동일한지 확인 HWaddr 00:15:17:50:C1:3D

[root@Spring Server]# ifconfig
bond0 Link encap:Ethernet HWaddr 00:15:17:50:C1:3D
inet addr:192.168.10.200 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::215:17ff:fe50:c13d/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:1452 errors:0 dropped:0 overruns:0 frame:0
TX packets:1545 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:228641 (223.2 KiB) TX bytes:484094 (472.7 KiB)
eth0 Link encap:Ethernet HWaddr 00:15:17:50:C1:3D
UP BROADCAST RUNNING ALLMULTI SLAVE MULTICAST MTU:1500 Metric:1
RX packets:1452 errors:0 dropped:0 overruns:0 frame:0
TX packets:1547 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:228641 (223.2 KiB) TX bytes:484410 (473.0 KiB)
eth1 Link encap:Ethernet HWaddr 00:15:17:50:
UP BROADCAST SLAVE MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:371 errors:0 dropped:0 overruns:0 frame:0
TX packets:371 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:121651 (118.7 KiB) TX bytes:121651 (118.7 KiB)

[2011]_리눅스_네트워크_관리[1].pdf

라우팅 경로를 찾는 traceroute, tracepath
 
   traceroute 를 위해서는 ICMP type 11(time-execeeded) 가 필터링되어서는 안됨
 
   1) ICMP 대신 UDP를 사용하려면

   traceroute -I < trace할 서버 주소 > 또는
   tracepath < trace할 서버 주소 >
 
   2) TCP를 사용하는 traceroute 툴, lft와 tcptraceroute
 
   lft : http://www.mainnerve.com/lft/
   tcptraceroute : http://michael.toren.net/code/tcptraceroute/
 
   lft < trace할 서버 주소 >
 
   # lft -d 80 lug.or.kr (해당 사이트가 80포트가 열린 경우 이용)
 
   Tracing ___________________________.
 
   TTL  LFT trace to 211.214.161.175:80/tcp
   1   192.168.123.254 1.4ms
   ... 중략 ...
   9   211.58.252.150 23.2ms
   10   211.108.63.222 21.2ms
   11   218.38.58.22 20.6ms
   12   [target] 211.214.161.175:80 75.9ms
 
   lft에서 네트워크명, AS번호까지 표시하도록 하려면 -N옵션을 사용하면 된다.
 
   # lft -N -d 80 lug.or.kr
 
   Tracing ____________________________________________________________________
 
   LFT can't seem to round-trip.  Local packet filter in the way?
 
   TTL  LFT trace to 211.214.161.175:80/tcp
   1   [IANA-CBLK1] 192.168.123.254 13.2ms
   ... 중략 ...
   9   [APNIC-CIDR-BLK2/HANANET-DONGJAK-KR] 211.58.252.150 24.2ms
   10   [APNIC-CIDR-BLK2/WULSANSO-KR] 211.108.63.222 25.0ms
   11   [APNIC4/HANANET-IDC-NGENE-KR] 218.38.58.22 39.4ms
   **   [80/tcp failed]  Try alternate options or use -V to see packets.
 
2. 네트워크 상태확인하는 netstat
 
   자주 사용하는 옵션 (워낙 옵션을 조합해서 자주 사용하므로 정리할 필요 있음)
 
   -n : 호스트명, 포트명을 lookup하지 않고 그대로 IP, Port번호로 보여준다.
   -a : 모든 네트웍 상태(listening, non-listening)를 보여준다.
   -t : TCP 프로토콜만
   -u : UDP 프로토콜만
   -p : 해당 포트를 사용하는 프로그램과 프로세스ID(PID)를 보여줌
       (솔라리스에서는 ARP 테이블을 보여줌)
   -s : 프로토콜별(IP, ICMP, TCP, UDP 등)로 통계를 보여줌
   -c : 1초 단위로 continuous하게 보여줌 (지속적인 접속 변화를 확인해야할 때 유용)
   -r : 라우팅 테이블을 보여줌. route 명령처럼
 
   netstat -nlp         Listening(l)중인 포트/소켓을 해당 PID와 프로세스명과 함께
   netstat -tn          TCP 접속 상태
   netstat -un          UDP 접속 상태
   netstat -rn          routing 테이블
   netstat -ntp         TCP 접속 상태를 해당 PID와 프로세스명과 함께
   netstat -atnp        모든 TCP 접속상태를 해당 PID와 프로세스명과 함께
   netstat -s           통계
   netstat -c -t        TCP 접속을 continuous 하게 보여줌
 
   # netstat -atnp
   Active Internet connections (servers and established)
   Proto Recv-Q Send-Q Local Address      Foreign Address     State    PID/Program name
   tcp        0      0 0.0.0.0:515        0.0.0.0:*           LISTEN   671/lpd Waiting
   tcp        0      0 127.0.0.1:3333     0.0.0.0:*           LISTEN   738/avmilter
   tcp        0      0 0.0.0.0:3306       0.0.0.0:*           LISTEN   720/mysqld
   ... 생략 ...
 
3. fuser : 파일이나 소켓을 사용하는 프로세스 ID를 보여줌
 
   1) TCP 25(mail)포트를 사용하는 PID를 보여줌
 
   # fuser -n  tcp 25
   mail/tcp:              757
 
   2) http 포트를 사용하는 PID, USER, 명령어를 보여줌
    (-vn을 -nv 처럼 사용해서는 안됨
  
   # fuser -vn tcp http
  
                        USER        PID ACCESS COMMAND
   http/tcp             root       1652 f....  httpd
                        root       1659 f....  httpd
   ... 생략 ...
 
   3) /dev/hdb1 을 사용하는 사용자와 PID, 명령어
     (umount해야할 때 사용중이라 나올 때 유용하게 쓰임)
  
   # fuser -vm /dev/hdb1
  
                        USER        PID ACCESS COMMAND
   /dev/hdb1            truefeel   1669 f....  xmms
                        truefeel   1670 f....  xmms
 
4. 패킷 모니터링을 위한 트래픽 덤프 툴 tcpdump
  
   1) eth0 인터페이스로 오고가는 트래픽 정보를 보여줌(-i eth0 옵션없으면 eth0임)
  
   tcpdump
  
   2) 192.128.1.1 host로 오고가는 또는 제외한 트래픽
 
   tcpdump host 192.128.1.1
   tcpdump src host 192.128.1.1
   tcpdump dst host 192.128.1.1
   tcpdump not host 192.128.1.1
 
   3) 192.128.1.1과 192.128.1.2 사이를 오고가는 트래픽만
 
   tcpdump host 192.128.1.1 and 192.128.1.2
 
   4) ICMP, ARP, UDP 프로토콜만, ICMP 프로토콜 20개만
 
   tcpdump icmp -i eth0
   tcpdump arp
   tcpdump udp
   tcpdump icmp -c 20
 
   5) 웹 포트로 오고가는 패킷만
 
   tcpdump port 80
 
   6) dhcp 패킷 확인할 때
 
   # tcpdump -v -s 1500 port 67 or port 68
   tcpdump: listening on eth0
   01:17:16.803166 0.0.0.0.bootpc > 255.255.255.255.bootps:  [udp sum ok]
   xid:0x29b28363 vend-rfc1048 DHCP:REQUEST RQ:truefeel
   PR:SM+BR+TZ+DG+DN+NS+HN+YD+YS+NTP [tos 0x10]  (ttl 16, id 0, len 328)
   01:17:16.806441 192.168.1.254.bootps > 255.255.255.255.bootpc:
   ... 생략 ...'
 

[출처] [리눅스 명령어] 모니터링에 유용한 명령어|작성자 참좋은날

네트워크 간의 Reachability를 확인하는 Tool들입니다.

Title

License OS 내려받기
traceroute Free Unix Source
IP packet의 TTL 값을 변경하여 대상 호스트로 probe 패킷을 전달하여 대상 호스트까지 가는 경로에 위치하는 gateway(Router)에서 TTL timeout error 메시지를 측정하는 프로그램이다. Solaris 2.5 Binary Package
  Solaris 2.6 Binary Package
arpwatch Free Unix Source
Arpwatch는 Ethernet address와 IP address의 쌍을 추적하며 그 활동 상황을 Syslog시키며 전자우편을 통하여 변경사항을 통보한다. 로컬 LAN의 IP 변경을 관리하여 LAN 보안을 위해 사용가능하고 IP 관리를 위해 사용할 수 있는 프로그램이다.  Redhat7.0 RPM Binary Package
  Mandrake RPM Binary Package
fping Free Unix Source
Ping과 유사한 프로그램으로 많은 수의 호스트를 병행으로 Ping할 수 있는 프로그램이다.
ping plot  Free/share Win95/98/NT 1.0(Free)
기본적으로 traceroute 프로그램이지만 보다 향상된 기능을 제공한다. 여러개의 hop을 동시에 측정하여 보다 빠른 결과를 보여주는 프로그램이다. 2.2(share)
prtraceroute Free Unix Source
prtraceroute는 traceroute의 결과와 IRR에 등록된 정책을 비교하는 프로그램이다. 경로의 AS와 AS간 정책을 표시한다. 이것은 RIPE의 prtraceroute tool의 향상된 버전이다. 
tcpnetview Free Win95/98/NT V1.07
LAN상의 Windows 계열호스트 명과 IP 그리고 Ethernet address를 mapping하는 프로그램으로 LAN 관리 시 유용한 프로그램이다.
pingroute.pl Free Unix/Win Source
ping 프로그램과 Traceroute 프로그램을 결합한 프로그램이다.
(Perl 프로그램이 필요로 한다.)
네트워크 간의 Performance를 확인하는 Tool들입니다.
Title License OS 내려받기
echoping Free Unix Source
UDP/TCP의 Latency를 측정하는 프로그램으로 네트워크 응용프로그램의 성능을 측정하는 데 유용한 프로그램이다. WEB 서비스의 응답시간을 측정하는데 사용할 수 있다. 
pchar Free Unix Source
pchar는 pathchard 프로그램의 향상버전으로 근원지에서 목적지까지 네트워크 link내 각 노드의 성능을 산정한다. 각 hop으로 다양한 크기의 UDP 패킷들을 전송함으로써 지연과 패킷 손실과 round trip time의 정보를 제공한다.
timeit Free Unix Source
Timeit은 임의의 네트워크 지점에서 지정된 web 서버의 성능을 평가할 수 있도록 만들어졌다. 이것은 Web 응용프로그래머에게 web 서버의 성능을 감시할 수 있는 수단을 제공한다. 
VitalAgentIT Client PC에서 인터넷 서버까지 네트워크 상황을 감시하며 속도 및 지연 그리고 피켓 손실들을 표시하여 준다. 전체적인 네트워크 현황에 대하여 alarm 기능을 제공하여 조치사항을 권고하여 주는 유용한 프로그램이다. Free Win95/98/NT V7.0
Title License OS 내려받기
cflowdCisco Netflow data를 이용하여 인터넷 트래픽 현황을 보여주는 프로그램이다. 해당 프로그램을 구동하기 위해서는 arts++ 프로그램이 필요하다.  Free Unix Source
Arts++
flow toolscflowd와 마찬가지로 Cisco Netflow data를 이용하여 트래픽 현황을 파악하는 간단한 프로그램들의 집합이다.  Free Unix Source
IPTrafIPTraf 는 Linux를 위한 console 기반의 네트워크 통계 프로그램이다. IPTraf는 TCP 연결 패킷과 바이트 수, 인터페이스 통계치, TCP/UDP 트래픽 분석등 다양한 정보를 제공한다.  Free Linux Source
spyLinux기반의 프로토콜 ANALYZER Free Linux Source
(free license checksum: 8627234452)
10 호스트의 작은 규모에서 2000년 12월 까지 사용할 수 있다)
etherealUnix와 Windows를 위한 자유롭게 이용가능한 네트워크 network protocol analyzer 이다. 실제 네트워크 또는 수집된 파일로부터 데이터를 조사할 수 있다. Free Unix Source
(Unix에서는 gtk+ , libpcap Library가 필요) Redhat RPM Binary Package
  Mandrake RPM Binary Package
  Solaris 8 Binary Package
  Win95/98/NT Binary Package
  packet Capture DLL
  Glib DLL
Windows PC에서 인터넷 서비스 데몬을 올릴 수 있는 프로그램들입니다.
Title License OS 내려받기
SolarWinds-TFTP-Server Free Win95/98/NT Binary Package
네트워크 장비의 Image를 upgrade하기 위해 사용할 때 필요한 PC용 TFTP 데몬프로그램이다.
tftpd32 Free Win95/98/NT Binary Package
네트워크 장비의 Image를 upgrade하기 위해 사용할 때 필요한 PC용 TFTP 데몬프로그램이다.
License 제약없이 자유롭게 이용가능한 각종 인터넷 client 프로그램들과 네트워크 관리를 위한 지원 프로그램들입니다.
Title License OS 내려받기
Netlab Free Win95/98/NT Binary Package
DNS Lookup, ping, tracroute와 같은 모든 client 프로그램을 내장하고 있는 다용도의 tool 집합 프로그램이다.
PMG Toolkit Free Win95/98/NT Binary Package
Ethernet OID 및 Novell의 SAP code와 같은 네트워크 기본정보를 제공하여 주는 toolkit.
(Password : dialed)
PMG Toolkit 2.4(password : pmg97) Free Win95/98/NT Binary Package
 
Cable Length Calculator 
Canonical Converter 
Latency Calculator?New Features
A Ping Calibrate feature was added to help determine the values for the routers. 
Link Speed 
IP Subnet Visualizer 
OUI Lookup 
IPX SAP Lookup 
Ethernet Packets per Second 
Etherchannel Calculator 
Bit Budget Calculator 
Hex to Decimal Converter 
Subnet Calculator?New Features
Several new fields have been added 
Multicast Calculator
 
SolarWinds-Subnet-CalculatorIP address의 Subnet mask에 따른 host 갯수를 확인할 수 있는 프로그램이다. 복잡한 subnet 계산을 쉽게 해준다. Free Win95/98/NT Binary Package
TeraTerm Free Win95/98/NT Binary Package
Telnet client 프로그램으로 화면의 글자를 복사하고 붙여 넣기가 쉬운 프로그램이다.
TeraTerm SSH client Free Win95/98/NT Binary Package
TeraTerm의 SSH client 프로그램으로 기본적으로 TeraTerm 이 설치되어야 한다. 인터넷상에서 secure하게 SSH 서버에 접속할 수 있게 하는 프로그램이다. 
qcheck_console1.3 Free Win95/98/NT Binary Package
Ganymede 사의 성능 측정 tool로서 각 서버에 endpoint라는 프로그램을 설치하여야 하며 그 다음 console 프로그램을 이용하여 application 네트워크 성능을 측정한다. 
qcheck_endpoint Free Win95/98/NT Binary Package
Windows PC용 Ganymede endpoint 프로그램이다.

 

'Linux > Open tools' 카테고리의 다른 글

리눅스 네트워크  (0) 2012.05.31
리눅스 네트워크 모니터링 프로그램  (0) 2012.05.31
nslookup 명령어 사용예  (0) 2012.05.31
nslookup 사용법  (0) 2012.05.31
netstat 사용법 정리  (0) 2012.05.31

nslookup 명령어 사용법

 

시작 -> cmd

 


?default 서버 설정

 

 

C:\Users\rukawa>nslookup
기본 서버: kns.kornet.net
Address: 168.126.63.1

>

> server 192.168.0.1
기본 서버: [192.168.0.1]
Address: 192.168.0.1
 

 

?MX 레코드 확인

 

 

> set type=mx
> naver.com
서버: [192.168.0.1]
Address: 192.168.0.1

권한 없는 응답:
naver.com MX preference = 10, mail exchanger = mx2.naver.com
naver.com MX preference = 10, mail exchanger = mx3.naver.com
naver.com MX preference = 10, mail exchanger = mx-1.naver.com

naver.com nameserver = ns2.naver.com
naver.com nameserver = ns1.naver.com
naver.com nameserver = ns3.naver.com
mx2.naver.com internet address = 202.131.27.96
mx3.naver.com internet address = 202.131.27.102
mx-1.naver.com internet address = 202.131.27.117
ns1.naver.com internet address = 119.205.240.165
ns2.naver.com internet address = 61.247.202.123
ns3.naver.com internet address = 175.158.30.90
 

 

 

 

?spf 레코드 확인

 


> set type=txt
> naver.com
서버: [192.168.0.1]
Address: 192.168.0.1
권한 없는 응답:
naver.com text =

 "v=spf1 include:_spfblocka.naver.com include:_spfblockb.naver.com includ
e:_spfblockc.naver.com ~all"

naver.com nameserver = ns3.naver.com
naver.com nameserver = ns2.naver.com
naver.com nameserver = ns1.naver.com
ns1.naver.com internet address = 119.205.240.165
ns2.naver.com internet address = 61.247.202.123
ns3.naver.com internet address = 175.158.30.90
>
 

 

 

 

 

?default 네임서버 설정

 

 

 C:\Users\rukawa>nslookup naver.com 168.126.63.1
서버: kns.kornet.net
Address: 168.126.63.1

권한 없는 응답:
이름: naver.com
Addresses: 222.122.195.6
 202.131.29.70
 202.131.29.71
 222.122.195.5

 

 

 

 

 

?MX 레코드 확인

 

 

C:\Users\rukawa>nslookup -querytype=mx naver.com
서버: kns.kornet.net
Address: 168.126.63.1

권한 없는 응답:
naver.com MX preference = 10, mail exchanger = mx3.naver.com
naver.com MX preference = 10, mail exchanger = mx-1.naver.com
naver.com MX preference = 10, mail exchanger = mx2.naver.com

naver.com nameserver = ns3.naver.com
naver.com nameserver = ns2.naver.com
naver.com nameserver = ns1.naver.com
mx2.naver.com internet address = 202.131.27.96
mx3.naver.com internet address = 202.131.27.102
mx-1.naver.com internet address = 202.131.27.117
ns1.naver.com internet address = 119.205.240.165
ns2.naver.com internet address = 61.247.202.123
ns3.naver.com internet address = 175.158.30.90
 

 


?SPF 레코드확인

 

 

C:\Users\rukawa>nslookup -querytype=txt naver.com
서버: kns.kornet.net
Address: 168.126.63.1

권한 없는 응답:
naver.com text =

 "v=spf1 include:_spfblocka.naver.com include:_spfblockb.naver.com includ
e:_spfblockc.naver.com ~all"

naver.com nameserver = ns3.naver.com
naver.com nameserver = ns1.naver.com
naver.com nameserver = ns2.naver.com
ns1.naver.com internet address = 119.205.240.165
ns2.naver.com internet address = 61.247.202.123
ns3.naver.com internet address = 175.158.30.90
 

 

 

[출처] nslookup 명령어 사용법|작성자 루카와

 

http://blog.rukawa.co.kr/10090055946

'Linux > Open tools' 카테고리의 다른 글

리눅스 네트워크 모니터링 프로그램  (0) 2012.05.31
네트워크 진단 하기 - 각종툴  (0) 2012.05.31
nslookup 사용법  (0) 2012.05.31
netstat 사용법 정리  (0) 2012.05.31
ssh 로그인 후 특정 위치로 바로 이동  (0) 2012.02.08