본 글은 더 이상 업데이트 되지 않습니다.

새로운 블로그에 업데이트하고 있으니https://blog.seowonjung.com/index.php/2020/12/02/532 주소로 방문해주세요.


젠투설치 매뉴얼은, 공식 위키가 아주 잘 쓰여있는데다 한글 번역까지 되어있으므로 공식 매뉴얼을 기준으로 한다.

https://wiki.gentoo.org/wiki/Handbook:AMD64/Full/Installation/ko


사실 젠투를 설치할 정도면 이미 리눅스 사용이나 여러 운영체제를 설치하는 부분에 있어서는 충분한 지식이 있을 정도이니 기타 잡다한 설명들은 제외할 예정이지만, 그래도 순서대로 적어보고자 한다.  또한, 공식 위키에서는 설명되어있지 않지만, 내가 이번에 5번의 설치 과정에서 겪은 꼭 도움이 될만한 부분을 설명하고자 한다.


이전에 시작하기 글에도 설명했지만, 설치환경을 다시 한 번 언급하자면,

1. 리눅스 단독 설치

2. 유선 네트워크

3. systemd

4. multilib

5. KDE 5 Plasma

로 진행하고자 한다.  하나 더 추가하자면, 안정버전으로 설명할 예정이다.




1. 다운로드

먼저, https://gentoo.org/downloads/ 이 페이지에 가서 부팅 가능한 이미지인 Minimal Installation CD와 stage3 파일을 받는다.  Minimal Installation CD를 받고나면 이것을 부팅가능한 매체, USB나 CD에 굽는다.  그리고 stage3는 또 다른 usb 메모리 드라이브를 준비해서 넣어둔다.



2. 부팅

네트워크 케이블을 연결한 상태에서 위에서 만든 부팅 디스크로 부팅한다.  부팅이 완료되면 요즘의 젠투 부팅씨디는 알아서 DHCP를 이용하여 IP 주소를 받아오지만, 다시 한 번 확인해준다.

# ifconfig


IP 주소를 받아오지 못하거나 안한 것으로 보인다면, dhcp 명령어를 실행해서 주소를 받아온다.  참고로 아래 명령어에서 eth0 부분은 ifconfig를 통해서 나오는 이름을 참고하시면 되겠다.

# dhcpcd eth0



3. 파티션, 포맷

윈도우가 설치된 상태에서 리눅스를 설치하는 것은, 일단 적어도 파티션의 개념이 제대로 잡혀있어야 윈도우를 날리지않고 설치할 수 있고, 그렇지않으면 윈도우를 전부 날릴 확률이 높다.  따라서, 파티션이 무엇이고 이걸 어떻게 다루는지 안다는 전제 하에 핵심만 설명하자면,


a. 파티션은 굳이 여러개를 나눌 필요는 없다.

b. 하이버네이션 기능이 꼭 필요한 게 아니라면, 스왑파티션을 크게 잡을 필요는 없다.

c. UEFI / GPT를 사용하지 않는다면, /boot 파티션은 없어도 괜찮다.  만약 만든다면, 나는 개인적으로 boot에는 2기가 정도를 준다.


정도 되겠다.  fdisk나 parted를 이용하여 파티션을 나눠주면 되고, GPT 방식을 이용한다면 공색 매뉴얼을 필히 참고하시라고 권해드린다.  스왑파티션의 경우, 나는 개인적으로 스왑은 2기가 이상은 잡지않는 편인데 그 이유는, 파티션이 500메가 이상 사용된다는 의미는 이미 램이 심각하게 모자란다는 의미로 받아들이기 때문이다.  사실상, 램이 부족하지 않은 시스템에서 스왑이 돌아간다는 것 자체를 문제로 본다.  따라서, 2기가 이상은 아무런 의미가 없다고 본다.


파티셔닝이 끝나면 원하는 파일시스템으로 포맷을 해주자.  만약 /boot를 만들어줬다면 /boot에는 Ext2를 권장한다.  몇 가지 이유가 있는데, 일단 리눅스라는 운영체제에서 가장 오래되고 검증됐으며 비저널링 파일시스템으로서는 이견이 없기 때문이다.


루트 파티션과 스왑 파티션의 준비가 모두 끝났으면, 파티션들을 모두 마운트 해줘야한다.  마운트해주고 나서 미리 다운받아놓은 stage3 파일이 담긴 usb를 연결하여 복사 및 압축을 풀어준다.   stage3 파일이 모두 풀렸으면, 시스템이 사용할 가상 파일시스템들을 마운트 해줘야한다.

# mount -t proc proc /mnt/gentoo/proc

# mount --rbind /sys /mnt/gentoo/sys

# mount --make-rslave /mnt/gentoo/sys

# mount --rbind /dev /mnt/gentoo/dev

# mount --make-rslave /mnt/gentoo/dev


공식 위키의 디스크 준비 항목을 보고 그대로 따라하시면 되겠다.



4-1. 설치준비

공식 위키에서와는 다르게, 날짜/시간과 컴파일 옵션 설정은 당장 안해도 된다.

미러를 골라준다.

# mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf


미러는 여러 개를 고를 수 있는데, 자신이 사는 지역과 가까운 곳에 있는 미러들을 선택해주면 되겠다.  이것이 다 됐으면, DNS 정보를 복사해준다.

# cp -L /etc/resolv.conf /mnt/gentoo/etc/


이제 chroot 명령어를 통해서 설치에 돌입한다.

# chroot /mnt/gentoo /bin/bash

# source /etc/profile


젠투 패키지 목록을 모아놓은 포티지를 설치해야한다.  그래야 어떤 패키지가 있는지 젠투가 알 수 있다.

# emerge-webrsync


공식위키에서는 다음 단계로 프로파일을 선택하라고 나오는데, 여기서 systemd를 선택하여 진행하면 100% 에러가 난다.  Circular dependency라고 하는, 의존성이 돌고도는 현상이 생긴다는 거다.  즉 다시 말하자면, util-linux를 설치하려면 systemd라는 패키지가 필요한데, 이 systemd를 설치하려면 util-linux가 필요한, 의존성 관계가 무한루프에 빠지게 된다.  따라서, 일단은 프로파일은 가장 기본인 1번 default/linux/amd64/13.0 * 이것을 선택한다.

# eselect profile list

eselect profile set 1


여기까지 했으면, 공식 위키에서 설치하라고 나오는 그 어떠한 패키지도 지금 현재는 설치하지마시길 권해드린다.



4-2. make.conf

/etc/portage/make.conf 파일은 젠투라는 배포판에 있어서 가장 핵심을 이루는 중요한 설정파일이다.  설정은 간단하며 내용물은 몇 안되는데, 까다로운 성격을 가진 유저들에게는 미치도록 스트레스 혹은 희열감을 주는 파일이 되겠다.


이 파일이 하는 일은, 앞으로 내 젠투 리눅스가 나아가야할 전체적인 시스템의 방향을 잡아주고, 내 하드웨어에 가장 최적화된 방법으로 시스템을 구성할 수 있게끔 설정을 하게해준다.  여기에 있어서 가장 핵심이 되는 설정은 USE와 CFLAGS인데, 하나씩 살펴보자.


먼저 CFLAGS는, 소스코드를 컴파일할 때 주는 옵션을 정의하는 곳이다.  내 컴퓨터가 인텔 i7 CPU를 장착했다면, 이 CPU가 가진 기능을 모두 활용하여 최대의 성능을 내게끔 한다거나 하는 일들이 가능한데, 그럴려면 CPU의 제원과 GCC라는 컴파일러의 옵션을 다 알아야하고, 이것이 일반적인 유저에게는 아주 어려운 일이다.  따라서, 젠투 커뮤니티는 "가장 보편적이고 안전한 옵션"을 제안한다.

https://wiki.gentoo.org/wiki/Safe_CFLAGS 이 페이지에 가면 다양한 CPU에 따른 CFLAGS를 제안하는데 예를 들어 내 CPU가 하스웰 Core i7이라면, CFLAGS="-march=haswell -O2 -pipe" 라는 옵션이면 충분히 무난하다라는 것이다.  여기에 CPU별 구체적인 명령어들을 CPU_FLAGS_X86이라는 옵션을 통해 정의할 수 있다.  젠투의 기본값은 CPU_FLAGS_X86="mmx sse sse2"로 설정되어있다.


하지만, "이건 너무 두루뭉실하지 않나" 하는 유저들이 있을 수 있기 때문에, 내 CPU가 가진 명령어셋을 검색/비교하여 최적화된 CFLAGS를 보여줄 수는 없을까? 하는 생각을 가진 유저들이 분명 있기 때문에 나온 명령어가 있다.  기본 명령어는 아니므로 설치를 해야한다.

# emerge -q app-portage/cpuid2cpuflags


설치가 완료됐으면 실행을 해보자.

# cpuinfo2cpuflags-x86

CPU_FLAGS_X86="aes mmx mmxext popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3"


이렇게 나온다.  이걸 그냥 복사해서 /etc/portage/make.conf 파일에 넣으면 된다.  너무 길고, 오타가 걱정되시면 아래의 명령어로 바로 붙여놓고 파일을 열어서 기본값으로 적힌 CPU_FLAGS_X86 라인을 삭제해주면 되겠다.

# cpuinfo2cpuflags-x86 >> /etc/portage/make.conf

# nano /etc/portage/make.conf

참고로, nano에서 파일을 저장하는 키는 Ctrl+x를 누르면 된다.



4-3. USE

USE 플래그는 젠투의 진입장벽을 높이는 주범이라고들 하는데, 그 이유는 USE를 너무 자세하게 설정하려고 하기 때문에 그렇다.  따라서, USE에는 취지에 맞게 최대한 global하게 설정하고, 패키지별 USE를 따로 설정해주는 것이 편하다.  개인적으로 추천하는 USE 플래그는 다음과 같다.

USE="bash-completion cjk unicode X -bindist"


bash-completion은, 만약 설치하려는 패키지가 BASH의 명령어 및 옵션 자동완성을 지원하는 경우 이것을 활성화하게되며, CJK는 동북아시아 3개국의 언어, Chinese, Japanese, Korean 언어 지원, UNICODE는 역시 마찬가지로 언어에 관계된 유니코드 설정, X는 GUI 환경인 X-Windows 지원, 그리고 마지막 -bindist 앞에 붙은 -는 on/off 스위치 같은 것인데, -를 붙이면 off 하겠다는 얘기다.  즉, bindist를 안쓰겠다는 의미인데, bindist (내 추측으로는 아마 binary distribution)는 특정 라이센스나 어떤 상황에 있어서 소스코드를 다운받아서 컴파일하지 않고, 그냥 미리 컴파일되어있는 패키지를 받아서 쓰겠다는 옵션인데, 이것은 젠투를 쓰고자하는 취지와 전혀 맞지않고, bindist로 받은 패키지들이 문제를 일으키는 경우가 종종 있다.


추가로 추천하는 USE 플래그가 있다면, 파이썬을 선호하는 유저라면 python, VIM을 주력으로 쓴다면 vim 문법지원 플래그인 vim-syntax 정도가 있겠다.  참고로 내 USE 플래그는 다음과 같다.

USE="bash-completion cjk ldap python ssl unicode vim-syntax X zsh-completion -bindist -gpm"


LDAP과 SSL은 개인적으로 직장에서 업무상 꼭 필요한 기능이기 때문에 넣었다.  이렇게 꼭 필요한 건 넣고, 필요없는 건 뺄 수 있는 점이 바로 젠투의 매력이겠지.


공식 위키에서는 -gtk -gnome qt kde 등이 예제로 있는데, GNOME을 쓴다고 굳이 -qt 할 필요는 없고, 오히려 개인적으로는 비추천한다.  GNOME 환경으로 구성해서 쓴다고해서 QT 기반 어플리케이션을 아예 안쓸 수도 없기 때문이기 때문인데, 예를 들자면 개인적으로 애용하는 XCA 같은 프로그램들은 GNOME 기반 앱인줄 알았는데 나중에 알고보니 QT기반이었다는 등...  요즘은 QT고 GNOME이고 한 가지만 지향해서 구성하는 건 좋지않다고 생각한다.



4-4. 기타 설정

/etc/portage/make.conf 파일의 나머지 설정을 할 차례다.  지금 굳이 안해도 상관없지만, 미리 하지 않았다가 나중에 시스템 전체를 다시 통째로 재컴파일해야하는 상황을 만들 수도 있기 때문에 지금 하는 게 낫다.


딱히 건드릴 건 없지만, ABI_X86="32 64" 항목을 넣어주는 것을 권장한다.  이것은, multilib 즉, 32/64비트 환경 둘 다 지원하는 바이너리를 빌드하도록하는 옵션인데, 일부 특정 패키지가 이 옵션을 요구한다.  그런데, "나는 완벽한 64비트 환경으로 쓰고싶은데" 라고 생각하는 유저들도 있을텐데, 이런 환경은 일반적으로 리눅스에서 전혀 권장하지 않으며, 공식 위키에도 이 부분에 대해서 설명하고 있다.

https://wiki.gentoo.org/wiki/Handbook:AMD64/Full/Installation/ko#Multilib_.2832.EB.B9.84.ED.8A.B8_.EB.B0.8F_64.EB.B9.84.ED.8A.B8.29


특히 nVidia 그래픽카드의 드라이버가 multilib를 요구하는데, 이것과 관계된 커널 모듈 및 기타 패키지들도 다 같이 요구되므로, 잘 모르는 상태에서 64비트 전용 환경을 구성하면 골치아파지므로 그냥 속편하게 multilib 환경으로 미리 구성을 해놓자.


참고로, ABI_X86="32 64" 항목을 넣어주면 stage3에 딸려오는 거의 모든 패키지를 재컴파일하므로 사실상 stage1부터 하는 것과 다름없어진다.


다음으로 MAKEOPTS라는 옵션이 있다.  이것은 젠투를 설치하려는 컴퓨터의 CPU가 가진 총 코어의 갯수를 적어주면 된다.  예를 들어, Core i7 970이라는 CPU는 물리 코어 6개에 논리 코어 6개로 총 12개의 코어가 있다.  따라서 MAKEOPTS="-j12" 라고 넣어주면 된다.  공식위키에서는, 총 코어갯수+1을 하라고 하는데, 사실 공식 영문위키에서는 +1을 하라는 의견이 없으며, 오히려 하단에 +1을 하는 것이 좋지않다라는 젠투의 공식 블로그 글을 링크해놓고 있다.

https://wiki.gentoo.org/wiki/MAKEOPTS

https://blogs.gentoo.org/ago/2013/01/14/makeopts-jcore-1-is-not-the-best-optimization/


X-Windows의 GUI 환경을 구축할 계획이 있다면, 그래픽카드와 장치를 적어주면 좋다.  사실, 안적어줘도 크게 상관은 없다.

VIDEO_CARDS="nvidia"

INPUT_DEVICES="evdev"


마지막으로, 지원언어를 설정해줄 수 있다.

LINGUAS="en ko"


이렇게 적어주면, 영어를 우선지원하고 다음으로 한국어를 지원하게 된다.  만약 순서를 바꾸면, GNOME 터미널이나 Konsole 등에서 각종 메시지가 한글로 나오게 된다.


이제 make.conf 파일을 총 정리해보자.  내 make.conf 파일을 올리는 것으로 정리를 마무리한다.


CFLAGS="-march=westmere -O2 -pipe"

CXXFLAGS="${CFLAGS}"

CHOST="x86_64-pc-linux-gnu"

MAKEOPTS="-j12"

CPU_FLAGS_X86="aes mmx mmxext popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3"

ABI_X86="32 64"


USE="bash-completion cjk ldap python ssl unicode vim-syntax X zsh-completion -bindist -gpm"


PORTDIR="/usr/portage"

DISTDIR="${PORTDIR}/distfiles"

PKGDIR="${PORTDIR}/packages"

PORTAGE_TMPDIR="/tmp"


VIDEO_CARDS="nvidia"

INPUT_DEVICES="evdev"

LINGUAS="en ko"


GENTOO_MIRRORS="http://www.gtlib.gatech.edu/pub/gentoo http://lug.mtu.edu/gentoo/ http://gentoo.osuosl.org/ http://gentoo.mirrors.pair.com/ http://mirrors.rit.edu/gentoo/ http://gentoo.mirrors.tds.net/gentoo http://mirror.lug.udel.edu/pub/gentoo/ http://cosmos.illinois.edu/pub/gentoo/ http://gentoo.cs.uni.edu/ http://mirror.usu.edu/mirrors/gentoo/"



4-5. 필수 패키지 설치 준비

이제부터 필수 패키지 설치에 들어가는데, 패키지를 설치하기 전 가장 먼저 해야할 일이 하나 있다.  바로 패키지 컴파일시 이 컴파일 데이터들을 캐싱해주는 C Cache라는 것을 먼저 설치해야한다.  얼마나 도움이 될지는 모르겠지만, 조금이라도 설치 시간을 단축시켜줄 수 있기 때문에 설치를 추천한다.


개인적으로 나는 패키지 설치시 출력 메시지를 아예 보지않는다.  어차피 C언어를 모르기 때문에 에러메시지를 이해할 수 없을 뿐더러, 뭐 굳이 컴파일되는 과정의 메시지를 볼 필요가 있나.  따라서, 모든 emerge 명령어 실행시에는 나는 -q를 붙인다.

# emerge -q ccache


시간이 꽤 걸릴 수 있다.  그 이유는, 젠투가 새롭게 설정된 make.conf의 환경을 적용시키려고 하기 때문이다.  만약 C Cache를 이용해서 최대한 빨리 빌드를 하고싶다면, /etc/portage/make.conf 파일을 열어서 USE 플래그를 공란으로 만들고,  ABI_X86을 삭제해주면 된다.

USE=""


그리고나서 C Cache 설치 및 하단의 설정 후 다시 복원해주면 되겠다.

C Cache 설치 이후에는 설정을 해줘야한다.  C Cache를 활성화하고 캐시 사이즈 및 위치를 지정하는 것이다.  /etc/portage/make.conf 파일을 열고 다음과 같이 넣는다.  이미 위에서 make.conf 파일을 정리했는데, 이것은 해도그만 안해도 그만이므로 추가로 설명하게 됐다.  위치는 관계없다.


FEATURES="ccache"

CCACHE_SIZE="2G"

CCACHE_DIR="/var/tmp/ccache"


이제부터 필수 패키지 설치를 시작하는데, 필수적인 패키지를 크게 분류하자면 다음과 같다.

a. 커널

b. 시스템 운영 패키지

c. 부트로더

d. 기타 툴



5. 패키지 설치

시스템 운영을 위한 패키지를 설치해야하는데, 사실 stage3에 이미 충분히 딸려오기 때문에 설치해야할 패키지는 몇 안된다.  하지만 이 글은 systemd로 설치하는 것을 전제로 하며, 젠투의 기본 프로파일은 기존의 OpenRC를 기반으로 하는 init시스템을 기본값으로 달고나오기 때문에 systemd에 필수적인 패키지를 설치해줘야한다.

(실은 USE에 설정한 python 때문에 util-linux를 재설치하려고 시도하는 것이고, 여기서 의존성 문제가 생기는 관계로, USE에 python을 넣지않으면 정상적으로 진행이 가능하다)


위에 프로파일을 systemd로 선택하면 100% 에러가 난다고 겁을 줬지만, 해결법은 사실 간단하다.  eudev를 삭제하고 util-linux를 설치해준뒤 프로파일을 변경하면 된다.  시간이 꽤 오래 걸린다.

# emerge -q sys-apps/dbus

# emerge -C sys-fs/eudev

# emerge -q sys-apps/util-linux

# eselect profile list

# eselect profile set 10


프로파일 번호가 10번인지 꼭 확인하자.  이름은 아래와 같다.

default/linux/amd64/13.0/systemd


GNOME이나 KDE를 설치할 계획이라고 하더라도, 일단 여기서는 해당 프로필을 선택하지 않는 이유는, 새롭게 설치한 나만의 젠투리눅스로의 부팅이 잘되는지를 먼저 확인하기 위해서다.


변경한 프로파일을 적용해야한다.  여기서 젠투가 알아서 필요한 systemd 관련 패키지들을 모두 불러와 설치를 해주며, 관계된 패키지까지 새로운 make.conf 파일에 정의된 옵션대로 재컴파일을 해주게 된다.  시간이 꽤 오래 걸릴 거다.

# emerge -aqvuDN @world


공식 위키에 나오는 시간대(timezone), 로케일 등은 보고 그대로 따라하시면 된다.  사실 systemd 환경에서는 지금 안해도 상관없지만, 지금 해주면 나중에 systemd가 OpenRC 환경으로 설정한 것들을 가져와서 적용시켜주므로 편리하다.



5-1. 커널 설치

옛날에 젠투를 쓸 때는 커널 옵션 하나하나 확인해가면서 설치를 했고, 사실 그게 또 나름 맛이 있어서 자연스럽게 커널 옵션들을 공부하게 됐다.  하지만 요즘은 하드웨어가 너무나도 복잡해지고 지원해야하는 종류도 많아져서, 옵션 일부를 잘못 건드리면 어떤 기능 전체가 싸그리 작동이 안되거나, 아니면 아예 부팅이 안되는 등의 문제가 생긴다.  자신의 하드웨어를 아주 잘 알고있고, 모듈로 컴파일하는 것과 커널에 넣는 것의 차이를 이해하면 혼자서 해볼만한데, 그렇지 않다면 별로 추천하지 않는다.  따라서, 젠투에서는 범용으로 쓸 수 있는 커널을 만들어주는 툴이 있다.

먼저 커널을 설치하자.

# emerge -q sys-kernel/gentoo-sources


시간이 좀 걸린다.  커널 소스코드 설치가 끝나면, 범용커널을 만들어주는 툴을 설치한다.

# emerge -q sys-kernel/genkernel-next


systemd 환경에서 사용하기 위해 파일 하나를 수정해줘야한다.

# nano /etc/genkernel.conf

UDEV="yes"

라고 설정해주면 된다.


이제 커널을 빌드해준다.  꽤 오래 걸린다.

# genkernel --udev --install all


커널을 직접 수정해서 쓰고싶다면, 일단 최초 설치는 genkernel로 설치하고, 이후 새롭게 빌드한 시스템으로 부팅이 잘 되고나서 시도해볼 것을 추천한다.



5-2. 시스템 운영 패키지 설치

기본적인 운영에 필요한 패키지를 설치해야하는데, 사실 systemd 프로파일 적용하는 단계에서 거의 대부분 설치된다.  거기서 빠진 것들 중 없으면 불편한 것들을 설치해보자.

# emerge -q sys-apps/pciutils

# emerge -q app-portage/gentoolkit

# emerge -q app-portage/eix

# emerge -q net-misc/dhcpcd

# emerge -q net-misc/openssh

# emerge -q sys-process/cronie

# emerge -q app-admin/sudo


일부 하드웨어의 추가 펌웨어를 설치해준다.  당장은 필요없을 수 있겠지만, 나중에 이걸 안해줘서 문제가 생기는데 기억이 안나서 해결 못하는 경우도 있다.

# emerge -q sys-kernel/linux-firmware



5-3. 부트로더 설치

부트로더로는 grub을 선택한다.  사실 이제 제일 무난하고 쓰기편하다.

# emerge -q sys-boot/grub:2

# grub-install /dev/sda


설치가 끝났으면 새로운 커널로 부팅할 시 systemd로 부팅하기 위한 설정을 해줘야한다.  설정은 간단한데, /etc/default/grub 파일을 열고 다음 줄을 찾아서 주석을 해제해주면 된다.

GRUB_CMDLINE_LINUX="init=/usr/lib/systemd/systemd"


그런다음 적용을 시켜준다.

# grub-mkconfig -o /boot/grub/grub.cfg



6. 환경설정

이제 마지막으로 수작업으로 작성해줘야하는 필수 설정파일을 작성해줄 차례다.

공식 위키에 /etc/fstab 파일에 대한 설명이 잘 나와있으니 그것을 보고 작성해준다.


passwd 명령어로, root 사용자의 패스워드를 변경해주고, 아래의 명령어로 일반 유저를 생성해준다.

# useradd -m -G users,wheel,audio -s /bin/bash USERNAME


랜카드의 DHCP를 활성시켜주기위해 systemd 파일을 하나 작성해준다.  /etc/systemd/network/50-dhcp.network 파일을 열고 아래와 같이 넣어주면 된다.

[Match]

Name=en*


[Network]

DHCP=yes


이렇게 넣고나서 재부팅해도 사실 DHCP를 이용해서 IP 주소를 못받은 상태가 되어있을텐데, 이것은 "시스템 시작시 DHCP를 이용해서 IP를 받아라" 라고하는, OpenRC 식으로 말하자면 /etc/init.d에 항목이 없기 때문에 그렇다.


이제 새로운 시스템으로 부팅을 해야한다.  먼저 chroot를 빠져나오고, 설치 시작 전에 마운트 했던 가상 파일시스템들을 해제해야하는데, 일반적인 umount 명령어로는 해제가 안된다.  옵션을 하나 붙이면 간단하게 해제된다.

# exit

# umount /mnt/gentoo/boot

# umount -l /mnt/gentoo/proc

# umount -l /mnt/gentoo/sys

# umount -l /mnt/gentoo/dev

# umount /mnt/gentoo

# reboot



7. 부팅 이후

만약 새로운 시스템으로 부팅이 되지않는다면, 공식위키를 보면서 어떤 절차가 빠졌는지 확인해본다.


6번에서 언급한대로 ifconfig 명령어를 쳐보면 분명 IP 주소가 안잡혀있을 거다.  아래의 명령어로 DHCP를 활성화하자.

systemctl enable systemd-networkd.service

systemctl start systemd-networkd.service


만약 systemctl이라는 명령어가 에러를 내보내면, 그건 systemd로 부팅되지 않았다는 얘기다.  /etc/default/grub 파일을 열고 GRUB_CMDLINE_LINUX 항목을 다시 보자.  제대로 되어있는게 맞다면 아래의 명령어로 GRUB을 재설치 해준다.
# grub-install /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg

저널링 동작을 위해 머신 ID를 만든다.

# systemd-machine-id-setup


호스트 이름을 설정한다..

# hostnamectl set-hostname <HOSTNAME>


로케일을 설정한다.  이 부분은 위의 설치과정에서 공식위키를 보고 진행했었다면 따로 안해줘도 된다.  안해줬다면 아래의 명령어로 가능한데, 개인적으로 로케일은 한글이든 영문이든 utf8을 쓰는 것을 추천한다.  영어라면 en_US.utf8이고, 한글은 ko_KR.utf8이다.

# localectl set-locale LANG=<LOCALE>



8. KDE 설치

KDE 설치는 사실 간단하다.  어차피 X가 의존성으로 묶여있어서 설치할 때 같이 딸려오니 따로 신경안써줘도 되며, 나중에 별도로 XDM만 설치해주면 끝난다.  다만, KDE 메타패키지에 빠진 프로그램들이 너무 많아서, KDE 빌드 이후에도 계속 설치해줘야할 프로그램들이 너무 많다는 정도.


먼저 시스템의 프로파일을 변경해줘야한다.  일반 사용자로 로그인했다면, sudo 명령어를 사용하여 root로 변경한다.

# sudo -i

# eselect profile list


여기서 default/linux/amd64/13.0/desktop/plasma/systemd 항목을 선택한다.  kde/systemd가 아니라 plasma/systemd를 선택해야하는데, 왜냐하면 plasma가 KDE의 최신버전인 5의 새로운 이름이기 때문이다.


만약, 한글과 영어 지원만 선택하고 싶으면 /etc/portage/make.conf 파일을 열어서 아래와 같이 넣는다.

L10N="ko en"


변경된 시스템 프로파일을 적용해준다.

# emerge -aqvuDN @world


KDE 설치의 필수 패키지는 아래와 같다.

# emerge -q kde-plasma/plasma-meta

# emerge -q kde-apps/konsole

# emerge -q kde-plasma/systemsettings

# emerge -q x11-misc/sddm

# emerge -q kde-plasma/sddm-kcm


SDDM을 활성화한다.

# systemctl enable sddm.service


그외 필요한 KDE 프로그램들은 여기서 볼 수 있다.

https://www.kde.org/applications/


만약 X가 설치되지 않았다면, 2개의 패키지만 설치해주면 된다.

# emerge -q x11-base/xorg-server

# emerge -q x11-base/xorg-drivers



9. 끝

총 5대의 설치를 진행하면서 메모를 해두려고 노력했으나, 의외로 메모하지 못한 곳에서 필요한 부분이 많았고, 그것들 대부분을 기억에 의존하여 작성하였다.  초보들이 보기엔 상당히 불편한 설치기이지만, 사실 젠투는 초보가 설치하기에는 적합하지 않다고 생각하고, 리눅스라는 운영체제에 익숙하지 않다면 절대로 추천하고 싶지 않은 배포판이다.  설령 리눅스에 익숙하더라도 성향에 맞지않으면 절대 오래 쓰지 못하는 배포판이기도 하다.


내 경우는, 내 성격과 젠투의 장단점이 잘맞아서 아주 만족스럽게 쓰고있다.  또한, 전혀 기대하지 않았던 KDE 5 Plasma가 너무 마음에 들어서 이것 역시도 아주 만족스럽다.  젠투는 쓰면 쓸수록 점점 안정적으로 변하는 배포판이라고도 하는데, 그것은 젠투가 사용자로 하여금 시스템의 구성에 더욱 더 시간을 사용하게 만들기 때문이다.  이것이 적성에 맞으면 잘쓰게 되고, 이런 데에 시간을 쓸 수 없다면 최악의 배포판이 되는 것이다.  이 경우라면 차라리 데비안이 훨씬 낫다.  한 번 설치하면 재부팅 외엔 거의 손댈 곳이 없는데다, 지금까지 내가 본 2대의, 전 세계적으로 uptime 길다고 알려진 서버들 모두 데비안을 썼다.  하나는 uptime이 3,000 days인가 그랬고, 다른 하나는 2,396 days였다.


젠투를 이미 2004년부터 썼지만 그때는 사실 젠투를 제대로 이해하고 쓴 것은 아니라고 생각한다.  지금은 나름 어느정도 이해한다고 생각하는 시점에서 보면, 젠투는 너무나도 잘만들어진 배포판이라고 생각하고, 사용자가 원하는대로 패키지 하나하나를 세밀하게 설정해서 설치할 수 있게 해주고, 그것을 유지/보수할 수 있게 제공해주는 각종 컬러풀한 CLI 툴들이 아주 잘만들어져서 부족한 점이 없다고 생각될 정도다.


다만 아쉬운 점은, 젠투를 개발하는 젠투 재단과 그 커뮤니티 자체가 불안정하다는 점인데, 이것 때문에 젠투라는 배포판 자체가 오랫동안 지속될지를 걱정해야할 판이라는 거다.  우분투도 사실 캐노니컬의 상태가 썩 좋지만은 않기 때문에, 젠투도 우분투도 망해서 없어지면 결국 정착할 곳은 데비안이 되겠지만, 현재로서는 젠투에 아주 만족한다.

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

7년 만에 다시 젠투를 쓰기 시작했다.  사실 엄밀히 말하자면, 7년 전에는 그냥 설치만 잠깐 해봤던 것이고, 메인 데스크탑 배포판으로써의 젠투 사용은 2004년 이후로 처음이다.  예전에 실제 사용했던 젠투의 흔적들: 

http://blog.naver.com/PostList.nhn?blogId=jswlinux&from=postList&categoryNo=10


이런저런 일들을 겪으면서 젠투에 정착하게 됐고, 현재 상당히 만족스럽게 쓰고있다.  예전에 처음 젠투를 쓸 때부터도 성향에 맞아서 잘 써왔지만, 지금은 더 만족스럽다.  아무래도 하드웨어와 소프트웨어가 당시보다 많이 발전해서겠지.


따라서, 당시보다 젠투에 대한 이해가 좀 더 깊어진 지금, 젠투 설치기를 다시 작성하려 한다.  젠투의 설치방식은 사실 2004년이나 지금이나 많이 바뀌진 않았다.  세세한 패키지의 이름 정도나 systemd의 차이 정도만 있을뿐, 여전히 한결 같다는 점은 마음에 든다.


그렇다면 왜 젠투인가.

저사양 컴퓨터를 제외하면, 컴파일시 최적화를 통한 이득은 거의 없다는 것이 이미 대다수의 유저들의 설전을 통해 정리가 완료됐다고 본다.  따라서, 젠투를 사용하는 것은 어디까지나 젠투가 지향하는 배포판의 관리방식이 유저의 사용 목적에 지극히 부합하기 때문이라고 보며, 나 역시도 그렇다.


예를 들자면, 내 경우는 내가 사용하는 패키지들이 LDAP을 지원한다면 최대한 LDAP 기능을 포함시켜서 설치했으면하며, 특히나 근무하는 곳의 규정상 모든 통신 프로토콜은 반드시 SSL을 사용하도록 강제하므로, 이 역시도 네트워크 관련 패키지라면 무조건 SSL을 활성화시켜서 설치하길 원하기 때문인데, 이런 점에서 젠투는 나에게 꼭 맞는 배포판이라고 볼 수 있다.


아쉬운 점은 요즘 젠투의 인기가 국내에서 많이 줄어들었는지, 젠투 설치기나 사용기 등을 검색해보면 최근 글이 아예 없다시피 했다.  물론 젠투 공식 핸드북이 워낙 잘 만들어져있어서 이제는 더 이상 설치기가 딱히 필요없기도 하지만, 보통 젠투를 처음 설치하면 누구나 설치 및 사용기를 작성하려고 하지않나 예상했다.


이 글은, 꼭 리눅스만이 아닌, 윈도우라도 설치/삭제 등을 밥 먹듯이해서 이제 파티션이 뭐고 운영체제가 뭔지 감은 잡고있으며, 문제발생시 구글링으로 스스로 해결하실 줄 아는 분들을 대상으로 한다.


들어가기에 앞서, 이 설치기는 아래의 환경으로 설치를 진행한다.

1. 리눅스 단독 설치

2. 유선 네트워크

3. systemd

4. multilib

5. KDE 5 Plasma



테스트해본답시고, 동일한 환경으로 젠투 설치를 2주일 새에 5번을 해봤으니 거의 문제가 없을 것으로 예상된다.


젠투 설치는 기본적으로 크게 다음과 같은 순서로 이루어진다.

1. 네트워크 사용이 가능한 다른 리눅스 배포판 부팅이미지나 젠투 부팅이미지로 부팅

2. 파티션 생성

3. 네트워크 및 설치에 필요한 환경 설정

4. 커널 설치

5. 부트로더, 로거, 크론 등 시스템 필수패키지 설치

6. 리부팅


사실 순서만 놓고보자면 우분투 등 다른 배포판의 설치과정과 거의 비슷하다.  다만, 저걸 자동으로 해주느냐 수작업으로 하느냐의 차이일 뿐.  젠투 설치에 익숙해지거나 위의 설치절차가 이해되면, 파티션 생성 이후의 과정에서는 각자 나름대로의 설치방법이 생기게 된다.


예전에 젠투 쓸 때는 "남자라면 stage1부터" 라는 이상하면서도 나름 이해되는 도전욕구를 불러일으키는 바닥부터 시작하는 것을 선호했는데, 지금은 굳이 그럴 필요가 없다.  어차피 systemd에 multilib 적용시켜서 설치하면, 사실상 전부 다 재컴파일 해야하기 때문에 GCC 제외하곤 결국 stage1부터 한 것과 똑같아진다.  Stage1이 뭔지 모르는 분들을 위해 설명드리자면, 젠투를 설치하기 위해 젠투 설치 ISO 이미지와 stage 파일을 다운로드해서 설치를 시작하면, 젠투설치를 하게해주는 GCC 컴파일러와 몇몇 툴들은 stage 파일에서 제공되는 것들을 사용하게 된다.  아무 것도 없는 허허벌판에서 손으로 집을 지을 순 없으니, 최소한의 툴은 제공해주는 셈이다.  그런데, 일부 유저들은 "난 얘네들마저도 내 컴퓨터에서 컴파일된 것을 사용하고 싶은데?"라고 생각할 수 있다.  GCC 컴파일러, Perl/Python 인터프리터 등, 내 컴퓨터에서 컴파일되어 최적화된 것을 사용한다면, 얘네들이 만들어내는 시스템의 핵심 툴들까지 전부 다 내 컴퓨터만을 위해 최적화된 버전이 아닌가.  따라서, 젠투를 설치하는데에 있어서 핵심적인 툴들부터 내 컴퓨터에 맞게 다시 설치하는 과정이 stage1이다.


KDE를 선택한 이유는, 사실 개인적으로 KDE를 별로 안좋아했고 예전에 잠깐씩 설치해서 써본 경험으로는 KDE가 불편해서 나한테 안맞는 윈도우매니저라는 고정관념이 있었는데, 이번에 젠투 빌드하면서 GNOME이 어떤 버그로 인해서 설치가 되지않는 문제가 있었고, 그로인해 어쩔 수 없이 선택한 KDE 5 플라즈마가 너무나도 마음에 들었기 때문.  KDE 5 플라즈마 구축해서 써오면서 알게된 건데, 생각보다 QT 기반의 소프트웨어들이 많았고, 그간 내가 gtk 기반 소프트웨어라고 알고 썼던 것이 알고보니 QT 기반이었다거나 하는 것들이 종종 있었다 (xca 같은 소프트웨어).



기본 시스템 빌드하는데 소요되는 총 시간은 하드웨어 성능에 따라 다르지만, 대략 3시간 정도 예상하면 되지않나 싶다.  요즘 젠투 설치는 너무 쉬워서 핸드북만 봐도 사실 딱히 쓸 게 없는데, 나는 그 과정에서 일부 선행되어야하는 작업들, 알고있어야하는 것들을 발견해서 이 설치기를 쓴다.


다음편으로...


블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

최근 맥을 더 이상 구입하지 않겠다는 다짐을 하게된 이후, 그렇다면 과연 어떤 리눅스 배포판을 써야하는가로 고민을 하게됐다.  쓸데없는 고민 같지만, 이 배포판 저 배포판을 써보느라 시간을 소비하는 일은 이미 20대 때에 해봤고, 이제는 하나라도 제대로 알고 쓰는 배포판이 있어야한다고 생각한다.


난 원래 슬랙웨어 2.2로 처음 리눅스를 접하기 시작해, 나중에는 우리나라 리눅스 유저들이 만든 레드햇 기반의 리눅스를 써왔다.  울나라 리눅스 1세대 유저들은 다 아시겠지만 알짜 리눅스의 인기가 좋았었다.  이후 마찬가지로 레드햇 계열의 한컴리눅스 2.0을 구매해서 쓰다가, 리눅스 발전에 기여한 공로라고 한컴리눅스 3.0을 무료로 증정받아 써왔었다.  그러다 군대를 갔다왔고 제대한 이후에는 각종 리눅스에 손을 댔다.  이때 젠투 리눅스, LFS 등 당시에도 쓰기 어려운 배포판을 두루 섭렵하면서 리눅스에 대한 이해가 지식이 깊어졌다.  사실 지금의 리눅스 관련 지식은 이때 전부 쌓았다고 봐도 좋을 정도로 리눅스 공부를 많이 했다.


당시 모든 배포판 중에서 젠투가 가장 마음에 들었었다.  그럼에도 불구하고 젠투를 지워버리게 된 이유는 컴파일 시간 때문이었는데, 당시 금융기관에서 일하던 나는 컴퓨터와 무관한 직장을 갖고있었고 퇴근해서 집에 오면 반강제적으로 하다시피한 의무적인 일 중 하나가 컴퓨터를 켜서 젠투의 패키지 업그레이드를 하는 것이었다.  컴파일하는데 상당한 시간을 들이느라 내가 컴퓨터를 쓰는 건지, 컴퓨터가 날 쓰는 건지 모를 정도로 오래 걸렸다.  지금 생각해보면 사실 젠투나 리눅스에 대한 이해가 충분하지 않은 상태에서 젠투를 쓴 것으로 추측되는데, 그토록 패키지 업데이트가 잦았던 이유가 아마도 불안정판 (~)을 쓰고있었던 게 아닌가 싶다.  사실, 굳이 포티지 리스트를 갱신할 필요가 없었으며, 게다가 딱히 불안정판을 쓸 이유도 없었기 때문이다.


결국 내 컴퓨터에서 리눅스를 처음으로 지워버린 그날 이후부터 미국으로 유학을 갈 때까지 리눅스에는 손을 대지 않았다.  결국 젠투리눅스가 한국에서 쓰던 마지막 리눅스 배포판이었던 셈.  이후 접하게 된 첫 리눅스는 우분투 8.04였다.  이때 데비안 계열의 리눅스를 처음 접하게 됐고, 왜 그토록 사람들이 "데비안으로 대동단결"을 외치는지 이해할 수 있었다.  사실 내가 한국에서 리눅스를 쓰던 시절에는 yum이라는게 없어서, 필요한 패키지를 모두 받아다 rpm -ivh로 설치를 했기 때문이라, apt-get이 너무나도 편했다.  이때부터 우분투에 빠져들어 미국에 거주함에도 불구하고 한국 우분투 사용자 모임에서 활동을 시작하게됐고 지금도 여전히 한국 우분투 사용자 모임의 IRC 채널 관리자를 하고있다.  아주 우연히도 취업하게 된 이곳의 서버 또한 전부 우분투로 운영하고 있고, 부서장 및 몇몇 직원들이 우분투를 데스크탑 운영체제로 사용하고 있을 정도였다.


하지만, 우분투는 늘상 불안한 배포판이라고 생각하는데, 몇 년 전부터 악화되기 시작한 캐노니컬의 재정상태를 비롯하여, 자금 마련에 실패한 우분투 폰 프로젝트, 데비안 기반이면서 더 이상 데비안과 완전히 호환되지 않는 자체 배포판 구조, 혼자만 밀고있는 독자적인 X 서버인 MIR, 자기네 규격을 밀려다 여론에 밀려 포기한 upstart 등을 보면, 캐노니컬이 나아가는 방향이 마치 애플이 그러는 것과 비슷하다는 느낌이 들기 시작했다.


그렇다면, 어떤 리눅스가 특정 회사에 의해 유지/보수되지 않으면서 동시에, "망하지 않을 것" 같은 배포판은 어디일까 라는 문제에 대해 고민하기 시작했다.

1. 첫번째 후보이자 강력한 후보는 누구나 예상하듯 데비안이다.  개인적으로는 위대한 배포판이라고 칭하고 싶다.  우분투 한국포럼의 한 유저에 따르면, uptime이 무려 3,500 days가 되는 서버를 본 적이 있다고 할 정도.  오로지 GNU 정신을 중요하게 생각하는 데비안 프로젝트라는 오픈소스 커뮤니티에 의해서만 유지되는 데비안은 그 어떤 회사에도 종속되지 않으며, 그럼에도 불구하고 전세계 리눅스 점유율을 사실상 독점하다시피하는 근간이 되는 배포판이다.  안정판의 경우는 너무나도 안정적이어서 재미가 없을 정도이고, 이 데비안을 기반으로 만들어진 우분투의 경우는 캐노니컬이라는 회사가 망하면 없어지겠지만, 분명 데비안은 영원히 남을 거다.

2. 리눅스는 아니지만, 태생이 정통 유닉스의 뿌리가 되는 FreeBSD이다.  FreeBSD 역시 영원히 망하지 않고 앞으로도 계속 발전할 운영체제라고 생각되며, 현재는 사용자가 많이 줄었지만 사실 알게모르게 많이 쓰이는 운영체제다.

3. 세번째로는 젠투를 꼽았다.  젠투는 내가 좋아해서 그런 것도 있지만, 젠투 커뮤니티를 잘 들여다보면, 의외로 생각보다 커뮤니티가 거대하고 탄탄하며, 젠투를 사용하는 유저들의 성향과 목적에 상당히 잘 부합하는, 아주 견고하며 잘만들어진 배포판이기 때문이다.  컴파일을 통해서 얻는 이익과는 무관하게, 배포판 자체가 아주 잘 만들어져있다고 생각하는데, 여기에 패키지를 설치 및 구성할 때 내가 원하는 옵션으로 구성할 수 있다는 점부터가 이미 엄청난 매력을 준다.

4. 네번째로는 아치 리눅스를 꼽아볼 수 있겠다.  개인적으로 아치를 써본 적은 없지만, 아치만이 가진 매력과 유저들의 성향을 봤을 때 젠투와 비슷한 형태의 매력을 주기 때문에, 데비안 계열만큼 유저가 많진 않겠지만 분명 아치도 오래 갈 거다.

5. 마지막으로는 페도라를 꼽겠다.  레드햇은 특정 회사에 의해 유지/보수되는 배포판이지만, 그 커뮤니티의 규모와 역사가 워낙 다른 수준이라, 레드햇이 망할지언정 그 커뮤니티에 의해 페도라만큼은 영원히 유지할 것 같다고 생각된다.


여기서 내가 최종적으로 내린 결론은 이렇다.

젠투를 주력으로 쓰고, 만약 젠투가 망하면 우분투를 쓰고, 캐노니컬이 망하면 데비안으로 최종 정착하겠다.


유명 젠투 유저 지인은 현재의 젠투 리눅스는 "병든 닭" 같은 배포판이라고 표현했는데, 그간 젠투 재단이 겪어온 길을 보면 위태위태한 건 사실이지만, 그만큼 열성적인 유저들이 많고 유저의 수 역시 적지 않다고 판단되며, 일단 내 성향이 지극히 부합하기 때문에 젠투를 첫번째로 골랐다.

원래는 FreeBSD를 주력으로 쓸려고 했는데, nVIDIA 그래픽카드와의 상성이 너무나도 좋지않아서 포기했다.  사실, FreeBSD 커뮤니티를 돌아다녀보면 FreeBSD와 데비안과 젠투 중 어느 것이 가장 낫느냐는 등의 토론이 엄청나게 많은데, 확실히 FreeBSD 유저들은 데탑용으로 써야할 리눅스를 고른다면 데비안과 젠투 이외엔 아예 고려대상에 포함조차 시키지 않는 성향이 보이더라.  또한, FreeBSD 유저들이 말하는, 왜 FreeBSD여야만 하는가 하는 식의 글들을 보면 대부분의 이유는 (https://www.over-yonder.net/~fullermd/rants/bsd4linux/01),

1. 안정적이어서

2. 진짜 유닉스라서

3. systemd가 아니라서

4. 문서화가 잘되어있어서

5. 라이센스

그외, 유저영역와 시스템 영역이 분리되어있어서 안전하다느니, 배포판이 하나뿐이라느니 여러 의견이 있지만, 가장 기억에 남는건, "리눅스는 사실 운영체제라고 할 수 없다.  리눅스라고 불리우는 커널에 GNU 툴들이 합쳐진 그 무엇이다.  FreeBSD야말로 진정한 운영체제다" 라고 한다.  "데비안인가 뭐시긴가, 레드햇인가 뭐시긴가, 우분투인가 뭐시긴가 하는 인터넷에 존재하는 수천개의 운영체제 뭐시기들이 바로 리눅스 커널을 사용하는 GNU 운영체제"라고 한다.  솔직히 말해서 말같지도 않는 FreeBSD 유저들의 알량한 자존심이라고 생각한다.  틀린말은 아니지만, FreeBSD 유저들이 리눅스를 그렇게 깎아내릴 입장이 되나?

내가 FreeBSD를 주력으로 쓰기위해 테스팅 하기 전부터 인터넷에 있는 수없이 많은 FreeBSD에 관한 글들을 읽어봤다.  그리고 테스팅을 하는 과정 FreeBSD에 상당히 실망하게 됐는데, 그것은 바로 nVIDIA 그래픽카드 드라이버를 리눅스의 것을 에뮬레이션 하는 부분이었다.  아니, 그토록 리눅스보다 FreeBSD가 위대하다고 하는데 드라이버는 어쩔 수 없이 리눅스 것을 에뮬레이팅하다니?  물론 하드웨어 벤더에서, 특히 그래픽 카드 쪽은 제약이 심해서 그런건 이해는 되는데, 하드웨어 드라이버를 에뮬레이션 해서 쓰는 것은 내 스스로 도저히 받아들이질 못하겠더라.  그래서 FreeBSD는 포기했다.  개인적으로 FreeBSD 기반의 방화벽인 pfSense를 너무나도 좋아하고, 서버용으로 FreeBSD는 최고라고 생각하지만 데스크탑용으로는 절대 아니라고 생각한다.  게다가 GNOME, KDE, XFCE 등의 유명 윈도우 매니져들의 태생부터도 일단 리눅스이고.

데비안을 첫번째로 선택하지 않은건, 운영체제가 너무나도 재미없기 때문.  그만큼 안정적이고 튼튼하다는 반증이겠지만.

페도라는... 레드햇 계열은 그냥 싫다.

아치는... 몇 가지 이유가 있는데, 우선 패키지 업데이트 속도가 너무 빨라서 안정적이지 못하다는 문제가 가장 중요했다.


이후 젠투를 사무실 데스크탑에 설치해서 이것저것 세팅하다가 systemd에 GNOME을 올릴려고 했으나 버그로 보이는 문제 때문에 설치가 안되서 포기하고 KDE 5 Plasma를 설치했다.  상당히 만족스럽고 잘 사용 중이다.  옛날에 KDE를 써보고 안좋은 인식이 있었는데, 이번에 젠투에서 설치해서 써보니까 너무나도 만족스럽다.  특히나 맥에서 리눅스로 주력 운영체제 이전을 고려 중인 상황에서, 내가 사용하는 소프트웨어의 대부분을 커버할 수 있는데다 생각보다 젠투의 완성도가 꽤 맘에 들어서, 현재 사용 중인 모든 컴퓨터에 젠투를 설치하려고 계획 중이다.


이제 8년 만에 다시 쓰는 젠투의 설치 매뉴얼과 각종 명령어들에 대한 내용을 업데이트할 예정이다.  8년 전과 비해서 크게 바뀌진 않았지만, 꼭 중요한 명령어나 절차가 있어서 이것들은 블로그에 꼭 기록을 남기고 싶다.

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,



ssllabs.com에서 A+ 받은 Apache / NginX SSL 설정을 공유해드린다.


Apache:

<IfModule mod_ssl.c>

<VirtualHost *:443>

....

SSLEngine on

SSLProtocol all -SSLv2 -SSLv3

SSLHonorCipherOrder on

SSLCipherSuite "-ALL EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EDH+aRSA+AESGCM EECDH+ECDSA+AES EECDH+aRSA+AES EDH+aRSA+AES RSA+3DES"

SSLCertificateKeyFile   /etc/ssl/private/your_website.key

SSLCertificateFile /etc/ssl/certs/your_website.crt

</VirtualHost>

</IfModule>


<IfModule mod_headers.c>

Header add Strict-Transport-Security "max-age=15768000"

</IfModule>


ServerTokens ProductOnly

ServerSignature Off

TraceEnable Off


저장 후  headers 모듈을 활성화하고나서 아파치 서버를 재시작해주면 된다.

sudo a2enmod headers && sudo service apache2 restart



NginX:

server {

        listen   443 default_server;

        server_name yourwebsite.com;


        ssl on;

        ssl_session_cache shared:SSL:20m;

        ssl_session_timeout 180m;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_prefer_server_ciphers on;


        ssl_certificate /etc/ssl/certs/yourwebsite.pem;

        ssl_certificate_key /etc/ssl/private/yourwebsite.key;


        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

        ssl_dhparam /etc/nginx/cert/dhparam.pem;

        add_header Strict-Transport-Security "max-age=31536000";


        ......

}


저장 후, 2048비트 길이의 safe prime을 담은 DH prarmeter 파일을 생성하기 위해 다음의 명령어를 실행해준뒤 엔진엑스를 재시작한다.

sudo mkdir -p /etc/nginx/cert && sudo openssl dhparam 2048 -out /etc/nginx/cert/dhparam.pem

sudo nginx restart





블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

리눅스에서 SSH를 통해 MySQL 서버를 마스터-슬레이브간 동기화하는 방법에 대해 작성한다.


1. 먼저 SSH로 접속할 유저를 생성하고 SSH키를 만든다.


2. SSH 터널을 생성한다.  MySQL을 위한 포트번호는 33061로 정한다.

sudo -u username ssh -f ServerIPAddress -L 33061:127.0.0.1:3306 -N


3. 접속확인을 해본다.

$ mysql -h 127.0.0.1 -P 33061 -u root -p

4. /etc/mysql/my.cnf 파일을 열어 server-id=1 항목을 주석해제하고 아이디를 넣어준다.


5. 마스터 노드에서, 레플리케이션용 슬레이브 유저를 생성한다.

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@% 'IDENTIFIED BY 'your_password';

mysql> GRANT ALL PRIVILEGES ON `your_database` . * 'slave_user'@'127.0.0.1' WITH GRANT OPTION;

mysql> FLUSH PRIVILEGES;


여기서 mysql 서버를 재시작해주는 것을 권장한다.

$ sudo service mysql restart

$ mysql -u root -p

mysql> show master status;

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |     5946 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

여기서 File과 Position을 잘 기록해놓는다.  숫자는 상황에 따라 다르다.


6. 이번엔 슬레이브 노드에서, 마스터 노드에 접속하기위한 설정을 한다.

mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_HOST='master_address', MASTER_USER='slave_user', MASTER_PASSWORD='your_password', MASTER_LOG_FILE=’mysql-bin.000001‘, MASTER_LOG_POS=5946;
mysql>start slave;


7. 테스트 해본다.  특히, 로그파일 /var/log/mysql/error.log 에서 ERROR가 있으면 안된다.

예)

150427 14:17:05 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000001' at position 107, relay log './mysqld-relay-bin.000001' position: 4
150427 14:17:05 [Note] Slave I/O thread: connected to master 'slave_user@127.0.0.1:33061',replication started in log 'mysql-bin.000001' at position 107




블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

글쓴이가 근무하는 곳에서 작년쯤 Yubikey라고 하는 USB 형태의 키를 주문했다.  




이게 무슨 물건이냐하면, 가운데에 있는 동그란 센서에 손가락을 잠시 갖다대면 AES 알고리즘에 의한 알파벳 30자리를 무작위로 생성해준다.  OTP라고 부르는데, 일명 One-TIme Password, 그러니까 1회용 비밀번호라는 의미.  심지어, 저 안에 펌웨어가 들어있어서 어떠한 방식으로 어떻게 암호화된 문자열을 생성할건지 직접 프로그래밍도 가능한데다, 2개의 메모리가 있어서 살짝 터치하는 것과, 약 2-3초간 터치하는 것에 따라서 다른 암호를 생성하게 할 수 있다.  이 패스워드를 생성해내는 구조와 알고리즘은 이미 오픈소스로 공개가 되어있으며, 파이썬/루비/PHP등 여러 언어에서 사용할 수 있도록 각종 예제와 프로그램 등을 무상으로 제공해준다.  관심이 있으신 분은 여길 보시면 되겠다.

http://www.yubico.com/products/yubikey-hardware/yubikey/technical-description/


많은 소프트웨어들이 이 Yubikey를 지원하고있는데, 특히 각종 웹사이트의 비밀번호를 저장해주는 인기 앱인 LastPass의 경우 프리미엄 회원은 Yubikey를 쓸 수 있게 해준다.  하지만, 여기서는 우분투가 설치된 컴퓨터에서 이 Yubikey로 로그인하는 것을 다뤄본다.   물론 당연하지만, Yubikey를 구매해야하며, 키가 없더라도 한 번쯤 포스팅을 읽어보면서 이게 대충 뭐하는 건지는 알 수 있도록 간단하게 설명하도록 했다.


관련 라이브러리를 설치한다.

$ sudo apt-get install libpam-yubico


이제 키를 USB에 꼽고 내 키가 가진 ModHex값(키 ID)을 알아내야한다.  두 가지 방법이 있는데, 가장 쉬운건 http://demo.yubico.com/php-yubico/Modhex_Calculator.php 사이트에 가서 Source Format에 OTP를 선택하고 String에는 키를 터치해서 패스워드를 입력해넣는 방법이다.  그러면 대략 14자리의 ModHex값을 보여준다.  또 다른 방법으로는 텍스트 편집기 하나를 열고 키의 센서를 터치해서 대략 3-4개 정도의 OTP를 생성하면, 맨앞 대략 14자리 정도의 문자열이 일치하는 것을 알 수 있는데, 이것이 바로 이 키의 ModHex 값이다.

예)

vvfvegvbtudalvegfjhtcdrghbljrhccuttgetifjgvr

vvfvegvbtudalcjcvhlcnutdgtcejftudbjdfrjbhfkh

vvfvegvbtudallilgekrilhnnekibdbrjhurbfgjrldd

Modhex: vvfvegvbtuda

이제 Yubikey로 로그인할 사람들의 명단을 생성한다.  편의상 /etc/yubikey_mappgins라고 하자.  형식은
user1:ModHex  
user2:ModHex  
형태로 저장하면 되겠다.

따라서, 글쓴이의 경우는
sysadmin:vvfvegvbtuda
라고 저장했다.

이제 마지막 작업만 남았다.  간단하다.
SSH로 로그인하는 경우에 키를 요구할 것인지, sudo 명령어를 사용할 때만 요구할 것인지, 혹은 GUI (LightDM)으로 로그인하는 사용자에게 요구할 것인지에 대한 "정책"을 세워야한다.  이 정책은 다들 아시다시피 /etc/pam.d에서 설정할 수 있다.  본 포스팅에서는 sudo 사용자들을 대상으로 해본다.

형태는 다음과 같다.  여기서 sufficient를 required로 바꾸면, 반드시 Yubikey의 OTP를 넣어야하고, sufficient로 두면 계정 패스워드만 넣어도 sudo가 가능하다.  주의할 점은, sufficient로 원할 경우는 아래의 라인을 /etc/pam.d/sudo 파일의 최상단에 넣어야한다.
auth    sufficient pam_yubico.so id=16 authfile=/etc/yubikey_mappings

sudo 명령 사용시 Yubikey의 OTP를 요구할 때, 사용자의 비밀번호로만 sudo를 사용하고 싶으면 Yubikey 입력부분에서는 그냥 엔터키만 치면 된다.  맨 뒤에 debug 를 추가하면 다양한 메시지를 출력해준다.
더 많은 옵션은 https://github.com/Yubico/yubico-pam 페이지를 참고하시면 되겠다.

sysadmin@ubuntu:~$ sudo -i
Yubikey for `sysadmin': 
[sudo] password for sysadmin: 
root@ubuntu:~# 

이런 식으로 나온다.  이것으로, 서버관리자 입장에서 다양한 활용이 가능할 것 같다.  예를 들어서 콘솔로 직접 로그인하려는 시도를 원천적으로 차단하기 위해서도 쓸 수 있고 (즉 인가된 사용자만 콘솔 사용), SSH 사용자들에게도 마찬가지로 키가 없으면 아예 로그인을 막거나하는 식의 비록 다양하진 않지만 강력한 보안정책을 세울 수 있다고 본다.  최근 정보유출이나 보안의식 부재로 인한 문제가 많다.  비록 살짝 터치만으로 랜덤 비밀번호를 생성해주는 것은 편하긴 하지만, 이걸 들고다니면서 매번 USB에 꽂았다뺐다 하는 것도 어지간히 귀찮긴 하지만, 일단 누군가가 OTP 중 하나를 외우는건 거의 불가능하고 (44자리 문자열을 한 번 잠깐 보고 외울 수 있을까) 키가 없으면 안된다는 점에서는 집 대문 열쇠나 마찬가지라고 볼 수 있겠다.

윈도우와 맥에서도 지원되니, 관심 있으면 꼭 써보시길 권해드린다.


블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

This post will explain how to set up multiple monitors with multiple graphic cards on Ubuntu 12.04

글쓴이가 근무하는 사무실에서, 글쓴이가 직접 쓸 워크스테이션이 지게차로 배송이 되어서 왔다 ㅎㅎ.


My workstation has two nVidia Quadro K4000 and six monitors.  My purpose was, 3 upper monitors(Graphic card #1) would be for monitoring only, and 3 lower monitors(Graphic card #2) would be for my use, such as terminal, web browser, note, and so on.  I work at College Of Education, University of Hawaii at Manoa as a Systems Administrator.

본 워크스테이션의 목적은 사실 오픈스택 클라우드의 시뮬레이션을 위해 구입했는데, 사양이 어마어마하게 빵빵하다.  구체적으로 나열하기는, 내것도 아닌데 자랑질하는 거 같아서 생략하고, 한국돈으로 천만원이 넘는다.  뭐 하여간,  모니터 위의 3대는 순전히 인프라 전체의 모니터링만을 하며, 아래 3대는 글쓴이의 작업용이다.


First time, I used Xinerama with nVidia control panel.  It worked good, but the only one left-side launcher existed on the left-top monitor, and log-out button existed only right-top monitor.  This was not what I wanted.  And also, I didn't want to unintentionally click monitoring windows on the upper monitors.  Yes, I wanted to block the mouse pointer moving toward upper monitors.  So, I needed two X-Windows managers working simultaneously with only one keyboard and one mouse for only lower monitors.  Actually, setting two independant window manager up is easy, but keyboard and mouse inputs work on both lower and upper desktop at the same time.

일단 첫째로 해본건 Xinerama였다.  nVidia 콘트롤 패널에서 클릭하면 아주 쉽게 잘되는데, 문제는 우분투 데스크탑의 런치패널이 왼쪽 상단 모니터에만 생기고, 상단 아이콘, 특히 로그아웃 버튼은 오른쪽 상단 모니터에만 생기니까 너무 불편했다.  게다가 중요한 건, 위의 모니터링 시스템들이 전부 웹브라우저이기 때문에, 컴퓨터 쓰다가 잘못해서 상단을 클릭하면 모니터링 페이지가 클릭된 페이지로 넘어가게 되서 이것 역시 불편했다.  무엇보다도 마우스 포인터가 위로 넘어가지 않길 바랬다.  따라서, 글쓴이가 원한건 두개의 독립된 윈도우매니저였으며, 키보드 하나와 마우스 하나로 아래 3대의 모니터만 컨트롤할 수 있어야만 했다.  윈도우 매니저 2개 설정하는 것 자체는 쉽지만, 문제는 두개의 서로다른 윈도우 매니져에서 키보드와 마우스는 같이 움직인다는게 문제였다.




I spent almost two days to figure out how to do this, and actually the configuration is very simple.  The configuration files we need are only two, /etc/lightdm/lightdm.conf and /etc/X11/xorg.conf.  I read this manual, https://help.ubuntu.com/community/MultiseatX

이것을 알아내기 위해서 대략 2일 정도를 소모했지만, 그에 비해 설정은 매우 간단하다.  여기서 우리가 필요한 파일은 /etc/lightdm/lightdm.conf 파일과 /etc/X11/xorg.conf 이다.  또한, 본 매뉴얼을 작성하기 위해 https://help.ubuntu.com/community/MultiseatX  이 글을 읽어봤었다.


For easy management multiple graphic cards and monitors, I split xorg.conf into two files, xorg_upper.conf and xorg_lower.conf.  It doesn't matter to merge or split it.  It's up to you. 

관리의 용이함을 위해, xorg.conf 파일을 둘로 나눴다.  윗모니터용 xorg_upper.conf, 아래 모니터용 xorg_lower.conf.  쪼개든 합치든 상관없다.


Let's see /etc/lightdm/lightdm.conf file.

[SeatDefaults]
user-session=true
greeter-session=unity-greeter
allow-guest=false
greeter-hide-users=true
greeter-show-manual-login=true

[Seat:0]
xserver-config=/etc/X11/xorg_lower.conf
xserver-command=/usr/bin/X -layout Layout0
user-session=ubuntu

[Seat:1]
xserver-config=/etc/X11/xorg_upper.conf -sharevts -allowMouseOpenFail -pointer Mouse1
xserver-command=/usr/bin/X -layout Layout1
user-session=ubuntu
autologin-user=monitor
autologin-user-timeout=0


Configuration is easy, right?  One thing we should know is, I'll block keyboard and mouse inputs on upper monitors, Seat:1 which means that I won't have a control.  Thus, upper desktop should enable "Auto-Login".  Don't worry.  We can control it through the VNC (Remmina).  If you confirm this works, then remove "-sharevts -allowMouseOpenFail -pointer Mouse1" and configure the remote desktop and automatic login on System Setting menu.  And then add "-sharevts -allowMouseOpenFail -pointer Mouse1" again.  Restart lightdm.

딱 봐도 설정이 어렵지는 않다.  한 가지 우리가 알고있어야할 점은, 윗 모니터들은 키보드와 마우스 입력을 막을 예정이고, 그렇다면 윗 모니터들을 제어할 방법이 없어지게 된다.  따라서, 자동 로그인을 키고 원격 데탑 설정만 해주면 된다.  위의 설정파일을 적용해보고 잘되는게 확인되면 마우스 입력을 막아주는 옵션인 "-sharevts -allowMouseOpenFail -pointer Mouse1" 부분을 잠시 지우고 로그인해서 자동로그인와 원격데탑 설정을 해준뒤 다시 로그아웃해서 옵션을 넣어주고 lightdm을 재시작해주면 된다.


The following is xorg_lower.conf.  Nothing different.  You can copy xorg.conf and rename it to xorg_lower.conf.

아래는 xorg_lower.conf 파일이다.  설정은 기본 xorg.conf와 다를게 없다.  그걸 그냥 복사해서 이름만 바꿔주면 된다.

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
    Option         "Xinerama" "0"
EndSection

Section "Files"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"
    # HorizSync source: edid, VertRefresh source: edid
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "DELL E2313H"
    HorizSync       30.0 - 83.0
    VertRefresh     56.0 - 76.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "Quadro K4000"
    BusID          "PCI:131:0:0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "Stereo" "0"
    Option         "nvidiaXineramaInfoOrder" "DFP-0"
    Option         "metamodes" "DVI-I-1: nvidia-auto-select +3840+0, DP-2: nvidia-auto-select +1920+0, DP-3: nvidia-auto-select +0+0"
    Option         "SLI" "Off"
    Option         "MultiGPU" "Off"
    Option         "BaseMosaic" "off"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection



Now, let's see the important file, xorg_upper.conf file.  It's almost same.  ServerFlags section is added on the top, and mouse#, keyboard# and screen# are not 0.

이제 중요한건, xorg_upper.conf 파일이다.  거의 다 비슷한데 맨 위 ServerFlags가 추가됐고, Mouse 넘버나 키보드 넘버, 스크린 넘버 등이 조금씩 다르다.  위의 파일과 비교해보자.

Section "ServerFlags"
    Option         "DefaultServerLayout" "Layout1"
    Option         "AllowMouseOpenFail" "True"
    Option         "AllowEmptyInput" "True"
    Option         "AutoAddDevices" "False"
    Option         "AutoEnableDevices" "False"
    Option         "DontVTSwitch" "False"
EndSection

Section "ServerLayout"
    Identifier     "Layout1"
    Screen      1  "Screen1" 0 0
    InputDevice    "Keyboard1" "CoreKeyboard"
    InputDevice    "Mouse1" "CorePointer"
    Option         "Xinerama" "0"
EndSection

Section "Files"
EndSection

Section "InputDevice"
    Identifier     "Mouse1"
    Driver         "void"
EndSection

Section "InputDevice"
    Identifier     "Keyboard1"
    Driver         "void"
EndSection

Section "Monitor"
    # HorizSync source: edid, VertRefresh source: edid
    Identifier     "Monitor1"
    VendorName     "Unknown"
    ModelName      "DELL E2313H"
    HorizSync       30.0 - 83.0
    VertRefresh     56.0 - 76.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "Quadro K4000"
    BusID          "PCI:132:0:0"
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "Device1"
    Monitor        "Monitor1"
    DefaultDepth    24
    Option         "Stereo" "0"
    Option         "nvidiaXineramaInfoOrder" "DFP-0"
    Option         "metamodes" "DVI-I-1: nvidia-auto-select +3840+0, DP-0: nvidia-auto-select +1920+0, DP-1: nvidia-auto-select +0+0"
    Option         "SLI" "Off"
    Option         "MultiGPU" "Off"
    Option         "BaseMosaic" "off"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection


I hope this helps!

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

CephBacula에 이어서 이번 오픈소스 프로그램 매뉴얼은 PyKota라고하는 생소한 프로그램이다.  일단 소개부터 드리자면, PyKota는 이름에서 봐도 알 수 있든 파이썬으로 작성되어있는, 어느 유저어떤 프린터기얼마나 사용하는지 기록을 남기며, 프린터기 사용을 제한하는 일을 하는 프로그램이다.  본 매뉴얼은 리눅스 터미널 사용에 익숙하며 데이터베이스 혹은 LDAP에 대해서 이해하고 있어야만 한다.

매 매뉴얼마다 얘기하지만 이번 매뉴얼에도 언급한다.

이전 매뉴얼들을 페이스북에 공유하면서 다른 분들과 나눴던 대화 중 역시 가장 기억에 남는건, "다른 상용 프로그램과의 비교"였다.  글쓴이가 매뉴얼을 작성하는 이유는 "글쓴이가 현재 사용 중인 너무나도 좋은 오픈소스 프로그램을 많이들 모르고 계셔서"이다.

글쓴이가 근무하는 하와이 주립대학교는 하와이 주 정부의 "교육부"에 해당하는 곳으로, 몇 년 전까지만 해도 주 정부에서 예산이 지원됐었는데 갑자기 "너네는 알아서 잘 살아라" 라고 일방적으로 통보하고 예산지원을 끊어버렸다.  그 이후 주립대학교의 학비가 큰 폭으로 상승됐고 장학금 등도 많이 줄었다.  이래저래 학교가 돈이 없다.  꼭 이러한 이유만은 아니겠지만, 어찌됐든간에 글쓴이가 근무하는 곳에서는 어떠한 시스템을 구축하고자 할 때는 너무나도 당연히 오픈소스부터 알아본다.  상용 프로그램이야 찾으면 얼마든지 널리고 널렸고, 없다고 한들 돈 주면 다 해결되는게 지금 세상이지 않나.  일단, 오픈소스를 찾고 그것을 기술지원해주는 업체에 기술지원비를 지불하여 서비스를 받는 식으로 이용하는 중이다.  말 나온김에 나열을 해보자면

OpenStack - Mirantis
OpenLDAP - Symas
LDAP Account Manager - LAM Pro
Firewall - pfSense
ownCloud - ownCloud Enterprise
Backup - Bacula Systems

정도가 되겠다.  좌측이 프로그램 이름이고, 우측이 기술지원 업체명이다.  모두 오픈소스 프로그램이다.  이들은 모두 오픈소스 프로그램을 바탕으로해서 자기들만의 패치를 더하는 제품을 내놓거나, 아예 처음부터 제품개발을 오픈소스로 하고 상용버전은 별도로 유지보수하는 식으로 한다.

이만하면 설명이 충분히 됐으니, 더 이상 상용 프로그램과 비교하는 분이 없으면 한다.  다시 한 번 강조하지만, 매뉴얼을 쓰는 목적은 좋은 오픈소스를 알리고자함이다.  어차피 상용은 그만큼 매뉴얼도 잘 되서 나오니까 이렇게 매뉴얼 작성하는 것도 필요없겠지만.  솔루션 필요할 때마다 아예 상용만 찾는 회사들도 있다.  그런 회사에서 근무하시는 분이라면 본 매뉴얼은 필요없을 거다.

 

글쓴이의 상사가 이런 얘길 했다.  "우리 College 내에서 어떤 교수는 분명 프린터기를 엄청나게 쓰고있는데, 우리는 그걸 파악조차 하고있지 못하다.  물론, 우리가 그들의 프린터기 사용을 제한할 수 없지만 적어도 누가 얼만큼을 쓰는지는 좀 알고있어야할 필요가 있어보인다." 라고 하면서 이 PyKota라는 프로그램에 대해서 알아보라고 했다.  본인이 근무하는 곳은 College Of Education으로서, 한국으로 치자면 "교육대학"쯤 되겠다.  그러니까, 하와이 주립대학교 교육대학이다.  교육대학의 총 교수진과 직원의 수는 대략 400여명 정도이고, 주립대학교 내의 대학들간의 교수진/직원 정보는 절대로 공유하지 않는다.  따라서, 글쓴이는 교육대학만 관리하고 그외 자연대학, 경영대학 등은 전혀 모른다.  알 방법도 없다.

본격적으로 시작해보자.  사실 2006년을 끝으로 개발이 중단된 것으로 보이지만 작동이 잘 되기 때문에 전혀 문제가 없다.  글쓴이가 테스팅한 환경은 우분투 10.04와 12.04 64비트 서버였으며 현재 대학 내 전체 사무실로의 적용을 준비 중이다.

PyKota는 다소 부적절한 용어를 섞어서 한 문장으로 설명하자면 "조낸 어렵고 조낸 복잡하며 조낸 잘만들어진" 프로그램이다.  처음 이것을 설치할 때엔 뭐 이딴 프로그램이 다 있나 싶을 정도로 이해하기도 어렵고 설명도 제대로 안되어있는 불친절한 프로그램이라고 생각했으며, 실제로 이것을 이용해서 프린트를 성공적으로 하게된 데에만 무려 1주일이라는 시간을 투자했다.  시간 들인 것과는 다르게, 핵심만 뽑아서 설명하면 한 편의 매뉴얼로 충분하므로 이 매뉴얼은 나눠서 설명하지 않는다.  이것 때문에 얼마나 스트레스 받았는지는 IRC에 자주 오신 분들이라면 글쓴이가 불평하는걸 여러 번 보셨을 거다.

PyKota는 프린터기 사용을 기록하기 위해 PostgreSQL, MySQL 등의 데이터베이스와 LDAP을 지원하는데, LDAP을 지원하는 것이 글쓴이에게 가장 핵심적인 요소였다.  하와이 주립대학교의 모든 인적정보는 LDAP으로 관리하기 때문이다.  데이터베이스를 이용한 설정은 LDAP에 비해서 쉽고 간단하기 때문에 설명하지 않는다.  게다가 하다하다 안되면 로컬에서 테스트를 해보는 것도 가능하지만, 반대로 LDAP은 인적정보를 포함한 상태로 로컬서버를 구축하는 것이 쉽지않기 때문에 훨씬 어렵다.  따라서, 본 매뉴얼은 DB를 이용한 설명은 생략하고 LDAP을 이용한 구축만 설명드린다.

먼저 PyKota의 동작원리부터 보자.

보고 자시고 할 것도 없이 간단하다.  한 가지 특이한 점은, 사용자의 프린트 요청을 CUPS가 바로 받는 게 아니라 PyKota가 바로 받는다는 점이다.

설치를 시작하자.  설치에 들어가기에 앞서 글쓴이의 테스팅 환경은 Ubuntu 12.04 64bit server, OpenLDAP에 start_tls, 그리고 HP LaserJet 4000라는 리눅스에서 특별한 드라이버 설치없이 사용가능한 투박한 프린터기다.

1.  아래의 두 파일들을 다운로드 한다.
$ wget http://www.pykota.com/software/pykota/download/tarballs/pykota-1.26_fixes_official.tar.gz
$ wget http://www.pykota.com/software/pkipplib/download/tarballs/pkipplib-0.07.tar.gz

 

2.  필수패키지를 설치할 차례다.
$ sudo apt-get install cups cups-client python-dev python-jaxml \ 
  python-reportlab python-reportlab-accel python-ldap python-osd \
  python-egenix-mxdatetime python-imaging python-pysnmp4 \
  python-chardet python-pam pkpgcounter

 

3.  대략 500메가가 넘는 패키지들이 설치될 거라고 나온다.  설치가 끝났으면 pkipplib부터 압축을 풀자.
$ tar xfz pkipplib-0.07.tar.gz

 

4.  pkipplib을 설치한다.  간단하다.
$ cd pkipplib-0.07/; sudo python setup.py install

 

5.  이제 PyKota의 압축을 풀자.  PyKota 패키지에서 프로그램이 빠진 것을 체크해주는 간단한 스크립트가 있으니 이걸 이용한다.
$ tar xfz pykota-1.26_fixes_official.tar.gz
$ cd pykota-1.26_fixes_official
$ python ./checkdeps.py

실행하고나면 뭔가 많이 나온다. 

Checking PyKota dependencies...
Checking for Python-PygreSQL availability : NO.
ERROR : Python-PygreSQL not available !
PygreSQL is mandatory if you want to use PostgreSQL as the quota database backend.
See http://www.pygresql.org
Checking for Python-SQLite availability : NO.
ERROR : Python-SQLite not available !
Python-SQLite is mandatory if you want to use SQLite as the quota database backend.
See http://www.pysqlite.org
Checking for MySQL-Python availability : NO.
ERROR : MySQL-Python not available !
MySQL-Python is mandatory if you want to use MySQL as the quota database backend.
See http://sourceforge.net/projects/mysql-python
Checking for Python-egenix-mxDateTime availability : OK
Checking for Python-LDAP availability : OK
Checking for Python-OSD availability : OK
Checking for Python-SNMP availability : OK
Checking for Python-JAXML availability : OK
Checking for Python-ReportLab availability : OK
Checking for Python-Imaging availability : OK
Checking for Python-Psyco availability : NO.
ERROR : Python-Psyco not available !
Python-Psyco speeds up parsing of print files, you should use it.
See http://psyco.sourceforge.net/
Checking for Python-pkpgcounter availability : OK
Checking for Python-PAM availability : OK
Checking for Python-pkipplib availability : OK
Checking for Python-chardet availability : OK
Checking for GhostScript availability : OK
Checking for SNMP Tools availability : OK
Checking for Netatalk availability : OK

메시지를 보면 PygreSQL, SQLite, MySQL, Psyco가 없다고 뜬다.  본 매뉴얼에서는 데이터베이스를 이용하지 않고 LDAP을 이용할 거라서 메시지는 무시해도 된다.  Python-Psyco의 경우 공식 매뉴얼에 의하면 32비트 컴퓨터에서만 필요하다고 써있다 (그렇다고 필수는 아니다).  따라서 글쓴이는 64비트 서버를 운영하는 관계로 패스했다.

 

6.  설치를 시작하자.
$ sudo python setup.py install 

 

7.  CUPS에게 PyKota의 존재를 알려야한다.
$ sudo cp /usr/local/share/pykota/cupspykota /usr/lib/cups/backend
$ sudo chmod 755 /usr/lib/cups/backend/cupspykota 

 

8.  PyKota를 위한 유저를 생성하고 설정파일을 복사해주자
$ sudo adduser --system --group --home /etc/pykota --gecos PyKota pykota
$ sudo chown pykota:pykota /etc/pykota/pykota.conf /etc/pykota/pykotadmin.conf
$ sudo usermod -aG lpadmin pykota

 

9.  cups의 설정파일을 수정해줘야한다.  이 매뉴얼을 보고 연습하시는 분이 localhost에서 하신다면 필요없지만, CUPS의 웹인터페이스에 localhost가 아닌 remote로 접속하려면 해야한다.  구글링하면 방법이 나오지만, 일단 간단하게나마 중요부분만 올려드린다.
Port 631
Listen /var/run/cups/cups.sock  (Listen localhost는 삭제한다.  Listen 127.0.0.1이 있으면 그것도 삭제한다)

Browsing On
BrowseOrder allow,deny
BrowseAllow all
BrowseLocalProtocols CUPS dnssd
BrowseAddress @LOCAL
BrowseWebIF Yes
BrowseRemoteProtocols

WebInterface Yes

이후 <Location>에는 Allow from IP주소를 모든 Location 항목마다 넣어주자.  <Policy> 항목에는 필요없다.

 

10.  CUPS를 재시작하고 웹브라우저를 열어서 포트번호 631로 접속해보자.  상단 Administration 클릭하면 아이디랑 비번을 물어볼 거다.  그건 CUPS가 설치되어있는 서버의 유저명과 비번을 입력하면 된다.   그리고나서 Add Printers를 클릭하여 프린터기를 추가한다.  주의할 점은 Share this printer를 반드시 선택해야한다는 점이며, 프린터기의 이름은 중요하다 (프린터기의 이름에는 공백을 허용하지 않는다).

 

11.  작동이 잘되면 이제 본격적으로 PyKota의 설정을 할 차례다.  먼저, Admin 파일부터 수정한다.  Admin 파일은 관리자 계정을 지정하는 역할 이외에는 없다.  따라서 데이터베이스로 운영하실 분이라면 파일을 열어서 계정만 설정해주고, LDAP을 하실 분이라면 LDAP의 기본 정보만 넣어주면 된다.  글쓴이의 파일을 일부만 수정한채 그대로 올려드린다.

$ sudo vi /etc/pykota/pykotadmin.conf
[global]

storagebackend: ldapstorage
storageserver: ldap://ldap.server.address
storagename: dc=abc,dc=com
storageadmin: cn=admin,dc=abc,dc=com
storageadminpw: AdminPassword

주의하실 점은, PyKota는 파이썬으로 작동하므로 라인 맨 앞에 공백이 있으면 안된다.

 

12.  가장 어려운 항목은 pykota.conf 파일이다.  무려 1,400라인이나 된다.  물론 대부분은 주석이지만, 복잡한 건 사실이다.  DB는 위와 마찬가지로 유저이름과 비번만 넣어주면 알아서 테이블 생성하고 관리하니까 큰 문제 없는데 LDAP은 아무래도 좀 다르니 설명 드린다.

/usr/local/share/pykota/ldap 디렉토리에 가면 LDAP 스키마 파일과 LDIF 샘플 파일이 있다.  이걸 보시면 뭐가 필요한지 LDAP 관리자라면 바로 파악하실 수 있을텐데, 일단 top에 ou=pykota를 하나 만들고 그 아래로
ou=billingcodes
ou=gquotas
ou=jobs
ou=lastjobs
ou=printers
ou=uquotas

가 반드시 필요하며, 아파치 디렉토리 스튜디오에서 보는 화면은 다음과 같다. 

 

다음은 유저에 해당하는 부분의 스크린샷이다.

Balance가 -4.0인 것은 신경쓰지 말되, 신경써서 봐야할 곳은 pykotaLimitBypykotaUserName이다.  밑에서 따로 설명한다.

글쓴이의 설정파일을, 주석처리된 부분 제외하고 올려드린다.  참고로, 글쓴이는 유저의 프린터기 사용 자체는 제한하지 않는다는 점을 명심하자.

[global]
storagebackend: ldapstorage
storageserver: ldap://ldap.server.com
storagename: dc=abc,dc=com
storageuser: cn=pykotastorage,dc=abc,dc=com
storageuserpw: pykota_storage_password
ldaptls: Yes
cacert: /etc/ssl/certs/your_certification.crt
userbase: ou=people,dc=abc,dc=com
userrdn: uid
balancebase: ou=people,dc=abc,dc=com
balancerdn: uid
groupbase: ou=groups,dc=abc,dc=com
grouprdn: cn
printerbase: ou=printers,ou=pykota,dc=abc,dc=com
printerrdn: cn
jobbase: ou=jobs,ou=pykota,dc=abc,dc=com
lastjobbase: ou=lastjobs,ou=pykota,dc=abc,dc=com
billingcodebase: ou=billingcodes,ou=pykota,dc=abc,dc=com
userquotabase: user
userquotabase: ou=uquotas,ou=pykota,dc=abc,dc=com
groupquotabase: group
groupquotabase: ou=gquotas,ou=pykota,dc=abc,dc=com
newuser : below
newgroup : below
usermail : mail
groupmembers: memberUid
storagecaching: No
disablehistory: No
logger: system
debug : Yes
logourl : http://www.pykota.com/pykota.png
logolink : http://www.abc.com/
smtpserver: localhost
maildomain: example.com
usernamecase: native
privacy : no
onbackenderror : nocharge
keepfiles : no
accounter: software()
skipinitialwait : no
preaccounter: software()
onaccountererror: stop
admin: Administrator
adminmail: admin@abc.com
mailto : both
balancezero: 0.0
gracedelay : 7
poorman : 1.0
poorwarn : Your Print Quota account balance is low.
Soon you'll not be allowed to print anymore.
softwarn: Your Print Quota Soft Limit is reached.
This means that you may still be allowed to print for some
time, but you must contact your administrator to purchase
more print quota.
hardwarn: Your Print Quota Hard Limit is reached.
This means that you are not allowed to print anymore.
Please contact your administrator at root@localhost
as soon as possible to solve the problem.
policy : external(/usr/local/bin/pkusers --add --skipexisting --limitby noquota $PYKOTAUSERNAME && /usr/local/bin/edpykota --add --skipexisting --printer $PYKOTAPRINTERNAME $PYKOTAUSERNAME)
policy: deny
maxdenybanners: 0
enforcement : strict
trustjobsize : yes
denyduplicates : no
duplicatesdelay : 0
noprintingmaxdelay : 60
statusstabilizationloops : 5
statusstabilizationdelay : 4.0
snmperrormask : 0x4FCC

 

13.  위의 10번에서 CUPS의 프린터기 추가가 성공적으로 됐으면, 해당 프린터기에 해당하는 설정을 pykota.conf 파일에 넣어줘야하는데, 아래의 명령어를 실행하면 된다.  솔직히 왜 이걸 유저가 하게했는지 이해가 안가는 명령어다.

$ sudo /usr/local/bin/pkturnkey --doconf

대략 다음과 비슷하게 나올 거다.

INFO: Please be patient...
INFO: Don't worry, the database WILL NOT BE MODIFIED.
INFO: Extracting all print queues.
INFO: pkprinters --arguments /tmp/pkprinters.args
INFO: Simulation terminated.

--- CUT ---
# Here are some lines that we suggest you add at the end
# of the pykota.conf file. These lines gives possible
# values for the way print jobs' size will be computed.
# NB : it is possible that a manual configuration gives
# better results for you. As always, your mileage may vary.
#
[FS-2000D]
preaccounter : software()
accounter : hardware(snmp)

맨 아래 빨갛게 처리해놓은 3줄을 복사해서 /etc/pykota/pykota.conf 파일 맨 아래에 삽입하면 된다.  역시 주의할 점은 라인마다 맨 앞에 공백이 있으면 안된다는 점이다.

 

14.  CUPS에 등록된 프린터기의 설정을 변경해야한다.  유저가 프린트를 하면 이것을 PyKota가 가로채서 먼저 작업을 하고 CUPS에 전달하는 역할을 하게하는 부분이다.  먼저 CUPS 서비스 데몬부터 중지시키고나서 설정파일을 열여본다.
$ sudo service cups stop
$ sudo vi /etc/cups/printers.conf

파일을 열어서 DeviceURI라고 적힌 라인을 찾아보면 아래와 비슷하게 되어있을 거다. 
DeviceURI socket://192.168.0.181

다음과 같이 고친다. 
DeviceURI cupspykota://socket://192.168.0.181 

프린터기가 여러 대라면 모두 바꿔야한다.  다 수정했으면 CUPS를 다시 시작해준다.
$ sudo service cups start 

 

15.  이제 이 프린터기를 데이터베이스나 LDAP에 등록시켜서 PyKota에 의해 이용현황이 통계되도록 해야한다.  10번에서 추가했었던 프린터기의 이름을 다시 한 번 확인한다.  
$ sudo /usr/local/bin/pkprinters --add --cups -D "프린터기의 설명" --charge 1 "Printer_Name"

프린터기의 설명은 편한대로 넣고, "Printer_Name" 부분은 CUPS에 등록된 프린터기의 이름을 넣는다.  여기서 charge 1이라는 옵션은, 이 프린터기에서 프린트를 한 장 출력할 때 얼마의 비용(cost)을 청구할 것인가를 정하는 부분이다.  예를 들어서, 컬러 프린터기는 1.2배 정도 비싸게 하고싶다거나, 흑백 프린터기는 0.8 정도로 20% 싼 비용을 청구하게 할 수도 있다.  비용이라고 해서 이게 꼭 돈을 의미하는 것은 아니며, 일종의 "포인트" 정도의 개념으로 볼 수 있다.  글쓴이처럼 학교에서 근무하는 분이라면 프린터기마다 비용을 정할 수도 있고, 학생과 교수를 구분하기 위한 group코드나 billing 코드를 설정할 수도 있다.

프린터기가 제대로 추가됐는지 확인해보자.
$ pkprinters -l

FS-2000D [Printer description] (0.0 + #*1.0)
Passthrough mode : OFF
Maximum job size : Unlimited
Routed through PyKota : YES

빨갛게 표시된 부분이 YES로 안되어있으면 /etc/cups/printers.conf 설정이 잘못된 거다.

 

16.   이제 사용자를 확인해볼 차례다.  PyKota를 사용하는 가장 큰 이유가 되는 곳이다.  다시 한 번 상기시켜드린다.  12번에서 pykotaLimitBy와 pykotaUserName을 신경써서 봐야한다고 설명했다.  DB 사용자라면 사용자를 수동으로 추가시켜줘야하며, LDAP 유저라면 필요없다.  DB사용자를 위한 사용자 추가방법을 설명해드릴건데, LDAP 유저에게도 필요한 사항이 나오니 건너뛰지말고 보시길 바란다.

PyKota에서는 사용자에게 프린트 사용제한을 5가지로 한다.  첫번째로는 프린터기별로 쿼타 (Quota)를 지정해서 지정된 쿼타를 모두 소모하면 프린터기가 작동되지 않는 방식이 있고 (quota), 두 번째는 사용자별로 포인트 (Balance)를 충전해서 포인트를 모두 소모하면 작동을 거부하는 방식이 있으며 (balance), 세 번째로는 쿼타 무시 (noquota), 네 번째는 포인트 무시 (nochange), 마지막은 프린트 금지가 되겠다 (noprint).  쿼타나 포인트 무시를 설정하더라도 프린터기 사용 자체는 모두 기록된다는 점을 알아두자.

사용자 추가는 /usr/local/bin/pkusers --add username 으로 가능하다.  pkusers를 입력해보면 다양한 옵션이 제공되는데, 포인트 충전식으로 지정하고, 유저를 생성하면서 동시에 10 포인트를 충전해주고, 포인트를 넘어서 프린터기를 이용할시 할증료로 2.5배를 청구하며, 프린터기는 hp4000만 이용할 수 있게 하겠다고 치면,

$ pkusers --add username --limitby balance --overcharge 2.5 --balance +10.0 --printer hp4000 UserName

이라는 명령어로 유저를 생성할 수 있다.  물론, 유저만 먼저 추가하고 나중에 설정을 변경하는 것은 edpykota 라는 명령어로 가능하다.  여기서 LDAP 유저가 알아야할 점은, 위의 명령어는 실행할 필요가 없으며 (이미 유저가 있으므로), 12번 스크린샷에서 나오듯 사용자의 pykotaLimitBy 값을 위에 나열한대로 적절한 값으로 수정하면 되겠다.  위의 예제에서 나와있는 것에 해당하는 옵션들은 스크린샷을 보시면 모두 있으니까 해결이 가능해보이는데, pykotaUserName라는 것만 다르다는 것을 볼 수 있다.  물론 위의 예제에는 --printer와 옵션이 매치되는 것도 알 수 있다.  LDAP 유저는 이용가능한 프린터기의 목록을 ou=uquotas에 기록하는데, 이것도 스크린샷을 통해 알아보자.

위의 스크린샷의 pykotaUserName과 12번 uid=username,ou=peoplepykotaUserName의 문자열이 같음을 알 수 있다.  즉, ou=uquotas에서 cn을 하나 생성하고 위의 스크린샷처럼 attr.을 추가하면 pykotaUserName으로 sysadmin이라고 되어있는 사용자만이 Wist_235라는 프린터기를 사용할 수 있게 허가하는 것이다.

프린트를 실행했는데 뭔가 잘 안된다면, pykota.conf 파일을 열어서 debug = Yes로 되어있는지 확인한 뒤, tail -f /var/log/syslog 열어놓고 나오는 로그를 보면 상세한 이유가 나온다.  대부분은 LDAP에 필요한 필수 Attributes를 넣지않아서일거다.

 

17.   이제, 다른 제약사항을 걸어보자.  /etc/pykota/pykota.conf 파일을 열어보자.
a.  askconfirmation 이라는 항목을 찾아가면 주석처리되어있는 아주 긴 라인이 하나 있는데, 이것의 주석을 풀면 프린트를 하려고 할 때마다 Yes, No를 묻게 할 수 있다.
b.  policy 항목을 찾아가면 external(/usr/local/bin/pkusers --add …… 라인이 있는데, 이것은 uquotas에는 유저가 있는데 실제 사용자는 없을 때 유용하게 쓸 수 있다.  예를 들자면, 유저가 이미 존재하면 건드리지말되, 없으면 추가하면서 일단 무제한으로 프린트를 할 수 있게 하며, pykotaPrintName 설정되어있는 프린터기를 기본으로 사용하게끔 한다고 친다면,

policy : external(/usr/local/bin/pkusers --add --skipexisting --limitby noquota $PYKOTAUSERNAME && /usr/local/bin/edpykota --add --skipexisting --printer $PYKOTAPRINTERNAME $PYKOTAUSERNAME)

라고 설정할 수 있다.
c.  policy: deny 를 설정하면, 조건이 맞지않는 프린트 요청은 모두거부한다.
d.  banner 항목을 설정하면 인쇄되는 종이마다 상/하단에 특정 메시지를 찍을 수 있다.  (startingbanner, endingbanner)
e.  smtpserver를 설정하면 인쇄 거부시 해당 사용자에게 이메일을 발송한다.

 

18.  마지막 순서로, 해도되고 안해도 되는 부분이다.  웹CGI 스크립트를 설치해서, 인쇄사용량에 대한 리포트를 뽑아보거나, 인쇄 전 내가 프린트하려는 파일이 몇 장이나 나오는지에 대한 간단한 스크립트가 있다.  솔직히 그닥 쓸만하진 않다.

아파치와 관련 모듈을 설치하고, CGI 스크립트를 복사해준다.

# apt-get install apache2 pwauth
# a2enmod authnz_external
# mkdir /usr/lib/cgi-bin/pykota/ 
# cp /usr/local/share/pykota/cgi-bin/* /usr/lib/cgi-bin/pykota/ 
# cp /usr/local/share/pykota/stylesheets/pykota.css /var/www/

/etc/apache2/sites-enabled/000-default 파일을 열어서 <Directory /usr/lib/cgi-bin> 섹션 안에 다음을 삽입한다.

<Directory "/usr/lib/cgi-bin/pykota"> 
  AllowOverride None 
  Options +ExecCGI -Multiviews +SymlinksIfOwnerMatch 
  Order allow,deny 
  AuthType Basic 
  AuthName "Restricted Server" 
  AuthBasicProvider external 
  AuthExternal pwauth 
  Require valid-user 
  Allow from all 
</Directory>

AddExternalAuth pwauth /usr/sbin/pwauth
SetExternalAuthMethod pwauth pipe

CUPS를 재시작한다.
# /etc/init.d/apache2 restart

CGI에 접속되는지 확인해보자.
http://machine_ip/cgi-bin/pykota/pykotme.cgi 
http://machine_ip/cgi-bin/pykota/printquota.cgi 
http://machine_ip/cgi-bin/pykota/dumpykota.cgi

 

 

19.  다음은 공식 매뉴얼을 볼 수 있는 주소다.

http://ftp.psu.ac.th/pub/pykota/latest/pykota/stable/pykota-1.26_official/docs/pykota.pdf

 

끝.

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

sudo add-apt-repository ppa:webupd8team/sublime-text-2

sudo apt-get update

sudo apt-get -y install sublime-text 


Sublime Text 2 실행한 뒤, 사이드 바에 고정시키면 끝.

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

리눅스나 맥의 터미널에서 BASH의 PS1에 색깔을 넣는 방법이다.  PS1에서 4까지 값이 있지만 우리가 필요한건 1만 변경하면 된다.  먼저 글쓴이의 PS1을 공개한다.

PS1

구조를 보면, 사용자명@호스트명:디렉토리$  식의 구조로 되어있고, 따라서

녹색+사용자명+빨간색+@+녹색+호스트명+파란색+:+디렉토리+색 초기화+$

이런 식으로 넣는다는 것을 알 수 있다.  역시 알고보면 간단하다.  구조를 알았으니 이제 적용만 하면 된다.  적용하는 방법은 터미널을 열고,

export PS1='녹색+사용자명+빨간색+@+녹색+호스트명+파란색+:+디렉토리+색 초기화+$ '

라고 하면 되겠다.  그런데 이걸 매번 하면 귀찮으니까, 아예 터미널이 열릴 때마다 자동으로 적용되도록 해보자.  

 

맥 OS X:  /etc/bashrc 파일을 열어서 PS1 부분을 주석처리하던가 지우던가 하고 새로운 설정을 넣으면 된다.
리눅스:  $HOME/.bashrc 파일을 열면 몇 가지의 PS1 라인이 보이는데, 터미널 타입에 따른 적용을 다르게 하는 부분이다.  귀찮으니까 전부 주석처리하고 새로운 설정을 넣으면 된다.

컬러 코드 (ANSI 코드)를 인터넷에서 알아내는게 의외로 참 힘들더라.  웹서핑 한참 해도 쉽게 찾을 수 없었다.  예전에 어디선가 구해둔 것을 공유해드린다.  아래의 코드를 보고 입맛에 맞는 컬러 프롬프트를 만들어보시면 되겠다.  코드 아래에 파일을 첨부해뒀으니 터미널을 열고 실행권한을 줘서 실행을 시키거나, sh를 붙여서 실행하시면 터미널에서 색상을 보여준다.  참고로 Draco님의 컬러 PS1도 구경해보시라.  홈페이지 바로가기

 

echo " [0m : 모든 색과 스타일 초기화"
echo -e "\033[01m [01m : 굵게(bold) / 밝게 \033[0m"
echo -e "\033[3m [3m : 이탤릭체(italic) \033[0m"
echo -e "\033[4m [4m : 밑줄(underline) \033[0m"
echo -e "\033[7m [7m : 반전(글자색/배경색을 거꾸로) \033[0m"
echo -e "\033[9m [9m : 가로줄 치기 \033[0m"
echo -e "\033[22m [22m : 굵게(bold) 제거 \033[0m"
echo -e "\033[23m [23m : 이탤릭체(italic)제거 \033[0m"
echo -e "\033[24m [24m : 밑줄(underline)제거 \033[0m"
echo -e "\033[27m [27m : 반전 제거 \033[0m"
echo -e "\033[29m [29m : 가로줄 제거 \033[0m"
echo -e "\033[30m\033[47m [30m : 글자색:검정 \033[0m"
echo -e "\033[31m [31m : 글자색:빨강 \033[0m"
echo -e "\033[32m [32m : 글자색:초록 \033[0m"
echo -e "\033[33m [33m : 글자색:노랑 \033[0m"
echo -e "\033[34m [34m : 글자색:파랑 \033[0m"
echo -e "\033[35m [35m : 글자색:마젠트(분홍) \033[0m"
echo -e "\033[36m [36m : 글자색:시안(청록) \033[0m"
echo -e "\033[37m [37m : 글자색:백색 \033[0m"
echo -e "\033[39m [39m : 글자색으로 기본값으로 \033[0m"
echo -e "\033[40m [40m : 바탕색:흑색 \033[0m"
echo -e "\033[41m [41m : 바탕색:적색 \033[0m"
echo -e "\033[42m [42m : 바탕색:녹색 \033[0m"
echo -e "\033[43m [43m : 바탕색:황색 \033[0m"
echo -e "\033[44m [44m : 바탕색:청색 \033[0m"
echo -e "\033[45m [45m : 바탕색:분홍색 \033[0m"
echo -e "\033[46m [46m : 바탕색:청록색 \033[0m"
echo -e "\033[47m [47m : 바탕색:흰색 \033[0m"
echo -e "\033[49m [49m : 바탕색을 기본값으로 \033[0m"

첨부파일: ansi_color.sh

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,