2007/08/02

Solaris 10으로 업그레이드 후 현상

begin:vcard
fn:Bonghwan Kim
n:Kim;Bonghwan
email;internet:bonghwan.kim@sun.com
tel;work:82-2-2193-5225
tel;cell:82-16-325-9068
x-mozilla-html:FALSE
version:2.1
end:vcard

1.2Ghz의 U-III(12 cores)를 장착한 V1280 을 사용하던 한 사용자가 1.5Ghz의 U-IV+(24cores)가 장착된 시스템으로 업그레이드를 하게 되었습니다. 펌웨어라던가 다른 것들은 업그레이드 하지 않았구요(사실 펌웨어 업그레이드는 검토해보는 것이 좋습니다. 뭐 어쨌든) 애플리케이션도 그전에 있던 그대로 다시 재수행을 하게 되었는데, 그 해당 프로세스의 메모리 크기가 50% 정도 커졌읍니다.

왜 이런 일이 발생했을까요?

이것은 업그레이드 이전과 이후의 차이입니다.
업글 이전 :
                     Kbytes        RSS          Anon
total Kb       632800     497784     381176       


업글 이후 :
                    Kbytes        RSS          Anon
total Kb    1021168     387720     299464      

U-IV+는 솔라리스10 이후만을 지원합니다. 따라서, 운영체제가 업그레이드 되었죠. 애플리케이션은 전혀 손을 대지 않았구요. 일단 솔라리스10이 가진 변경된 피쳐를 간과한 것이 있습니다. 솔라리스 10은 스팍 시스템이 지원할 수 있는 페이지 사이즈를 여러개를 이용할 수 있도록 업그레이드 되어 있으며, 응용 프로그램에 맞추어 최적의 (자바 버추얼 머신의 경우에는 가장 큰) 페이지 사이즈를 자동적으로 이용할 수 있도록 되어 있습니다.

다음은 해당 프로세스의 pmap -x 를 본 결과 입니다.

업그레이드 이후
Address                             Kbytes        RSS           Anon     Locked Mode   Mapped File
FFFFFFFED5000000     524288       4096         4096          - rwx--          [ anon ]
FFFFFFFEFFC00000     233472       204800     204800     - rwx--          [ anon ]


업그레이드 이전
Address                             Kbytes        RSS           Anon     Locked Mode   Mapped File
FFFFFFFEE2C00000     262144     192512     192512       - rwx--    [ anon ]
FFFFFFFF0D800000     118784     106496      106496       - rwx--    [ anon ]

힙에 커다란 사이가 나는 것을 볼 수 있습니다. 그런데,  실제 메모리에 탑재되어 있는 영역은 얼마안됩니다.

이러한 차이는 두가지 이유가 있습니다. 솔라리스 10의  MPSS(Multiple Page size support)에 의해 이 프로세스에 가장 큰 페이지를 기준으로 할당을 하도록 함으로써 swap out된 메모리가 많이 할당되어 있게되었습니다. 페이지 사이즈가 커진다는 얘기는 페이징의 단위가 되는 메모리의 크기가 커졌다는 것을 의미합니다. 이것은 $pmap -xs <pid>로 확인할 수 있습니다. 따라서, 메모리 할당에 따른 조각(chunk)이 커짐에 따라 Fragmentation  커짐을 의미합니다.

참고 : man pagesize.1




2007/07/24

솔라리스 10에서 OpenSSL 라이브러리 사용(OpenSSL link in SOlaris 10)- rdesktop example

솔라리스 10은 OpenSSL 라이브러리를 지원합니다.
그런데, OpenSSL 라이브러리가 /usr/lib에 들어있지 않고
/usr/sfw/{lib,include} 에 들어 있는 관계로 SSL을 사용하는 애플리케이션들
을 포팅해야 하는 경우 /usr/sfw/lib를 지정해주어야 하는 경우가 왕왕 있습니다.

대표적으로 rdesktop의 경우 prefix를 /usr/sfw 이외로 잡는 경우 (리눅스에
서는 흔히 /usr/local을 씁니다) 다음과 같이 선언함으로써 빌드를 할 수 있
습니다.

예) rdesktop의 빌드 예
#./configure --prefix=/usr/local --with-openssl=/usr/sfw
# gmake clean && gmake install

2007/07/20

솔라리스 10의 고정(정적) 라우팅 (Static Routing)

begin:vcard
fn:Bonghwan Kim
n:Kim;Bonghwan
email;internet:bonghwan.kim@sun.com
tel;work:82-2-2193-5225
tel;cell:82-16-325-9068
x-mozilla-html:FALSE
version:2.1
end:vcard

솔라리스 10(U3이후) 에서는 정적 라우팅을 사용하기 위해서는

/etc/inet/static_routes

라는 화일에 다음과 같은 방법으로 라우팅 정보를 입력합니다.
# comments
destination gateway

예) /etc/inet/static_routes

#CDN network
192.168.1.1 Gateway1
#Image network
10.14.48.1 Gateway2

솔라리스 10 U3 이전 버젼에서는 가장 나이스 한 방법은 라우팅을 추가해주는 SMF를 하나 추가하는 방법이 있을 수 있으며, 가장 간단한 방법은 /lib/svc/method/net-init 에 직접 routing을 추가할 수 있습니다.

김봉환/

2007/07/16

솔라리스10에서 TrueType 폰트

솔라리스 10에서는 TrueType 폰트를 설치하려면, 설치하고자 하는 환경과 사
용자의 관점에 따라 여러가지가 있을 수 있습니다. 일단, 트루타입을 어디에
서 사용하고자 하는 것입니다. 사용자 데스크탑 환경에서 쓰고 싶은 것인가?
아니면 특정 애플리케이션에서 쓰고 싶은가에 따라서 설치하는 디렉토리가 달
라질 수 있습니다.

MS-Windows를 사용해온 사용자들 입장에서는 다소 이해가 언뜻 안가는 것처럼
들릴 수 있는데, 이는 윈도우즈와 솔라리스가 제공해온 환경에 차이가 있기
때문입니다. MS-Windows는 데스크탑 환경에서 사용하는 모든 폰트를 트루타입
으로 제공하는데 여기에 사용되는 모든 폰트가 시스템 디렉토리에 저장되어
있습니다. 만약, 이때 별도의 트루타입 폰트를 가지고 있는 애플리케이션을
설치하고자 한다면 일반적으로는 사용자가 해당 애플리케이션 설치시 그 애플
리케이션이 가지고 있던 트루타입 폰트가 시스템 폰트 디렉토리에 설치가 되
게 됩니다.

따라서, 애플리케이션도 기본 시스템 폰트 디렉토리에서 자기가 원하는 폰트
를 찾아서 사용할 수 있게 됩니다. 애플리케이션에 따라서, 별도의 폰트 디렉
토리를 유지하는 경우도 있습니다.

그러나, 솔라리스는 오래전부터 멀티 유저 환경에서 사용되어 왔기 때문에,
시스템 디렉토리에 대한 쓰기 권한을 일반 사용자에게 제공해오지 않았습니
다. 따라서, root로 데스크탑을 사용해온 사용자들은 시스템 디렉토리에 해당
폰트들을 등록(복사) 해놓으면 원하는 환경(데스크탑 혹은 애플리케이션)에
가져다 쓸 수 있으나, 일반 사용자들은 시스템 트루타입 폰트 디렉토리에 쓰
기를 할 수 없으므로, 자신 사용자를 위한 별도의 디렉토리에 복사/등록해서
사용할 수 있습니다.

시스템 truetype 폰트 디렉토리는 로케일별로 흩어져 있으나, 대개 한글 관련
된 경로는
/usr/openwin/lib/locale/ko/X11/fonts/TrueType/
/usr/openwin/lib/locale/ko_KR.UTF-8/X11/fonts/TrueType/ (위 디렉토리와
동일함)
에 복사해서 집어 넣습니다. 필요에 따라서 fonts.dir와 fonts.alias를 만들
어 넣어야 합니다.

일반 사용자들은 $HOME/.fonts 디렉토리에 TrueType 폰트들을 복사한 후 로그
아웃 후 재 로그인하면 바로 사용가능하게 됩니다.

이때 등록된 트루타입 폰트들은 기본적으로 JDS(Gnome)에서 이용이 될 수 있
으며 StarOffice/StarSuite/Java와 같은 특정 애플리케이션에서 사용되어질
수 있습니다.

대개 starsuite은 시스템 전체적으로 설치되는 경우( /opt/starsuite8/ ) 별
도의 디렉토리를 ( /opt/starsuite8/share/fonts/truetype/ )를 따로 가져서
자체적인 트루타입을 가질 수 있습니다. Starsuite에서의 사용만을 목적으로
한다면 이 디렉토리에 설치를 해도 사용할 수 있습니다만 이런 경우 이 디렉
토리를 xset으로 기본 폰트 디렉토리로 등록하지 않게 되면 이 디렉토리 내에
있는 폰트들은 starsuite 이외의 애플리케이션에서는 사용할 수 없게 됩니다.

기존의 데스크탑 환경인 CDE는 TrueType 폰트를 사용하기 위해 변환(복사 및
fonts.dir / fonts.scale 생성)을 지원해주는 유틸리티를 제공한다
(/usr/dt/bin/sdtfontadm) 이 툴을 이용해서 복사된 TrueType 폰트는
$HOME/fontadm_fonts 라는 디렉토리로 복사되며, CDE 시작시 자동으로 font
path에 추가된다.

반면, JDS(Gnome)에서는 사용자용 TrueType 폰트 저장을 위해 $HOME/.fonts라
는 디렉토리를 제공하며, 별도의 툴 필요없이 복사만 하면, JDS(Gnome)이 알
아서 로딩한다. 실행 메뉴에 들어있는 폰트 관리 소프트웨어는 시스템 디렉토
리와 사용자 디렉토리의 TrueType 폰트 모두를 보여주나, 사용자 디렉토리에
들어있는 폰트에 대해서만 쓰기 권한을 제공한다.

JDS 환경에서는 유저별로는 $HOME/.fonts에, 시스템 전체로는 시스템 디렉토
리(위 참고)에 원하는 TrueType 폰트를 복사하게 되면 데스크탑 환경용 폰트
는 물론 일반 애플리케이션에서도 해당 폰트를 참조할 수 있게 된다.

2007/06/29

Solaris와 System Clock(Wall Clock) 상호 운영도

대부분의 컴퓨터는 CPU를 포함한 모든 디바이스 간의 동기화를 이용하여 시스
템 클럭을 제공합니다. 이 클럭을 기본으로 CPU, Memory , PCI bus, PCI
device등이 정확한 통신을 할 수 있도록 합니다.
사용자가 컴퓨터에 내리는 시간은 이 시스템 클럭을 커널내 소프트 클럭으로
전환하여 가지고 있습니다. 사용자가 보게 되는 date & time은 이 소프트 클
럭을 인간이 볼 수 있는 포맷으로 전환하여 보도록 해줍니다. 물론, 타임존도
고려하게 됩니다.
만약 커널의 모듈(대개 디바이스 드라이버나 커널 자체 내부 함수)에서 과부
하가 형성되게 되면, 커널 내에서 외부 클럭을 가지고 와서 내부 소프트클럭
으로 전환하는 함수의 실행에 지연이 발생할 수 있으며, 결과적으로는 시간
업데이트의 지연(drift) 현상이 발생하게 됩니다.
지연된 시간을 기반으로 date & time은 비 정확한 시간을 가질 수 있게 됩니다.
또한 배터리에 의존하는 시스템 클럭은 배터리의 수명으로 인하여 클럭의 작
동에 지장을 받을 수 있습니다. 때문에 Out-Of-Box Time(Absolute Time)을 보
장받기 위하여 NTP와 같은 네트웍 타임 소스를 사용할 수 있습니다. NTP를 사
용하더라도 시스템에서는 drift가 발생할 수 있으나, NTP는 발생되는 drift를
최소화도록 유지하도록 함으로써 NTP를 공유하는 서버들간에 시간오차가 적도
록 해줍니다.

2007/06/11

오픈솔라리스에서 dia 포팅하기

오픈솔라리스 b64a에서 dia를 포팅해서 사용하는 방법이다. 참고로 본인은 사
용자 쉘로 bash를 사용한다.(리눅스와 호환을 하기 위해서는 사용자 쉘을
bash로 하는 것이 절대적으로 필요하다.)

썬 솔라리스가 Solaris 10 U3까지는 freeware를 포팅하려면 불편한 것들이 많
았었는데 이번에 사용한 오픈 솔라리스 b64a 버젼에서는 놀라운 호환성을 보
였다. 즉, configure & gmake하면 하면 대부분 되었는데 유니코드를 지원하기
위해서 GNU xgettext가 필요했다.
PATH를 다음과 같이 우선 설정한다.
export PATH=/usr/local/bin:$PATH:/usr/sfw/bin

일단 GNU xgettext 소스를 다운 받는다
압축을 푼후 해당 디렉토리로 들어가서,
./configure --prefix=/usr/local
gmake && gmake install

컴파일이 다되면,

root 사용자로, #gmake install 해서 설치해준다.

또 /usr/bin/xgettext를 자꾸 찾을 수 있으므로 /usr/bin/xgettext를 이름을
잠깐 변경해놓고( mv /usr/bin/xgettext /usr/bin/xgettext.org ) 새로 설치
한 GNU xgettext로 링크되도록 한다. ( ln -s /usr/local/bin/xgettext
/usr/bin/xgettext)

설치가 끝나면, dia 소스를 다운 받는다. configure하기 전에 일단 환경설정
을 한다.
솔라리스도 /usr/lib/libintl.* 도 있고, /usr/local/lib/libintl.* 도 있으
므로, LD_LIBRARY_PATH=/usr/local/lib를 환경변수에 일단 등록해준다.

압축을 푼후 디렉토리로 들어가서
./configure --enable-shared --prefix=/usr/local --enable-gnome
--with-cairo --with-gnomeprint LDFLAGS="-L/usr/local/lib -R/usr/local/lib"

한다. python 플러그인을 사용하기 위해서는 --with-python을 지정하면 되는
데, 이때 dia는 python관련 소스를 재 컴파일하려고 시도한다. 불행하게 솔라
리스는 동적 오브젝트만 지원하는 관계로 libpython*.a가 지원되지 않는다.
따라서, 솔라리스에서 python 플러그인을 사용하려면 python도 새로이 받아서
설치해야 한다. 여기서는 python 플러그인을 사용하지 않는 구성을 한다.

configure가 끝나면, 바로 build를 시도한다.

#gmake && gmake install

설치가 끝난후 dia를 실행해서 정상적으로 실행하면 성공적인 포팅 끝.

* 도움이 되셨으면 애드센스 클릭해주는 센스 *

2007/06/05

Solaris 10 network Tuning Parameters(수신 시스템)

수신시 packet loss가 발생하는 이유는 대개

  1. 수신자가 충분한 버퍼를 가지고 있지 못하거나,
  2. 수신측의 인터럽트가 CPU에 의해서 충분히 잘 처리되지 않거나,
  3. 수신측에서 수신 큐에 도착한 데이타를 페치하는 과정에서 딜레이가 있거나 하는 경우입니다.

위의 기준으로 봤을때 튜닝의 요소는 다음 세가지에 해당합니다.

1) 충분한 버퍼를 확보하기 위해서
tcp_conn_req_max_q ; Anonymous access에 대한 Queue를 늘립니다.
tcp_conn_req_max_q0 ; DoS 가 아닌 접속 요청에 대한 큐를 늘립니다.
tcp_max_buf ; 이 값이 대표적으로 중요합니다.
tcp_time_wait_interval ; 접속이 끝난후 안정 종료하는데 걸리는 시간입니다. 이값이 길면 다음 접속이 어렵습니다. 이 값이 해당이 있는 지는 잘 모르겠습니다. 매 송신시 별도 접속을 하는 경우에만 사용하세요.
tcp_recv_hiwat ; 주로 수신을 받아야 하는 경우 중요합니다. ftp client 등
tcp_xmit_hiwat ; 수신과 함께 송신이 많은 경우 필요 합니다. 주로 서버의 경우.

를 조정할 필요가 있습니다.

조정의 예)
#ndd /dev/tcp tcp_conn_req_max_q 2048
#ndd /dev/tcp tcp_conn_req_max_q0 2048
#ndd /dev/tcp tcp_time_wait_interval 3000
#ndd /dev/tcp tcp_recv_hiwat 1048576
#ndd /dev/tcp tcp_xmit_hiwat 1048576
#ndd /dev/tcp tcp_max_buf 1048576


2) CPU interrupt 처리를 잘 하기 위해서는
set ip:ip_squeue_fanout=1 ; 여러 cpu를 활용합니다. set ip:tcp_squeue_wput=1  ; NIC 개수보다 CPU 개수가 훨씬 많으면 설정하는 것이 좋습니다.(option)

3) 패킷 처리 지연시간을 기본에서 0ms로 줄이려면 필요합니다. set ip:ip_squeue_wait=0 ; steam queue에서 packet drain시 지연 시간을 줄입니다.
하나씩 적용해서 테스트해보시려면 2) -> 1) -> 3)순으로 테스트하시고, 3번은 앞에까지 했는데 효과가 없는 경우에만 사용하세요.

썬의 나이아가라 시스템(일명 CMT)을 위한 튜닝을 하는 것이라면 2)번을 설정하는 것이 매우 중요합니다.

2), 3)은 /etc/system 에 변경사항을 추가해야 하며, 1)은 live로 파라메터를 변경할 수 있는 항목이므로 script화 하거나 SMF화 해서 사용하는 것이 좋습니다. 수시로 값을 변경해서 테스트할 수 있겠죠. /etc/system에 적용하는 것도 여전히 사용은 됩니다.

2007/05/28

Solaris 10 x86 IO tuning(ufs)

솔라리스10의 x86 버젼은 x86의 역사적인 이유(?)로 인하여, IDE 디스크를 사
용하는 경우에는 디스크의 모든 성능을 제대로 낼 수 없도록 되어(?)있기 때
문에 다소 튜닝할 필요가 있습니다. 솔라리스의 IDE 디스크는 기본적으로 physical device <-> ATAPI driver(SCSI HBA emulation) <-> sd(scsi disk) 와 같은 통신 방식을 사용하는데, 맨 하부의 물리적 디스크와 ATAPI 사이에서 데이타 전송시 사용하는 기본 블럭의 개수가 56으로 되어 있는데, 이 블럭을 128로 변경할 필요가 있습니다.

즉,
tunefs -a 128 /dev/rdsk/c1d0p0
tunefs -a 128 /dev/rdsk/c1d1p0
...

이 튜닝은 ufs에만 해당하면 zfs 인 경우에는 해당하지 않습니다. 또한, 이 옵션은 SATA와 SAS 디스크의 경우에는 해당되지 않습니다.

동시에 동시 전송 블럭의 수를 늘렸기 때문에 물리적인 디스크와 사용하게될 버퍼의 크기는 1M(=1048576)으로 설정할 필요가 있습니다. 다음과 같이 설정 하도록 합니다.
maxphys는 상당히 오래된 커널 변수인 관계로 최신 디스크나 어레이등을 사용 할 때는 반드시 사용하는 것이 좋습니다.

#echo "set maxphys=1048576" >> /etc/system

설정하고 재부팅이 필요합니다. 이 튜닝은 상위 화일 시스템과 상관없이 사용 하는 것이 좋습니다.

아울러, 솔라리스에서 제공하는 잉여 화일 시스템 서비스인 UFS용 access time 기록 기능을 정지시키게 되면, 화일 수가 많은 환경(web, bbs, cache ...) 에서 상당한 성능 향상을 볼 수 있습니다.

mount -F ufs -o remount,noatime /disk partition

위의 ufs 튜닝 옵션들은 모두 서비스 제공중에 설정가능한 것이나, 최적의 성능을 위해서라면 화일시스템을 새로이 구성하시는 것이 바람직합니다(구성할 때 위 옵션들을 사용하도록 구성)

* 유용하셨으면 AdSense 살짝 클릭해주세요 *

2007/05/07

Solaris 10 Update 3의 새로운 기능 "Secure by Default"

솔라리스 10 U3에는 여러 가지 기능이 좋아졌습니다만, 그 중에서 가장 독특한 기능의 변화는 Trusted Extension이라는 보안 강화 기능인데 , 이는 미군에서 요구하는 보안 등급을 준수하게 해주는 보안 강화 기능으로 매우 강력한 보안 구성 환경으로써, 실제로 이 기능을 구성하여 가동할 수 있다면, 웬만한 보안 소프트웨어는 거의 살 필요가 없을 정도입니다. 이 기능은 다소 복잡한 구성에 대한 이해가 필요하니 별도로 소개를 하도록 하겠습니다. 아울러, 솔10 U3는 보안을 위해서 "Secure By Default"라는 기능을 추가로 제공하고 있는데, 이름 자체에서 언급하는 의미 그대로를 해석하면, "기본적으로 보안이 강화된" 이라고 볼 수 있겠습니다.

최근에 솔라리스는 소스가 공개되었고, 이에 따른 솔라리스 소스의 문제점을 찾아내어 해킹을 시도하는 사례가 증가될 수 있다는 판단이 있었던 것 같습니다. 리눅스가 오픈 소스하에서 이런 문제때문에 상당히 괴롭힘을 당해왔다는 것을 생각해보면 쉽게 이해할 수 있는 일이라 할 수 있겠습니다.

따라서, 솔라리스10 U3(11/2006) 설치 과정중에는 Secure By Default를 하겠냐고 물어보는 과정이 있습니다. 이 과정에 동의를 하고, 구성을 사용하게 되면 솔라리스는 외부 접속을 위해서 ssh를 제외한 모든 원격 접속 서비스인 telnet, XDMCP 서비스등을 모두 disable 되거나 localhost에게만 허용하도록. 때문에, 그 이전 버젼을 사용하던 사용자들은 이런 내용의 사전 습득이 없으면 다소 당황할 수 있게 됩니다.

현재 모드를 알 수 있는 방법은 없으며, 관련 네트웍 서비스를 모두 오픈(사용할 수 있도 하거나) 혹은 '제한'을 두는 두가지의 명령만 있습니다. 사용법은

#/usr/sbin/netservices open
혹은
#/usr/sbin/netservices limited

입니다.

솔라리스10을 정상 설치후 telnet 서비스나 혹은 X-window 관련 서비스가 정상적으로 작동이 되지 않는다면 위의 명령어로 서비스를 오픈한 후 사용하시면 됩니다.

그러나, 안정적인 보안환경을 유지 및 사용하기 위해서는 ssh를 사용할 것을 강력하게 권고합니다.
ssh와 함께 제공되는 데이타 암호화 툴을 이용함으로써 tcp spoofing이나 암호 데이타의 snooping등을 원천적으로 봉쇄할 수 있게됩니다.

복수개의 노드를 관리하기 위해서 rlogin, rsh, rcp등을 사용하던 사용자들도 ssh기반의 환경으로 옮겨서 사용할 것을 강력하게 권고합니다.

기능
unsecured 방법
Secured 방법

터미널 접속 서비스
telnet
ssh

원격 실행
rsh,rexec
ssh

화일 전송
rcp,ftp
scp, sftp

X Window 접속 및 Display
XDMCP
ssh -X


솔라리스의 ssh 서비스를 이용하기 위해서는 일반 사용자를 만들어서 사용하는 것이 바람직합니다. 솔라리스10 Update3에서 설치과정중 "Secure By Default"를 사용하는 것으로 설정하게 되면, 서버는 telnet으로 접속할 수 없게 되어 ssh를 사용해야 하는데, 솔라리스 개발자가 잠깐 졸았는지(?) ssh 서버가 root access를 허용하지 않도록 구성되어 있습니다.

따라서, root로 접속할 수 없게 되는 것이죠. 때문에, 설치를 정상적으로 한후, console(콘솔)에서 ssh 서버가 root로 로그인하는 것을 하용하도록 구성을 변경할 필요가 있습니다. 구성하는 법은 다음과 같이 합니다.

#cp /etc/default/login /etc/default/login.backup
#sed 's/CONSOLE=/#CONSOLE=/g' /etc/default/login > /tmp/login
#cp /tmp/login /etc/default/login

#cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
#sed 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config > /tmp/sshd_config
#cp /tmp/sshd_config /etc/ssh/sshd_config
#svcadm restart ssh

와 같이 실행함으로써 ssh가 root로 로그인할 수 있도록 할 수 있습니다.

X-window 로그인이나 애플리케이션 화면출력(Display)를 위해서는 클라이언트쪽(PC나 노트북등)에 X server를 지원하는 운영체제(solaris, linux)를 사용한다면 ssh -X를 쉽게 사용할 수 있습니다. 만약, windows나 Mac을 사용하는 경우라면 ssh -X를 이용한 원격 디스플레이를 지원하는 X server 에뮬레이션 소프트웨어를 사용하셔야 합니다.

* 도움이 되었으면 Google AdSense 살짝 찍어주세요 *

2007/04/26

Solaris10 x86의 제한(limit) 점

Max # of CPUs
오픈 솔라리스에 있는 코드를 보면 알 수 있는 것인데,
amd64 아키텍쳐, 즉 64비트 x86 머쉰에서는 64개의 CPU를 운영하도록 '하드코
딩'되어 있으며 x86 아키텍쳐, 즉 32비트 x86 머쉰에서는 32개의 CPU를 운영
하도록 '하드코딩'되어 있다.

여기서 amd64 아키텍쳐라고 해서, amd CPU만 해당되는 것이 아니다. Intel의
64bit 머쉰(EM64T)들도 솔라리스는 amd64로 인식하기 때문에, 인텔의 64비트
지원 CPU들의 시스템에서는 최대 64개의 CPU를 구동할 수 있도록 되어 있다.

CPU가 이렇게 많다고 해서 성능이 다 좋아지는 것은 아니며, 하부의 하드웨어
아키텍쳐가 이만한 CPU를 잘 동작시킬 수 있는 구조를 가지고 있어야 한다.

Max # of RAM
메모리는 2TB RAM을 운영할 수 있는 스팍용 솔라리스와는 달리 x86용은 128GB
를 운용할 수 있도록 되어 있는데, 이는 CPU 구조와 밀접한 관련이 있다. 스
팍은 완전한 64bit 가상 메모리 지원 구조를 가지고 있는 반면에 x86은 그렇
지 않기 때문에 그런 것이다.

Maximum threads
예전 x86용 솔라리스에서는 최대 8000개의 스레드밖에 만들 수가 없었으나 지
금은 스레드의 개수는 완전히 시스템이 장착하고 있는 메모리의 양에 의해서
만 제한이 된다. 스레드의 기본 stack(스택) 사이즈는 1M 씩 잡혀 있으므로,
32비트의 스레드를 3만개(30,000)를 만들려면 30GB의 스택 공간이 필요하게
되므로 실행이 불가능해진다. 따라서, 이렇게 많은 스레드를 구동시키려면 기
본 스택 사이즈를 매우 작게 만들어야 한다.

2007/04/18

Dtrace와 Java : Java를 Dtrace로 해부해볼 수 있을까?

어려운 문제다.
Dtrace를 만든 3명중에 한명인 Adam 조차도 Java를 dtrace로 완전히 분해하는 게
어렵다고 했다. 그나마 JDK 1.6이후에는 솔라리스10의 jvm이 dtrace probe를 지원하게
되서 훨씬 쉬어지긴 했지만 말이다.

JDK 1.6.x이전에는 java vm은 운영체제 입장에서 독립적인 프로세스이면서, 내부적으로는 자바 애플리케이션을 실행시켜주는 머신 역할을 하고 있어서, 실제로 jvm의 애플리케이션인 java의 thread들은 운영체제에서 정확하게 무슨일을 하는지 알 수가 없었다.  그래서, jvm을 블랙박스라고 했다.

안에  어떤일이 일어나는 지 모르는 상태에서 jvm의 그 자체에 대고 dtrace 때려봐야 코끼리 뒷다리 만지기식이었다고 할까.

그래서, JDK 1.4.x와 JDK 1.5.x에서는 jvm이 구동될때 dtrace로 추적이 가능하도록 하는 플러그인 모듈(JNI 인터페이스)이 오픈 소스 프로젝트로 개발되었는데 성능이 워낙  후지다 보니, 욕을 많이 먹는 와중에 jdk 1.6.x이 발표되면 흐지 부지 되었다.

기술적으로는 운영체제에서는 jvm 안에 있는 thread의 움직임을 알수가 없으므로 jvm이 내부의 움직임을 외부 운영체제에 알려주어야만 운영체제에서는 무언가를 해볼 수가 있다. 그나마, 솔라리스8에서 솔10이 되면서 Thread-to-LWP 할당 방식이 1-to-1이 되었기 때문에 Java Thread를 운영체제에서 어느 정도 알게 된것이 발전이라면 발전이다. (참고 pstack, jstack)

JDK 1.5이전에는 java vm이 dtrace에게 java application에 대한 정보를 제공해주기 위해서 java vm이 제공하는 JNI기반의 DVMTI라는 trace interface module을 통하여 dtrace를  지원했었다. (https://solaris10-dtrace-vm-agents.dev.java.net/ )

그러나, 이 모듈은 매우 심각한 오버헤드로 많은 자바 개발자들로 하여금 경악을 금치 못하게함으로써 많은 사용이 되지 않았으며, 그러는 동안에 jdk 1.6 버젼에서 외부 trace를 위한 기능이 대폭적으로 개선되면서, 솔라리스용 java vm 1.6.x는 특별히 자체적으로(natively) dtrace를 지원하도록 개선되었다.

쉽게 얘기하면, jdk 1.6대를 사용해서 무언가를 돌리고 있으면, 애플리케이션은 자동적으로 java vm의 hotspot vm의 dtrace probe(검사 포인트)를 실시간 등록을 해준다. 때문에, java vm 로딩은 다소 좀 늦어지긴 했으나, 모니터링 부분에서는 혁신적인 발전이 제공되었다고 볼 수 있다.

아울러 jdk 1.6이 제공하는 trace 확장 기능은 java vm 자체의 모니터링 및 trace 기능도 발전시켜서 아주 화려한 툴들을(jconsole, demo/JTop, demo/MemoryManagement) 기본적으로 제공함에 따라 dtrace의 필요성이 많이 감소해졌다. ㅡ.ㅡ;

jconsole


그러나, 여전히 dtrace는 막강하다. 애플리케이션의 문제를 논리적으로 접근하는 힘은 어디에서나 강할뿐 아니라, jdk 1.6이 java thread의 procedure에 대한 정보를 모두 노출함으로써 dtrace적 논리로 문제의 근원을 찾아볼 수 있게 되었다.

freemind라는 java application을 jdk 1.6으로 실행했을 경우이다.
bash-3.00# pgrep freemind
2352
bash-3.00# ptree 2352
2352  /bin/bash /usr/sfw/bin/freemind.sh ; freemind를 실행시켜 주는 쉘이다.
  2356  /usr/bin/java -Dfreemind.base.dir=/usr/sfw/lib/freemind-bin-max-0.8.0/ ; 실제 freemind.jar의 java pid
bash-3.00# dtrace -l | grep 2356 | c++filt | tail
62071 hotspot_jni2356        libjvm.so jni_UnregisterNatives UnregisterNatives-entry
62072 hotspot_jni2356        libjvm.so jni_UnregisterNatives UnregisterNatives-return
62073 hs_private2356         libjvm.so void VM_CMS_Initial_Mark_Operation::doit() cms-initmark-begin
62074 hs_private2356         libjvm.so void VM_CMS_Initial_Mark_Operation::doit() cms-initmark-end
62075 hs_private2356         libjvm.so void VM_CMS_Final_Remark_Operation::doit() cms-remark-begin
62076 hs_private2356         libjvm.so void VM_CMS_Final_Remark_Operation::doit() cms-remark-end
62077 hs_private2356         libjvm.so HashtableEntry*Hashtable::new_entry(unsigned,oopDesc*) hashtable-new_entry
62078 hs_private2356         libjvm.so void RuntimeService::record_safepoint_begin() safepoint-begin
62079 hs_private2356         libjvm.so void RuntimeService::record_safepoint_end() safepoint-end
62356 hotspot_jni2925        libjvm.so jni_GetCharArrayRegion GetCharArrayRegion-return


(  c++filt는 Sunstudio를 설치해야만 제공되는 C++ name demangle 유틸이다./opt/SUNWspro/bin에 있다.  )

java가 pid 2356의 dtrace probe를 위한 probe point를 대거 등록해놓은 것이 보인다.
이중에서 hotspot_jni2356으로 등록되어 있는 probe statement가 중요하다. 실제 자바 애플리케이션의 함수들을 trace할때 필요하다.

그러면, freemind라는 java application을 dtrace할 수 있게 되었다. dtrace 해주자. ;-)
#dtrace -n 'hotspot_jni2925:::{@[probefunc]=count()}' ; pid 2925가 가장 일을 많이 하는 함수를 프린트하자.
...
  jni_IsAssignableFrom                                           1984
  jni_GetSuperclass                                              2388
  jni_IsInstanceOf                                               3818
  jni_SetIntArrayRegion                                         27688
  jni_GetByteArrayElements                                      28064
  jni_MonitorEnter                                              28064
  jni_MonitorExit                                               28064
  jni_ReleaseByteArrayElements                                  28064
  jni_GetArrayLength                                            36036
  jni_GetPrimitiveArrayCritical                                 38248
  jni_ReleasePrimitiveArrayCritical                             38248
  jni_CallStaticVoidMethod                                      69000


이렇게 나온다. 햐! 엄청 좋아졌다.
그러면, 가장 많은 부하를 제공하고 있는
jni_CallStaticVoidMethod()가 호출되는 어떤 경우일까? 또 dtrace해주자 !

#dtrace -n 'hotspot_jni2925::jni_CallStaticVoidMethod:CallStaticVoidMethod-entry{@[jstack()]=count()}'
몇가지 경우가 나타났다.

...
              libjvm.so`jni_CallStaticVoidMethod+0xe0
              libmawt.so`X11SD_Lock+0x43
              libawt.so`Java_sun_java2d_loops_MaskFill_MaskFill+0x96
              sun/java2d/loops/MaskFill.MaskFill(Lsun/java2d/SunGraphics2D;Lsun/java2d/SurfaceData;Ljava/awt/Composite;IIII[BII)V*
              sun/java2d/pipe/AlphaColorPipe.renderPathTile(Ljava/lang/Object;[BIIIIII)V*
              sun/java2d/pipe/DuctusShapeRenderer.renderPath(Lsun/java2d/SunGraphics2D;Ljava/awt/Shape;Ljava/awt/BasicStroke;)V*
              sun/java2d/pipe/DuctusShapeRenderer.fill(Lsun/java2d/SunGraphics2D;Ljava/awt/Shape;)V*
              sun/java2d/pipe/PixelToShapeConverter.fillRect(Lsun/java2d/SunGraphics2D;IIII)V*
              sun/java2d/S
              0xfc6a5f35
              0xfc402e9d
              0xfc6dc99d
              0xfc402e9d
              0xfc402e9d
              0xfc758abc
              0xfc76f8fa
              0xfc402c71
              0xfc402c71
              0xfc6947fe
              0xfc782015
              0xfc75cc9c
              0xfc402e9d
              0xfc402e9d
              0xfc402e9d
              0xfc768b95
              0xfc699bb4
              0xfc5cd0d0
              0xfc402c71
              0xfc402e9d
              0xfc402e9d
              0xfc402e9d
              0xfc402e9d
              0xfc400202
              libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3
              libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27
              libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f
              libjvm.so`__1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_+0xc1
              libjvm.so`__1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_+0x7e
              libjvm.so`__1cMthread_entry6FpnKJavaThread_pnGThread__v_+0xd2
              libjvm.so`__1cKJavaThreadRthread_main_inner6M_v_+0x4c
              libjvm.so`__1cKJavaThreadDrun6M_v_+0x196
              libjvm.so`java_start+0xd3
              libc.so.1`_thr_setup+0x52
              libc.so.1`_lwp_start
             1006

              libjvm.so`jni_CallStaticVoidMethod+0xe0
              libmawt.so`X11SD_Unlock+0x1d4
              libawt.so`Java_sun_java2d_loops_MaskFill_MaskFill+0x20c
              sun/java2d/loops/MaskFill.MaskFill(Lsun/java2d/SunGraphics2D;Lsun/java2d/SurfaceData;Ljava/awt/Composite;IIII[BII)V*
              sun/java2d/pipe/AlphaColorPipe.renderPathTile(Ljava/lang/Object;[BIIIIII)V*
              sun/java2d/pipe/DuctusShapeRenderer.renderPath(Lsun/java2d/SunGraphics2D;Ljava/awt/Shape;Ljava/awt/BasicStroke;)V*
              sun/java2d/pipe/DuctusShapeRenderer.fill(Lsun/java2d/SunGraphics2D;Ljava/awt/Shape;)V*
              sun/java2d/pipe/PixelToShapeConverter.fillRect(Lsun/java2d/SunGraphics2D;IIII)V*
              sun/java2d/S
              0xfc6a5f35
              0xfc402e9d
              0xfc6dc99d
              0xfc402e9d
              0xfc402e9d
              0xfc758abc
              0xfc76f8fa
              0xfc402c71
              0xfc402c71
              0xfc6947fe
              0xfc782015
              0xfc75cc9c
              0xfc402e9d
              0xfc402e9d
              0xfc402e9d
              0xfc768b95
              0xfc699bb4
              0xfc5cd0d0
              0xfc402c71
              0xfc402e9d
              0xfc402e9d
              0xfc402e9d
              0xfc402e9d
              0xfc400202
              libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3
              libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27
              libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f
              libjvm.so`__1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_+0xc1
              libjvm.so`__1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_+0x7e
              libjvm.so`__1cMthread_entry6FpnKJavaThread_pnGThread__v_+0xd2
              libjvm.so`__1cKJavaThreadRthread_main_inner6M_v_+0x4c
              libjvm.so`__1cKJavaThreadDrun6M_v_+0x196
              libjvm.so`java_start+0xd3
              libc.so.1`_thr_setup+0x52
              libc.so.1`_lwp_start
             1010

그 중에 가장 호출 빈도수가 높은 경우는 위와 같다. (c++filt를 쓰지 않아서 mangling 되어있다)
자바가 화면에 새로 그리기 위해서 호출이 많은 것 같다(필자는 자바 전문가가 아니라서 자세히 설명하진 못하겠다. 하지만, 애플리케이션 그래픽 프로그램이고 이벤트를 받지 않으면 별로 하는 일이 없기 때문에 이렇게 나오는게 아닌가 싶다.)

mangling이 답답하다면 demangle 해서 보자.

자바를 아는 자바 전문가들에게는 진짜 필요한 툴이 아닌가 싶다.
참고로, dtrace는 솔라리스10에서만 사용가능하므로, 솔라리스에서만 이렇게 dtrace를 통한 java trace가 가능하다.

문제를 알았다면, 이제 자바 전문가를 불러서 해결해달라고 하자. ㅡ.ㅡ;

Dtrace 활용하기 : Xorg의 버그 finding

오픈 솔라리스를 쓰다보면 확실히 많은 버그에 시달리게 된다. 그나마 썬 솔라리스는 패치도 제공해주고 하니, 가끔씩 패치하면 버그가 줄어드는 것을 볼 수가 있는데, 오픈 솔라리스는 그것도 못하니 새로 깔아야 한단 얘긴데... 참으로 귀찮은 일이 아닐 수 없다.

한편으론 dtrace를 활용하면서 배워보려고 하는 사람들에겐 아주 좋은 환경이 아닐 수 없다.
여기 저기 떠돌아다니는 버그들 덕분에 dtrace 활용율을 늘릴 수는 있을 테니 말이다.

오늘은 firefox 2.0 영문 브라우저를 쓰고 있는데, 미디어 다음 사이트를 접속만 하면 시스템의 CPU가 버닝아웃될 지경이다.(참고로 내 시스템은 Mobile Athlon 3000+/amd64/2G from Acer )

그래서, dtrace로 Xorg의 어느 부분이 문제인지 찾아보고 싶어졌다. 평소에는 바뻐서 그냥 죽였다 다시 살리곤 했는데, 오늘은 시간이 좀 되는 관계로...
prstat상으로 보면, 나는 브라우저를 사용하고 있는데, CPU 점유는 Xorg가 거의 다하고 있다.
Xorg가 누구 때문에 이렇게 열심히 일하는 지를 보려면 /usr/demo/dtrace/whofor.d를 이용하면
쉽게 추측할 수 있다(물론, prstat만 가지고도 어느 정도 예측할 수 있지만  말이다)

#dtrace -s /usr/demo/dtrace/whofor.d

firefox-bin sleeping on Xorg:

           value  ------------- Distribution ------------- count
            2048 |                                         0
            4096 |                                         5
            8192 |@@@@@@@@@@@@@@@                          6102
           16384 |@@@@@@@@@@@@@                            5053
           32768 |@@@@                                     1703
           65536 |@@@                                      1057
          131072 |@                                        587
          262144 |@                                        358
          524288 |@                                        199
         1048576 |@                                        288
         2097152 |@                                        244
         4194304 |                                         148
         8388608 |                                         43
        16777216 |                                         15
        33554432 |                                         16
        67108864 |                                         2
       134217728 |                                         0


챠트상으로 나온 결과를 보면, firefox가 잦은 횟수로 Xorg에 CPU를 빼앗기고 있다.
firefox가 Xorg에 부담을 주고 있는 것으로 예측할 수 있다.

그럼 Xorg의 뭐가 잘못되서 CPU를 이렇게 쓰는 것인지 궁금해졌다. '도대체 Xorg를
왜 이렇게 만들어가지설라무네...'
일단 CPU를 과점하고 있는 Xorg의 pid로 pstack을 찍어봤다. 흠...
Xorg의 문제인지, shared library의 문제인지가 궁금하기 때문이다.
_XSERVTransSocketRead() 란 함수가 불려지고 있는 것으로 나오는데 이게 어느 라이브러리에 붙어있는 것인지 알 수가 없다.

dtrace를 떴다.
#dtrace -b 2g  -n 'pid$target::_XSERVTransSocketRead:entry{ustack();}' -p `pgrep Xorg`
Xorg의 문제이다.

여기서 _XSERVT* 함수가 불릴때만 문제가 되는 것인지 확정할 수 없다. 일단 Xorg가 문제임으로 Xorg의 Sub function들을 대상으로 호출 회수 상태를 알고 싶어졌다. 다시 dtrace를 했다.

#dtrace  -n 'pid$target:Xorg::entry{@[probefunc]=count()}' -p `pgrep Xorg`
Xalloc, Xfree를 과도하게 하고 있는 것이 보인다.
이 함수는 둘다 Xorg의 메모리 할당과 해제를 위한 함수인데, 뭐 때문에 메모리 할당 해제를
이렇게 심하게 반복할까? 궁금해진다. 다시 dtrace를 돌렸다.

Xalloc이 호출될때, 어떤 stack을 경유해서 Xalloc() 이 호출되는 지 궁금하기 때문이다.
이 부분을 알게 되면, Xorg의 문제의 중요 부분을 알 수 있겠다 싶다.

# dtrace  -n 'pid$target:Xorg:Xalloc:entry{@[ustack()]=count();}' -p `pgrep Xorg`
              Xorg`Xalloc
              libxaa.so`XAAInitPixmapCache+0x72b
              Xorg`localAllocateOffscreenArea+0x63
              Xorg`xf86AllocateOffscreenArea+0x36
              libxaa.so`XAACreatePixmap+0x226
              Xorg`ProcCreatePixmap+0xff
              Xorg`Dispatch+0x2d2
              Xorg`main+0x4de
              Xorg`_start+0x7a
             1932

              Xorg`Xalloc
              libxaa.so`XAAValidateGC+0x305
              Xorg`damageValidateGC+0x40
              Xorg`ValidateGC+0x1a
              Xorg`ProcPolyFillRectangle+0x101
              Xorg`Dispatch+0x2d2
              Xorg`main+0x4de
              Xorg`_start+0x7a
             3281

              Xorg`Xalloc
              Xorg`miRegionCreate+0xf
              Xorg`miComputeCompositeClip+0x98
              libfb.so`fbValidateGC+0x63
              Xorg`miBSCheapValidateGC+0x89
              libxaa.so`XAAValidateGC+0x63
              Xorg`damageValidateGC+0x40
              Xorg`ValidateGC+0x1a
              Xorg`ProcPolyFillRectangle+0x101
              Xorg`Dispatch+0x2d2
              Xorg`main+0x4de
              Xorg`_start+0x7a
             3382

              Xorg`Xalloc
              Xorg`AddResource+0xda
              Xorg`ProcCreateGC+0xbd
              Xorg`Dispatch+0x2d2
              Xorg`main+0x4de
              Xorg`_start+0x7a
             4191

              Xorg`Xalloc
              Xorg`CreateGC+0x1a
              Xorg`ProcCreateGC+0xa5
              Xorg`Dispatch+0x2d2
              Xorg`main+0x4de
              Xorg`_start+0x7a
             4191

              Xorg`Xalloc
              Xorg`miRectsToRegion+0x13
              Xorg`miChangeClip+0x35
              Xorg`miBSCheapChangeClip+0x27
              libxaa.so`XAAChangeClip+0x43
              Xorg`damageChangeClip+0x44
              Xorg`SetClipRects+0xe1
              Xorg`ProcSetClipRectangles+0x87
              Xorg`Dispatch+0x2d2
              Xorg`main+0x4de
              Xorg`_start+0x7a
             4949

              Xorg`Xalloc
              Xorg`SetClipRects+0x3f
              Xorg`ProcSetClipRectangles+0x87
              Xorg`Dispatch+0x2d2
              Xorg`main+0x4de
              Xorg`_start+0x7a
             4949

              Xorg`Xalloc
              libxaa.so`XAADoGlyphs+0x5b7
              libxaa.so`XAAGlyphs+0x95
              Xorg`damageGlyphs+0x337
              Xorg`CompositeGlyphs+0x13e
              Xorg`ProcRenderCompositeGlyphs+0x347
              Xorg`ProcRenderDispatch+0x26
              Xorg`Dispatch+0x2d2
              Xorg`main+0x4de
              Xorg`_start+0x7a
             6327



다시 dtrace를 돌렸다.
흠... 끝의 다섯개의 스택에 관심이 갔다. 특히, 마지막 스택을 유념하게 보게된다.
그 앞의 스택의 호술 횟수(4949)보다 50%이상 많다(6327)

ProcRenderCompositeGlyphs() Glyphs 이라.. 어라, 이건 폰트 문제인데... Glyphs를 damage()
한후 libxaa에 있는 XAAGlyphs를 다시 호출하느라 메모리를 할당하고 있네...
왜 이러지 미쳤나? xaa 라이브러리는 True type 폰트를 위한 anti-aliasing 라이브러리이다.
firefox가 열려고 시도한 웹페이지에서 지정한 true-type 폰트의 anti-aliasing 때문에
생긴 것일까?

어느 정도 원인은 파악했다. 역시 dtrace다 !!!

그런데, 이걸 어떻게 해결해야 하나...가 고민이다. Xorg를 업그레이드 해야 하나? 솔라리스를 다시 깔아야 하나? 아니면, 옵션 변경으로 할 수 있을까?

여기서부터는 dtrace문제 밖인데... 웬지 dtrace가 해결까지 해줬으면 좋겠다는 꿈을 꿔본다.

"도움이 되셨으면 구글 애드센스 살짝 눌러주는 센스를 기대하겠습니다"



2007/04/16

윈도우즈 비스타에서 NTFS 크기 변경

비스트가 설치되어 있는 시스템에서 솔라리스를 설치하려면 일단 디스크 파티
션을
재조정할 필요가 있습니다. 포맷되어 있지 않은 디스크 영역이 있다면 모를까
일반적으로는 시스템이 공급될때 부터 하나의 디스크 혹은 볼륨으로 구성되어서
오므로, 솔라리스나 리눅스를 설치하고자 한다면, 파티션을 새로이 조정해야
하는데

윈도우즈 비스타이전에는 파티션 매직이나 Gparted와 같은 제3의 유틸리티 혹은
오픈 소스 유틸리티를 이용하여 다시 파티셔닝을 했었습니다. 그러나, 비스타
에서는
파티션을 재조정할 수 있는 툴을 자체적으로 제공합니다.

이 툴을 이용하여 100% 사용하고 있는 NTFS 파티션을 10GB 줄이게 되면, 10GB
규모의
빈공간의 디스크가 나오게 되는데, 이공간에 솔라리스를 설치하면 됩니다.

NTFS 확장이나 축소를 위한 툴은 Control Panel(제어판) -> System and
Management(시스템 관리) -> Administrative Tools(관리툴) -> Computer
Management(컴퓨터 관리) -> Disk Management(디스크 관리)

에서 접근 가능합니다. 사용방법 별로 어렵지 않으며, 마우스 우측 버튼을 통
하여 쉽게 해결할 수 있습니다. 명령어로도 가능합니다.

원래 소스는 아래 페이지를 참고하세요.
http://www.bleepingcomputer.com/tutorials/tutorial133.html

* 도움이 되셨다면 위 Google Adsense 살짝 클릭해주는 센스 기대합니다. *

2007/03/15

2007 US New Summer Time & Patch

미국의 Daylight(aka. 서머타임)의 변경일이 금년 2007년부터 앞당겨졌습니다.
예전에는 4월인가 5월부터 였는데, 금년부터는 3월에 하는 것으로 바뀌었습니다.

따라서, global time을 참고해야할 서버들은 시간이 맞지 않게됩니다.
여러 고객들에게 매우 중요한 일이므로 필히 아래 url을 참고하신 후
관련 패치를 받으시라고 전달해주시기 바랍니다.

Time의 변경은 단순 소프트웨어 뿐 만 아니라, 하드웨어(시스템 컨트롤러등)에도
치명적인 변화를 요하므로 고객들로 하여금 꼭 사전에 Patch Management Time을
잡아서 필요한 Patch를 모은후 Patch할 수 있도록 유도하시기 바랍니다.

솔라리스 10은 122032-04(SPARC) 122033-04(x86)를 설치해야 합니다.
패치를 받을려면 당연히 썬의 서비스 계약이 이루어져 있어야 합니다.

solaris 및 썬 관련 모든 TimeZone 패치 정보는

여기를 참고하세요.
http://www.sun.com/bigadmin/hubs/dst/

2007/02/23

Solaris 에서 read_vtoc()의 사용

솔라리스는 예전의 작은 디스크들의 레이블로 SMI label을 사용했었는데요. 스토리지가 커지면서 LUN 기반의 스토리지나 zfs와 같은 초대형 스토리지 및 화일 시스템을 지원하기 위해서 EFI label이라는 것이 새로 생겼습니다.

read_vtoc() 시스템 콜은 예전에 SMI로 label 되었거나 새로운 Label인 EFI중의 2**32-1보다 작은 블록을 가진 디스크에 대해서만 사용할 수 있게되어 있으며, 새로이 EFI label을 사용하는 스토리지나 디스크의 경우에는 efi 인터페이스를 사용해서 vtoc를 읽어오도록 되어 있습니다.

즉, read_vtoc를 사용했다면 대신에 efi_alloc_and_init(3EXT)을 사용해서 소스를 새로이 변경하셔야 합니다.
코딩은 다음의 소스를 참고해서 작성하시면 될 겁니다. 다음은 i_label의 디스크를 읽는 방법을 담은 소스(opensolaris.org에서 퍼옴)입니다. 참고삼아, 작성하시길 바랍니다.

아래 소스 코드에는 없습니다만 efi_alloc_and_read로 vtoc를 리턴받으신 후 사용하신 후에는 반드시 efi_free()로 해당 vtoc를 free 시키셔야 합니다. 참고 man efi_alloc_and_read.3ext

도움이 되셨다면 위의 광고 한번 살짝 클릭해주세요.

630 * readefi(): Read a partition map.
631 */
632 static int
633 readefi(int fd, char *name, struct dk_gpt **efi)
634 {
635 int retval;
636
637 if ((retval = efi_alloc_and_read(fd, efi)) >= 0)
638 return (0);
639
640 switch (retval) {
641 case (VT_EIO):
642 return (warn(name, "Unable to read VTOC"));
643 case (VT_EINVAL):
644 return (warn(name, "Invalid VTOC"));
645 case (VT_ERROR):
646 return (warn(name, "Unknown problem reading VTOC"));
647 }
648 return (retval);
649 }

/* 내부 작동 원리 : libelf */
203 efi_alloc_and_read(int fd, struct dk_gpt **vtoc)
204 {
205 int rval;
206 uint32_t nparts;
207 int length;
208
209 /* figure out the number of entries that would fit into 16K */
210 nparts = EFI_MIN_ARRAY_SIZE / sizeof (efi_gpe_t);
211 length = (int) sizeof (struct dk_gpt) +
212 (int) sizeof (struct dk_part) * (nparts - 1);
213 if ((*vtoc = calloc(length, 1)) == NULL)
214 return (VT_ERROR);
215
216 (*vtoc)->efi_nparts = nparts;
217 rval = efi_read(fd, *vtoc);
218
219 if ((rval == VT_EINVAL) && (*vtoc)->efi_nparts > nparts) {
220 void *tmp;
221 length = (int) sizeof (struct dk_gpt) +
222 (int) sizeof (struct dk_part) *
223 ((*vtoc)->efi_nparts - 1);
224 nparts = (*vtoc)->efi_nparts;
225 if ((tmp = realloc(*vtoc, length)) == NULL) {
226 free (*vtoc);
227 *vtoc = NULL;
228 return (VT_ERROR);
229 } else {
230 *vtoc = tmp;
231 rval = efi_read(fd, *vtoc);
232 }
233 }
234
235 if (rval < 0) {
236 if (efi_debug) {
237 (void) fprintf(stderr,
238 "read of EFI table failed, rval=%d\n", rval);
239 }
240 free (*vtoc);
241 *vtoc = NULL;
242 }
243
244 return (rval);
245 }

2006/11/23

Brandz configuration guide : 솔라리스(x86)에서 레드햇 리눅스를 돌리자 !!!


일단, 디렉토리를 두개 만듭니다.
1) mkdir /zone
2) mkdir /zone/shared ; (나중을 위해서 만들어줌)

첨부되어 있는 redhat3.zfg 화일 안에서, bge0의 ip 주소를 원하시는 ip로 변
경하십니다. 이때 ip는 솔라리스 설치시 할당했던 ip와 같은 네트웍대의 ip를 주셔야 합니다.

그런 다음 다음과 같이 실행합니다.

3)#zonecfg -z redhat3 -f redhat3.zfg

구성이 정상적으로 끝났으면, 다음 명령으로 확인할 수 있습니다.
#zoneadm list -cv

4) 구성된 가상 서버에 설치를 하려면 다음과 같이 합니다.
#zoneadm -z redhat3 install

잠시 있다가, redhat enterprise linux 3의 첫번째 CD를 넣으라고 나옵니다.
CD를 넣으시고, 잠시 있으시면, CD1의 목록을 스캔하고, CD2,CD3,CD4를
넣으라고 한후, 다시 CD1부터 넣으라고 나옵니다. 그때부터, 실제 패키지들을
설치합니다.

모두 설치가 끝나면 리눅스 컨테이너를 부팅한 후 로그인해보실 수 있습니다.
5) 레드햇 존 부팅
#zonecfg -z redhat3 boot

6) 로그인은 콘솔 로그인과 일반 로그인이 있습니다. 이는 텔넷을 사용하지
않고 로그인을 하는 방법입니다. 물론, ip를 이용해서 네트웍으로 로그인하실
수도 있습니다.

; 콘솔로그인
#zlogin -C redhat3
; 비 콘솔 로그인
#zlogin redhat3

최초 설치에 root는 패스워드가 없습니다. 설정하시고, root를 사용하진 마시고
일반 사용자로 사용하시기 바랍니다.

설치하는 과정은 두번째 첨부에 나와있습니다. 참고하십시요.

도움이 되셨다면 위의 광고한번 살짝 클릭해주세요.


----- redhat3.zfg

create -b
set zonepath=/zone/redhat3
set brand=lx
set autoboot=true
add net
set address=172.168.1.2/24
set physical=bge0
end
add attr
set name=audio
set type=boolean
set value=true
end



--- brandz installation process : zoneadm -z redhat3 install

bash-3.00# zoneadm -z redhat3 install
Please insert disc 1 in the removable media drive and press
<ENTER>

Installing cluster 'desktop'

You will need discs 1 - 4 to fully install
"Red Hat Enterprise Linux 3"

Please insert disc 2 in the removable media drive and press
<ENTER>

Installing zone miniroot.
Attempting to expand 30 RPM names...
Please insert disc 3 in the removable media drive and press
<ENTER>

Attempting to expand 1 RPM name
Please insert disc 4 in the removable media drive and press
<ENTER>

Attempting to expand 1 RPM name
Please insert disc 1 in the removable media drive and press
<ENTER>

Attempting to expand 1 RPM name
Setting up the initial lx brand environment.
System configuration modifications complete!
Duplicating miniroot; this may take a few minutes...
Booting zone miniroot...
Miniroot zone setup complete.
Please insert disc 2 in the removable media drive and press
<ENTER>

Attempting to expand 664 RPM names...

Installing zone 'redhat3' from disc 2.
Installing 475 RPM packages; this may take several minutes...

Please insert disc 3 in the removable media drive and press
<ENTER>

Attempting to expand 189 RPM names...

Installing zone 'redhat3' from disc 3.
Installing 148 RPM packages; this may take several minutes...

Please insert disc 4 in the removable media drive and press
<ENTER>

Attempting to expand 41 RPM names...

Installing zone 'redhat3' from disc 4.
Installing 23 RPM packages; this may take several minutes...

Please insert disc 1 in the removable media drive and press
<ENTER>

Attempting to expand 18 RPM names...

Installing zone 'redhat3' from disc 1.
Installing 18 RPM packages; this may take several minutes...

Completing install processing; this may take a few
minutes...
Setting up the initial lx brand environment.
System configuration modifications complete!
Initial installation of zone 'redhat3' complete Thu Nov 16 16:32:25 KST 2006
Installation of zone 'redhat3' completed successfully.
Details saved to log file:
"/zone/redhat3/root/var/log/redhat3.install.2988.log"




2006/11/13

솔라리스에서 Xprint 설치하는 법

1) GISWxprintglue 라른 솔라리스 패키지를 찾아서 다운 받습니다. xprint.mozdev.org 에 있습니다.

2) tar.gz의 압축을 푼 후 pkgadd -d ./GISWxprintglue.pkg 로 패키지를 설치합니다.
3) /opt/GISWxprintglue/server/etc/XpConfig/$LANG/Xprinters 에 첨부 화일
로 엎어씁니다.
4)/opt/GISWxprintglue/server/etc/XpConfig/$LANG/print/attributes/print로
첨부 화일을 엎어쓰기 합니다.
5) /etc/init.d/xprint start
를 실행해서 아무런 에러가 나오지 않아야 합니다.

그런다음 /etc/init.d/xprint get_xpserverlist
를 실행해서 어떤 서버가 설정되었는 지 확인합니다.
아마도 prtsvr:25
이런 식으로 나올 겁니다. 위와 같이 나왔다면

xprint를 지원하는 프린트 소프트웨어(모질라 v1.7같은 프로그램)를

이용해서 프린팅합니다 이때 프린팅시 프린터 서버로 다음과 같이 제공합니다.

-d XEROX@prtsvr:2



도움이 되셨다면 위의 광고한번 살짝 클릭해주세요.

2006/10/04

Solaris 10 project configuration for Large OLTP DB server(oracle)

Solaris 10 project configuration for Large OLTP DB server(oracle)

-
This summary is a fine idea....
For high-performance OLTP DB server I also set additional project values
in order to be able to sustain a large amount (>1024) of sessions and
terminals. They are included below :

user.oracle:100:Oracle:::process.max-sem-nsems=(privileged,1024,deny);
project.max-file-descriptor=(privileged,8192,deny);
project.max-msg-ids=(privileged,8192,deny);
project.max-sem-ids=(privileged,4096,deny);
project.max-shm-ids=(privileged,512,deny);
project.max-shm-memory=(privileged,137438953472,deny);
task.max-lwps=(privileged,8192,deny)

2006/09/29

솔라리스10에서의 System V IPC와 프로젝트 개념의 이용

system V IPC 관련 parameter는 기본적으로 /etc/system에 설정하는 것을
권고하지 않습니다. 이유는 새로운 방법이 생겼기 때문입니다.
그러나, 솔라리스 10 이전 버젼의 환경을 검사하는 애플리케이션과의
뒷버젼 호환성을 위해서 /etc/system에 선언을 하셔도 작동이 됩니다. 하지만,
폐기된 변수에 대해서는 원하는 값이 모두 그대로 설정(적용)이 되지 않을 수 있습니다. ^^;

따라서, 구버젼 방식으로 사용하셔도 되긴 합니다만, 향후에 구버젼 방식은
통보없이 지원되지 않을 수 있습니다.

새로운 방식은 'project'라는 개념으로 사용하는 것입니다.
이 개념을 길게 설명하려면 끝도 없구요. 해당 매뉴얼을 보시길 권고드립니다.
아니면, 솔라리스 10 교육을 받도록 권고드리세요. 이런 건 장비산다고
해드리는 서비스가 아닙니다. 스스로 새로운 것을 배우셔야죠. ^^

참고삼아 간단하게 설명드리면

project 개념은
사용자 혹은 사용자의 특정 태스크들의 모음을 지칭하는 새로운 말입니다.
기존의 사용자 그룹을 지칭하는 그룹보다 확장된 개념입니다.
기존 처럼 사용자 혹은 그룹이 될 수도 있고, 특정 사용자의 특정 프로세스들의
군들을 지칭할 수도 있고, 사용자1의 일부 프로세스와 사용자2의 일부프로세스들을
통칭하는 용도로 사용할 수도 있습니다.

System V IPC에서 적용이 가능한 변수들은 이제 이 'project'의 개념을 사용합니다.
즉, oracle이란 사용자가 실행하는 모든 애플리케이션에 대해서 shared memory의
적용 크기를 키우시고 싶으시면

[절차]
1) proejct를 만든다.
2) project에 oracle user가 소속되게 한다. 혹은 oracle user를 만들때 project를
선언해준다.
3) oracle이 소속된 project에 shared memory max를 의미하는 변수를 변경한다.
변경은 서버 재부팅이 필요없이 online 중에 가능합니다.

실제로 하는 절차는 docs.sun.com (resource management and zones)에 자세히 나옵니다. 필히 참고하세요.

간단하게 얘기드리면,
1) 프로젝트를 만들려면 projadd 를 사용한다.
2) projadd로 project를 만들때, project에 소속될 user를 선언해준다.(-U 옵션)
3) project를 만든 후에 사용자가 만들어질때는 useradd에서 그 사용자의 프로젝트를
선언해준다.(-p 엽선)
4)해당 사용자로 로그인한후(이미 로그인되어 있으면 로그아웃 했다가 다시 로그인)
#prctl -P $$ | more
로 관련 속성의 값을 확인해본다.

4) 해당 프로젝트의 공유 메모리 크기를 변경하고 싶으면
#projmod -K "project.max-shm-memory=(priv,8G,deny)" project-name
와 같은 식으로 합니다.

해당 속성 변수들의 값을 보시고, 필요한 것만 바꾸실 수 있습니다.

일단 사용자가 project에 소속되면, 관련 값을 모두 live로 변경할 수 있습니다.

자세한건 man projadd, projmod, prctl, useradd
등에서 Example을 확인해보세요.

도움이 되셨으면 위의 광고한번 살짝 클릭해주세요

2006/09/20

[솔라리스에서 애플리케이션/프로세스를 특정 cpu 혹은 cpu set에서만 수행하도록 구성하는 방법]


[솔라리스에서 애플리케이션/프로세스를 특정 cpu 혹은 cpu set에서만 수행하도록 구성하는 방법]

a.out 이란 실행화일을 쉘에서 실행하실때 특정 cpu에서만
bind되어서 실행하고자 하는 경우에는 다음과 같이 수행하도록 합니다.

1. 쉘 프롬프트에서 작업하는 방법

1) processor set을 구성합니다.
  • processor set이란 cpu들의 집합을 의미(이하 pset)하는 것인데 각 cpu set에는 최소 1개이상의 processor가 포함되어 있어야 하며, CPU(processor)는 각 한번에 한 processor set에만 귀속될 수 있습니다. n개의 processor를 가진 processor set에는 최대 n-1개의 processor set이 존재할 수 있습니다. processor set에 귀속되지 않은 cpu가 한개는 반드시 있어야 합니다(OS와 interrupt 수행)
    • ex) root@T2000-1[/]psrset -c -F 1
      created processor set 1
      processor 1: was not assigned, now 1
  • 2) 특정 cpu에서만 실행되길 원하는 애플리케이션(a.out)을 다음과 같은 방법
    으로 실행합니다.
    ex)#psrset -e 1 a.out arg0 arg1 ...

  • 3) 일단 a.out을 실행된 경우라면, processor set을 사용하지 않고서, 특정
    프로세서에 bind 시킬 수 있습니다. a.out의 pid 1223을 할당받고서 실행이 되었다면 다음과
    같이 실행해서 특정 cpu에 bind 할 수 있습니다.
    • ex)#pbind -b 1 1223
      pbind는 pset(processor set)이 구성이 안되어 있는 경우에도 사용 가능하면 한개의 CPU만 bind하는 경우에 사용합니다. 물론 이경우 pset을 만든 후 psrset을 이용해서 pid 1223을 bind하실 수도 있습니다.(pset이 앞의 예 1번대로 만들어져있다고 가정)

    • ex)#psrset -b 1 1223

    • 이렇게 실행되면, a.out은 자신과 자신의 LWP & child process 모두가
      processor set 1에 귀속된 프로세서에서만 수행됩니다. 일반적으로는 processor set을 이용하여 bind하는 것이 운용이나 관리면에서 월등합니다. bind하고나서 processor하나의 성능이 모자라는 경우에는 실질적으로 bind해서 사용하기가 불가능합니다. 따라서, 단일 cpu라 하더라도 psrset을 구성해서 bind하는 것이 바람직하며, psrset을 이용할 시에는 bind된 후라도 동적으로 online상태에서 cpu의 가감을 운영할 수 있습니다.

2. 시스템 콜을 이용하는 방법
C program 자체에서 자신이나 혹은 다른 애플리케이션을 특정 cpu에 bind하시
고 싶으시면 processor_bind(2), pset_bind(2) 을 이용합니다.
참고, www.opensolaris.org에서 pbind.c / psrset.c source를 참고하세요.


김봉환/

2006/09/01

솔라리스에서 RBAC( roll based access control )의 의미 및 구성 방법

안녕하세요. 한국썬의 김봉환입니다.

아마도 useradd를 실행할 수 있었던 사용자는 Primary Administrator 권한을
위임받을 수 있는 profile을 가졌을 겁니다. 그 사용자에서 profiles -l 해보
세요. 이 권한으로 위임받은 사용자는 exec_attr에 추가되는 모든 명령어를
실행할 수 있습니다.

profile이라는 것은 권한(authorization)과 명령 실행(command)를 결합해 놓
은 환경입니다.
따라서, 특정 사용자에게 특정 profile을 할당해주게되면, 그 profile을 위임
받은 사용자는 이미 권한을 획득한 상태이기 때문에 exec_attr에 등록된 명령
어를 실행할 수 있는 것입니다.

특정 사용자에게 profile를 위임하지 않은 상태에서 권한을 구성하게 할 수도
있습니다만, 이렇게 사용하시려면 사용하기가 불편할 뿐 아니라, 관리하기가
까다롭기 때문입니다.

dtrace 와 같은 명령어는 대개 kernel probe를 위해서 root 권한을 가지고 있
는 사용자가 실행할 수 있는데, 이렇게 하기 위해서는 특정 사용자를 dtrace
수행 권한을 포함한 profile을 가지게 할 수 있고, 직접적으로 authorization
을 가지게 할 수도 있습니다.

user_attr(4), auth_attr(4) 를 참고하십시요.

RBAC의 바람직한 사용법은 profile을 구체적으로(촘촘하게) 구성하시고, 사용
자에 따라서 profile을 수여받도록 하는 것이 바람직합니다.

따라서, 사용자에게 특정 일만 하게 하시고 싶으시면 그 사용자에게 Primary
Administrator를 수여하지 마시고, 적절한 profile을 제공하십시요. 만약
prof_attr에 기 만들어진 profile이 존재하지 않는다면, 만드셔도 됩니다.

prof_attr에 new profile 추가
exec_attr에 새로 추가된 profile에 따라 실행이 필요한 명령어 추가
user_attr에 새로 만든 profile을 추가함에 따라서 쉽게 RBAC 을 사용하실 수
있습니다.

보다 섬세하게 RBAC을 사용하시고 싶으면 auth_attr에 나오는데로, 사용자에
게 auths를 할당할 수 있습니다만, 여러개의 authorization은 dependancy를
가지기 때문에 완벽하게 이해하셔야 사용하실 때 문제가 없읍니다.

예를 들면, 쓰기 권한을 주고, 읽기 권한을 막았다던가 하게 되면, 쓰기 권한
에도 문제가 생깁니다. 또한, 일반적인 프로세서가 open/read/write하는 모든
대상에 대해서 이해를 하고 있어야 합니다. 가령 웹서버가 소켓과 포트에 대
한 권한을 열어주고 화일 시스템에 대한 접근을 막아두면, 로그를 쌓는 기능
을 가진 웹서버는 에러로 동작하지 않을 수도 있습니다.


2006/08/30

초고속 컴파일 환경 구축 방안

고객이 사용하는 환경을 그대로 유지하고 싶은 채 컴파일 속도를
증가 시키고 싶으면, 몇가지가 있을 수 있습니다.

1) 현재 컴파일 서버 만을 업그레이드 하는 경우
현재 썬에서 제공하는 X4600을 사용하면 용량이 두배정도 증가하니,
IO를 충분하게 유지한다는 가정하에서 소요 시간이 절반으로 줄겠죠.

2) 컴파일을 대행해주는 접속 노드 환경 구축
고객 노트북 -> 컴파일 클러스터 노드 -> 소스 화일 서버

같은 아키텍쳐를 유지함으로써 각 노드부하별 사용자들이 컴파일 노드로
원격접속한후 소스 화일 서버에서 공유된 화일 시스템을 마운트한 후 각 노드별로
컴파일하는 방법이 있습니다. 이렇게 하기 위해서는 사용자들이 각 서버의
노드의 사용율이 얼마나 되는 지를 임의 배분하거나, 스스로 판단해서 접속한 후
실행해야 하며, 사용자간 컴파일 의존관계를 가지고 있지 않아야 합니다.

이런 구조로 구성하려면, 저가의 접속 서버를 확장 구축해서 접속 서버들이 각각 컴파일 하도록 합니다. 소스는 공유 소스 서버에서 가져와서 컴파일한 후 소스 서버에 저장하도록 합니다.

윈도우즈 컴파일러가 분산 컴파일러(멀티 cpu에서 컴파일되는 것을 지원하는 컴파일러)
가 아니라면 노트북에서 컴파일이 3시간이라고 했으니, 서버가 비슷한 구조면
혁신적으로 빨라지기는 어렵습니다만(CPU를 하나만 죽어라 쓸테니) 접속 서버로
Dual core 1cpu server를 사용자의 1/4 정도 구축하고, 뒤에 X4600같은 화일 서버를 소스 서버로 구축하고, 기가비트로 서버간 접속을 구성하고, X4600은 스위치까지 4G trunking을 사용하길 추천합니다. 소스 화일 서버로 윈도우즈를 고집하지 않는 다면, Thumper에 삼바를 올리는 것도 아주 훌륭함.

장점은 구축하기 쉽다. 쓰기 편하다. 비용 적게 든다.
하지만, 컴파일 속도 개선은 컴파일 서버 노드의 CPU 성능을 벗어나지 못한다.


3) 컴파일을 대신해주는 컴퓨팅 노드 구축(Grid)

현재 사용하는 고객 환경과는 거리가 있는 것으로 보입니다. 이런 환경으로 구축하려면 Grid 환경과 그리드를 지원하는 소프트웨어(컴파일러)등을 사용해야 하는데, 윈도우즈 기반의 그리드는 제 소관 밖이어서 드릴 말이 별로 없습니다만 구성은 가능합니다.

현재 컴파일 속도를 배가하는게 가장 좋은 기술입니다만, 사용 환경과 컴파일러등에 영향을 많이 받습니다. 장기적으로는 이 환경을 구축하는 것이 바람직합니다만, 아직 windows 기반의 HPC 기술은 매우 초기 단계로 취약합니다. 그래도 관심이 있어할 수 있으므로 사이트 자료를 참고해서 제안하세요. 그리고, 우리가 제안하기엔 아주 취약합니다.
( http://www.microsoft.com/hpc ; microsoft 기술 자료임)
http://cmssrv.tc.cornell.edu/ctc/winhpc/ ; 코넬대학 자료임

4) Code Versioning System 사용
각 사용자들이 소스 서버의 소스를 각 사용자의 시스템으로 다운로드한 후 컴파일한 후 서버로 재 업로드하는 방법으로 적정 소스 관리 툴을 사용해야 합니다. 오픈 소스계열에서는 CVS가 가장 많이 사용됩니다. software 이름으로는 rcs 이고.. 커머셜 제품도 꽤 많이 있습니다.

이런 경우의 단점은 소스코드의 유출이 있을 수 있으며, 컴파일 속도가 노트북 성능을 넘어서 나올 수 없습니다. 노트북보다 빨라야 한다고 했으니, 이 방법은 바람직하지 않을 것으로 보임.



2006/08/29

CDE의 기본 screensaver를 xscreensaver로 변경하는 법

begin:vcard
fn:Bonghwan Kim
n:Kim;Bonghwan
email;internet:bonghwan.kim@sun.com
tel;work:82-2-2193-5225
tel;cell:82-16-325-9068
x-mozilla-html:FALSE
version:2.1
end:vcard

CDE에서 screen saver를 xscreensaver로 변경하려면

일단,

1) XScreenSaver.dt, Lock.fp 를 작성한다. (man xscreensaver 참조)
2) /usr/dt/appconfig/types/C
/usr/dt/appconfig/types/ko
/usr/dt/appconfig/types/ko_KR.UTF-8
에 위에서 만든 화일을 저장한다.

3) 위 디렉토리에 있는 sys.resources 화일에서
dtsession*saverList: StartDtscreenBlank
라인을 찾아서
dtsession*saverList: XScreenSaver
로 변경한다.

4) 로그아웃 했다가, 다시 로그인한 후 Lock 버튼을 클릭해본다.
5) 한참(아마 30분) 을 기다려 본다. ^^

6) xscreensaver가 정상적으로 시동이 되면,
/usr/openwin/lib/xscreensaver/hacks 디렉토리에 실행하고자하는 실행 퍼미
션을 가진 쉘스트립트를 만든다.

7) /usr/openwin/lib/app-defaults/XScreenSaver
화일에 default-n:에 실행할 스크립트를 지정한다.

내가 테스트 해보지는 않았습니다. 테스트 해보고, 잘안되는 것 있으면 구체
적으로 물어봐주세요. ^^;

김봉환/

2006/08/23

솔라리스10에서 thread에 바인드(bind)되는 cpu 알아내기

운영체제 내부 정책에 따라 순간적으로 이루어지는 행위로서 특정 CPU에 바인딩되는 프로세스 스레드의 정보를 알기가 정확하게 알기가 힘듭니다.(관리자 임의로 psrset이나 pbind를 통해서 bind한 프로세스들의 정보는 pbind, psrset 으로 알 수 있습니다)

솔라리스에서는 prstat에서 status 컬럼에서 관련 정보를 알 수가 있습니다만,
reporting하는 툴인 prstat 그 자체의 수행에 의한 모순때문에 정확하게 알기가
힘들게 됩니다. 막상 prstat가 데이타를 읽어서 찍는 경우에는 관찰대상인 프로세스보다
prstat가 우선권을 차지하는 경우가 왕왕발생하므로, 관찰 대상의 프로세스는 대개
sleep으로 나타나게 되는 경우가 많이 있습니다.

복수개의 Core를 사용한다면 좀 낫습니다만, 그래도 여전히 이런 모순이 존재하게 되기
때문에 이러한 형태의 정밀한 보고는 매우 어렵습니다.

솔라리스 10에서는 dtrace로 이와 같은 경우의 보고를 완벽하게 해결할 수 있습니다.

아래 처럼 명령을 주면, -p 옵션 뒤에 있는 프로세스가 cpu에 할당 될때 마다
할당된 thread와 cpu를 인쇄합니다.

> #dtrace -q -n 'sched:::on-cpu/pid==$target/{printf("process/thread
> %s[%d]:%d is running on CPU %d\n\n",execname,pid,tid,cpu)}' -p 1031

-p 옵션 뒤에 관찰 대상이 되는 프로세스의 pid가 제공됩니다.

이렇게 실행해놓으면, 프로세스 1031이 cpu에 바인딩될때마다 1031의 무슨 thread가
어떤 cpu에 바인딩되는 지를 보여줍니다.

dtrace : 놀라울 따름입니다. !!!

opensolaris에서 한글환경

solaris 10 intel/amd 버젼에서는 데스크탑 환경으로 사용하는 경우에 gdm기반으로 로그인 하는 경우, 기본 한글 환경을 설정하기 위해서 로케일을 ko_KR.UTF-8로 설정됩니다. 특히, 솔라리스 10 U2부터는 gdm이 기본 로그인 환경으로 바뀜에 따라, 사용자는 선택의 여지가 없이 unicode(ko_KR.UTF-8)로 로그인해야 합니다.
gdm 세션 옵션 메뉴에서 언어를 선택할 수 있기는 합니다만, 한국어는 하나밖에 없으며, 이 옵션은 유니코드(UTF-8)에만 적용됩니다.

그런데, 아직은 많은 애플리케이션들이 컨텐츠들의 인코딩 로케일로 ko_KR(euc-kr)을 사용하는 경우가 많기 때문에, 로그인시 ko_KR.UTF-8이 아닌, 기존의 euc-kr 코드셋을 사용하는 로케일인 ko 혹은 ko_KR 로 설정하기 위해서는 두가지 방법이 있습니다.

하나는 /etc/X11/gdm/gdm.conf에서 설정하는 방법이 있고,
다른 하나는 사용자의 ~/.profile 혹은 ~/.login 에서 설정하는 방법이 있습니다.

두 방법다 환경 변수 GDM_LANG=ko를 선언하도록 하면 됩니다.
gdm.conf의 방법은 gdm.conf의 내용을 이해해야 하므로 사용자 별 하는 방법을 소개하면

~/.profile을 사용하는 경우
맨 처음 라인에
GDM_LANG=ko;export GDM_LANG

~/.login을 사용하는 경우
맨 처음 라인에
setenv GDM_LANG ko

를 선언하면 됩니다.

2006/08/16

daylight saving check하는 법

#zdump -v $TZ | head 1

에서 맨 끝에 나오는 idstflag가 0이면 normal, 1이면 daylight 적용 중이라는군.

지금까지 작성된 소프트웨어 중에 최고는 ? 유닉스 !

유닉스III가 현존하는 소프트웨어 중에 가장 최고의 소프트웨어라는 군요.
유닉스의 적자인 솔라리스는 그럼 귀족 중에 귀족이겠네요.

http://www.informationweek.com/shared/printableArticle.jhtml?articleID=191901844

2006/08/10

[Fwd: Re: How to force a scsi disk to spin down]

begin:vcard
fn:Bonghwan Kim
n:Kim;Bonghwan
email;internet:bonghwan.kim@sun.com
tel;work:82-2-2193-5225
tel;cell:82-16-325-9068
x-mozilla-html:FALSE
version:2.1
end:vcard



-------- Original Message --------
Subject: Re: How to force a scsi disk to spin down
Date: Wed, 09 Aug 2006 10:04:28 -0700
From: Richard Elling <Richard.Elling@Sun.COM>
To: Phillip.Wagstrom@Sun.COM
CC: Bill Gou <Bill.Gou@Sun.COM>, sig.oe@sun.com, storage@sun.com
References: <44D97F33.6020909@Sun.COM> <44D9ED78.1010600@Sun.COM>


Also luxadm stop  -- richard  Phillip Wagstrom -- Area SSE MidAmerica wrote: > Bill Gou wrote: >> Hi, >> >> Is there any command/tool I can use to force a scsi disk to spin down.  >> You may ask why I need to do this. ok, I have a multipack, in which  >> one disk is very noisy, I want to find out which one is making the  >> noise by spinning down the disks one at a time. >  >     "cfgadm -c unconfigure <device>" should be able to do this.  Of  > course, this will require whatever filesystems are mounted on the drive  > to be unmounted and the drive can't be in use.  You'll have to use  > either "cfgadm -c configure <device>" or "devfsadm" once you re-install  > the drive to bring it back online. >     Otherwise, I have had luck with the "eject" command on occasion. >     In a pinch, though its not a good idea to disrupt spinning drives,  > just pop them one at a time and find out which one is the squeaky wheel. >  > -Phil >  

2006/08/08

지정된 애플리케이션에 특권 할당을 위한 RBAC 구성 방법(Access Service)

다음의 순서를 잘 지켜서 따라하세요.(웬만하면 cut&paste 하세요)
아래의 각 명령어 앞에있는 '#' 기호는 쉘 프롬프트를 의미하는 것입니다.
복사할때는 '#'은 복사하지 마세요.
그리고, 각 실행은 한줄 명령어입니다. 여러줄로 나누어져 보이더라도, 한줄로 만들어서 실행하세요.

1) 보안 실행 환경 구성(RBAC)
#echo "# AS RBAC profile configuration for AS runtime environment" >> /etc/security/prof_attr
#echo "AS Management:::AS runtime Environment Administration:auths=solaris.network.*;help=RtASMgmt.html" >> /etc/security/prof_attr
#echo "# AS RBAC execution configuration" >> /etc/security/exec_attr
#echo "AS Management:solaris:cmd:::/htsteam/AS/bin/AsCL:euid=0" >> /etc/security/exec_attr
#echo "AS Management:solaris:cmd:::/htsteam/AS/bin/AsCH:euid=0" >> /etc/security/exec_attr
#echo "AS Management:solaris:cmd:::/htsteam/AS/bin/trload:euid=0" >> /etc/security/exec_attr


2) 사용자 특성 변경
# usermod -P "AS Management" htsteam

와 같이 실행하면, 일단 구성은 된 것입니다. 정상적으로 되었는 지 확인하기 위해서는
htsteam user를 logout한 후 다시 로그인하십시요.

로그인 한후
profiles -l
라는 명령을 실행해본 후에 htsteam 사용자에 AS Managment 역할과 실행할 수 있는 화일이
할당된 것이 보이면 정상적으로 구성된 것입니다.

예상하기에 다음과 같이 보일 겁니다.

      AS Management:
          /htsteam/AS/bin/AsCL    euid=0
          /htsteam/AS/bin/AsCH    euid=0
          /htsteam/AS/bin/trload    euid=0


이렇게 나타나면, 일단 htsteam이라는 사용자가 AsCL을 실행할 수 있게됩니다.
그런데,주어진 역할에 따른 애플리케이션을 실행할때에는 실행하는 방법이 별도로 있습니다.
즉, 위와 같이 나왔더라도, AsCL을 실행하기 위해서는 다음과 같이 특수 커맨드를 이용해야 합니다.

#pfexec AsCL


그냥 AsCL을 실행시키면 에러가 날겁니다. 차이를 느껴보세요.
AsCL관련한 애플리케이션을 시작시켜주는 쉘 스크립에 넣어놓으면 그리 불편하지 않을 겁니다.

혹시 불편하다고 불평하는 분 계실 수 있는데, 이렇게 하는 이유는 '보안'을 위해서 그런 겁니다.
리눅스나 윈도우즈와 비교하지 말기를 바랍니다. 차원이 다릅니다.

해보시고, 문제가 있으시면 연락주십시요.

썬에 서비스를 구매하시면 이런 고급 서비스를 받을 수 있음을 필히 주지시켜 주십시요.

한국 썬
김봉환/


백경민 쓴 글:

안녕하세요. 부장님.

 

이트레이드증권 시스템 80포트 사용 관련해서

 

오전에 전화드린 백경민입니다.

 

바쁘신중에 불편을 드려 죄송합니다.

 

현재 문제는 80포트를 사용하는데 있어 일반유저가 아닌

 

루트유저 권한으로 실행해야 된다는 것입니다.

 

현 개발중인 AP에서 80포트와 연관이 있는 Process는 다음과 같습니다.

 

- user:group   ->  htsteam:other ( 80포트 실행 권한이 부여되어야할 user)

 

/htsteam/AS/bin/AsCL

/htsteam/AS/bin/AsCH

/htsteam/AS/bin/trload

 

실제 80포트를 열어주는 Process는 AsCL 이며 이와 연계되어 AsCH이

 

공유 메모리를 생성하게 됩니다. 문제는 장중에 변경이 일어났을시 AsCH는

 

클라이언트와 연결되어 있는 관계로 공유 메모리를 재생성 할수없는 문제가

 

있어 위의 trload라는 Process를 추가해 사용하게 되어있습니다.

 

위의 서비스를 하는데 있어 setuid를 사용하여 문제를 해결하려 했으나

 

보안과 관리상의 문제가 큰 부분이 있어 이트레이드 담당자께서는 앞서 말씀드린

 

부분(보안, 관리)을 보완할수 있는 방법을 요청하고 계십니다.

 

시스템 자체가 try&buy로 서비스를 받을수 없다는건 알지만 고객 관리 차원에서

 

머리숙여 부탁드리겠습니다.

 

감사합니다.

 

백경민 드림.(phone: 010-9944-3871)

 

 

 


2006/08/01

웹서버로 솔라리스를 사용해야 하는 이유(security)

자바스크립트 보안 자세히 들여다보기

http://www.zdnet.co.kr/news/internet/etc/0,39031281,39149821,00.htm

웹 사이트들은 자바스크립트 덕분에 점점 더 대화형으로 발전하고 있지만 10년 정도된 자바스크립트의 사용으로 보안 이슈가 제기되고 있다.

자 바스크립트는 웹 2.0 붐에서 주요한 역할을 하고 있다. 2.0은 웹사이트의 영역을 넓혀가고 있으며 자바스크립트가 큰 역할을 하고 있기 때문이다. 그러나 악성 자바스크립트는 특히 웹사이트의 보안상 결함과 결합되어 웹기반 공격을 개시할 수 있다고 보안 전문가들은 경고한다.

자 바스크립트와 이것이 왜 보안 위협이 될 수 있는지에 대한 질문에 답을 하는 과정에서 CNET 뉴 스닷컴은 아래 항목들로 FAQ 를 만들었다.

자 바스크립트는 무엇인가?

자 바스크립트는 스트립트 프로그래밍 언어있다. ECMA스크립트에서 유래된 것으로 넷스케이프 커뮤니케이션즈가 개발했으며 1995년 넷스케이프 브라우저에 도입됐다. 자바스크립트는 웹 사이트에서의 사용으로 잘 알려져 있다.

자 바스크립트는 자바인가?

아 니다. 이름과 달리 자바스크립트는 썬마이크로시스템즈의 자바와는 관계가 거의 없다. 자바는 자바 프로그램을 수행하는 프로그래밍 언어이자 소프트웨어이다.

썬 의 공동 설립자 중 한명인 빌 조이가 자바스크립트라는 이름이 나온데 전적으로 책임이 있는데 그는 이 것이 "잘못된 결정"이라고 최근에 있었던 한 행사에서 말했다. 그 는 "내가 넷스케이프가 자바스크립트라는 이름을 작명하도록 허용했다. 그들은 전화를 했다. 공황상태에 있었으며 자바스크립트란 이름을 사용하길 원했다. 나는 가족과 함께 밖에서 시간을 보내고 있었으며 별 생각을 하지 않았다"라고 말했다.

자 바스크립트가 웹 2.0과 어떻게 관계되는가?

2.0은 정확한 정의가 없다. 평범한 정적인 페이지만을 담고 있는 웹 사이트들을 모두 지칭하기 위해 주로 사용되는 용어이기 때문이다. 2.0 사이트들은 보다 대화성이 강하며, 예를 들어 사용자들이 온라인으로 게재하는 사진에 태그를 붙일 수 있도록 한다. 기존 웹과는 달리 데스크톱 애플리케이션을 사용하는 것에 보다 가까운 경험을 사용자에게 제공한다.

웹 사이트를 더 멋지게 만드는 핵심 기법의 하나는 AJAX(Asynchronous JavaScript and XML) 라는 프로그래밍 방식이다. 지난 해 출범한 구글 맵스는 AJAX 개발 기법의 이점을 널리 확산시킨 서비스로 사용자는 마우스로 스크린 상의 지도를 이동시킬 수 있다.

캘 리포니아 주립대 버클리 캠퍼스의 전산학과 교수인 데이비드 와그너는 "자바스크립트는 보안에 나쁘며 재앙이라고 할 수 있다. 현재 우리는 자바스크립트에 발목이 잡혀있다. AJAX는 더 많은 자바스크립트를 뜻하기 때문에 우리는 더 오래 발목이 잡혀있을 수 있다"라고 최근의 한 행사에서 말했다.

자 바스크립트를 어떻게 악성으로 만드는가?

해 커들은 사용자가 원하지 않는 일을 하도록 자바스크립트를 프로그램할 수 있다. 예를 들어 최근의 야마너 웜은 야후 메일을 목표로 삼았다. 이메일 주소를 수집하고 이를 해커에게 보낸 후 사용자의 야후 주소록에 있는 모든 수신자에게 스스로를 보낸다.

마 이스페이스에서 확산된 새미 웜은 인기가 많은 소셜 네트워킹 사이트인 마이스페이스의 프로파일을 바꾼다. 두 웜 모두 자바스크립트로 만들었다.

보 안 전문가들은 또한 최근 자바스크립트를 사용하여 홈 혹은 기업 네트워크의 지도를 그리고 서버 혹은 라우터나 프린터와 같은 장비를 공격할 수 있는 방법을 알아냈다.

내 컴퓨터에서 모든 자바스크립트가 동작하는가?

현 대식 웹 브라우저는 전부 자바스크립트를 지원한다. 악성 스크립트는 웹 페이지에 숨겨둘 수 있으며 통상적인 브라우저에서 볼 때 경고없이 동작하게 된다.

악 성 자바스트립트에 어떻게 대처하면 되나?

해 커들은 자신들이 만든 웹사이트로 희생자를 끌어들일 수도 있다. 그러나 크로스-사이트 스크립팅이라는 공통된 결함을 악용하여 사람들이 믿는 사이트를 이용할 수도 있다. 구글, MS, 이베이를 포함한 웹 대기업들은 이러한 결함을 치유해야만 했다. 지난 주 AOL Netscape.com은 경쟁사 Digg.com의 팬들이 자사 웹사이트에 자바스크립트를 심는 바람에 이를 수정해야만 했다.

공 격은 어떻게 이뤄지는가?

해 커는 악성 자바스크립트를 만들고 이 스크립트를 호스트할 수 있는 결함있는 웹사이트를 찾는다. 보 안 전문가들은 웹 사이트들이 크로스-사이트 스크립팅 결함을 많이 지니고 있다고 말한다. 해커는 이러한 결함을 이용하여 악성 코드를 웹 사이트에 심는다. 이 사이트를 방문하는 사용자들은 공격을 받게 된다. 예를 들어 이번 주 Netscape.com 사에 대한 공격을 보면 방문객들은 경쟁사 Digg.com 의 광고를 담은 자바스크립트 팝업을 만나게 되며 일부 경우 소셜 미디어 사이트인 Digg.com 으로 자동 안내된다.

나 의 PC 와 네트워크를 어떻게 보호하는가? 자 바스크립트는 내 컴퓨터에서 동작할까?

모 든 현재의 웹 브라우저는 자바스크립트를 지원한다. 웹 브라우저에서 자바스크립트를 꺼 버릴 수 있으며 자바스크립트가 수행되지 않을 것이다. 그러나 그렇게 되면 많은 웹사이트의 기능도 함께 꺼지게 된다.

자 바스크립트가 수행되면 사용자의 브라우저를 통하기 때문에 방화벽과 같은 보안 장치를 뚫게 된다고 보안 전문가들은 말했다. 웹 애플리케이션 보안 업체 화이트햇 시큐리티의 CTO 인 제레미아 그로스만은 "브라우저를 악용하여 내부 네트워크를 해킹할 수 있다"라고 말했다.

일 부 PC 보안 소프트웨어는 악성 자바스크립트를 탐지할 수 있지만 한번의 공격이 있고난 이후에 가능하다. 공격을 막기 위해서는 공격 시그니처 (위협의 "핑거프린트")에 의존하기 때문이다. 효과적인 보안 조치는 웹 서버 쪽에서만 가능하다고 보안 전문가들은 말한다.

웹 사이트 운영자가 할 일은?

크 로스-스크립팅 결함이 있는지 웹사이트를 점검하고 이를 고쳐야 한다. 사용자가 제공한 모든 자바스크립트도 확인할 필요가 있다.

그 로스만은 "사용자들은 그들이 방문하는 웹사이트에 운명을 맡기고 있다"라고 말했다.

웹 사이트 결함의 증가로 일부 보안 전문가들은 웹 개발자들이 보안 이슈에 많은 관심을 기울이지 않는다고 우려하고 있다. 2.0 의 관심 때문에 사람들은 새로운 웹사이트를 개발하고 있다(돈을 많이 벌 수 있다는 희망에). 그러나 개발 동인은 기능에만 매달려 있으며 보안은 무시되고 있다고 전문가들은 말한다.

왜 이 문제를 10년 전이 아닌 지금 읽고 있는가?

자 바스크립트가 10년 전에 나온 것은 맞다. 그 러나 최근 AJAX 덕분에 인기가 더 높아졌다. 더욱이 악성 자바스크립트가 오래 전부터 가능했던 것은 사실이지만 보안 전문가들은 별로 관심을 기울이지 않았으며 더 빠르고 간단한 PC 장악을 가능하게 하는 웹 브라우저 버그 발견에 치중했다고 보안 전문가들은 말한다.

2006/07/24

Solaris 10 실시간 프로그래밍 사양(Realtime) FAQ

1. POSIX.4(실시간 POSIX 확장) 를 지원합니까?

POSIX.4라는 용어는 사용하지 않구요. 일반적으로 Posx.4는 IEEE 1003(=Posix.1)의
Realtime Extension 으로 일컬어집니다.
솔라리스에서도 POSIX 1의 Realtime Extenstion으로 Posix 1003.1b-1993 를
지원합니다. Solaris에서 man standards 라고 명령을 쳐보시면 알 수 있습니다.

POSIX Standard Description Release
POSIX.1-1988 system interfaces and headers SunOS 4.1
POSIX.1-1990 POSIX.1-1988 update Solaris 2.0
POSIX.1b-1993 realtime extensions Solaris 2.4
POSIX.1c-1996 threads extensions Solaris 2.6
POSIX.2-1992 shell and utilities Solaris 2.5
POSIX.2a-1992 interactive shell and utilities Solaris 2.5
POSIX.1-2001 POSIX.1-1990, POSIX.1b-1993, Solaris 10
POSIX.1c-1996, POSIX.2-1992, and
POSIX.2a-1992 updates
....

자세한 건은 맨밑에 첨부했습니다.

2. OS와 함께 C, C++, Fortran 77이상 컴파일러가 제공 됩니까?
SunStudio 가 제공됩니다. C/C++/f77 모두 지원됩니다.

3. CPU의 수행 상태를 모니터링 할 수 있는 툴이 제공되는가요? (스케줄러에 설정된 값을 확인 할 수 있는 기능을 제공하는 툴이 내장되어 있나요)
mpstat, prstat, ps 등으로 CPU별/스레드별 활동이 모니터링 가능합니다.
또한, dtrace를 통해, clock이 정확하게 발생하는지, catch가 되는지 등을 정밀하게
확인할 수 있습니다.



4. 멀티 프로세싱, 멀티 쓰레드 기능을 제공합니까?
물론입니다. 위 1번에 첨부한 준수 표준에 보시면 아주 오래전부터 지원하고
있습니다. 멀티 스레드는 유닉스 중에서는 썬의 솔라리스가 최초로 적용한 기술입니다.
스레드 처리 기술에는 Sun thread와 Posix thread 두가지가 있습니다.

5. 멀티 CPU 사용을 지원 합니까?
물론입니다. 썬의 솔라리스는 현재 144개의 CPU가 제공되는 시스템에서 사용되고
있습니다. 이론적으로 수천개의 프로세서를 지원할 수 있는 고확장성 기능을 채택하고
있어서 SMP 구조 시스템에 최적화되어 있습니다.

6. CPU별 OS 인터럽트에 대해 isolation 가능합니까?
프로세서 유틸리티 psradm으로 가능합니다.
man psradm


7. 제품에 가장 적합한 하드웨어 구성은 어떻게 되나요(CPU)?
적합한 하드웨어 구성이라고 딱히 있는 것은 아니며, 솔라리스가 사용될 수 있는
시스템이면 모두 가능합니다.
썬의 UltraSPARC 계열의 시스템과 옵테론 계열의 시스템 모두 사용가능합니다.

참고삼아, 솔라리스는 기본 설치시 clock catch rate를 10ms로 설정되어 있으며
Realtime 환경을 위해서 고 해상도의 clock catch를 위해서는 /etc/system 이란
화일안에 hires_tick=1 을 설정함으로써 1us 단위의 clock catch를 할 수 있습니다.
1us 단위 보다 더 촘촘한 시간 단위의 클럭 catch를 위해서는 별도의 시스템
카드를 사용해야 하는 것으로 알려져 있습니다.

다음을 참고하세요. 솔라리스의 매뉴얼에 포함되어 있는 솔라리스가 준수하는
표준안의 일부입니다.

NAME      
standards, ANSI, C, C++, ISO, POSIX, POSIX.1, POSIX.2, SUS, SUSv2, SUSv3, SVID, SVID3, XNS, XNS4, XNS5, XPG, XPG3, XPG4, XPG4v2 - standards and specifications supported by Solaris

DESCRIPTION
Solaris 10 supports IEEE Std 1003.1 and IEEE Std 1003.2, commonly known as POSIX.1 and POSIX.2, respectively. The following table lists each version of these standards with a brief description and the SunOS or Solaris release that first conformed to it.

POSIX Standard Description Release
POSIX.1-1988 system interfaces and headers SunOS 4.1
POSIX.1-1990 POSIX.1-1988 update Solaris 2.0
POSIX.1b-1993 realtime extensions Solaris 2.4
POSIX.1c-1996 threads extensions Solaris 2.6
POSIX.2-1992 shell and utilities Solaris 2.5
POSIX.2a-1992 interactive shell and utilities Solaris 2.5
POSIX.1-2001 POSIX.1-1990, POSIX.1b-1993, Solaris 10 POSIX.1c-1996, POSIX.2-1992, and
POSIX.2a-1992 updates Solaris 10 also supports the X/Open Common Applications Environment (CAE) Portability Guide Issue 3 (XPG3) and Issue 4 (XPG4); Single UNIX Specification (SUS, also known as XPG4v2); Single UNIX Specification, Version 2 (SUSv2); and Single UNIX Specification, Version 3 (SUSv3). Both XPG4 and SUS include Networking Services Issue 4 (XNS4). SUSv2 includes Networking Services Issue 5 (XNS5). The following table lists each X/Open specification with a brief description and the SunOS or Solaris release that first conformed to it.


See more from #man standards.5