Category Archives: 허접프로그래머

Windows 2008R2 Hyper-V 가상화에서 돌아가는 리눅스 서버의 시간 교정하기 (ntpd)

최근에 개발서버들을 Windows Server 2008R2에 CentOS 5.x 를 게스트로 올려 사용중에 놀라운점을 경험하게 되었습니다. 게스트호스트인 CentOS 리눅스 서버들의 시간이 매우 빠르게 증가한다는것인데요. 결국에는 시간이 몇시간도 아닌 몇일씩 앞질러가 버리더군요.

사용자 삽입 이미지

위와 같이 가상화 설정에서 시간 동기화를 끄게 되면 조금은 완화되지만 여전히 해결되지 않는 모습을 보게 됩니다. 이 상태에서는 NTP를 사용하더라도 문제를 해결하지 못하게 됩니다. 이 문제를 해결하기 위해 다음과 같은 방법을 사용하였습니다.

부트로더 설정 변경

1. /boot/grub/grub.conf 를 수정하여 커널 부트 옵션을 수정하여 줍니다. 다음을 참고하셔서 적절한 위치에 문자열을 추가해 주시면 됩니다.

32비트OS : divider=10 clocksource=acpi_pm
64비트OS : notsc divider=10

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-164.6.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.6.1.el5 ro root=/dev/VolGroup00/LogVol00 hda=noprobe hdb=noprobe notsc divider=10
initrd /initrd-2.6.18-164.6.1.el5.img
title CentOS (2.6.18-164.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-164.el5.img

ntpd 설정 변경

1. 다음의 샘플 설정을 참고하여 /etc/ntp.conf 파일을 설정합니다. server 설정으로는 [이곳]을 가시면 다양한 ntp풀에 참여하는 서버들 리스트를 볼 수 있습니다. 하지만 일단 저의 경우에는 다음과 같은 서버들을 사용하겠습니다.

tinker panic 0
restrict 127.0.0.1
restrict default kod nomodify notrap
server time.bora.net
server ntp.ewha.net
server time.kriss.re.kr
server time.nuri.net
server ntp.postech.ac.kr
driftfile /var/lib/ntp/drift

이 설정에서 가장 중요한 부분은 tinker panic 0 지시자입니다. 이 지시자가 설정되면 큰 시간 점프가 일어날 경우 NTP실행을 포기하는 것을 막아줍니다. 이것은 시간이 점차적으로 빗겨나는 행위나 또는 가상서버의 서스펜드 상태로 들어갈때의 시간 점프시에 꼭 필요합니다. 이 설정은 ntp.conf파일의 최상단에 위치해야 합니다.

2.  그리고 설정한 서버 목록중에 2개 정도를 /etc/ntp/step-tickers 에 추가해주도록 합니다.

time.bora.net
ntp.ewha.net

3. (Optional) 이제 마지막으로 로컬의 시계를 참조하지 않도록 설정합니다. 이는 다량의 시간 변경 현상이 일어날 경우 원격지 서버의 시간을 참조하지 않고 로컬의 시간으로 돌아가는 문제가 있기 때문에 이것을 방지하기 위해 다음의 설정을 추가합니다. 위의 2번까지만으로 별 문제가 없으실 경우 다음은 안하셔도 됩니다.

server 127.127.1.0
fudge 127.127.1.0 stratum 10

시간 교정 및 동기화

1. 다음의 명령을 수행하여 수동으로 시간을 동기화하고 동기화된 시간을 하드웨어 시계에 적용하고 ntpd 데몬을 OS부팅시 자동 실행되도록 설정합니다.

ntpd -q
hwclock --systohc
chkconfig ntpd on

2. 시스템을 재부팅합니다.

참고 : http://hardanswers.net/correct-clock-drift-in-centos-hyper-v

[Java] Json 라이브러리의 최고봉 Gson 수동으로 배열 처리하기

구글의 Json 라이브러리인 [Gson]는 확실히 멋진 라이브러리입니다. 어떤식으로든지 객체와 1:1매핑되어 정확하게 값이 타입에 맞게 들어가는 것을 보면 놀라지 않을 수 없습니다.

그런데 이것이 너무 편하다 보니 매번 POJO객체를 만들어야 한다거나 또는 이 편리함이 오히려 복잡함으로 다가오게 만들정도의 획일화된 사용법을 제공하는등 마냥 편한건 아닌것 같더군요.

하지만 좀더 알아보니 방법이 없는게 아니라 제가 모르는 것이었습니다. [이곳]에 나와있는 예제를 첨부해 보겠습니다.
[code]Gson gson = new Gson();

Collection collection = new ArrayList();
collection.add(“hello”);
collection.add(5);
collection.add(new Event(“GREETINGS”, “guest”));

String json = gson.toJson(collection);
System.out.println(“Using Gson.toJson() on a raw collection: ” + json);[/code]
위와 같은 코드를 실행해서 배열을 Json으로 변환하는 예제를 실행해 보았습니다. 위의 예제는 사실상 전혀 이해 못할것이 없는 당연스러운 코드 입니다. 하지만 다음의 경우는…일단 저는 모르고 있었네요.
[code]JsonParser parser = new JsonParser();

JsonArray array = parser.parse(json).getAsJsonArray();

String message = gson.fromJson(array.get(0), String.class);
int number = gson.fromJson(array.get(1), int.class);
Event event = gson.fromJson(array.get(2), Event.class);

System.out.printf(“Get: %s, %d, %s”, message, number, event);[/code]
위와 같이 일일이 수작업으로 원하는 만큼만의 작업을 할 수 있습니다. Java 5.0이상부터라면 다음과 같은 구문을 사용할 수도 있습니다.
[code]JsonParser parser = new JsonParser();

JsonArray array = parser.parse(json).getAsJsonArray();

for(JsonElement element : array)
{
  // …
}[/code]

참고 :
http://code.google.com/p/google-gson/source/browse/trunk/extras/src/main/java/com/google/gson/extras/examples/rawcollections/RawCollectionsExample.java

https://sites.google.com/site/gson/gson-user-guide