이 글은 우분투 9.10 및 쿠분투 9.10을 기준으로 작성된 것입니다.
(물론 우분투 버전에 상관 없이 유효한 자료이긴 합니다.)
이 내용을 모르고서 리눅스를 접했다간 쩔쩔 매기 십상이다. 원래 새로운 것을 접함에 있어서 처음부터 자세하고 구체적인 것들을 알 도리가 없는 것이 당연하다. 하지만 이러한 기본 개념 조차 없으면 문제가 생겼을 때 대체 무엇이 문제인지, 해결 방법을 어디서 찾아야 하는지 아무 것도 모르고.. 그저 답답해 미치고 돌아가실 따름이다. 그래서 리눅스를 처음 접하는 분들은 이런 종류의 글 꼭 한 번 쯤은 읽어 보시길 바란다.
덧붙여서,
딴에는 더 기초적이고 광범위한 리눅스 잡지식을 담았놓은 곳이다. 이 글을 정독하고자 한다면, 그리고 리눅스 뭐가 뭔지 하나도 모르겠다면, 우선 링크에 있는 것을 먼저 읽어보고 오는 편이 좋을 지도 모르겠다. -_-a
마지막으로.. 요즘은 초보자도 쉽게 사용할 수 있도록 만드는 추세이지만, 그래도 프로그래밍을 조금 배워야 개념들을 이해하기 쉬운 것이 사실이다. 가능하면 C나 C++, JAVA 등등, 무엇이든 좋으니 언어 하나만 일정 수준 이상 공부를 해도 리눅스를 이해하는데 많은 도움이 된다.
우분투에서 프로그램을 설치하는 방법은 다양하다.
그 중에서도 가장 원론적인 방법은 소스코드를 컴파일하는 것이라고 할 수 있다.
소스코드: C언어, C++, 자바, 파이썬 등의 프로그래밍 언어로 작성된 파일(문서). 흔히 프로그래머들이 프로그램을 짠다고 하는데, 다른 말로 하면 이게 소스 코드를 제작한다는 것이다.
컴파일: 소스코드를 컴퓨터가 이해할 수 있는 binary file로 변환해주는 작업. 컴퓨터가 사용하는 binary language도 일종의 언어이므로, '통역 작업'이라고 생각하면 편하다. (binary file은 이진수, 즉 모든 내용이 0과 1로만 표현되는 파일을 말한다.)
컴파일러: 컴파일을 해주는 프로그램. '통역사'로 비유할 수 있다. 우리는 리눅스에서 프로그램을 설치할 때 알게 모르게 항상 컴파일러를 쓰고 있다. 컴파일러의 종류는 다양하지만, C언어용 컴파일러는 gcc, C++용 컴파일러는 g++이 널리 이용된다. 프로그래밍 언어 별로 컴파일러가 따로따로 필요하다.
윈도우즈에선 꿈도 못 꿀 일이다. 코드를 통째로 던져주다니..
컴파일러가 설치되어있지 않다면 설치가 불가능한 것이 당연하다.
복잡한 프로그램일수록 소스 코드의 양도 많아지고 분할된 파일로 제작되고 하는 법이다. 이것을 컴파일할 때는 분산된 파일의 역할, 관계 등을 지정해주면서 컴파일하는데, 뭐라고 자세히는 설명 못하겠지만 컴파일 하기가 무지 복잡해진다는 것은 명백한 사실이다. 결과적으로 터미널에서 수십 줄의 명령어를 입력해야 비로소 프로그램이 설치된다고 상상해보자. 프로그램 설치하기가 싫을 것이다. -_- 이와 같이 컴파일 작업이 복잡하기 때문에 사람들은 make란 유틸리티(일종의 프로그램)를 고안해냈다.
make: 확장자 없는 Makefile이란 제목의 파일(문서)에 소스코드들 간의 관계나 역할, 컴파일 과정이나 이용되는 컴파일러 등을 기록하고, 이를 이용하여 컴파일을 쉽게 해주는 프로그램. Makefile은 소스코드가 있는 폴더 안에 생성해야 한다. 파일 내용은 make 전용 문법에 맞추어 작성한다. (여타 프로그래밍 언어들과 유사하다.) 단순히메모장(gedit, Kate 등의 프로그램)에서 작성할 수 있다.
따라서 프로그램 제작자가 소스코드와 함께 makefile도 제작하여 첨부해 준다면, 우리는 그저 그것들을 다운받고 make란 유틸리티를 이용해 프로그램을 설치하게 되는 것이다. make 유틸리티는 터미널에서 대개 다음과 같이 사용한다.
$ make
$ sudo make install
make install 명령어는 컴퓨터 관리자 권한으로만 실행 가능하므로 sudo 명령어를 앞에 붙여야만 한다. make 해줬는데 덧붙여서make install은 또 왜 사용하냐면- 걍 make란 프로그램을 만든 사람 맘이다. ㅡ,.ㅡ
프로그램 설치의 기본 틀은 위와 같지만, (예를 들어) 사용자가 프로그램의 여러 가지 기능 중 일부 기능을 제외하고 설치하고 싶다면 Makefile의 내용을 수정해야만 할 것이다. 특히 프로그램 소스코드 파일들이 각각 프로그램의 기능 하나씩을 담당하도록 프로그래머가 잘 분배하여 작성했다면 Makefile 수정이 유효하다. 하지만 사용자가 Makefile을 수정하기 위해선 Makefile 자체의 내용 뿐만 아니라 소스 코드의 내용도 어느 정도 이해해야 하고, 이는 단순히 프로그램을 사용하는 입장에서는 매우 어렵고도 귀찮은 작업이 된다. 이를 위해 프로그래머는 처음부터 Makefile을 작성해두지 않고 쉘 스크립트(Shell script)만 제작해두는 경우가 많다.
쉘스크립트: 여기서 쉘(Shell) = 터미널..이라고 설명해도 좋을 것이다. 쉘스크립트는 문서이자 소스코드이며 간단한 프로그램이다. 메모장을 이용해 작성할 수 있으며, 터미널에서 곧바로 실행 가능하다. 기본적으로는 터미널 문법, 즉 터미널에서 사용되는 명령어들을 이용해 작성한다. 하지만 쉘스크립트 고유의 문법도 지니고 있어 좀더 복잡한 응용이 가능하다.
대부분의 프로그램 제작자들은 configure라는 이름의 쉘스크립트, 즉 configure script를 제작해서 첨부한다.
configure script: 사실 쉘스크립트 제작방식대로 제작하는 것이 아니라 GNU autotools를 이용해 제작한다고 한다. 쉘스크립트처럼 보이지만 쉘스크립트의 일종으로 일반화해서 생각해도 좋은지는 미지수.. (아시는 분은 알려주시면 감사할게요 -ㅂ-;) ...초보 수준에서는 그냥 그 정도만 알아도 과분하긴 하다 ㅠㅠ;
configure script는 실행될 때 설치 옵션을 받아들이고, 이를 토대로 맞춤형 Makefile을 제작해낸다. 아마 리눅스 설치 관련 검색을 좀 해봤다면 설치 과정 중 아래와 비슷한 과정이 있음을 한두 번쯤은 봤을 것이다.
$ ./configure -enable--debug -disable--release
configure 옵션은 configure script를 제작한 프로그래머 맘대로 정해놨기 때문에 그 프로그램의 configure 옵션 사용법을 찾아볼 필요가 있다. 대개 configure --help 치거나 잘못된(?) 옵션을 입력해주면 알아서 configure 사용법을 보여줄 것이다. 뭐가뭔지 잘 모르겠다면 그냥 옵션 없이 ./configure만 입력해도 일단 설치는 잘 된다. 이렇게 configure script를 실행하고 나면 Makefile을 비롯해 설치에 필요한 여러 가지가 생성되는 것을 볼 수가 있을 것이다.
참고: configure가 아닌 ./configure 라고 입력하는 이유는 해당 파일이 '현재 경로'에 있음을 명시하기 위해서이다. 보안상의 이유로 모든 리눅스의 실행파일들은 절대경로를 입력해야만 실행되도록 되어있다. 폴더에서 하위 경로는 슬래쉬(/)기호로 구분되며, 경로명에 사용된 점(.)은 '현재 폴더의 경로'를 나타내는 것이다. (출처: http://en.wikipedia.org/wiki/Configure_(computing)) 단, bin 디렉토리에 저장된(=등록된) 실행파일들 만큼은 실행할 때 절대 경로를 입력할 필요가 없고 어느 위치에서든 실행 가능하다. 역시 이 포스팅을 참고하길 바란다. [Ubuntu] 우분투 입문; 터미널은 뭐고 명령어들은 왜 이리 복잡한겨 -,.-
그 밖에 cmake, qmake, gmake 등등 Makefile을 제작해주는 프로그램들이 설치에 추가적으로 필요한 경우도 있는데, 설치 과정에 이것을 사용하게 만들지 말지 정하는 것은 프로그래머 맘대로이다. 또 하나. configure script는 Makefile만 제작한다기보단 설치를 위한 전반적인 물밑작업을 벌이는 것이다. 따라서 configure script는 cmake나 qmake와는 좀 다르다. 여튼 이러한 기본적인 개념을 안다면, cmake나 qmake 등을 이해하고 사용하는 것도 훨씬 수월해질 것이다.
이제 실전 설치 팁.
지금껏 설명한 설치 방법은 굉장히 원초적인 방법이고, 웬만한 프로그램들은 프로젝트 짜서 그럴듯하게 개발되기 때문에 설치 편의성도 신경써서 제작되곤 한다. 그 대표적인 예가 패키지(package) 설치이다.
패키지: 위에서 설명한 ./configure, make, sudo make install의 과정을 모두 자동적으로 알아서 처리하도록 설정된.. 윈도우즈에서 자주 보던 setup 파일, 혹은 install 파일 비슷한 것이다. 하지만 온전한 프로그램 하나를 통째로 패키지 하나로 만드는 경우는 드물고, 그 프로그램 핵심 패키지와 설명서 패키지, 그 프로그램 소스코드 컴파일에 필요한 컴파일러 패키지, 다른 프로그램들도 사용 가능한 프로그램 소스(라이브러리) 패키지 등으로 나뉘어 있다. 하지만 핵심 패키지를 설치하겠다고 하면 웬만큼 직접적으로 연관된 패키지들을전부 알아서 제시해 주므로 프로그램 설치에 어려움을 느끼진 않을 것이다.
우분투의 경우 apt-get 명령어(프로그램)를 사용하면 우분투 패키지 관리센터인지 뭔지에 등록된 패키지를 인터넷을 통해 다운받아 설치할 수 있다. 물론 apt-get 말고도 rpm, deb 등등의 패키지 관리 프로그램이 다수 존재한다. 여튼 패키지 형태로 제작된 프로그램은 이들 패키지 관리 프로그램을 통해 설치할 수 있다.
패키지 설치를 위해선 인터넷 연결이 필수. 인터넷이 연결되어있지 않다면 어쩔 수 없이 소스코드를 USB를 통해 옮겨받은 담에 configure, make, sudo make install...해줘야 하니 귀찮다. 그리고 apt-get 등의 패키지 관리 프로그램은 설치 뿐만 아니라 패키지 업데이트, 삭제 등도 가능하다. 이들 작업을 위한 apt-get 사용법의 예를 몇 가지 들면 다음과 같다.
$ sudo apt-get install [패키지 이름]
$ sudo apt-get update
$ sudo apt-get remove [패키지 이름]
..기타 등등 apt-get 사용법은 $ apt-get help 를 입력하면 볼 수 있다.
반면 우분투의 시냅틱 패키지 관리자, 쿠분투의 KPackageKit 등의 프로그램을 실행하면 우분투 관리센터에 등록된 최신 버전의 패키지를 검색할 수 있고, GUI 기반이므로 눈으로 확인하며 설치할 수 있다. 한 손으로 귤 뜯어 먹으면서 옵션 설정은 마우스로 딸깍딸깍 해갖고 설치할 수 있는 것이 요즘 세상이다. -_- 모든 설치과정을 GUI를 통해 보여주고, 옵션 설정을 받고, 간혹 필요한 것이 있으면 알아서 추가 설치하기도 한다. 이는 터미널에서 apt-get을 통해 설치하는 것과 절대 동일하다. 사실 모든 패키지는 설치 중 '터미널 보기'란 것이 제공되는데, 이걸 보면 알 수 있듯이 설치 명령 내리는 방식만 다를 뿐 컴퓨터에 전달되는 명령은 동일하다고 할 수 있다. (아래 사진은 쿠분투 KPackageKit이다.. 우분투 시냅틱 패키지 관리자는 상대적으로 스샷 구하기도 쉬우니 검색해봅시다.)
따라서 누군가 apt-get을 이용해 어떤 패키지를 설치하라고 지시해놨다면, 무시하고 시냅틱 패키지 관리자나 KPackageKit을 통해 설치해보자. 관련 패키지도 볼 수 있고 설명도 읽을 수 있고. 초보에게 리눅스 울렁증 극복하는 데 이만한 것이 어딨나 싶다. -_-a
참고: 우분투와 쿠분투의 모든 것들은 공유 가능하다. 둘은 단지 화면으로 보여주는 방식(데스크톱 환경)만 다를 뿐, 핵심은 동일한 것을 사용한다. 우분투 계열 리눅스는 기본 리눅스의 터미널 환경을 탈피하기 위해 GUI를 제작했는데, 우분투는 GUI 제작에 GTK를 주로 사용했고 쿠분투는 GUI 제작에 Qt를 주로 이용했다는 차이가 있다. 여튼 둘 다 호환은 잘 된다. 단지 우분투에선 기본적으로 시냅틱 패키지 관리자가 설치되어 사용되고 쿠분투에선 기본적으로 KPackageKit을 설치, 권장 사용된다는 차이가 있을 뿐이다. 그리하여 두 패키지 관리자가 디테일한 사용법 면에선 차이가 좀 있지만, 무엇을 통해 패키지를 설치하든 결과는 똑같다.
이에 반해 우분투 소프트웨어 센터는 정말 완벽한 소프트웨어 덩어리를 제공한다. 필요한 패키지들의 묶음이랄까. Windows에서 보던 설치프로그램들에 가장 근접한 형태의 설치과정을 보여준다. 사용자 입장에서 보면 가장 완성도 높은 프로그램 관리 시스템이라 할 수가 있다. 고퀄리티의 설치 과정을 제공하는 만큼 여기 등극하기도 까다롭달까 -_- 패키지 묶음이라는 태생적 한계도 있어서 패키지 관리 센터에 등록된 패키지 숫자에 비하면 등록된 개수가 훨씬 적다.
결론적으로 설치엔 크게 세 가지 방법이 있는데,
1. 소프트웨어 센터를 이용하는 방법.
2. 패키지 단위로 설치하는 방법. (패키지 관리자. 또는 터미널에서 apt-get 명령어 사용)
3. 소스코드 다운받아서 컴파일하는 방법. (./configure, make, sudo make install)
우분투에서 집중 관리, 지원 받는 프로젝트(완성도 높은 것들)는 소프트웨어 센터에 등극하는 경향이 있고
패키지 역시 등록될 가치가 있는 것들이랄까.. 공유될 필요가 있는 것들.
패키지 목록에도 등록되지 않은 것들은 좀 minor한 실험작들? 이 대부분이랄까..
확실히 그렇게 구분짓기는 뭣하지만, 내가 느낀 바에 의하면 그러하다. -_-a
이때 패키지 혹은 소프트웨어들은 굉장히 안정적이어서 설치 시 문제를 거의 일으키지 않는 반면(필요한 것이 있어도 웬만하면 다~ 알아서 하므로) 소스코드 컴파일 과정은 까다로운 것이 많다. 예를 들어 우분투는 처음 설치됐을 때 g++이 설치되어있지 않은데, 어떤 프로그램 설치에 g++이 필요한 경우 g++ 컴파일러가 없다면서 설치 에러가 날 수도 있다. 뭣도 모르는 뉴비들에겐 참으로 절망적인 순간이다.
다행히도 프로그램 제작자 홈페이지에서 필요한 패키지나 프로그램 목록을 제시해주는 것이 일반적이다. 또한 에러 문구에도 무엇이 부족한지 다 명시를 해주곤 한다. 영어가 빼곡하긴 하지만 당황하지 말고 찬찬히 읽어 보자. 에러 문구에서 무슨 패키지를 설치해야 한다고 다 일러놨으니 패키지 관리자를 통해서든 apt-get을 통해서든 설치를 해주면 된다. 다만 안타까운 것은 패키지 이름을 정확히 제시해주질 않는다는 것. 가령 gtk library 패키지가 필요하다고 말은 해주는데, 실질적으로 설치해야 할 패키지 이름은 libgtk2.0-dev였고.. 이런 식이다. 사정이 이러하니 요상한 것들을 많이 설치하게 된다면 프로그래밍 기본 잡지식이 궁함을 느낄 것이다. 어쩔 수 없이 경험으로 체득하는 수 밖에.. 구글 검색도 답이 될 수 있고 패키지 관리자 프로그램에서 검색을 통해 유추해보는 것도 필요하다. 그러니 ...초보자들은 일단 먹기 좋게 잘 발라진 것만 골라먹는 것이 건강에 좋을 수도 있다. 안그럼 재설치를 새 번 씩이나 하는 경우도 있고- -ㅍ-.. (물론 정면으로 부딪히면서 얻는 것도 많으니 판단은 알아서..)
여튼 리눅스란 참으로 신비로운 피조물이어서- 너가 세계 8대 불가사의 해라, 하고 싶다.
이럴 땐 넓고 얕게 핥아보든, 좁고 깊게 파헤치든.
자꾸 부비적대는 것이 리눅스와 친해지는 가장 빠른 방법인 듯하다.
쓰면서 나도 공부가 많이 됐고. 이 글이 리눅스를 접하는 좋은 열쇠가 되기를 기대한다.