리눅스 하드디스크 UUID 변경

DD 명령을 이용하거나 cat 을 이용하여 disk 클론을 뜰 경우 혹은 클라우스 서버에서 스냅샷을 이용하여 볼륨으로 환원한 뒤에 마운트를 한 경우
한 서버에 두개 UUID가 존재하게 되어 가끔 곤란한 상황이 올 수 있다.

기술적인 측면에서 한 서버에서 UUID는 겹치게 발급되어 있으면 안된다.

디스크의 UUID 는 서버내에서 blkid 명령어로 확인할 수 있다.

위와 같이 완벽히 같다면 부팅 단계에서 부터 꼬여서 문제가 발생 할 수 있다 ‘ㅅ’a

 

때문에 부득이 하게 Clone 을 사용한 경우 각 파티션의 UUID를 변경 해줘야 한다.
UUID 는 uuidgen 이란 명령어로 쉽게 만들 수 있다.

 

각 파티션에 적용은 tune2fs 명령어의 -U 옵션으로 교체가 가능하다.

역 따옴표 안의 명령어거 먼저 실행되기 때문에 위명령어로 즉시 바꿀수 있다.
변경후 blkid 명령어로 변경이 정상적으로 되었는지 재 확인 한다 ‘ㅅ’a

 

swap 파티션의 경우 tune2fs 가 아닌 mkswap 명령어로 변경한다.

swap 파티션이 이미 마운트 된 상황에서는 UUID변경이 되지 않기 때문에 swapom, swapoff 명령어로 마운트를 해제하고 진행한 뒤에 재 마운트를 한다.

 

 

PS. tune2fs 명령어는 ext2~4 의 uuid 를 변경 할 수 있다.
xfs 파일 시스템은 아래의 명령어로 uuid 변경을 진행한다.

 

 

Centos 5 – coreutils 최신 버전 설치.

CentOS 5 에는 coreutils-5.97 이 포함 되어 있다. – CentOS 6 에는 8.4 / CentOS 7에는 8.22 버전을 가지고 있다.

다만 좀더 최신 CentOS 에는 포함된 명령어가 없는경우가 있다.
( timeout 이라던가… 혹은 timeout 같은 거라든가.. 그것도 아니면  timeout 같은거? )
이럴 경우에는 coreutils 최신버전은 서버에 별도 설치하여 복사해서 이용하는 방법을 사용한다 ‘ㅅ’a

(8.13버전을 사용하는 이유는 ftp://ftp.gnu.org/gnu/coreutils/에 접속해보면 알지만 8.13이후 버전부터는 tar.gz 이 아닌 tar.xz 형식으로 배포해서… 64bit OS에서 압축 배포하는건 32bit OS에서는 압축해제하기 어렵다.)

 

설치후 prefix 폴더의 bin 으로 들어가면 linux에서 기본명령어로 많이 사용하던 명령어들을 볼 수 있다.

base64, basename, cat, chcon, chgrp, chmod, chown, chroot, cksum, comm, cp, csplit, cut, date, dd, df, dir, dircolors, dirname, du, echo, env, expand, expr, factor, false, fmt, fold, groups, head, hostid, id, install, join, kill, link, ln, logname, ls, md5sum, mkdir, mkfifo, mknod, mktemp, mv, nice, nl, nohup, nproc, od, paste, pathchk, pinky, pr, printenv, printf, ptx, pwd, readlink, rm, rmdir, runcon, seq, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shred, shuf, sleep, sort, split, stat, stdbuf, stty, sum, sync, tac, tail, tee, test, timeout, touch, tr, true, truncate, tsort, tty, uname, unexpand, uniq, unlink, uptime, users, vdir, wc, who, whoami, yes

 

필요한게 있다면 /usr/bin 으로 복사해서 사용을 한다 ‘ㅅ’a

 

timeout 명령어 설명.

~]# timeout 3 curl -f -s  –url httpd://xxxxx.com/index.php
와같이 사용함으로서 쉘로 웹이 죽었나 안죽었나 테스트 할때 쓰며 3초안에 반응을 하는 조건을 건다.
curl 의 경우max-time 옵션을 가지고 있다. 때문에 굳이 curl 에서는 쓸일이 없겠다.

php.ini 에서 업로드 파일 사이즈를 지정하는 옵션

post_max_size 는 upload_max_filesize 보다 20% 크게 지정해야 한다.
통신 비트는 일반적으로 8bit 후 2bit의 별도의 패리티비트(오류정정)가 포함된다

upload_max_filesize /  post_max_size
.              10M                     12M
.              20M                     24M
.              40M                     48M
.              60M                     72M
.              80M                     96M
.             100M                    120M

post_max_size 사이즈가 만약 100M 를 넘어 간다면 memory_limit(기본값 128M)를 최소 40M 가량 더해 적용한다.
이외에도 업로드 되는 파일의 사이즈가 매우 크다면 네트워크 속도를 고려하여 max_execution_time, max_input_time 을 늘려 PHP 실행시간 제한을 늘려야 한다.

 

memory_limit, max_execution_time, 는 PHP_INI_ALL 이기 때문에 php함수인 ini_set() 혹은 .htaccess 에서 php_value 로 설정이 가능하다.
post_max_size, upload_max_filesize, max_input_time 의 경우 PHP_INI_PERDIR, PHP_INI_SYSTEM 의 가변성을 가지기 때문에 php함수인 ini_set() 혹은 .htaccess 에서 php_value 로 선언할 수 없다.

각 php.ini 설정값의 가변성 여부는 http://php.net/manual/kr/ini.list.php 에서 확인할 수 있다.

CentOS6 x64 – apache 1.3.x – mod_geoip 설치

httpd.conf 에 아래와 비슷한 내용이 먼저 들어 있어야 한다.

이유는 mod_geoip 설치시 마지막 LoadModule 라인을 인식하여 그 아래 LoadModule  mod_geoip 추가 한다.
라인이 없다면 스크립트 실패로 설치가 실패한다.

 

GeoIP를 yum 으로 설치한다.

 

이후 mod_geoip 를 설치한다.

 

httpd.conf 파일에 data 파일 위치를 선언하는 부분을 추가한다.

 

CentOS6에서 기본 설치를 이용했을때 일반적인 data파일 위치는 아래와 같다.
GeoIP : /usr/share/GeoIP
xt_geoip(iptables): /usr/share/xt_geoip
mod_geoip(apache): /var/lib/GeoIP
dat 파일은 매월 2~7일 사이에 maxmind.com 에서 바뀐부분을 새롭게 배포한다.

때문에 위 위치안의 GeoIP.dat 파일을 매월 초 갱신해 줘야 한다는 이야기가 된다.
갱신 없이 사용한다면 국가별 차단 등을 해놨을때 해당 국가여도 접속을 못하는 상황이 나올 수 있다.

그래서 아래와 같이 geoip_data_update.sh 스크립트를 만들어 매월 7일 정기적으로 실행 시켜 업데이트를 한다.

 

smartctl을 이용한 디스크이상 사전 탐지

smartctl 명령어는 하드디스크 롬에 기록되는 형태이다. 때문에 I/O 에러 발생때문에 write가 잠겨
/var/log/messages 상에 찍히지 않는 I/O에러를 검출하는 목적으로 사용할 수 있다.

CentOS 5/6 은 이미 탑재되어 있는 명령어 이지만 Centos 7의 경우 아래와 같이 명령어 추가를 한다.

 

명령어는 작동시간, 부팅횟수, 헤더, 온도, 배드카운터, CRC 에러등등 하드디스크의 모든 종합 정보를 볼수 있다.
클라우드 – 가상디스크는 지원하지 않는다.
일반디스크인데 정보 표기다 되지 않을경우 아래 명령어서 on  시켜줘야 할 수 있다.

 

1. 아래 명령어는 SMART 속성 정보만 표기 한다.

주요 해서 봐야 하는 부분은 아래와 같다.
HEAD spindle error   //   Spin_Retry_Count  (매우 높음) = 헤드가 재 작동을 시도한 횟수.
BAD sector  //   Offline_Uncorrectable  (높음) = 읽기/쓰기에 문제가 발생한 섹터 = 배드 섹터 발생
아래는 약간은 중요도가 떨어지지만 주요해서 봐야 한다.
UDMA_CRC_Error_Count   (낮음) = HDD인터페이스 전송 CRC 오류 (sata 케이블 오류의심)

위 에러중 HEAD 관련 카운트가 1개라도 나온경우 스핀들모터 혹은 리드헤드 쪽에 문제가 발생한것이다.
이는 즉시 데이터 백업 및 디스크 교체를 진행한다.

 

2. 누적된 에러 로그를 호출한다. ‘ㅅ’a

정상일경우 아무런 메세지도 표시되지 않는다. 메세지가 출력되는 경우 아래 상세 테스트를 진행한다.

 

 

3. 상세한 테스트를 한다. ( short 1~2분 소요 / long = 약 두시간 가량 소요 )

백그라운드 테스트가 진행되며 테스트간 off-line 모드가 되고 테스팅 시간은 약 108분 걸린다고 되어 있다.
smartctl -X 명령어로 long 테스트를 중지할 수 있다.

Status 값에 failure 가 떨어질경우 백업 및 디스크 교체를 한다.