2009년 12월 9일 수요일

가상 환경에서 리눅스 사용시 디스크 관리 팁.

리눅스를 가상으로 올릴 경우, 하나의 가상 디스크를 크게 잡고 통째로 / 에 마운트해서 쓰는 경우가 있는데.. 이런 경우 다음과 같은 문제가 발생한다.

"실제 데이터량과는 상관없이 지속적으로 가상 디스크 파일의 크기가 증가한다."

실제로 리눅스에서 df를 이용하여 확인해보면 / 에 마운트된 디스크에서 사용되는 양이 2기가 바이트 정도지만 가상 디스크의 파일크기는 4~5기가가 넘어가는 경우가 허다하다.

이러한 현상이 발생하는 이유는 생각해보면 당연한 것인데, 쓰자니... 귀찮다.
하여튼, 중요한건 실제로 디스크에 데이터를 읽고 쓰는 순간 가상디스크 파일의 크기가 커지는 현상이 발생한다는 점이다.

따라서, 해당 부분을 최소화 해주면 가상디스크 파일의 크기를 비교적 최소한으로 유지할 수 있다.

결론부터 말하자면, /var, /tmp, swap 공간을 다른 가상 파일로 분리해주면 실제 운영체제가 자리하는 가상디스크의 크기는 그닥 차이가 나지 않게 된다.

개인적으로 var_tmp_swap.vdi라는 고정크기 파일을 유지하며 여러 리눅스 버전에서 공유하고 있다.

2009년 12월 8일 화요일

yum-fastestmirror 를 설치, update 속도를 올려보자!!

관련 검색을 해보면 알겠지만.. 설치가 되지 않는 경우도 있다고 하니 주의..

간단하게 yum install yum-fastestmirror 명령으로 설치해주면 정말 빨라진다..

2009년 10월 19일 월요일

libiconv 사용법.

libiconv의 사용법은 함수가 달랑 3개라 간단하지만 의외로 복병이 있었다. 이를 정리해보자.
libiconv에서 실질적으로 지원하는 함수는 다음의 세가지 이다.


iconv_open()
iconv()
iconv_close()


open() 함수에서 변환될 코드의 명칭을 전달해주면 변환 핸들을 리턴한다. 이 변환 핸들을 이용해서 iconv()함수를 호출해주면 된다.

그런데, 우선적으로 이 원하는 코드의 명칭이 헷갈렸다. UTF8, UTF-8, ISO-10646/UTF-8 등등 어떤걸 써야할지... 뭐 결론은 저건 다 같은 코드를 가리키고 있다. 아무거나 써도 상관없다는 것.

간단하게 확인하려면, 명령행에서 iconv -l을 실행시켜서 어떤 것을 지원하는지 확인하면 되지만.. 라이브러리로 링크할때 이것이 실제로 링크되었는지 불안한 경우가 있다. 특히 크로스 컴파일을 할 때 매우 헷갈릴 수밖에 없다.

간단하게 링크된 libiconv에서 지원하는 코드 셋을 살펴보고 싶다면 다음의 코드를 이용해보자.


int do_print(unsigned int namescount, const char * const * names, void* data)
{
unsigned int i;
(void) data;
for (i = 0; i < namescount; i++)
{
L_DEBUG(names[i]);
}
return 0;
}

/*
 * Use this when you want to known what supported.
 */
void Iconv::DebugPrintSupportedCharacterSets()
{
libiconvlist(do_print, NULL);
}

L_DEBUG는 자체적으로 만들어쓰는 로그 매크로이니 신경쓰지 말자. printf로 바꿔써도 무방.

iconvlist 함수가 없다고 링크 오류가 발생할 수 있는데.. 일반적으로 usr/include/iconv.h 가 인클루드 된 것이다. libiconv 소스 패키지에 들어있는 iconv.h에는 저 함수가 선언되어 있다.
인클루드 패스를 조정해주면 된다.

iconv() 함수는 일반적으로 잘 동작하지만... 리턴 값이 정상적으로 리턴되지 않는 경우가 있다고 한다. 그래서 in_left와 out_left를 이용하여 다음과 같은 함수를 구현해보았다.

const TChar * Iconv::convert(TChar * input, TUint32 length)
{
L_TRACE("legnth = %d", length);

if(length > m_bufferSize)
{
expandBuffer(length + m_bufferSize);
}

TChar * p_in_buf = input;
size_t in_left = length;

TChar * p_out_buf = m_buffer;
size_t out_left = m_bufferSize;

iconv(m_handle,(char **)&p_in_buf, &in_left, &p_out_buf, &out_left);

L_DEBUG("in_left = %d, out_left = %d", in_left, out_left);

if(in_left == length)
{
L_DEBUG("FAIL to convert %s -> %s", DtvCodeTypeToStr(m_sourceType), DtvCodeTypeToStr(m_resultType));

m_resultSize = 0;
m_result = NULL;

return m_result;
}

if(in_left == 0)
{
m_resultSize = m_bufferSize - out_left;
m_result = m_buffer;
return m_result;
}

// WARN!! recursive call.

expandBuffer(m_bufferSize); // x2

return convert(input, length);
}

Iconv 클래스의 생성자와 파괴자에서 m_buffer를 정리해주면 된다.

2009년 9월 21일 월요일

구글 블로그 시작하기.

지금까지 써왔던 이글루가 갈수록 마음에 안들어 간다.
그래서 구글 블로그를 둘러보는 중..