CentOS7 에서 XFS 로 포맷을 진행하려 하는데, 2TB 까지밖에 파티션이 생성안되는 문제가 있었다.


대충 찾아보니 fdisk가 하위호환때문에 2TiB 로 고정한다는 듯.

수정된 fdisk 를 사용하면 된다고 한다.


딴걸 설치하기는 귀찮고...

http://unix.stackexchange.com/questions/29078/how-to-partition-22tb-disk

글에서 주는 해결책을 옮기면서 조금 수정해봄.



1. xfs 설치 확인

mkfs.xfs 를 그냥 실행하여 설치가 되어있는지 확인해본다. 없다면 설치.

# yum install xfsprogs


2. 디스크 확인

# fdisk -l


나의 경우(그리고 글에서 설명하는 경우)는 /dev/sdb 이다.

본인 상황에 맞게 아래 예시에서 알아서 바꾸자.


3. 파티션 만들기

# parted /dev/sdb mklabel gpt

# parted /dev/sdb mkpart primary xfs 1 -1


나의 경우 두번째 명령어가 실행이 안되는 것 같았는데....


이 과정을 스킵해도 된다고 한다.

스킵할 경우 아래 예시에서 /dev/sdb1 대신에 /dev/sdb 를 사용할 것.


스킵할 경우 sector alignment 문제(나도 뭔지 모름)가 없는 대신 윈도우나 맥 등에 연결할 경우 매번 포맷하라는 메세지가 뜬다고 한다.



4. 파티션 포맷

# mkfs.xfs -f -L somelabel /dev/sdb1


라벨(L 옵션)은 fstab 에 기록할때 대신 사용될 수 있는 것 같다.


5. 디렉토리 생성 & 테스트 마운트

# mkdir /storage

# mount -t xfs /dev/sdb1 /storage


마운트가 되었다면

# df -Th /storage

로 확인해보자!


6. fstab 수정

# vi /etc/fstab

파일 가장 하단에

LABEL=somelabel    /storage        xfs    defaults    0 0

추가


7. mount / umount

이후에는

# mount /storage

만 입력해도 마운트할 수 있다.


마운트 해제는

# umount /storage



참고

http://unix.stackexchange.com/questions/29078/how-to-partition-22tb-disk


일반적인 포맷은 여기!

http://ask.xmodulo.com/create-mount-xfs-file-system-linux.html


부팅디스크 레이드 구성은 부팅과정에서 Lifecycle Controller 를 이용했었는데,

데이터 디스크는 iDRAC를 이용해서 구성해봤다.

큰 차이는 없는 듯..


RAID 컨트롤러는 PERC H730P MINI



6TB * 12개를 RAID6 로 구성하였다.


데이터의 보존이 중요하진 않았지만, 깨져버리면 시간을 엄청 날릴게 분명하니.. 어떤 방식을 사용할지 많이 고민했지만..

RAID1+0 은 하드가 너무 아깝고, RAID5 는 하드 용량이 커지면서 쓸모가 없는 경우가 많아졌다고 하고,

하드 개별로 따로 쓰자니 그것대로 애매해서 결국 모두 RAID6 로 한번에 묶는 것으로 결정.




iDRAC에 들어가서 화살표 순서대로 진행한다.

나의 경우 남은 하드 모두를 RAID 용으로 구성할 예정이지만 아니라면 개별 하드를 설정해주자.





Job Queue 에 등록되어 확인할 수 있다.

100%가 될때까지 기다리자.



이번엔 가상디스크 생성.

RAID Layout 을 선택하고, 하단에서 RAID구성에 사용할 하드디스크를 선택해주면 된다.


Capacity(용량) 같은 경우 자동으로 최댓값으로 설정이되는데, 

직접 입력하면 소숫점단위 때문인지 최대 용량을 초과했다며 진행이 안된다. 최댓값 그대로 쓸거라면 건드리지 말자.


그 외 옵션은 여기저기 보고 내가 임의로 설정하였다.



하단에서 Create Virtual Disk 선택.

어차피 재부팅이 필요하다고 하니 At Next Reboot 을 선택해주자.

Apply Now 해도 되는지는 아닌지는 잘 모름.



재부팅하면 자동으로 Lifecycle Controller로 진입하고, RAID 구성을 시작한다.

눈 깜짝할 사이에 지나감!




부팅이 완료되고 디스크 관리를 실행하면 이런 창이 뜬다.

초기화해주자.




RAID 구성 끝!


이제 포맷을 해야한다.

간단하지만... 굳이 스크린샷을 넣자면...









진짜 끝!

Docker 의 설치 및 간략 사용법 정리.

UBUNTU 14.04 64bit 에서 작업하였음.


1. docker 설치

$ sudo curl -fsSL https://get.docker.com/ | sh

# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

# apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'

# apt-get update

# apt-get install docker-engine


2. (선택)현재 사용자를 docker 그룹에 추가

$ sudo usermod -aG docker $(whoami)


추가한 후엔 로그아웃하고 다시 들어와야, 정상적으로 작동한다.

추가하지 않을 경우 아래 모든 docker 커맨드를 root 권한(sudo)로 실행해야 함.


3. 이미지 받기

docker pull <이미지 이름>:<태그(보통 버전)>

형태로 받을 수 있다.


난 Ubuntu 14.04 를 설치할 예정이므로,

$ docker pull ubuntu:14.04


4. 이후엔 자유.


========================================================


= 명령어 정리 =


$ docker <command>

images: 이미지 목록 출력

ps: 컨테이너 목록 출력

start, stop, restart: 이름 그대로.

attach: 컨테이너 접속

Ctrl+D : 컨테이너 정지 후 빠져나오기

Ctrl+P, Q: 정지하지 않고 빠져나오기

exec: 컨테이너 안에 명령어 실행

rm: 컨테이너 삭제

rmi: 이미지 삭제


$ docker run -i -t --name test ubuntu:14.04 /bin/bash

ubuntu 이미지로 test 이름의 컨테이너를 만들고 bash 실행, 접속

태그를 생략할 경우 latest 이미지를 사용하게 되며, 없을 경우 다운로드 받는다.



참고

Install Docker - https://docs.docker.com/linux/step_one/

Docker 기본 사용법 - http://pyrasis.com/Docker/Docker-HOWTO

RAID 구성을 뒤늦게 내가 다시 하는 바람에 (Dell PowerEdge R730xd RAID 구성하기)

OS 도 재설치해야 했다.


RAID0 도 아니고, RAID1 으로 구성한건데 알아서 복사해주면 안되나... 싶지만.. 안되는 듯ㅠ


업체말로는 USB 설치디스크 제작 후 설치는 안된다고 하는데.. 확실하게는 모르겠고..

CD가 제품에 포함되어 있어서 그냥 외장 ODD 를 빌려서 진행하였다.


서버에 따라 ODD가 포함되어 있는 경우도 있다곤 하던데, 이 서버에는 없음.


참고로 부팅하기 전부터 OS 설치 디스크가 들어있는 ODD가 연결되어 있어야한다.


How to Install an Operating System on Dell PowerEdge Servers 라는 Dell 지원 문서도 있으니, 굳이 사진볼 필요없다 하는 사람은 빠르게 이걸 보자.




준비가 다 되었다면, RAID 구성했던 방식과 동일하게, Lifecycle Controller 로 진입한다.


* 나의 경우 정확한 원인은 모르겠지만 ODD 연결 후 이 화면 이후에 마음대로 재부팅되는 문제가 발생했었다.

ODD에 전원을 공급하는 USB 선이 따로 있었기에, 전력 문제라고 생각하고 ODD 전력선을 따로 연결해주니 문제가 해결되었는데, 이게 원인인지는 확실하지 않음.




OS Deployment 메뉴를 선택, Deploy OS 를 선택한다.





여기서 OS설치하면서 RAID 구성도 가능하다. 하지만 난 이미 RAID 구성을 따로 했으므로 패스!




Boot Mode 와 Secure Boot, 설치할 OS 종류를 선택.

사진에서는 Secure Boot 가 Disabled 인데, 나는 Enabled 로 설정했다.


부팅 디스크가 2TB(맞나?) 미만이면 BIOS 를 선택해도 상관없지만, Win8 이후 UEFI 가 기본이라는 말을 들어서 UEFI 로 진행!





정상적인 경우라면 1분 내외로 다음 단계로 진행된다. 5분 미만이라고 적혀있기도 하고.


그런데 나는 이 상태로 1시간 넘게 지속되었고, 결국 강종 후 재설치를 진행했었다..ㅠ 두번째 시도에서는 1분만에 통과!





Unattended Install 로 하면 어떻게 설치될지 궁금했지만, 난 그냥 Manual 로 했다.





이 후에 OS 이미지를 넣으라는 안내메시지와(부팅하기전에 넣어두라며..) OS의 Validation을 진행하고,

마지막 요약화면을 보여준다.


Finish 를 누르면 재부팅이 되며 설치가 진행된다.


아래쪽 안내메세지는, 윈도우 설치 화면으로 진입해야 하니 중간에 Press Any Key 라고 뜨면 아무키나 눌러달라는 안내.





위에서 Secure Boot를 Enabled 했다면, 재부팅 도중 이런 안내메세지를 볼 수 있다.

설정이 바뀌었다는 안내이므로 그냥 무시하면 된다.



위에서 요구했던 Press any key!

아무키나 눌러준다. 난 Spacebar!




엔터 눌러주고... 잠시 로딩을 기다리면...




따단!!




GUI 관리도구를 사용하고 싶다면, Core 버전 말고 아래 Standard 버전을 선택하자.


이 후로는 일반 Windows 설치와 다르지 않다.


파티션을 설정하고, 설치를 시작하고, 관리자 계정의 패스워드를 설정하면 완료!

패스워드 규칙은 정확하게는 모르겠으나 최소 영문+숫자+특수문자 조합을 사용해야 하는 것 같다.





끝~!


중간에 Composing OS Drivers 에서 안 넘어가던 문제와.. 조모임 및 기타 내 할일 한다고 띄엄띄엄 왔더니 재설치 시작 후 이화면 보는데에만 5시간이 걸렸다ㅠ



마지막으로,

iDRAC 등이 설정되어있지 않다면, 서버실에서 나오기 전에, 원격제어(RDP)를 설정해두도록 하자.


그리고!!

Hyper-V 를 설치할 경우 + 현재 사용하는 네트워크로 가상 네트워크를 만들거라면 Hyper-V 까지 설치하고 모니터와 키보드/마우스를 정리하자.

가상 네트워크 설정을 하면 설치 후 재부팅시 가상 드라이버로 인터넷이 연결되면서, 로컬에서 최초로 한번 로그인을 해줘야지 정상적으로 인터넷에 연결이 된다.


이걸 몰라서 원격에서 Hyper-V 설치 후 접속이 안되어서 모니터 들고 서버실에 다시 찾아감ㅠ

6TB 짜리 Data 하드들도 RAID 구성을 해야겠지만.. 일단 그건 나중일로 미뤄두고..


주OS 가 설치된 하드를 RAID1 으로 설정해보았다.

원래 업체측에서 해줄까 물었고, 그 용도로 300GB SAS가 2개달려있긴 했지만..

잠결에 받은 전화에 "그냥 제가 알아서 할게요 레이드 설정하지 말아주세요" 라고 해버렸지..


이거땜에 몇시간을 투자하긴 했지만 지금 생각해보면 잘한 결정인 것 같다.

원랜 RAID 를 안할까.. 도 고민해봤지만, 그러다 괜히 고장나면 미래의 내가 과거의 나를 죽이고 싶어지겠지....


----- 여기까지 잡솔이였고.. -----


RAID 구성은 하드웨어로 설치된 RAID 컨트롤러에 맡길 수도 있고, Windows 의 디스크 관리 메뉴에서 소프트웨어적으로 설정할 수도 있다.


난 OS 를 설치할 드라이브를 RAID 설정하려는거기도 하고, RAID 컨트롤러라고 따로 있으니 얘가 더 성능이 좋겠지?(잘모름)



iDRAC 설정을 아직 하지 못해서(해도 이건 안되나?) 직접 키보드/모니터를 연결해서 설정하였고, 그래서 폰카로 다 직접 찍었다..ㅎㅎ



우선 부팅과정 중 F10을 눌러서, Lifecycle Controller 로 진입한다.

보통 Ctrl+R 로 Configuration Utility 로 들어가라고 하던데, 저기서도 잘 된다.


대충 부팅 과정이 푸른 시작화면 -> 위 검은화면 -> 푸른 시작화면 이니까, 첫번째 푸른화면에서 메모리체크, 드라이버 체크 등을 할 동안 기다렸다가, 위 검은 화면이 나오면 F10 을 눌러준다.


잘 눌렀다면(?) 위 사진처럼 내가 선택한 메뉴가 표시된다.


(그리고 아래 문구를 읽었다면 알겠지만, 사실 이건 RAID 설정한 이후의 사진 촬영..)




정상적으로 메뉴에 진입하였다면 이런 형태의 화면이 나타나고, 키보드/마우스를 사용가능하다.

왼쪽 메뉴에서 잘 찾아가도 되지만, 가운데 3번째있는 Configure RAID 를 선택한다.



그 후에는.. 사실 사진을 안찍었다..ㅋㅋㅋ

Creating RAID Using Lifecycle Controller - Community

PDF 문서를 참고하도록 하자. p.9 이후 부터!


대충 말로 적자면

RAID Controller 선택 ->Controller 에 연결된 하드 중에서 RAID 구성에 사용할 하드 선택 -> RAID Level 선택 -> 

HDD / Virtual Disk 설정 -> 요약화면 -> 끝


중간에 HDD 설정에서 Physical Pool 이라는걸 선택하라고 하는데, 정확히 뭔지 모르겠어서 RAID 구성할 하드 2개 다 선택했다.

자세하게 뭔진 모르겠지만.. Hotspare 같은걸 위해 존재하는게 아닐까.. 싶기도 하고....




대충 찍어서 흔들렸네..

여튼 난 저렇게 나왔다.


Finish 하면 끝.




연구실에서 드디어 랙서버를 구매하였다.

모델은 Dell PowerEdge R730xd


사용가능 금액이 수백씩 자꾸 올라서 몇번이나 견적을 수정하고... 예정기간보다 몇개월이나 늦어졌지만... 우여곡절끝에 드디어!!






OS - Windows Server 2012 R2 Standard

CPU - Intel Xeon E5-2680 v3 2.5GHz * 2개

RAM - 16GB RDIMM * 16개

OS용 하드 - 300GB 15K RPM SAS * 2개

DATA용 하드 - 6TB 7.2K RPM NLSAS * 12개

+

RAID 컨트롤러 - PERC H730P


내 노트북 SSD보다 큰 256GB RAM과 72TB의 하드디스크를 가지고 있다..


난 처음에 256GB 램을 들었을때 잘못 들은 줄 알았어...

하드라기엔 너무 적고.. 256MB 비디오램인가? 싶어 몇번을 되물었는데... 이걸 내 눈으로 볼 줄이야......

여튼,,




0~12 까지 6TB 하드가, 12,13 에 300GB 하드가 잡혀있다.

지금은 300GB 두개를 RAID1으로 다시 구성했지만...




이번에 구입한 랙과 랙서버..


하드 갯수 때문에 서버를 3대로 쪼개어 구매할까 했지만 하나의 스토로지 서버에 때려박을 수 있다고 하여 일단 한개로 몰아넣었다.

전면에 12개, 후면에 2개(OS용 SAS)가 들어가 있는 상태.


단촐(?)하게 랙서버 하나인 주제(?)에 가격이 엄청나다..ㅠㅠ


아마 앞으로 몇년간 내가 주로 사용하게 될 것 같아서.. 얘를 관리하면서 간단히 사용기라도 적어볼까한다.

내가 언제 이런걸 다시 만져보겠어....


나도 이런 서버 하나 갖고 싶어라ㅏㅏㅏ


SMS API 를 연동하면서, 보낼 문자의 길이를 EUC-KR 인코딩에 맞게 카운트할 필요가 있었다.


단순히 EUC-KR 로 인코딩해서 카운트len(string.encode('euc-kr'))해도 되긴 하지만, "뷁" 같이 EUC-KR 테이블에 없는 문자는 ? 로 치환 후 계산이 필요했음.


즉, 내가 원하는건

1. EUC-KR 에 없는 문자는 ?로 치환하고

2. EUC-KR 인코딩에 맞게 글자수 카운트

를 Python 2.7 에서!


PHP 코드 및 원리는 http://dev.epiloum.net/293 여기에 나와있으며, CP949 / EUC-KR 차이 등에 대해 상세히 잘 설명되어 있다.



길이 자체는 위에 말한듯이 euc-kr 로 인코딩 후 카운트하면 되니 상관없고, 지원하지 않는 문자열을 ?로 만드는 과정이 필요.

utf-8 로 인코딩된 문자열이 입력으로 들어오는 기준으로 작성되었다.


대충 만든거니 대충보고 쓰자...


FUNC: convert_euc_kr

INPUT: content (utf-8)




기반 코드들을 Python 3 으로 마이그레이션함에 따라, 이 코드도 수정이 필요하였다.

에러가 나지 않게 타입(str, byte)부분만 바꿔줘서 제대로 작동이 되는지는 확인해보지 않았다.




리턴값은 여전히 utf-8 로 인코딩 되어 있으니, 길이를 구할때는 len(ncontent.encode('euc-kr')) 로 하면 됨.


끝.

iOS 만 서비스 할때는 그냥 대충 php + cron 으로 push 를 돌렸었는데,

이게 백명 단위만 되어도 delay 문제가 생겨서... async 방식으로 언젠가 도입을 해야지.. 생각만 했었다.


이번에 안드로이드때문에 하게 되었으니.. 겸사겸사...

GCM 으로 iOS 도 사용할 수 있는 방법이 있다는건 봤지만,, 클라를 수정해야 했고..

이미 있는 앱도 같이 적용 + 클라 더 손대기가 귀찮아서 서버쪽을 잘 만들어보기로 했다.



APNS

우선 APNS 는 pyapns 라는 녀석으로 쉽게 asynchronous 한 push 를 구현가능하다.



pyapns 서버를 구축한 후 python 에서


import pyapns

pem_path = 'path_to_push_pem'

pyapns.configure({'HOST': 'http://localhost:7077/'})

pyapns.provision('com.example.appid', pem_path, 'production') #sandbox

push = {'aps': {'alert':'푸시 테스트', 'sound':'default'}}

pyapns.notify('com.example.appid', '### push token ###', push, async=True)


이렇게 사용하면 된다.



GCM

GCM 은 주로 node.js 로 했던 듯 하나... 난 시스템을 통일시키고 싶었다.

찾아보니, 위 pyapns 처럼 로컬에 서버를 열어두고 request를 보내면 되는 방식의 GoCM 이라는 라이브러리가 있었다.

Golang 으로 짜져 있음.



GCM 은 인증서가 필요없고 sandbox / production 구분이 없어서 더 간편하다.

간단히 POST request 만 구현하면 어떻게든 가능하지만, 난 requests 라이브러리 사용을 선호함.


import requests, json

GCM_SEND_ENDPOINT = 'http://localhost:5601/gcm/send'

token = '### token ###'

msg = {'title': '[title]', 'message': 'message'}

requests.post(GCM_SEND_ENDPOINT, data={'tokens': [token], 'payload': json.dumps(msg)})



Daemonize

위 방법대로 하면 이제 APNS / GCM 을 둘다 이용할 수 있게 되지만, 각각 웹서버를 하나 돌려야 해서 귀찮다.

당장은 그냥 쓴다고 해도 재부팅을 한다거나.. 프로세스 유지해주기가 귀찮으니까 데몬으로 만들어버리자.


pyapns 는 python-twistd :: daemon 으로 만들기

GoCM 은 GoCM :: daemon 으로 만들기


글을 각각 참고하면 된다.



Feedback / Report

APNS / GCM 각각 삭제되었거나 더이상 사용되지 않는 token 에 대한 feedback 을 제공해준다.


APNS

pyapns.feedback('com.example.appid') 를 호출하면 

[(timestamp, token), ] 

형태로 반환해준다.


token 으로 uninstalled 처리를 해주면 됨.


GCM

canonicals / notregistered 두가지 feedback 이 존재한다.

전자는 token 이 변경되었을 경우(인 것 같다. 사실 레퍼런스를 안봐서..), 후자는 앱이 삭제된 경우.


이건 그냥 GoCM README 를 보자.



Fin

드디어 Python 만을 사용하여(Go 는 컴파일 한번 하고 끝이니 논외), 하나의 시스템만으로 Asynchronous APNS / GCM 둘다 사용할 수 있게 되었다.


여기선 다루지 않았지만, 동일한 DB에 os 구분하여 token 을 저장하고, os 를 알아서 구분해서 메세지를 보내도록 하면 좀 더 관리가 쉽다.


분명히 두 OS를 같이 서비스하는 사람/업체가 많은데 내가 못찾는건지 다른 방법이 있는건지...

생각처럼 깔끔하고 쉬운 방법이 눈에 안보이네.. 흑

자, 이번엔 GoCM (https://github.com/Flyclops/GoCM) 을 데몬으로 만들어두는 방법.


twistd 와 다르게 단일 컴파일된 실행프로그램이므로.. 조금 golang 이라던가.. 그게 아니라 그냥 별개로 생각하자...

뭐 조금 수정하면 다른 방법에서도 쓸 수 있다.

나도 앞에서 글 쓴 twistd 데몬 스크립트를 수정하였음.


1. GoCM 을 컴파일, 바이너리를 적당히 옮겨둔다. 나의 경우 /usr/bin/GoCM

2. /etc/init.d/GoCMd (뭐 데몬이름은 알아서..) 을 작성한다. 내용은 아래 더보기..


3. 위 파일에서, GoCM 경로와 DAEMON_ARGS 에서 api key 를 수정해준다.

4. $ sudo chmod +x /etc/init.d/GoCMd

5. $ sudo update-rc.d GoCMd defaults

6. $ service GoCMd start

twistd 를 daemon 화 하는 방법.

https://github.com/eagafonov/python-twisted-startup-script 의 방법을 이용한다.


1. /etc/python-twistd.d/ 디렉토리를 생성한다.

2. 위 git 에서 python-twisted-web 파일을 받는다. 그리고 파일 이름과 내용을 필요에 따라 수정. 아래부턴 편의상 그냥 python-twisted-web 이라고 쓰겠지만, 알아서 바꾼 이름을 사용하자.

3. git 에서 python-twisted-startup-script 를 위 python-twisted-web 파일과 이름을 똑같이 만들어서 /etc/init.d/ 에 넣는다.

4. $ sudo chmod +x /etc/init.d/python-twisted-web

5. $ sudo update-rc.d python-twisted-web defaults

6. $ service python-twisted-web start

'Linux, Server, Web' 카테고리의 다른 글

Python Asynchronous APNS / GCM Server (Python + Golang)  (2) 2015.12.23
GoCM :: daemon 으로 만들기  (0) 2015.12.23
우분투 시간 동기화  (0) 2015.11.01
MediaWiki URL 설정  (0) 2015.07.30
[Ubuntu] php-apn 설치하기  (0) 2015.07.02

+ Recent posts