2018년 12월 27일 목요일

dotnet core Hello world

ttps://docs.microsoft.com/ko-kr/dotnet/core/linux-prerequisites?tabs=netcore2x

1. 설치  (CentOS 7.5 에서)
dotnet core 2.2 설치
https://docs.microsoft.com/ko-kr/dotnet/core/linux-prerequisites?tabs=netcore2x

다운로드
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm  (리포추가)
sudo yum update  (일단 OS 몽땅 업데이트)
sudo yum install dotnet-sdk-2.2


2. Helloword를 찍어보자

#mkdir /home/www/dotnet/helloworld
#cd /home/www/dotnet/helloworld
[www@dot-netcore-001-talk-svc-jp2v-dev helloworld]$ dotnet new console

Welcome to .NET Core!
---------------------
Learn more about .NET Core: https://aka.ms/dotnet-docs
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs

Telemetry
---------
The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.

Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry

ASP.NET Core
------------
Successfully installed the ASP.NET Core HTTPS Development Certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only). For establishing trust on other platforms refer to the platform specific documentation.
For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.
Getting ready...
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on /home1/www/dotnet/helloworld/helloworld.csproj...
  Restoring packages for /home1/www/dotnet/helloworld/helloworld.csproj...
  Generating MSBuild file /home1/www/dotnet/helloworld/obj/helloworld.csproj.nuget.g.props.
  Generating MSBuild file /home1/www/dotnet/helloworld/obj/helloworld.csproj.nuget.g.targets.
  Restore completed in 407.77 ms for /home1/www/dotnet/helloworld/helloworld.csproj.

Restore succeeded.


[www@dot-netcore-001-talk-svc-jp2v-dev helloworld]$ dotnet run
Hello World!

or

[www@dot-netcore-001-talk-svc-jp2v-dev helloworld]$ dotnet ./bin/Debug/netcoreapp2.2/helloworld.dll
Hello World!


수정 후 빌드만 다시하기

[www@dot-netcore-001-talk-svc-jp2v-dev calc]$ dotnet build
Microsoft (R) Build Engine version 15.9.20+g88f5fadfbe for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 54.51 ms for /home1/www/dotnet/calc/calc.csproj.
  calc -> /home1/www/dotnet/calc/bin/Debug/netcoreapp2.2/calc.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:02.22


Process 모냥

[www@dot-netcore-001-talk-svc-jp2v-dev ~]$ ps -ef | grep dotnet
www       91284      1  0 14:01 pts/0    00:00:03 /usr/share/dotnet/dotnet /usr/share/dotnet/sdk/2.2.100/Roslyn/bincore/VBCSCompiler.dll -pipename:www.F.4YVjXIkKKf73NaMTt+z4fEXoz
www       93060  90767  1 14:13 pts/0    00:00:00 dotnet run -- kwon
www       93098  93060  0 14:13 pts/0    00:00:00 dotnet exec /home1/www/dotnet/calc/bin/Debug/netcoreapp2.2/calc.dll kwon




high cpu 찾기
top -H -c -b -n1

동작중인 내용잡기
strace -p pid

stack 추출
pstack $pid (high cpu pid)



2018년 12월 17일 월요일

google home 삽질기(ing....)

도대체 구글에 문의하는 법을 모르겠다
메일 문의에 대한 링크 자체를 못 찾겠고
몇몇 서비스에 대해서 콜백이 되는것 같은데 내경우 무슨 서비스를 선택해야 하는지 알 길이 없내
구글홈 관련 질문을 해야 하는 건지  유튜브인지 계정문의 인지 내가 어케 아냐

여하간 간만에 낚시 미끼를 지대로 물었다 슬슬 입이 아프다...

여하간 IT환경에서는 모르면 나처럼 자괴감에 빠진다.  (IT 20년차 따위는 모르는게 당연하다)

아래는 요청 한거고 이거 답변이나 오려나 모르겠다.

답이 오면 업데이트 해보겠다

업뎃1 : 찾아보니 메일 문의가 있다.  google pay 쪽이다. 모르겠다 일단 메일 보낼 수 있는곳으로 보내보자
https://support.google.com/pay/answer/7644089?hl=ko 
https://support.google.com/pay/contact/general_email



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

가족그룹 공유관련 질문 및 요청이 있습니다.


=요청사항=
sistet0@gmail.com(와이프) 계정을 가족관리자로하고 (현 가족관리자로 되어 있음)
yckwon75@gmail.com(나)과 arakwon0901@gmail.com(딸)이
가족으로 초대 될 수 있도록 조정 부탁합니다.


좀 복잡하지만 히스토리는 이렇습니다.

1. youtube red에 가입함
2. 괜찮은듯 하여 구글홈 mini 구입함
3. 구입시 6개월 무료 사은품이라는 글을 보고 기기 등록후 유료결제 해지 (12월 15일 끝난다는 안내는 봤지만 그냥 연장되는 줄 알았음)
 > 이 부분에서는제가 잘 몰랐던 부분이 있었음을 압니다. 결제를 한번이라도 한 계정은 대상이 아님을 나중에 알았내요
4. 기능이 괜찮아서 구글홈, 구글mini 하나씩 더 구입 (구글홈1, 구글홈mini2, 크롬케스트1)
5. 와이프계정을 등록할때 6개월 무료라고 나와서 그것도 가입
6. 뒤늣게 한번이라도 결제한 계정은 사은품(?) 대상이 아닌걸 알게됨  낚였음을 이때 알았음 -.-;
7. 그래도 와이프계정이 프리미엄이므로 공유 된다고 알고 그냥 둠
 > 여기서도 구글 가족그룹이라는것 자체를 안내받은적이 없음, 그냥 구글홈 앱에서 집에 포함되면 같이 공유되는줄 알았음
8. 몇일 잘 쓰다가  12월 16일 오후쯤 갑자기 나오던 음악이 안나옴, 어시스턴스가 계속 안된다고 다음에 하라고 메시지 나옴
9. 전체 기기 초기화 하고 재등록하고 몇시간을 고생하다가 구글링에서 가족그룹이 있고 가족그룹의 관리자가 있다. 그리고 가족그룹의 관리자가 유튜브프리미엄 권한이있을 경우에만 구매내역이 공유된다고 글을 봄
 > 이쯤해서 사용자 입장에서 열이 좀 받겠지요?
10. 구글홈, 유튜브, 가족그룹이 상호간 참조이기는 하지만 하나의 서비스가 아니라는 것을 이제야 깨달음 (대체 제품하나 쓰는데 얼마나 공부를 해야 하는것인가 ㅠㅠ)
11. 와이프계정을 가족관리자로 하려고 가족들 탈퇴 시키고  가족그룹 해체
 > 12개월 제한이 있는지 몰랐 -.-;; 미치겠....
12. 와이프계정을 가족관리자로 등록하고  초대하였으나 내 계정으로 초대가 안옴 -> 구글링구글링....12개월 제한이 이 뜻이라는 걸 깨달음
13. 뭔지 모르겠으나 어뷰징 방지용인듯 하여....순응해 보기로 함...다시 내 계정으로 가족 관리자가됨 (1회에 한해서 가능하다는 것도 나중에 알게 됨) 와이프 초대가 안됨
14. 뭐가 문제인지 몰라서 와이프, 딸, 내계정 다시 탈퇴시킴, 구글홈 기기들 모두 초기
> 요단강 건넜음
15. 현상태
내 계정  yckwon75@gmail.com  관리자도 못되고, 가족에 들어가지 못함
딸 계정  arakwon0901@gmail.com  14세인가?? 계정이라 관리자는 안되고, 가족에 못 들어감
와이프 계정 sistet0@gmail.com 관리자는 되어 있으나, 초대를 해보았으나 위 두 계정 가입불가

유튜브 뮤직도 홈에서 뭐가 문제인지 안되길래 새로 계정 하나 만들어서 음악 듣기 계정으로 연결해 놓음
폰과 PC, 테블릿의 계정이 엉망이 됨 ㅜ.ㅜ  (이 부분은 뭐...해보느라 삽질의 결과...)

안되면 계정 다 다시 파고 가족으로 묶어야 하는데 내 계정이 워낙 엮인것이 많아서 요청을 해봅니다.

그리고 의견으로

구글 홈, mini 구매시 "사은품"이라고 하고 안내에서
구매이력이 없는 계정에서 가능하다는 부분은 안내하고 있으나
가족그룹에 대한 설명이 없고 그룹관리자가 권한이 있어야 한다는것도
꽤나 시간을 들여야 이해할 정도로 설명이 모자라다고 봅니다
솔직히 "세상에공짜는없다" 라는 기조를 가지고 있음에도
워낙 구글서비스를 많이쓰다보니 홀딱 넘어가기는 했으나
이렇게 사람을 고생시켜서야 되겠나 싶내요
아무리 "낚은 물고기에게 먹이를 주지않는다"라고 해도
이런 미끼 마케팅에 2중 트랩은 문제가 있다고 봅니다.  (가입이력없어야함, 그룹관리자 권한따라감+12개월제한)
구글홈제품 과 유투브프리미엄 마케팅시(유의사항설명에)
가족 그룹관리자에 대한 설명+12개월 가족그룹 이동에 대한 설명이 제공되야 할것 같습니다.
모바일로 안내를 일일이 보기 어렵습니다. 이 모든 내용은 PC에서 뒤지고뒤져서 찾아낸 내용이지요

2018년 10월 30일 화요일

지랄발광


증시패닉, 靑게시판에 개미들 '통곡'…文 경제팀 책임론 확산



내 누차 술먹으며 말을 하지만
거시적으로봤을때
금본위 화폐시장에서 기축통화의 품격(?)이 떨어지면서
이미  주식이니 코인이니 중구난방 폭탄돌리기를 하는상황에
특히나 2014년 버냉키에서 옐런으로 미국연준의장이 바뀔때 부터
금리인상이 이번에는(?) 정말(?) 할것이라고 으름장 그리 날리고
15년 이후 실제 미국이 달러를 회수하기 시작했고
현재 미국이 마치 경기가 좋은듯이 버블이 일어나는것은
기존의 미국에서 개발도상국으로 나가던 달러를
긁어 들여서 유지하고 있을 뿐 좋을게 없는 상황이라는 점과
중국 미국 일변도에다
특히나 지금은 미국의 3배나 의존하는 중국무역의존도를 가지는 우리가
미국과 중국이 무역전쟁 수준인 국제상황에
내돈은 괜찮을것이라는 상상력은 무슨 생각인지 알 길이 없다

극단적인 미시경제활동이 개미가 하는 단타에 미수치기라면
그 리스크는 니들이 공부해서 알아야 하고
risk taking도 해야지
무슨 개노무 청와대 청원이냐

2018년 10월 19일 금요일

openJDK String 처리 속도 비교


JVM성능 측정에 여러가지 측면이 있겠으나 (collection object, network, thread....)
젤 만만 한게  요즘은 XML에 JSON이 대세이므로 Sting 연산이 많이 쓰이기 때문에 그냥 이걸루 비교를 해봤다

결과값은 절대적이지 않고  내용에 책임 못 진다.
그냥 참고만 하고 비슷한 테스트할때 이해하는데 사용하시라

Server : Physical Xeon 40Core
MEM : 64G
Heap : 4G  (TEST를 위해 작게 잡고 동일한 환경으로 테스트)

TEST Tool : JMH http://openjdk.java.net/projects/code-tools/jmh/
TEST Sample code : http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/  (이건 다 돌리면 10시간 걸린다... 회사내부에서 볼 자료라 오픈하기 뭐해서 안올릴란다)

TEST String code :.... 걍 만들어 올리기도 구찮음...는 아니고...이놈에 블로그스팟 넘해... 에디터에 무슨 박스 하나가 없어요.... {code} 이런것 까지 원하지도 않아 그냥 좀 표같은거라도 좀 편집 할 수 있게 해주면 안되나!!!!  맨날 HTML Code수정해야 겠냐...미치것내
정말 집에 NAS에 워드프레스를 깔던가 해야지 원....

어디선가 배껴온 소스에 값만 바꿔 쓴다.(어딘지 출처가 기억안난다 ㅋㅋ)
some more data 라를 문자를 StringBuilder append로 1만번  String  +연산으로 1만번 하는 코드를
워밍업 5회 후  10회의 테스트를 하고 처리시간을 평균낸 데이터를 그래프에 사용했다
가끔 GC가 떠서 성능이 개판난 데이터는 3회 정도 해서 젤 높은 값을 빼고 다시 평균을 잡았다.

2018년 10월 1일 월요일

open jdk base Visual Remote Server monitoring

openJDK JMC(Java Mission Control)  사용방법


1. 대상서버에  jstatd 데몬을 구동한다.
모니터링시 해당 데몬으로 접근하여 서버에 JVM 정보를 가져온다.

정책파일을 수정해서 권한을 추가해 주어야 JMC에서 접근하여 정상적으로 값을 가져올 수 있다

openJDK의 경우 CentOS 7.x에서 설치시 PATH는 아래와 같다.

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/lib

해당폴더에 아래 파일을 만든다  (tools.jar 파일이 있는곳에 만들면 된다)
#vi tools.policy
grant codebase "file:[absolute-path-to JAVA_HOME]/lib/tools.jar" {
           permission java.security.AllPermission;
};

백그라운드로 띄운다

#jstatd -p 1099 -J-Djava.security.policy=${JAVA_HOME}/lib/tools.policy &


2. WAS Process에 JMX 설정을 한다.  JVM에서 열어도 되고 tomcat 리스너중에 JMX리스너를 열어도 된다. 여기서는 JVM에서 연다

./catalina.opts.common.sh  (JVM 옵션을 넣을 수 있는곳이라면 아무대나 잘 넣자)
OPT_JMX="-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=30088 \
-Dcom.sun.management.jmxremote"


3. JMC openjdk 버젼을 받아보자  oracle jdk에 있는거랑  별 차이없다

http://jdk.java.net/jmc/
JMC 7 Early-Access Buildsr


4. JMC 띄우고 원격으로 대상서버 접속하면 끝

요런화면




요런화면도 볼 수 있다. 라이브로 덤프도 볼 수 있고 뭐뭐뭐... 기능은 많다
근데 이거 끼우면 overhead를 감안해야 한다
어느정도인지는 잘 모르겠다능...

2018년 9월 20일 목요일

Z GC ??? 누구냐 넌

딴건 모르겠고

"huge pages" 를 기준으로 대용량 메모리를 할당 했을때를 목표로 한다

센트 7  "huge pages"가 2M다

# cat /proc/meminfo | grep Huge
HugePages_Total:    10
HugePages_Free:     10
HugePages_Rsvd:      0
Hugepagesize:     2048 kB


튜닝할때 이 부분이 가장 묘할듯   OS를  넘나들면서 옵션을 조정해야 한다.

아티클을 봤을때

16G Heap을 지정하려면 Hugepagesize도 같이 튜닝이 필요하므로 

앞서 JVM 옵션만 가지고 튜닝하던것  + OS 튜닝도 같이 계산에 고려해야 한다.



Large pages are also known as "huge pages" on Linux/x86 and have a size of 2MB.
Let's assume you want a 16G Java heap. That means you need 16G / 2M = 8192 huge pages.
First assign at least 16G (8192 pages) of memory to the pool of huge pages. The "at least" part is important, since enabling the use of large pages in the JVM means that not only the GC will try to use these for the Java heap, but also that other parts of the JVM will try to use them for various internal data structures (code heap, marking bitmaps, etc). In this example we will therefore reserve 9216 pages (18G) to allow for 2G of non-Java heap allocations to use large pages.
Configure the system's huge page pool to have the required number pages (requires root privileges):
$ echo 9216 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
Note that the above command is not guaranteed to be successful if the kernel can not find enough free huge pages to satisfy the request. Also note that it might take some time for the kernel to process the request. Before proceeding, check the number of huge pages assigned to the pool to make sure the request was successful and has completed.
$ cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
9216 
NOTE! If you're using a Linux kernel >= 4.14, then the next step (where you mount a hugetlbfs filesystem) can be skipped. However, if you're using an older kernel then ZGC needs to access large pages through a hugetlbfs filesystem.
Mount a hugetlbfs filesystem (requires root privileges) and make it accessible to the user running the JVM (in this example we're assuming this user has 123 as its uid).
$ mkdir /hugepages
$ mount -t hugetlbfs -o uid=123 nodev /hugepages 
Now start the JVM using the -XX:+UseLargePages option.
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages ...
If there are more than one accessible hugetlbfs filesystem available, then (and only then) do you also have to use -XX:ZPath to specify the path to the filesystems you want to use. For example, assume there are multiple accessible hugetlbfs filesystems mounted, but the filesystem you specifically want to use it mounted on /hugepages, then use the following options.
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages -XX:ZPath=/hugepages ...
NOTE! The configuration of the huge page pool and the mounting of the hugetlbfs file system is not persistent across reboots, unless adequate measures are taken.


==================
참고

http://openjdk.java.net/projects/zgc/

https://wiki.openjdk.java.net/display/zgc/Main






JEP 333 ZGC A Scalable Low-Latency Garbage Collector (Experimental) (JDK-8197831)

hotspot/gc
The Z Garbage Collector, also known as ZGC, is a scalable low latency garbage collector (JEP 333). It is designed to meet the following goals:
  • Pause times do not exceed 10 ms
  • Pause times do not increase with the heap or live-set size
  • Handle heaps ranging from a few hundred megabytes to multi terabytes in size
At its core, ZGC is a concurrent garbage collector, meaning that all heavy lifting work (marking, compaction, reference processing, string table cleaning, etc) is done while Java threads continue to execute. This greatly limits the negative impact that garbage collection has on application response times.
ZGC is included as an experimental feature. To enable it, the -XX:+UnlockExperimentalVMOptions option will therefore need to be used in combination with the -XX:+UseZGC option.
This experimental version of ZGC has the following limitations:
  • It is only available on Linux/x64.
  • Using compressed oops and/or compressed class points is not supported. The -XX:+UseCompressedOops and -XX:+UseCompressedClassPointers options are disabled by default. Enabling them will have no effect.
  • Class unloading is not supported. The -XX:+ClassUnloading and -XX:+ClassUnloadingWithConcurrentMark options are disabled by default. Enabling them will have no effect.
  • Using ZGC in combination with Graal is not supported.

2018년 8월 23일 목요일

안산시 대피소 정보

안양 살때는 근처 아파트 지하주차장이 2등급 방호 대피소였는데

이사온 안산은 주민자치센터 대피소도 3등급이다

사실 3등급은 그냥 대피정도 가능한 곳이고  방폭이 어느정도 가능한 지하시설이다

화생방이나 핵등의 방폭방화는 1등급에서 가능하다

안사에서 보면  신혼때 살았던 안산 사1동  주민자치센터가 1등급이다  아마도 지휘시설용으로 만들어 놓은듯

일단 문제가 발생하면

1차  이동 주민자치센터 (공공시설이다 방호등급 3)
1차 이동 푸르지오 2차 아파트 (지하공간이 넓다 방호등급 3)

상태가 심각하면

2차 사1동 주민자치센터(공공시설물에 방호 1등급) 로 튀면 되겠다


2018년 8월 18일 토요일

간만에 작정하고 덤비는 자동차 자가정비

2018년 8월 18일 토요일  10:00~13:00 3H

작업후 업데이트는.....언제쯤이나 할꺼나....

이젠몰 DIY샵 셀프정비
https://m.blog.naver.com/PostList.nhn?blogId=illangel
정비예약
https://booking.naver.com/booking/10/bizes/99636?area=bns

차종 : 카렌스 2000 1.8 LPG



1. 작업내용
미션케이블 부싱교환(완료)
마이너스접지(완료)
계기판 램프교환(완료)
리어휀다부식 처리 및 도색( 도색1회+클리어 남았음 )
실린더세척
엔진헤드커버(일명 짐바가스켓) 개스킷 교환
엔진플러싱, 오일교환, 팬 세척 실링
미션 오일교환, 팬 세척실링
캘리퍼 메인터넌스
리어 스테빌라이져 링크 와  부싱


2. 작업순서
플러그 제거 -> 실린더거품도포(10분)-펌핑 -> 석션 및 클리닝->
헤드커버탈거 -> 개스킷교환(청소.실링) -> 헤드커버조립(10mm  0.8~1.2kmg) ->
플러그 조립(1.5~2.3kgm) ->

엔진오일 석션 1리터 -> 클리너투입 -> 시동후 공회전 15분

시동 Off + 리프트업->
엔진오일 드레인(14mm  3~4.2kgm) -> 엔진오일 필터 제거 ->
엔진 오일팬 제거 ->
미션 오일 드레인  ->
미션 오일팬 제거(제거시 볼드 위치 마킹할 것 긴거 짧은거)  -> 팬 세척

엔진오일필터 장착
엔진오일팬 실링 장착(???mm  0.8~1.1kgm)
미션오일팬 실링 장착(???mm  0.8~1.1kgm)  8개 볼트 A형 B형 다름) -> 1시간 대기(다음작업진행)

스테빌라이져 링크,부싱 교환(??mm   4.4~6.2kgm) ->
리프트다운
타이어 분리(21mm   9~12kgm) ->
캘리퍼 분해, 구리스도포 (좌 프론트, 좌 리어) -> 타이어 장착

엔진오일.미션오일 주입 -> 주행테스트

==============
3. 구입내용

미션오일 현대모비스 순정 ATF-SP 3 4L  1개 : 2만원
엔진오일 S오일 7 RED1 5w30 4L  2개 : 2만3천원 (다음에도 쓰려고)
오일팬 가스킷(구입)  : 5천원
엔진오일 누유 방지제 (구입)  : 록타이트 스탑리크 1만5천원 (엔진 헤드도 소량 누유중)
엔진오일필터, 에어필터 세트 :  1만2천원
연소실 클리너(거품식) MX-5000 4개 :  2만원
발보린 플러싱오일 1L 2통 : 9천원
퍼머텍스 울트라카파 RTV 실리콘 가스켓 101BR 85g 1개 : 1만 6천원  (헤드커버게스킷용)
록타이트 실리콘 가스켓 5910 50ml 2개 : 1만 6천원 (오일팬 개스킷작업용)
LPG 연료필터 4개 : 11880원
링크 어셈플리컨트롤 좌우: 13200원  (스테빌라이져, 활대) -주행시 뒤쪽이 달달달
링크 부싱 2개 :  1100원

리프트 1시간 1만원 대여
오일받이 (샵)
깔대기  (샵)
셕선, 임팩드라이버, 기타 공구 (샵)

개인공구
드라이버, 복스알세트, 토크렌치
뺀치, 니퍼, 케이블타이
오일종이, 걸래 , 장갑, 실리콘 장갑 
철솔, 붓, 엔진룸세정액, 엔진크리너,알콜,부식제거제


4. 작업시 정보 (공구사이즈 및 체결토크)
엔진오일 드레인 볼트 14mm  3~4.2kgm
엔진오일 팬 볼트 10mm  0.8~1.1kgm
미션오일 드레인볼트 ????
미션 오일 팬 볼트 ???mm  0.8~1.1kgm

타이어 볼트 21mm   9~12kgm
스태빌라이져 컨트롤 링크  ??mm   4.4~6.2kgm

캘리퍼 프론트 (52-13)
락 볼트 4.6~6.9 (켈리퍼 고정볼트)
볼트 2.6~3.0  (동작부위)
캘리퍼 리어   17mm (52-17)
락 볼트 3~4 (켈리퍼 고정볼트)
볼트 4.6~6.8  (동작부위)

언더커버  10mm  1.4~1.6 kgm
실린더헤드커버  10mm  0.8~1.2kmg
점화플러그 1.5~2.3kgm
엔진오일필터 : 손으로장착 -> 렌치를이용하여 1과 1/6 (60도) 회전


5. 오일량 및 측정 기준

미션오일  : 5.2L 정량 그냥 빼면 2L 나오고 3L는 토크컨버터 안에 있음
엔진오일 : 3.6L 정량  (오일필터 200ml)

미션측정 :
기준 : 예열상태 +  P-1로 각 단계별 5초대기  2~3회 수행  HOT 구간 확인
HOT 측정 - 예열 + 시동ON +  P 상태에서 체크  (HOT 구간)
Cool측정 - 시동걸기전 Cool 구간

엔진오일 : 예열 + 시동OFF  상태에서 5분후 체크

2018년 7월 26일 목요일

JVM 까보기



리브레 오피스로 작성했더니...

이걸 PPT로 바꾸면 깨지고... html로 export해도 못쓰것고..

odp 파일을 google slide에서 읽어들이고 깨지는 부분 조금 수정한 후 저장

그리고  메뉴에서 "퍼블리쉬 투 더 웹" 메뉴 선택해서 "임베디드"선택하면 html 코드로 생성되고

그걸 블로그에서 HTML 편집기 상태에 붙여 넣는다....그럼 아래 같이 나온다...

젠장 졸 복잡하내


2018년 6월 29일 금요일

Nginx HTTP Proxy에서 Protocol 혼용에 따른 HTTP 502 발생 CASE 검토



1.server architect

client <-http-> nginx(proxy) <-http-> java was(tomcat, Armeria..etc)

(이 외에 tomcat AJP, weblogic,jboss등의 전용 proxy모듈등이 있을 수 있음, 케이스마다 다르다)

2. basic information
2.1 nginx의 proxy module을 사용하여  upstream(WAS등 여하의 뒷단 서비스)과 HTTP 통신시 프로토콜정보

porxy 모듈의 소스(메뉴얼에도 설명이 없다....)
 https://github.com/nginx/nginx/blob/68b50f71e193e58ee117ef36f25387cbaa75edf3/src/http/modules/ngx_http_proxy_module.c


2902 ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
{....
3281 ngx_conf_merge_uint_value(conf->http_version, prev->http_version,
3282                              NGX_HTTP_VERSION_10);

- HTTP 1.0 지원
nginx의 proxy module의 기본 protocol은 http 1.0

- HTTP 1.1 지원
http 1.1로 동작시키기 위해서 keepalive 구문을 사용한다.

    upstream proxy_service {
        server 127.0.0.1:20080;
        keepalive 32;
    }

- HTTP 2.0 지원
일반적으로 우리는 revers proxy구조를 만들고 이때 Client와 upstream 사이에 정보확인 안되므로
프로토콜 업그레이드가 필요할 수 있다.이러한 경우 HTTP 2.0(websocket,SPDY)으로 동작시킬 수 있다 (1.3.13+)

http://nginx.org/en/docs/http/websocket.html

location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

3. Case Study
3.1 HTTP 502
Client에서의 요청을 처리하던중 가끔 HTTP 502에러가 발생한다.????

3.1.1 WAS Restart, WAS Full GC
여하간의 문제로 upstream server가 nginx의 socket 생성 자체를 해주지 못한다면 502 (bad gateway)가 발생할 수 있다. (느리거나 용량문제로 발생하는 504와 다르다)
여기서는 이 문제를 다루지 않는다

3.1.2 proxy connection에 http 1.0, 1.1 혼용사용
HTTP 1.0은 keepalive를 지원하지 않는다
또한
HTTP 1.1도 keepalive를 off 할 수 있다. 다만 HTTP 1.1은 keep alive가 주요 목적이라고 감안하고 다음 이야기를 진행 한다.

client -> upstream 으로 접속시  keepalive를 켜는 경우와 끄는경우가 존재한다.
대부분 관리자의 취향(?)에 따르지만 이론적인 장단점은 다음과 같다 .

keepalive off(HTTP1.0) : 매 요청시 connection을 재 생성하여 upstream에 접속한다. 잘못된 요청에 의한 connection오염위험이 적으나 대량부하 사이트에서 다수의 socket자원이 생성된다
Keepalive on(HTTP1.1) : 일정수의 접속유지 connection을 생성하여 공유한다. connection이 오염되는경우 장애 위험이 있으나 proxy모듈과 upstream software적인 결함없이 안정적이라면 자원을 재활용하고 미리 생성해 놓을수 있으므로 안정적이고 속도가 빠르다

다음과 같이 설정하면 80으로 들어온 모든 요청은 keepalive로 접속하여 upstream으로 전달되고 32개의 connection은 지속적으로 재활용된다.


    upstream proxy_service {
        server 127.0.0.1:8080;
        keepalive 32;
    }


    server {
        listen 80;

        location / {
            proxy_pass http://proxy_service;

            proxy_http_version 1.1;
            proxy_connect_timeout 5;
.....
        }


문제는 다음과 같이 혼용되는 경우

    upstream proxy_service {
        server 127.0.0.1:8080;
        keepalive 32;
    }


    server {
        listen 80;
        #proxy_http_version 1.1; 지시자가 있으므로 1.1로 upstream으로 향한다.
        location / {
            proxy_pass http://proxy_service;

            proxy_http_version 1.1;
            proxy_connect_timeout 5;
.....
        }

        # 지시자가 없으므로 기본값인 1.0으로 upstream으로 향한다.
        location /statcheck {
            allow 127.0.0.1;
            deny all;
            proxy_pass http://proxy_service;
        }


모든 요청이 정상적으로 처리될 것 같으나

client가 /statcheck 를 호출하는 경우  http1.0 으로 upstream으로 요청이 넘어가고 upstream은 keepAlive off로 판단하여
기존의 KeepAlive로 생성된 해당 요청 Connection을 끊어버리게 된다.

client                                      upstream
1. A GET /index.html HTTP1.1 요청 전송 ->
2.                                          <- 응답 200 ok
3. B GET /statcheck HTTP1.0 요청 전송 ->
5.                                          <- 응답 200 ok
6.                                     <- Fin 전송
7. C GET /hello.html HTTP1.1 요청 전송 ->
8.                                     <- RST 전송

위의 경우 A 요청은 정상 처리가 되고 사용된 Connection정상
B 요청이 들어오면 1.0 이므로 정상처리후 해당 Connection을 끊는 동작시작
(HTTP Protocol의 정상 동작이나 추가 설명은 아래쪽에)
C요청을 전송하였으나 upstream에서 RST 전송으로 끊어지면서 HTTP 502오류 처리





3.1.3 upstream connection 구현체의 timeout (nginx proxy timeout 가 upstream보다 짧아야 문제가 없다. upstream으로 tomcat을 사용하는 경우 connectionTimeout에 지정된다.)
네트워크통신의 가장 일반적인 방법은 요청을 수행한 Client가 작업이 끝나면 Server쪽에 Connection을 끊는 요청을 하는 케이스다.
만약 Server쪽에서 끊어버리거나 중간의 방화벽, Porxy등에서 끊어지는현상이 있다면 의도한(과도한 자원잠식방지, 자원재활용, 보안정책)결과 일 수 있으나
간혹 nginx와 upstream간의 timeout문제로 connection이 끊어지면서 502 가 발생하는 경우가 있다

ex)
nginx proxy_timeout 10sec
tomcat connectionTimeout 5sec

인 경우 tomcat의 connection 관리자가 5초가 넘게 Idel인 Connection에 대하여 RST(reset)을 전송하여 요청을 끊어버릴 수 있다.
이런 경우 절묘한 타이밍에(?) 요청처리를 위해 connection을 사용중이였다면 완료되지 못하고 connection이 유실되고
해당 요청은 502처리된다.

client          upstream
1. A요청 전송 ->
2.              <- 응답
3.          5초 IDLE
4. <- Fin 전송
5. B요청 전송 ->
6. <- RST 전송

상기와 같이 Client에서 정상적으로 종료 요청을 해서 정리되는 케이스가 아니라면
upstream 에서 Fin 전송(끊기위해) 후 RST를 전송하기 전 까지 사이의 짧은 시간에 B 요청이 들어올 수 있고(낮은 확율로)
이 경우 사용자는 nginx log에서 HTTP 502에러를 보게 된다. 물론 WAS의 log에는 아무 내용이 없다.

대부분 이러한 케이스에 대하여
proxy_timeout (nginx proxy, AJP...etc)  == upstream timeout 을 권장하지만
WEB과 WAS가 같은 서버가 아닌경우 NTP로 동기화 한다고 하더라도 ms 수준의 차이가 발생할 수 있으므로

proxy_timeout (nginx proxy, AJP...etc)  < upstream timeout 로 설정 하는것이 권장된다.


4. WorkAround
상기의 타이밍 문제(Fin과 RST 사이의 짧은 시간에 요청이 들어오는)는 KeepAlive + http proxy모듈을 사용하는경우 다음사항이 검토되어야 한다.

4.1. upstream keepAlive OFF  (비권장)
KeepAlive를 끄면 모든 요청처리는 매번 새로운 Connection에서 처리되므로 상기 발생되는 문제를 회피할 수 있다
하지만
대량부하 사이트에서 proxy 처리를 하는 경우 다수의 socket자원이 생성되게 되며 자원관리를 위해 overhead가 필연적이므로 권장하지 않는다.

tomcat AJP, JBoss, Weblogic등의 경우 connection Pool을 사용하지 않는경우와 같아진다. 성능문제


4.2. upstream KeepAlive ON (권장)
Config시에 주의를 요한다
모든 요청은 KeepAlive로 upstream으로 전달 되도록 구성되어야 한다. 상기 3.1.2항의 프로토콜 혼용상태로 구성되면 문제가 발생한다.


5. 기타

그렇다면 tomcat mod_jk AJP, weblogic mod_wl, JBoss mod_cluster 등의 다른 proxy 모듈을 사용해도 이러한 제약 사항에 걸리는가?
그렇지는 않다
대표적인 AJP를 예를 들면 AJP는 별도의 프로토콜 stack을 구성하므로 상기와 같은 문제가 발생하지 않는다.
사용자의 http 요청이 web 으로 들어오면 AJP protocol로 wraping 되어 tomcat의 별도 AJP Port로 통신한다.
또한 keepalive의 지원여부가 AJP Connection의 생명주기와 무관하기 때문에 끊어지는 일은 없다.

다만 3.1.3항의 timeout 문제는 발생할 수 있으므로 주의가 필요하다 (이경우 AJP에 Cluster 설정이 없는 경우 502가 발생한다)


.이상

2018년 2월 20일 화요일

게스트하우스의 파티에 대한 기억


2012년 21코스 연결로

한창 올레길 붐이 일던 시기 도착한 제주



게하에 들어가 수더분한 형님과 인사하고

멍 때리며 시간을 보내던 중

랜트카에서 여자둘 남자둘의 한무리가 도착

양손 가득 봉지에는 술과 고기등 먹을 거리가 있었고

너무나 당연하다는양 저녁에 파티안하냐며...

쥔장 형님과 썩은 웃음을 교환하고

저녁에 불픠워주고 즈들끼리 먹게 그냥 방치



다음날은 조용조용한 남여 몇몇이 따로 따로 도착

저녁시간 형님이 냉동실에 짱박아둔 고기를 꺼내고

라면을 끓이고 이리저리 주섬주섬 모아 간소하지만

긴시간 서로 이야기를 나누며 시간을 보냈고

흥이 오른 누군가는 폰에서 나오는 노래에 바운스를 튕기던 ...



게스트 하우스의 주인은 호스트였다

게스트는 말 그대로 여행중 하루 쉬었다갈 손님이

씼고 먹고 정보를 교환하고 등대고 잘 공간만 제공하면 그만 이였다.

그래서 저렴했고 사람들끼리 맞으면 같이 가고 같이 먹고

아니면 조용히 자기의 시간을 가지던 개인적인 공간 이였다



올레길이 흥하면서 서비스의 질은 팬션에

가격은 싸게 지내고 싶은 사람들과

가벼운 주머니에 하루이틀 관광삼아 케리어를 끌고온 사람들이

이성을 만나서 술한잔 하는 재미를 찾기 시작했고

때마침

육지사람들의 엄청난 유입과 우우죽순 생겨난 게스트하우스에 의해

서비스 인플레이션이 심해지면서 1세대 게스트하우스 들은 적당한 가격에 돈을 벌고 빠져 버렸다

그 이후  아프X카, 산티X고 등등의 유명한 파티 게하들의 모델을 그대로 답습한 많은 숙소가 생겼고

가끔 썸이나 지분거림 정도로 끝나던 이성간의  충돌은 사고와 사건으로 커져 갔다




나처럼 배낭매고 땀에 절은 게스트가 도착해서

세탁기 돌리는데 눈치를 봐야하는곳이 생겼고
(오해말자 좋은곳도 많다.)

대화의 시간에 자신의 여행이야기 보다

족보 이야기 회사이야기 연애 이야기가 우선으로 오르내리게 되었다

1년에 한두번 정도 찾아가던 나는 가끔 조용하면서 나름의 기준으로 운영하던

많은 게스트하우스가 사라지는것을 보았고 안타까웠다

개인적으로 특히나 해오름게하...

북카페였던 사이게스트하우스와 한라산게스트하우스는 아쉬움으로 남는다
(인수 하시기도 했고 폐업하기도 했다.)



호스트가 주인인 게스트하우스의 파티를 본것이 오래된 것 같다

게스트들 끼리 모여 짝짓기 놀이 하듯 서로 호구조사를 하고

술을 주량넘어 벌컥대는 시간은 어느정도 없어 졌으면 좋겠다



전날 짱박아 뒸던 모든 소주와 맥주를 털어먹고

새벽까지 같이 달렸던 전우(?)들과

호스트형님이 끓여주던 해장라면을 먹던 시절이 그립다.


2018년 2월 11일 일요일

아는게 아는게 아닌

살아온 시간이 늘어날수록

알면 알수록 모르는게 많아지고

알면 알수록 고통스러워 질까

40대를 지나고 몇 년

여행지에서 또는 회사 근처에서 만나다 보면

대부분 껍대를 뒤집어쓴 자신의 모습과

여행지에서 괴리되어 있는 자신의 모습에서 혼동을 느낀다 (나또한)


안나푸르나 어라운드 이후 나는 한달의 시간을 그냥 쉬기로 했다

ABC를 가지는 못했으나   못 한게 아니라 안 한다고 마음 먹고 접어버렸고

온전히 2주간의 포카라 생활을 즐겼다





2018년 1월 17일 수요일

오픈소스 백업 bacula backup - draft

바큘라설치 

이슈사항 
- 백업시 네트워크 대역폭 
- NAS IO 성능 확인 
- 저장되는 데이터의 보안(암호화여부)
- 다양한 device 지원 (Disk, NFS, Tape)


0. 준비

서버, 버박에 2개 생성, vm1에  dir,sd,catalog 구성 
192.168.56.101 vm1 backup_dir backup_sd
192.168.56.102 vm2 backup_dest1 backup_fd1

서비스 구성 3데몬, 1DB
-bacula Director 디렉터(서버) , chleo 1천대정도 컨트롤, 9101port 사용 
-bacula File 파일데몬(클라이언트 에이전트), 9102 Port, bacula-common, bacula-fd 
-bacula Storage 스토리지(저장소), 9103 Port 
-Catalog 카탈로그 (백업 카탈로그 저장 DB)
관리 
-bacula monitor 모니터 (Xwin 기반 GUI)
-bacula Console 콘솔 (CLI)
-webmin (Web Base Console-별도 프로젝트 )


의미 
Pool : Volume의 집합, 하나의 파일로 뭉쳐진다.
Volume : 백업된 데이터 들이 분류별로 저장됨, 하나의 백업작업에 하나의 Volume, 볼륨사이즈제한가능, 볼륨 갯수 제한 가능,



centos에는 yum설치시 5.x 버젼으로 설치됨
https://repos.fedorapeople.org/slaanesh/bacula7/epel-bacula7.repo 에서 제공하는 yum으로 하려고 해도 최대 버젼이 7 기준임

이번에 설치시 설치버젼  Baclula 7x


1. Director 설치 
1.1 관리 서버가 될 곳부터 (director 와 Stroage 구성)
1.1.1 리포 추가 
cd /etc/yum/repo.d

yum으로 설치하고나면
5.x와 7.x 가 같이 출력 되므로 해깔리지 않도록 주의 해당 rpm만 정리하면 아래와 같음

[root@centos6-9 yum.repos.d]# yum list | grep bacula
#이거 깔면 아래것은 의존성으로 설치됨
bacula-director.x86_64 7.0.5-7.el6 epel-bacula7   <==
bacula-common.x86_64 7.0.5-7.el6 epel-bacula7
bacula-libs.x86_64 7.0.5-7.el6 epel-bacula7
bacula-libs-sql.x86_64 7.0.5-7.el6 epel-bacula7

#콘솔, 모니터 각각 설치
# 이거 설치하면 Xwin의 시스템도구에 bacula bat console과 bacula monitor 항목이 생성된다.
bacula-console.x86_64 7.0.5-7.el6 epel-bacula7
bacula-console-bat.x86_64 7.0.5-7.el6 epel-bacula7
bacula-traymonitor.x86_64 7.0.5-7.el6 epel-bacula7

#저장소 패키지 별도 서버에 구성 가능 
#의존성으로 mt-st 설치됨
bacula-storage.x86_64 7.0.5-7.el6 epel-bacula7

#로그를 모니터링하는 뭔가인듯....  디렉터만 깔면 되나???
bacula-logwatch.noarch 7.0.5-7.el6 epel-bacula7

#클라이언트쪽에 설치
bacula-client.x86_64 7.0.5-7.el6 epel-bacula7

# 문서나 개발뭔가인데 필요하면 설치
bacula-devel.x86_64 7.0.5-7.el6 epel-bacula7
bacula-docs.noarch 7.0.5-1.el6 epel-bacula7
nagios-plugins-bacula.x86_64 7.0.5-7.el6 epel-bacula7


# 설치후 정보 위치 
/etc/bacula : 설정파일
/usr/libexec/bacula : db 스키마생성등의 스크립트
/var/spool/bacula/ : 로그파일
/etc/init.d/bacula-* : 시작 스크립트 
/usr/sbin/ : 바큘라 실행파일 
bacula-dir  bacula-sd  bacula-tray-monitor


1.2. DB설치 
# yum으로 그냥 때려설치...의존성으로 깔리는건 그냥 깔아줌 
yum install mysql-server mysql-devel

#기동 (튜닝 따위는 나중에)
service mysqld start

# 부팅될때 닥시고 구동 
chkconfig  mysqld on


1.3. 스키마 생성 과 권한 및 패스워드  (바큘라 설치하면 생성용 스크립트가 /usr/libexec/bacula 에 있다)
DB에 bacula 관련 DB를 설정해야 한다.
기본 DB가 postgresql 이다 파일을 수정해서 값을 변경한다.
아래 변수값을 기준으로 필요한 스크립트를 수행하므로 오타 주의

1.3.1 DB생성
$vi create_bacula_database
....
default_db_type=postgresql  을  mysql로 
....

[root@centos6-9 bacula]# ./create_bacula_database 
Creating mysql database
Creation of bacula database succeeded.


1.3.2 스키마생성
$vi make_bacula_tables
....
default_db_type=postgresql  을  mysql로 
....
[root@centos6-9 bacula]# ./make_bacula_tables 
Making mysql tables
Creation of Bacula MySQL tables succeeded.

1.3.3 권한설정 
$vi grant_bacula_privileges
....
default_db_type=postgresql  을  mysql로 
....
[root@centos6-9 bacula]# ./grant_bacula_privileges 
Granting mysql privileges
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_privCreate_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections
localhost root Y Y Y Y Y Y Y Y Y Y Y Y Y Y YY Y Y Y Y Y Y Y Y Y Y Y Y 0 00 0
centos6-9 root Y Y Y Y Y Y Y Y Y Y Y Y Y Y YY Y Y Y Y Y Y Y Y Y Y Y Y 0 00 0
127.0.0.1 root Y Y Y Y Y Y Y Y Y Y Y Y Y Y YY Y Y Y Y Y Y Y Y Y Y Y Y 0 00 0
localhost N N N N N N N N N N N N N N NN N N N N N N N N N N N N 0 00 0
centos6-9 N N N N N N N N N N N N N N NN N N N N N N N N N N N N 0 00 0
localhost bacula N N N N N N N N N N N N N N NN N N N N N N N N N N N N 0 00 0
% bacula N N N N N N N N N N N N N N N NN N N N N N N N N N N N 0 0 00
Privileges for user bacula granted on database bacula.

스크립트를 열어 보면 db_password= 항목이있다. 직접 넣어주고 돌려도 된다.


만약 mysql 설치시 패스워드가 있다면 /etc/my.cnf에 mysql root 패스워드 설정을 추가하거나 
위에 스크립트 수행할 때 뒤에 옵션을 줘서 수행한다
ex) 
스크립트에 패스워드 옵션 먹여서 실행 (값은 없으므로 그냥 -p 만주고 실행 쓰고 있던 DB나 패스워드를 넣었다면 그 값으로)
/usr/libexec/bacula/grant_mysql_privileges -u root -p 
/usr/libexec/bacula/create_mysql_database -u root -p
/usr/libexec/bacula/make_mysql_tables -u root -p
/usr/libexec/bacula/grant_bacula_privileges  -u root -p

1.3.4. bacula 패스워드 변경 
$mysql -u root -p
>UPDATE mysql.user SET password=PASSWORD("xxxxxx") WHERE user='bacula';
>FLUSH PRIVILEGES;


ex)
mysql> UPDATE mysql.user SET password=PASSWORD("xxxxxc") WHERE user='bacula';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Director 설치는 끝났다.

시작시키려면 서비스명은 
[root@centos6-9 bacula]# chkconfig | grep bacula
bacula-dir      0:해제 1:해제 2:해제 3:활성 4:활성 5:활성 6:해제  (디렉터)
bacula-sd      0:해제 1:해제 2:해제 3:활성 4:활성 5:활성 6:해제  (스토리지)

1.3.5 mysql과 연결
bacula를 rpm으로 설치하면 기본 postgra로 연결하게 되어 있다.
이걸 mysql로 바꿔줘야 구동시 mysql로 접근해서 catalog 서비스가 가능하다.
alternatives 로 지정을 바꾸어준다

[root@centos6-9 bacula]# alternatives --config libbaccats.so

3 개의 프로그램이 'libbaccats.so'를 제공합니다.

  선택 명령
-----------------------------------------------
   1 /usr/lib64/libbaccats-mysql.so
   2 /usr/lib64/libbaccats-sqlite3.so
*+ 3 /usr/lib64/libbaccats-postgresql.so

현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오:1  <== 1을 선택해서 mysql로 변경

연결이 안되면 아래같은 에러가 발생한다.
/var/log/bacula/bacula.log

17- 1월 11:33 bacula-dir JobId 0: Fatal error: Could not open Catalog "MyCatalog", database "bacula".
17- 1월 11:33 bacula-dir JobId 0: Fatal error: postgresql.c:236 Unable to connect to PostgreSQL server. Database=bacula User=bacula
Possible causes: SQL server not running; password incorrect; max_connections exceeded.
17- 1월 11:33 bacula-dir ERROR TERMINATION
Please correct configuration file: /etc/bacula/bacula-dir.conf




2. Storage 구성 
dir과 별도의 서버에 구성할 경우 
bacula-storage.x86_64 7.0.5-7.el6 epel-bacula7
bacula-common.x86_64 7.0.5-7.el6 epel-bacula7
bacula-libs-sql.x86_64 7.0.5-7.el6 epel-bacula7   설치 하면 된다고함 (인터넷 정보 확인은 안해봤음 안되면 찾아서 하자)

2.1 config 파일 구성 
백업을 하려면 저장소가 필요하고 저장소를 Pool 이라는 공간안에 여러개의 Volume을 넣어 두는 형태로 설정한다
두개의 포트를 정보를 넣는데
하나는 dir과 통신을 위한 대상 port 정보와
수신을 위한 sd port 정보를 정의한다.

바큘라는 저장소 관리를 테이프처럼 한다. 
volume 이라는건 하나의 테이프라고 보면 되고 백업을 볼륨에 저장하고 하나의 볼륨이 꽉 차면 다음 볼륨을 만들어 저장한다.
물리적인 tape 라이브러리에서 테이브 하나가 차면 다음 테이프에 저장되는 것으로 보면 된다.
pool 이라는건 백업job을 위해 사용되는 테이프들을 통칭 Pool 이라고 하고 (하나의 백업을 위해 10개의 테이프가 사용되면 그놈들을 모아 둔걸 pool 이라고)
tape 운영시 10개의 tape를 백업하고 라이브러리에서 빼내면 순서대로 라벨링하고 하나의 가방에 넣어두듯이 하나의 세트를 의미한다. (나중에 복구할때도 이 전체 테이프를 라이브러리에 넣고 카탈로그를 돌려야 복구가능하다. 하나라도 없으면 ㅜ.ㅜ)

실제 서버에서 보면 pool은 하나의 파일로 생성되고 내부적으로 volume이 생성되어 있다.
자체적으로 하나의 파일로 말아 버리는것으로 보안성 유지를 위해서 이런 구조가 사용되는 듯 
단점은 관리자가 직접 파일 access는 안되고  유틸을 사용하여 추출 해야 한다... 이게 더 안전할듯 
병신처럼 파일 하나라도 건드리면 카탈로그 정보가 틀어질꺼고 그럼 전체 볼륨이 뽀개질듯 

나는 풀을 4개 만드려고 한다.
1. dev_pool : WEB/WAS Contents,SVN   
/data/www
/data/web

2. img_pool : 서비스 컨텐츠 백업  (서비스 이미지)

3. log_pool : log 백업용

4. os_pool : os config 백업  /etc, /home, 
 --exclude=/lost+found/* --exclude=/media/* --exclude=/mnt/* --exclude=/sys/* -exclude=/proc/* --exclude=/dev/*

NAS 사용량조사
프로덕션 볼륨 : 386GB
개발볼륨 : 120G
메일서버 : 476G
레거시(stylewish) : 376G

WEB Contents
oneten.web : /data/www  103M
[wishlink@oneten.web1 data]$ du -sk ./www
102612 ./www

WAS Contents
oneten.was : /data/www  122M
[wishlink@oneten.was1 data]$ du -sk ./www
122088 ./www

wislink.web (홈피, 레드마인, 위키, SVN)
/data/www 10G
/data/redmine-2.6.3   4G

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

$vi /etc/bacula/bacula-sd.conf

Device {
  Name = FileStore-os
  Media Type = File
  Archive Device = /data/backup/os_pool
  LabelMedia = yes; # lets Bacula label unlabeled media
  Random Access = Yes;
  AutomaticMount = yes; # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
  Maximum Concurrent Jobs = 5
}

Device {
  Name = FileStore-log
  Media Type = File
  Archive Device = /data/backup/log_pool
  LabelMedia = yes; # lets Bacula label unlabeled media
  Random Access = Yes;
  AutomaticMount = yes; # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
  Maximum Concurrent Jobs = 5
}



$vi /etc/bacula/bacula-dir.conf

Storage {
  Name = "OS Backup"
  Address = 192.168.56.101 # N.B. Use a fully qualified name here
  SDPort = 9103
  Password = "wishlink0503#!"
  Device = FileStore-os
  Media Type = File
  Maximum Concurrent Jobs = 10 # run up to 10 jobs a the same time
}

Storage {
  Name = "LOG Backup"
  Address = 192.168.56.101 # N.B. Use a fully qualified name here
  SDPort = 9103
  Password = "wishlink0503#!"
  Device = FileStore-log
  Media Type = File
  Maximum Concurrent Jobs = 10 # run up to 10 jobs a the same time
}



# Generic catalog service
Catalog {
  Name = MyCatalog
  dbname = "bacula"; dbuser = "bacula"; dbpassword = "wishlink0503#!"
}



/usr/share/doc/bacula-common-7.0.5


2.2  권한 설정 

2.2.1 selinux 떄문에 백업볼륨 생성실패 
꺼버리자 
에러의예
17-Jan 15:04 bacula-sd JobId 13: Warning: mount.c:212 Open of file device "FileStore-os" (/data/backup/os_pool) Volume "OsVol-0002" failed: ERR=file_dev.c:172 Could not open(/data/backup/os_pool/OsVol-0002,CREATE_READ_WRITE,0640): ERR=Permission denied

selinux config 파일 위치 
#vi /etc/sysconfig/selinux

내용에서 비활성화
SELINUX=disabled

리부팅하면 꺼짐 

2.2.2 iptables를 쓰고 있다면 끄거나 필요 Port를 열어줄것 

2.2.3 폴더 권한 문제 

chown -R bacula:disk /data/backup
chmod -R 760 /data/backup/

owner에 7을 안주면 volume생성이 안되더라....
other에는 혹시 나중에 작업할때 볼 수 는 있어야 하니 그냥 6 주었음




3. File Daemon 설치
3.1 pkg 설치 정보 
bacula-client.x86_64 7.0.5-7.el6 epel-bacula7
(위에 설치하면 필요 의존성은 같이 설치됨)
 bacula-common
 bacula-libs 

3.2 config 파일 
/etc/bacula/bacula-fd.conf
- Password 수정 
-FDAddress = 192.168.x.x  <== 처음 설치하면 없는데 꼭 있어야 하나??? 없이 하면 배포하기 편한데...

3.3 서비스 기동 
#service bacula-fd start
#chkconfig bacula-fd on


4. 관리도구  구성   
4.1 bconsole (CLI)
bconsole은 CLI에서 백업을 수행하거나 작업하는데 사용하기 위한 도구이다.
같은 서버에 있을 필요없이 아무대나 있어도 되지만 /etc/bacula/bconsole.conf  에서 dir에 접속하는 정보를 맞추어야 한다.

4.1.1 pkg 설치 
나는 저 앞에서 dir 설치시 같이 설치했으므로 별도 설치는 하지 않았지만 만약 console만 다른서버에 설치하려면 다음 pkg를 설치하도록 한다.
bacula-console.x86_64 7.0.5-7.el6 epel-bacula7

4.1.2 bconsole 설정
dir에 접속하기 위한 설정 
/etc/bacula/bconsole.conf 

#
# Bacula User Agent (or Console) Configuration File
#
Director {
  Name = bacula-dir    <==  Director 구성시 지정한 이름과 같아야 한다. 
  DIRport = 9101         <== Director 서비스 port 
  address = 192.168.56.101 <==  Director 서비스가 설치된 서버 IP
  Password = xxxxxxx"  <=== Director 서비스 접속용으로 지정한 패스워드
}

4.2. BAT (Bacula Admin Tool - GUI)
기초 설치시 같이 깔린다.  X-Win 기반이므로 설치된 서버의 Win에서  프로그램->시스템도구-> Bacula Bat Console  로 추가된다.

/etc/bacula/bat.conf 에 패스워드 부분만 확인해준다.
[root@centos6-9 bacula]# cat bat.conf
#
# Bacula Administration Tool (bat) configuration file
#

Director {
  Name = bacula-dir
  DIRport = 9101
  address = localhost
  Password = "xxxxxxx"
}

4.3 Webmin (Bacula Web Admin -  WEB GUI)
특별히 바큘라를 위한 툴은 아니고 시스템전반에 걸친 관리를 수행하는 WEB Tool임 
바큘라에 잘 들러 붙기 때문에 이거 쓰면 편하게 구성가능 
위에 파일 일일이 수정하느라 뼈골 빠지느니 이걸로 하면 됨
다만 바큘라의 설정이 이놈저놈 하나씩 설정한 다음 서로 엮어 주는 구성이라 기본 개념이 없으면 UI도 작업하기 어려움 
초기 적용단계라면 CLI로 연습삼아 굴러보고(?) GUI에서 노가다를 줄이는 황홀함을 느껴보시길 권장 

4.3.1  pkg 설치
라파지토리 추가 
vi /etc/yum.repos.d/webmin.repo

아래내용으로 
[Webmin]
name=Webmin Distribution Neutral
#baseurl=http://download.webmin.com/download/yum
mirrorlist=http://download.webmin.com/download/yum/mirrorlist
enabled=1

PGP 키 등록해줄것 
rpm --import http://www.webmin.com/jcameron-key.asc <== 이거 꼭 해줘야됨 

업뎃하고 
yum check-update

설치 
yum -y install webmin 

4.3.2 접속 및 구성 
URL로 접속하면 됨 (개간단)

계정은 OS에서 사용하는 계정으로 로그인,  root로 로그인 하면 됨

bacula 를 기본 postgra로 구성했으면 바로 붙겠지만 나처럼 mysql로 했으면 붙여주는 작업이 필요함

메뉴는 잘 기억이 안나는데.... 여하간 처음 로그인해서  왼쪽 메뉴에서 "system"-> Bacula Backup System 을 선택하면 오류가 나오는데 config 부분에 


4.4 baculum

http://www.bacula.org/7.4.x-manuals/en/console/Baculum_Web_GUI_Tool.html

vi /etc/yum.repos.d/baculum.repo

[baculumrepo]
name=Baculum CentOS repository
baseurl=http://bacula.org/downloads/baculum/centos
gpgcheck=1
enabled=1


업뎃하고 
yum check-update

설치
yum install baculum baculum-httpd
php가 필요할 수 있음
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum check-update
yum install php54