궁금하니 직접해보도록 하자.




동아리 등 카카오톡 단체 채팅방에 있다보면, 일명 "사진 테러", 사진이 주구장창 많이 올라올 때가 있다.


와이파이에 연결된 상태라던가.. PC 카톡을 하고 있다면 상관없지만,

현재 LTE 를 사용 중이라면? 내 데이터가 얼마 남지 않았다면?!!



사진을 왕창 올린 후 시작되는 대 탈주 시대..



이런 문제를 카카오톡도 어느정도 인지를 해서인지,

데이터 네트워크인 상태에서 고용량(3MB 이상) 사진을 다운받으려하면 바로 받지 않고 용량을 표시해주며 다시 한번 다운 받을지 선택지를 주게 된다.



Mac OS 에 있는 기본 바탕화면 중 하나.

9MB 가 넘는 용량에, 카카오톡에서는 "눌러서 보기" 라는 메뉴로 데이터 낭비를 방지한다.



하지만 이런 용량 큰 사진도 채팅방에 올라오면 미리보기로 작게 사진이 표시된다.




데이터가 아깝다고 나가는 사람들 대부분은 저 작은 사진 때문에!

채팅방에 바로 뜨는 저 사진은 나의 선택과 상관없이 무조건 표시된다.


채팅방에 사진이 우후죽순 계속 올라오고 내 데이터가 없으면 걱정될만도 하지.


자, 그럼 본론으로 돌아와서.

저 작은 사진의 용량은 어느정도 될까?


저렇게 작은 사진은 섬네일(thumbnail) 이라고 부르며, 

로딩 속도를 빠르게 하고 데이터를 절약하기 위해 본래 큰 사이즈의 사진을 작게 리사이징한 이미지들을 일컫는다.


업로드한 사진은 섬네일용으로 크기를 줄여서 카카오톡 서버에 추가로 저장되며, 위의 예시 사진의 경우엔 그 주소가

http://th-m4.talk.kakao.com/th/talkm/oWqVfrX2Dm/VIcT3QJjULUAtKhU8xxVv1/aas3nr_120x68.jpg

가 된다. (어떻게 알아내는지는 귀찮으니 패쓰, 여러가지 이유로 시간이 지나면 다운로드 안될 수 있음.)


다운 받아보면  이런 귀여운 크기와 작은 용량의 사진이 되어있음을 알 수 있다.


용량은 약 2KB


귀찮아서 많은 사진을 테스트해보진 않았지만,

섬네일 사진은 모두 대략 1~4KB 정도의 크기로 리사이징됨을 알 수 있었다.


즉, 최소 200여장 이상의 사진이 카톡방에 올라와야 1MB 를 소모한다.


물론 텍스트보다는 데이터를 많이 소모하지만, 

단순히 카톡방에 사진이 올라오는 것 만으로 데이터 폭탄을 맞을 만큼 데이터를 많이 소모하지는 않는다.


걱정하지 않아도 된다는 소리.

NFS 설치

# yum install nfs-utils


NFS 서버 설정

# vi /etc/exports

[Path]    [Client IP]([Options])


Options

ro - 읽기 전용 (기본값)

rw - 읽기/쓰기 모드

root_squash - Client의 root를 익명 사용자(nobody)로 매핑 (기본값)

no_root_squash - Client의 root를 NFS 서버의 root로 매핑

all_squash - 모든 사용자를 익명 사용자(nobody)로 매핑

sync - Client와 NFS 서버간 동기적 통신 모드 (기본값, 안전성 향상)

async - Client와 NFS 서버간 비동기 통신 모드 (속도 향상)

secure - 마운트 요청 시 포트를 1024 이하로 할당 허용 (기본값, 1024 이하 포트는 root만 설정 가능)

insecure - 마운트 요청 시 1024 포트 이상도 할당 허용

anonuid=<uid>

anongid=<gid>



설정 후

# systemctl restart nfs-server


재부팅 후에도 자동으로 실행되게끔
# systemctl enable nfs-server
도 해준다.


* 서버에서

# showmount -e 127.0.0.1

을 실행해보고,

clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused)

에러가 나온다면,
# service rpcbind start
을 해주자.



클라이언트에서

$ showmount -e <Server IP>

로 서버의 exports 리스트를 확인할 수 있다.


테스트 마운트는

# mount -t nfs <Server IP>:<Server Path> <Client Path>

로 가능.


/etc/fstab 설정도 가능하다.

<Server IP>:<Server Path> <Client Path> nfs hard,intr 0 0


이때 옵션(예시에서 hard,intr)은 

19.4. Common NFS Mount Options

여기서 찾아보자.



참고

NFS 서버 구성 - http://blog.helperchoi.com/76

http://unix.stackexchange.com/questions/64915/nfs-connection-refused

http://www.unixmen.com/setting-nfs-server-client-centos-7/


/etc/sysconfig/network-scripts/ifcfg-eth?


파일을 수정하면 된다.


* DHCP 설정

BOOTPROTO=dhcp


* STATIC 설정

BOOTPROTO=none

IPADDR = "192.168.137.2"

NETMASK = "255.255.255.0"

GATEWAY = "192.168.137.1"

DNS1 = "192.168.137.1"


** 변경 후 네트워크 재시작

# systemctl restart NetworkManager

# systemctl restart network



재부팅시 네트워크 어댑터가 자동으로 시작되지 않는다면,

ONBOOT=no 를

ONBOOT=yes 로 바꿔준다.


수동으로는

시작: # ifup eth?

종료: # ifdown eth?



참고

CentOS 7.0에서 네트워크 설정 - http://manseok.blogspot.kr/2014/08/centos-70.html

CentOS - eth0 자동 활성화 시키기 - http://avisynth.tistory.com/10

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')) 로 하면 됨.


끝.

+ Recent posts