Category: Linux

Virtual Image 만들기

dd 명령어를 사용해서 다음과 같이 Virtual Image 만들기가 가능하다.

10GiB 의 용량을 가진 가상 이미지를 만들어 줍니다.

Ubuntu 18.04 도메인을 찾을 수 없을때

Ubuntu 18.04 를 사용중인데, 보안 업데이트를 하기 위해서 apt 명령을 입력했더니 다음과 같이 도메인을 찾을 수 없는 이유로 오류가 생긴다.

“Temporary failure resolving” 이게 뭘까 싶어서 알아본 내용을 정리한다.

resolve.conf 파일을 열어보면 다음과 같이 되어 있을 것이다.

resolv.conf 파일은 다들 알다시피 도메인 네임 서버를 지정해주는 설정 파일로 이 파일이 잘못되면 도메인을 ip로 변환할 수가 없게되어 결국에는 인터넷 연결을 할 수가 없게 된다.

그런데, 위 내용을 보면 도메인 서버 ip는 로컬 호스트로 보이고 코멘트에 이것을 수동으로 바꾸지 말것을 경고하고 있다. 거기다 resolve 상태를 “systemd-resolve –status”로 확인하라고 친절히 안내하고 있다. 이 명령어는 uplink DNS 서버에 대한 상태를 알려준다.

그러면 이 uplink DNS 를 바꿀 수는 없을까?

systemd-resolve 데몬이 이를 수행하는데, 이는 다음과 같은 위치의 파일들을 읽어서 동작한다.

Ubuntu18.04 에서는 /etc/systemd/resolved.conf 파일이 존재하며 여기에 DNS= 부분에 DNS 서버를 space 로 구분해 리스트로 적어놓을 수 있다.

실제로 ‘DNS=8.8.8.8’ 을 입력하고 ‘systemctl restart systemd-resolved’ 하면 적용되어 apt update 가 잘 동작했다.

Bash 파일 존재 유무 체크하기

Bash 쉘 스크립트를 작성할때 자주 사용하는 로직인 바로 파일 존재 유무를 체크하는 것이다. 파일 하나만 체크할 수도 있고 여러파일을 체크할 수도 있다. 여러 파일을 체크할때는 다음과 같이 할 것이다.

이것을 Bash 쉘 스크립트에서는 어떻게 리턴을 받아야 하나하는 고민이 생긴다. 가장 쉬운 방법은 stdout, stderror 를 체크하는 방법이다.

Bash 에서 이를 exit code 라고 하고 $? 에 세팅이되어 다음과 같은 로직이 가능해진다.

명령어가 성공(stdout)하면 $?에 0, stderr 면 1 이다. 위를 실행하면 다음과 같다.

위 방법외에도 한줄로 다음과 같이 할 수도 있다.

AND 와 OR 연산자를 이용해서 메시지를 출력하도록 한다.

하지만 위 방법도 오류 메시지, 혹은 결과가 출력이 되는데 이를 방지하고 결과만 받고 싶다면 다음과 같이 할 수 있다.

이렇게 하면 결과 출력 없이 yes, no 만 출력이 된다.

출처: How to check if a file exists in a shell script

Trac 설치 및 실행

현재(2018년)에 Trac 을 설치해서 사용하는 사람이 있을지 모르겠지만, 개인적으로 뭔가를 할때 제일 좋은 툴은 것 같다. 그런데, Trac 설치는 가끔 하는거라 할때마다 헤메곤 하는데 기록해두기 위해서 이 글을 작성한다.

Python 2.7

Trac 은 현재 Python 2.7 에서 잘 작동한다. Python 2.7 이 설치되어 있어야 한다. 현 시점에서 CentOS 7, Ubuntu 16.04 LTS 에서 기본으로 Python 2.7 이 설치되어 있어 별도로 Python 2.7 을 설치할 필요는 없다.

pip, setuptools 설치

Trac 뿐만 아니라 Python 의 라이브러리를 설치하기 위해서 pip 를 이용한다. 역시나 이것도 프로그램이라서 pip 를 설치해줘야 한다.

설치하는 방법은 다음과 같이 두가지가 있다.

  • 배포판 패키지로 설치
  • setuptools 을 이용한 설치.

CentOS 7 과 Ubuntu 16.04 LTS 에서는 pip 패키지를 제공 한다. 별도로 setuptools 을 이용한 설치를 할 필요가 없다.

설치를 마쳤으면 최신버전으로 다음과 같이 업데이트를 해준다.

그리고 setuptools 은 많은 Python 라이브러리들을 설치할때 이용된다. 이것도 CentOS 7, Ubuntu 16.04 LTS 에서 패키지로 제공 한다. 설치해 주자.

Trac 1.0.15 설치

현재 2018년 1월에 Trac 최신 버전은 1.3 이다. 하지만 Trac 에 설치되는 플러그인들이 아직 1.2 이상을 잘 지원하지 못한다. 그래서 1.0.1 버전을 설치하기로 했다.

이렇게 함으로써 Trac 의 설치는 끝난다.

Trac 프로젝트 생성

Trac 은 알겠지만 Project Management 프로그램이다. 그래서 프로젝트를 만들어 줘야 한다.

위와같이 프로젝트를 생성해 준다.

프로젝트가 생성이 되었다면 이제 프로젝트를 관리할 ID 에 권한을 부여해줘야 한다. 보통 ID 는 admin 으로 하고 다음과 같이 프로젝트 Administrator 퍼미션(Permision)을 부여해준다.

admin 이라는 ID 를 추가하면서 퍼미션을 TRAC_ADMIN 으로 부여 했다.

로그인 인증 설정

admin 이라는 ID 로 로그인 인증을 위해서는 인증을 위한 방법을 먼저 정의해야 한다. 인증 방법에는 다음과 같이 두가지 방법이 있다.

  • Basic Auth by HTTP
  • Htdigest

나의 경우에는 Htdigest 방법을 사용한다. 이를 위해서 AccountManager 플러그인을 설치했다.  그리고 Htdigest 인증 파일을 작성해줘야 한다. 이를 위해서 다음과 같이 Htdigest 인증 파일을 만들어주는 trac-digest.py 파일을 이용한다.

위 소스를 trac-digest.py 로 저장한다. 그리고 다음과 같이 실행해 준다.

AccountManager 플러그인을 활성하고 이를 이용해서 이 인증 방법을 지정해준다. 다음과 같이 trac.ini 설정 파일을 편집해 준다.

Trac 실행

Trac 실행은 먼저 다음과 같이 CLI 로 할 수 있다.

CentOS 7, Ubuntu 16.04 LTS 는 Systemd 가 기본이다. 시스템 부팅 프로세스에 등록하기 위해서 systemd 스크립트를 다음과 같이 작성해 준다.

/etc/default/tracd 파일에 다음과 같이 프로젝트 정보를 기술해 준다.

이제 다음과 같이 systemd 스크립트 활성화 하고 시작해준다.

이렇게 한 후 서버에 8000 포트로 접속해서 “LocalProject” 프로젝트 리스트가 나오면 정상이다.

그리고 로그인을 할때에 앞서 설정한 계정과 비밀번호로 로그인을 하면 된다.

PHP7 설치하기

이 문서는 php7.2 설치 문서 입니다.

1. 준비

CentOS 가 최소설치되었다고 가정하고 시작했기 때문에 컴파일 환경을 구축해야 합니다.

Ubuntu16.04 의 경우에는 다음과 같은 프로그램이 설치되어 있어야 합니다.

 

2.Download and Unpack

최신버전을 다운로드 받아야 합니다.

3. Configure and Compile

이제 PHP에서 사용할 기능들을 결정해야 합니다. PHP에서 제공하는 기능은 아주 많지만 여기서는 다음과 같은 기능들을 사용할 것입니다.

아무런 에러없이 끝났다면 다음과 같이 컴파일을 해주고 설치해준다.

4. Configure to the installed php7

config-file-scan 디렉토리를 생성해 준다.

그리고 php.ini 파일을 /opt/php-7.2.1/etc 디렉토리로 복사해준다.

그리고 다음과 같이 php-fpm 을 위한 설정 파일도 만들어 준다. 이것은 php-fpm.conf.default 파일을 php-fpm.conf 파일로 복사해주고 다음과 같이 설정해 주면 된다.

그리고 pool 을 php-fpm.d 디렉토리에 설정해 준다. 보통 기본으로 www.conf 가 있는데 이것을 활요하면 된다.

위 설정은 각 서버 환경에 맞춰 해줘야 한다. 얼마나 사용자를 받느냐에 따라서 pm 값을 달리 해줘야 한다.

마지막으로 다음과 같이 systemd 를 위한 서비스 파일을 다음과 같이 작성해 줍니다.

위 내용을 php-fpm.service 파일로 /etc/systemd/system 디렉토리에 작성해 주고 systemd 에 등록해준다.

5. Verify

php-fpm 이 잘 동작하는지 확인 하는 방법으로 cgi-fcgi 명령어를 활용하는 법이 있다. 이 명령어는 php-fpm 처럼 FastCGI 로 동작하는 서버에 직접 연결을 할 수 있게 해준다.

php 정보를 표시해줄 파일을 작성하고 다음과 같이 cgi-fcgi 를 사용해 본다.

index.php  파일에는 ‘phpinfo();’ 를 호출해 php 설치에 관한 정보를 출력하도록 했으며 각종 파라메터를 쉘 환경변수에 지정해서 cgi-fcgi 로 전달해준다.

Python, SaltStack 편집을 위한 vim 세팅

서버를 다루다보면 Python, SaltStack 을 작성해야 하는데 이를 위해서 윈도우즈로 다운로드 받아서 편집기를 열어서 하기가 영 귀찮습니다. 터미널을 이용해기 때문에 vim 를 이용하면 아주 편한데, 이 문서는 Python, SaltStack 편집을 위한 vim 세팅 위한 것입니다.

환경

환경이 중요합니다. 이 문서의 환경은 다음과 같습니다.

  • OS Distro: Ubuntu 16.04
  • vim version: 7.4
  • Python Virtualenv: /home/systemv 계정에 Python 가상환경을 만들었으며 여기에 각종 Python 라이브러리가 설치되어 있다.

Vundle 플러그인 설치

Vundle 은 vim 플러그인 입니다. 이 플러그인은 vim 의 각종 플러그인을 아주 편하게 설치 및 관리를 해주는 플러그인 매니저 입니다.

다음과 같이 설치 해줍니다.

git 를 이용해서 Vundle 플러그인 매니저 파일을 vim 디렉토리에 다운로드 받습니다.

.vimrc 파일 작성

이제 vim 의 환경설정 파일을 다음과 같이 작성합니다.

위와같이 작성한 후에 vim 을 실행해 명령어 모드에서 다음과 같이 입력해줍니다.

Neosnippet 설치.

이 플러그인은 코드 스냅피를 지원해줍니다. vim 설정 파일에서 Vundle 블럭 사이에 다음을 추가해줍니다.

시스템 버퍼에 있는 키워드를 완성해 줍니다.

jedi-vim 설치.

awesome Python autocompletion with VIM

Python 을 위한 자동완성 플러그인 입니다. 이는 jedi 라는 파이썬 라이브리를 설치해줘야 합니다. Python 은 가상환경을 사용하기 때문에 가상환경를 이용해서 설치해줍니다.

이제 jedi-vim 를 설치해줍니다. 역시 Vundle 를 이용해서 설치 합니다.

Powerline status bar

vim 를 사용하면서 각종 필요한 정보를 화면 아래에 상태바로 보여 줍니다.

다음과 같이 vim 설정을 해줍니다.

Python 문법 체크

이제 Python 문법 체크를 위해서는 먼저 파이썬 문법체크 라이브러리를 설치해 줍니다. 역시 가상환경에서 설치 해줍니다.

pep8, pyflakes를 문법 체크를 위한 라이브러리이며 autopep8 은 vim 플러그인에서 사용하기 위한 의존성 패키지 입니다. 이는 잘못된 문법을 자동으로 고쳐줍니다.

이제 vim 플러그인을 설치해 줍니다.

그리고 vim 설정에 다음과 같이 입력해 줍니다.

Python 문법 체크를 위해서 Autopep8 을 사용하는데 이를 vim 에서 사용할 수 있도록 도와주는 플러그인을 설치합니다.

위와같이 하면 ftplugin 디렉토리에 python_autopep8.vim 파일이 생성 됩니다.

python 을 위한 설정으로 다음과 같이 python.vim 파일을 작성해 ftplugin 디렉토리에 넣어둡니다.

위 파일은 python 파일 타입에 한해서 vim 설정을 적용해 줍니다.

SaltStack 을 위한 vim 설정.

다음과 같이 아주 간단히 설정을 할수 있습니다.

최종 .vimrc 파일 내용

 

 

Python pip 를 일반계정에 설치하는 방법

시스템을 운영하다 보면 Python 을 많이 사용하게 되는데, 리눅스 시스템의 경우에 기본적으로 Python 이 설치되어 있다. 하지만 pip 는 기본적으로 설치되지 않는데 이것을 설처하기 위해서 리눅스 시스템의 슈퍼유저인 root 사용자 계정을 빌리거나 설치 요청을 하는 경우가 많다.

하지만 일반계정으로 pip 를 사용할 수 있는데 이에 대해 간단히 소개한다.

디렉토리 생성하기

일반계정일 경우에 홈디렉토리에 bin 디렉토리를 생성하고 PATH 쉘 변수를 설정하면 되는데 이럴경우 홈디렉토리에 노출되는데 이를 숨기기 위해서 숨김 디렉토리로 설정한다.

숨김 디렉토리를 생성한 후에 PATH 쉘 변수를 만들고 Bash 환경파일에 기록한 후에 적용해 준다.

get-pip.py 이용 설치

이제 일반계정으로 pip 설치를 위해 get-pip.py 를 다운받아 다음과 같이 설치 한다.

그리고 다음과 같이 설치한다.

핵심은 –user 옵션이다.

이렇게 하면 pip 관련된 파일들이 ~/.local/bin 디렉토리에 생성된다. 관련 라이브러리들도 ~/.local/lib 함께 생성된다.

pip 를 이용해 패키지를 설치할때도 역시 다음과 같이 –user 옵션을 이용한다.

 

Database 를 위한 공유 메모리, HugePages 계산하기

Database 시스템은 공유메모리 혹은 HugePages 에 매우 의존적입니다. 서버에서 데이터베이스가 가동되면 Database 가 사용하는 메모리는 Database만을 위해서 사용되어 집니다. 대부분의 큰 Database 시스템은 다른 서버 프로그램 없이 단독으로 설치되어 운영되어지기 때문에 얼마만큼 물리적 메모리를 Database 에 할당할지가 Database 시스템 전체에 큰 영향을 미칩니다.

이 글에서 Database 시스템을 위한 공유메모리, HugePages 등을 할당할때에 고려사항은 무엇이며 얼마나 할당하는 것이 좋은지를 살펴보겠습니다.

Oracle 11g or 12c

먼저 Oracle 은 물리적 메모리에 약 80% 를 Oracle 이 사용하도록 할당하도록 합니다. 여기서 대략 80% 라고 했는데, 만일 몇가지 프로그램을 함께 돌린다면 약 75% 가 적당합니다.

물리 메모리의 약 80% 할당

여기서 고려해야할 사항이 하나 있습니다. 80%를 할당하라고 해서 무조건 80%를 할당하게 되면 문제가 됩니다. 예를들어 16GB 의 물리 메모리로 운영하는 경우에 80%면 12.8GB 이고 서버에서 사용가능한 용량은 3.2GB 입니다. 요새 데스크탑 컴퓨터도 안되도 4GB 는 사용하는데 아무리 가벼운(?) 리눅스 서버라도 3.2GB 는 운영하는데 너무 적어 보입니다.

이럴때는 운영체제에서 사용할 최소 메모리를 남겨두고 나머지를 Oracle 에 할당하는게 현명하다고 할 수 있습니다.

또하나 중요하게 고려해야할 사항은 Oracle 에서 AMM을 쓰느냐 안쓰느냐 하는 문제 입니다. 이 둘의 차이는 다음과 같습니다.

AMM 을 사용할 경우: /dev/shm 장치를 이용한 공유메모리 모델 사용. HugePages 사용 불가

AMM을 사용하지 않을 경우: System V 공유 메모리 모델 사용. HugePages 사용 가능

 

Oracle 11g 버전으로 넘어오면서 전에 없던 기능이 하나 생겼는데, 그것은 바로 AMM(Aotomactic Memory Management) 입니다. AMM은 Oracle의 메모리 모델인 SGA와 PGA 를 통틀어서 메모리 관리를 자동으로 해준다는 개념입니다.

AMM 기능을 이용하면 대략적으로 SGA 영역은 Oracle 할당받은 메모리 영역에서 85%, PGA 는 약 15%로 나눠서 관리한다고 합니다.

또 한가지 AMM의 특징이 있는데, 공유메모리 모델중에서 /dev/shm 장치를 이용한 Posix 규격의 공유메모리 모델을 사용한다고 합니다. 이 메모리 모델은 메모리 가상 장치를 통해서 프로세스가 공유할 내용을 파일로 저장해서 공유하는 방법으로 오로지 용량에만 제약사항이 있습니다. 공유할 내용을 파일로 생성할때에 얼마만한 크기로 생성할지는 전적으로 서버 프로그램, 여기서는 Oracle, 에 의해서 결정됩니다. 최근의 모든 리눅스 서버는 /dev/shm 이 자동으로 마운트되어 있으며 기본적으로 전체 물리메모리의 50%를 사용합니다.

용량을 바꾸기 위해서는 다음과 같이 해줍니다. CentOS 6과 CentOS 7 배포판 별로 차이가 조금 있습니다.

 

만일 AMM을 사용하지 않을 경우에는 SystemV 의 공유메모리 설정을 따르게 됩니다. 이때에 HugePages 도 함께 사용할 수 있습니다. 이 설정들은 커널 파라메터로 조정하며 그 설정 변수는 다음과 같습니다.

shmmax: 단일 프로세스가 공유메모리를 호출하기 위한 최대 값. 단위 Bytes

shmall: 시스템을 통틀어 사용가능한 공유 메모리 Page 량. 단위 Page

nr_hugepages: Huge 페이지 개수.

 

여기서 중요한 것이 만일 HugePages 를 사용한다면 shmall 은 사용되지 않습니다. shmall 은 리눅스 메모리의 기본단위인 4096bytes(4k) 를 기반으로 계산되어 지는데, HugPages 는 이보다 더 큰 2048k(2MB) 를 기반으로 페이지를 나누기 때문입니다.

어찌됐든 이런 모든 상황을 고려해서 사용가능한 메모리를 구한다면 다음과 같은 공식으로 구할 수 있습니다.

보시면 아시겠지만 다른분이 만들어놓은 것으로 최소 500MB 용량을 넘는 것으로해서 shmmax, shmall, hugepages 를 모두 계산하고 있습니다.

MySQL 5.x

MySQL 의 경우에, InnoDB 엔진만을 사용한다는 전제하에, 전체 메모리의 80%를 MySQL이 할당해서 사용하도록 설정합니다.

물리 메모리의 약 80%를 MySQL에 할당(InnoDB만 사용)

MySQL 은 오로지 SystemV 의 공유메모리 모델을 따릅니다. 따라서 HugePages 를 사용할 수 있는데, 이를 위해서는 다음과 같이 my.cnf 에 설정을 해줘야 합니다.

그리고 shmmax,shmall,nr_hugepages 는 앞에 스크립트를 이용해서 구합니다.

Linux 설정

SystemV 공유 메모리 모델의 경우에 몇가지를 더 해줘야 합니다.

첫째로 Transparent Huge Pages (THP) 설정을 꺼야 합니다. 성능저하가 발생한다고 하네요. 다음과 같이 간단히 처리 할 수 있습니다.

매번 부팅시마다 자동으로 설정하고 싶다면 부팅 파라메터를 수정해 줍니다.

Ubuntu 의 경우에는 다음과 같이 해줍니다.

CentOS 의 경우에는 다음과 같이 해줍니다.

확인도 가능한데, 다음과 같이 AnonHugePages 값이 0Kb 명 THP 가 비활성화 된 것입니다.

마지막으로 커널이 HugePage 를 사용할 그룹이 누군지를 지정해 줍니다.

위와같이 리눅스 시스템 사용자의 그룹ID 를 알아내도록 명령어를 입력할 수도 있고 아니면 그냥 그룹ID를 찾아서 적어줘도 됩니다.