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

2006/07/21

ZFS configuration & Performance

ZFS는 Copy-on-Write(COW)에 의해서 인접한 블럭들을 통합해서 I/O 처리할 수 있기 때문에 '쓰기(write)에 집중되는" 부하에서 매우 강한 것으로 보입니다만. 특별한 경우, 랜덤 읽기(Random Read)에서는 zfs가 가지는 RAID 구성의 특성에 영향을
많이 받을 수 있다고 되어 있습니다.

특 히, ZFS의 RAID-Z(5의 변형)은 각 디스크 별로 stripe되지 않고,디스크내의 Block 별로 stripe됩니다. (디스크가 1개가 있어도 RAID-Z를 사용하고, 동적으로 디스크의 가감이 이루어지는 것을 지원하기 위해서 위와 같은 방법을 사용합니다.) 그러므로, 디스크를 모두 같은 그룹으로 묶어버리게 되면, 결국 한 디스크에 IO가 발생하는 것과 동일하게 됩니다.(아래 테이블에서 Z 1 x (99+1) 구성) 때문에, 다른 볼륨 매니저의 RAID-5처럼 오인해서 모든 디스크를 한 그룹으로 묶게 되면 성능 저하가 발생하게 됩니다.(특히, RANDOM I/O에서)
전통적인 구성과 유사하게 하시려면 그룹이란 개념으로 디스크를 묶어서 RAID를 구성해야 합니다, Z 20 x (4+1)이나 Z 10 x (9+1)과 같은 구성을 하여야 합니다.

아래 zfs에서 사용되는 RAID구성과 Random 읽기 성능과의 상관 관계 테이블이 있습니다.

N= disk의 수
DS = 개별 disk 용량
IOPS= 각 disk별 IOPS

라고 가정했을 때, RANDOM Operation에서 다음과 같은 테이블이 구성됩니다.

Random
Blocks Available FS Blocks / sec
---------------- --------------
RAID-Z (N - 1) * DS 1 * IOPS
Mirror (N / 2) * DS N * IOPS
Stripe N * DS N * IOPS

디스크의 개수가 100(=N)개이고, 각 디스크의 용량이 100GB(=DS), 각 Disk별 IO 성능이 200 Blocks/sec(=IOPS) 라고 가정하면 다음과 같은 성능 테이블이 구성됩니다.

아래 테이블에서 각 레이블은

Z 5 x (19+1) : a dynamic striping of 5 RAID-Z groups, each
group made of 20 disks (19 data disk + 1 parity).
M : a 2-way mirror
S : a simple dynamic stripe.

를 의미합니다. 따라서, 예상 가능한 Performance Table/Configuration Matix는 다음과 같습니다.

Random
Config Blocks Available FS Blocks /sec
------------ ---------------- ---------
Z 1 x (99+1) 9900 GB 200(=100KB/s)
Z 2 x (49+1) 9800 GB 400
Z 5 x (19+1) 9500 GB 1000
Z 10 x (9+1) 9000 GB 2000(=1MB/s)
Z 20 x (4+1) 8000 GB 4000
Z 33 x (2+1) 6600 GB 6600

M 2 x (50) 5000 GB 20000(=10MB/s)
S 1 x (100) 10000 GB 20000

일반적으로 1 Block은 512bytes 입니다.

대부분의 경우에는 디스크를 많이 공급한후 R1+0. R0+1이 권고되는 구성이라고 생각합니다.

RAID-Z를 사용해야 하는 경우에는 위의 테이블을 기준으로 납득할 수 있는 IOPS를 기준으로 적절한 구성을 하시는 것이 좋을 듯 합니다.

refer the full story :
http://blogs.sun.com/roller/page/roch?entry=when_to_and_not_to
(본문의 내용을 이해하기 쉽게 약간 의역했습니다.)

김봉환/

[Solaris10:inetd:network] Solaris 10에서 inetd 로그 활성화하는 법

Solaris 10에서는 inetd 운영 구조가 변경되다 보니, 이전 버젼에서 사용하던 방법들이
적용되지 않는 경우가 발생한다.
10이전 버젼에서는 inetd의 로그를 활성화하기 위해서는 inetd가 실행될때 -t 옵션을 가지고
실행하도록 하면 되었으나, 솔라리스 10에서는 inetd 서비스가 SMF 구조로 들어가다 보니
이것을 활성하는 방법이 다소 변경되었다.
솔라리스 10에서는 inetd 휘하에서 구동되는 서비스의 시작과 운영을 inetadm에 의해서 관리한다.
inetadm에 의해서 기본적으로 관리되는 속성을 보기 위해서는 다음과 같이 명령한다.

#inetadm -p
NAME=VALUE
bind_addr=""
bind_fail_max=-1
bind_fail_interval=-1
max_con_rate=-1
max_copies=-1
con_rate_offline=-1
failrate_cnt=40
failrate_interval=60
inherit_env=TRUE
tcp_trace=TRUE
tcp_wrappers=TRUE

솔라리스 10에서는 다음과 같이 함으로써 inetd 서비스의 운영 속성을 변경한다.

#inetadm -M tcp_trace=TRUE

2006/07/15

솔라리스에서 CD./DVD의 iso 이미지 화일 추출하기

1)추출할 내용이 들어 있는 미디어(CD/DVD)를 드라이브에 넣는다.
2)cdrw -l 로 해당 디바이스가 나타나는 지 확인한다.
3) 2)번 결과에서 나온 디바이스가 c3t0d0s0 라고 가정하면 다음과 같이 실행하면 미디어의 내용을 추출해서 화일로 저장하게 된다.
#dd if=/dev/rdsk/c3t0d0s2 of=/data/solaris10.iso
주의: 2)번 결과에서는 c3t0d0s0라고 나와도 위 dd 명령어에서 주는 입력은 s2 임을 잊어서는 안된다. s2가 미디어 전체를 의미한다.

4) 추출한 내용 확인하기
추출한 .iso 화일의 내용이 정상적인 지 확인 하기 위해서는 solaris10.iso로 추출한 화일을 마운트해서 내용을 확인해야 한다.

5) ISO image 마운트하는 방법

5-1) iso 화일을 디스크 디바이스처럼 인식시킨다
#lofiadm -a /data/solaris10.iso <- 반드시 절대 경로 사용
/dev/lofi/1
5-2) 가상 디바이스(루프백 디바이스)를 CD 마운트하듯이 마우트한다.
#mount -F hsfs -o ro /dev/lofi/1 /mnt
5-3) ls로 내용을 확인한다. cd /mnt 한 후 ls 하는 것은 별로 바람직하지 않다.
#ls -l /mnt
5-4) 다시 마운트해제
#umount /mnt
5-5) 루프백 디바이스 해제
#lofiadm -d /dev/lofi/1

2006/03/27

솔라리스10 상에서 IPC설정하는 법

아래 테이블에 따라서, 적용이 되는 리소스만 적용이 되구요. 없어진 변수(총6개)는 적용이 안됩니다.

<솔라리스 10에서 사라진 시스템 파라메터들>

변경하는 법은
#projmod 를 이용해서 아래 테이블에 해당되는 리소스를 변경하면 됩니다.
#projmod -K "project.max-shm-ids=(basic,4096,deny),(privileged,8096,deny)" default
라는 식으로 명령을 주면, root를 제외한 모든 사용자에게 적용됩니다. 기로그인한 사용자는재 로그인을 해야 합니다.

일반적으로 oracle과 데이타베이스는 oracle과 같은 별도 사용자를 가지므로, 위의 명령어로작동이 됩니다. root 사용자를 대상으로 변경하고 싶으면, projid를 user.root를 대상으로 주면 되겠죠.

참고로, ipc 설정이 정상적으로 적용되었는지 확인하는 법은 예전처럼 system wide는
ipcs 이외에 rctladm을 사용할 수 있구요. process별 확인은 prctl을 이용합니다.

2006/03/21

The ADAPTIVE Communication Environment (ACE)

The ADAPTIVE Communication Environment (ACE)
최근에는 ACE class library를 활용한 개발이 활발히 이루어지고 있는데, 아마도 개발이 편리하게 해주는 클래스들이라는 점과, 상당히 오랜 기간, 오랜 사람들로 하여금 안정화되었다는 점, 실제로 꽤 많은 미션 크리티컬 영역에서도 사용되고 있다는 점이 높이 평가된듯 하다.

이 ACE를 솔라리스10 에서 컴파일해서 사용하려고 하면, 몇가지 방법이 있다.

[download source]
일단, 정상적인 화일을 다운받는다. 이상하게 들릴지 모르겠지만, 위의 링크에서 ACExxx.zip 과 ACExxx.tar.gz는 약간 다르다. 앞으로는 고쳐질지 모르겠지만, zip 화일은 텍스트 끝마다 ^M이 붙어있어서 솔라리스에서 컴파일할때 에러가 발생한다. #inlcude, #define과 같은 라인에서 에러 발생. 따라서, 솔라리스에서 빌드하고자 한다면, tar.gz 포맷 화일을 다운받는다. 아마도, zip 버젼은 윈도우즈에서 작성한듯 하다.

[ How to build #1 ]
$ACE_ROOT/include/makeinclude/platform_macros.GNU를 sunos5_sunc++.GNU에 링크를 하고, $ACE_ROOT에서 gmake를 실행하면 된다. gmake는 /usr/sfw/bin에 있으므로 미리 PATH에 /usr/sfw/bin이 적용되어 있는지 확인하도록 한다.

[ How to build #2]
대개의 표준 리눅스 빌드판처럼 configure를 이용해서 새로이 빌드 환경을 구성해서 컴파일할 수도 있다.
썬컴파일러만 있는 경우(/opt/SUNWspro/bin)에 $ACE_ROOT 서브디렉토리로 solaris10-amd64와 같이 컴파일된 바이너리를 오브젝트용 디렉토리를 만든다.
cd $ACE_ROOT/solaris10-amd64
../configure --prefix=/usr/local CC=cc CXX=CC
와 같이 실행한후 make, dmake, gmake 아무거나 사용해서 빌드를 시작한다. CPU가 많은 시스템에서는 dmake 사용을 권고한다. (프로세서 분산 컴파일을 한다. 특히, 썬의 T1000/T2000에서는 dmake 필히 사용)

주의할 점은 위처럼 기본 구성을 하는 경우, ACE는 SSL 사용을 기본으로 enable한다는 점이다. 솔라리스에는 openssl이 기본으로 안들어있으므로, 사전에 다운로드 해놓아야 한다는점이다. 만약 SSL을 사용하지 않을 예정이면, --disable-ssl을 configure시 추가해서 지정해서 구성한다.

[performance]
cpu가 하나만 있는 시스템에서는 멀티스레드를 사용하는 것이 성능을 저하시킨다. 따라서, 이경우에는 멀티스레드를 죽이는 것이 좋다.

2005/11/04

NV17 nVidia Corporation NV17 [GeForce4 440 Go] xorg.conf sample

Dell에서 19인치 LCD를 사용하는 환경에서 쓰던 xorg.conf입니다.
노트북이나 더 작은 크기의 디스플레이에서는 해상도를 낮추어야 합니다.

----

# /etc/X11/xorg.conf (xorg X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the /etc/X11/xorg.conf manual page.
# (Type "man /etc/X11/xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following commands:
#
# cp /etc/X11/xorg.conf /etc/X11/xorg.conf.custom
# sudo sh -c 'md5sum /etc/X11/xorg.conf >/var/lib/xfree86/xorg.conf.md5sum'
# sudo dpkg-reconfigure xserver-xorg

Section "Files"
FontPath "unix/:7100" # local font server
# if the local font server has problems, we can fall back on these
FontPath "/usr/share/fonts/truetype/ttf-bitstream-vera"
FontPath "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
FontPath "/usr/share/fonts/truetype"
FontPath "/usr/share/fonts/truetype/dustin"
FontPath "/usr/share/fonts/truetype/X-TT"
FontPath "/usr/share/fonts/truetype/kochi"
FontPath "/usr/share/fonts/truetype/openoffice"
FontPath "/usr/share/fonts/truetype/cdac"
FontPath "/usr/share/fonts/truetype/freefont"
FontPath "/usr/share/fonts/truetype/ms"
FontPath "/usr/share/fonts/truetype/latex-xft-fonts"
FontPath "/usr/share/fonts/type1/gsfonts"
FontPath "/usr/lib/X11/fonts/Type1"
FontPath "/usr/lib/X11/fonts/Speedo"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi:unscaled"
FontPath "/usr/lib/X11/fonts/misc"
FontPath "/usr/lib/X11/fonts/cyrillic"
FontPath "/usr/lib/X11/fonts/100dpi"
FontPath "/usr/lib/X11/fonts/75dpi"
EndSection

Section "Module"
Load "bitmap"
Load "dbe"
Load "ddc"
Load "dri"
Load "extmod"
Load "freetype"
Load "glx"
Load "int10"
Load "record"
Load "speedo"
Load "type1"
Load "vbe"
EndSection

Section "Extensions"
Option "Composite" "Enable"
EndSection

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "keyboard"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc104"
Option "XkbLayout" "us"
Option "XkbOptions" "ctrl:nocaps,compose:menu"
EndSection

Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/psaux"
Option "Protocol" "PS/2"
Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
Identifier "Generic Mouse"
Driver "mouse"
Option "Device" "/dev/input/mice"
Option "SendCoreEvents" "true"
Option "Protocol" "ImPS/2"
Option "ZAxisMapping" "4 5"
EndSection

Section "Device"
Identifier "nVidia Corporation NV17 [GeForce4 440 Go]"
Driver "nvidia"
BusID "PCI:1:0:0"
Option "UseFBDev" "true"
EndSection

Section "Monitor"
Identifier "Dell Latitude"
Option "DPMS"
HorizSync 29-75
VertRefresh 40-60
EndSection

Section "Screen"
Identifier "Default Screen"
Device "nVidia Corporation NV17 [GeForce4 440 Go]"
Monitor "Dell Latitude"
DefaultDepth 24
SubSection "Display"
Depth 1
Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 4
Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 8
Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 15
Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 16
Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth 24
Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "800x600" "640x480"
EndSubSection
EndSection

Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen"
InputDevice "Generic Keyboard"
InputDevice "Configured Mouse"
InputDevice "Generic Mouse"
EndSection

Section "DRI"
Mode 0666
EndSection

2005/09/11

솔라리스 10에서의 자원의 설정 : 가용 file descriptor의 변경

솔라리스 9전에는 애플리케이션이 사용하고자하는 최대 오픈 가능한 화일을 조정하기 위하여 화일 디스크립터(fd)의 수를 /etc/system에 추가해서 변경하였었다.

/etc/system :
set rlim_fd_cur=2048 ; 애플리케이션에 기본으로 할당되는 fd 개수, soft limit
set rlim_fd_max=4096 ; 애플리케이션 내에서 시스템콜(setrlimit)으로 변경(증가)시킬 수 있는 최대의 fd 수, hard limit

그리고, reboot이 반드시 필요했다.

솔라리스 9이후부터는 특히, 솔라리스10에서는 이러한 자원의 설정과 변경의 개념은 '사용자'와 '프로젝트'라는 특별히 확장된 형태의 '그룹'의 개념을 기반으로 자원을 동적으로 설정 및 변경할 수 있도록 바뀌었다. 동적이란 말은 당연히 설정 이후에 시스템 '재부팅'이 전혀 필요없음을 의미하는 것이다.

실제 어떻게 적용하는 지를 보기위해서 아래 예를 보도록 하자.
솔라리스 10에서 apache라는 사용자를 만들어서, apache라는 사용자가 웹서버를 운영한다고 가정하자.
apache라는 사용자로 로그인을 한후 apache의 각종 리소스가 어떻게 설정되어 있는 지를 확인하기 위해서는 다음과 같이 실행하면 볼 수 있다.
#prctl -P $$ more

그중에서 file-descriptor를 보기위해서는
#prctl -P $$ fgrep -i file-des
을 실행하게 되면,
process.max-file-descriptor basic 256 - deny 1113
process.max-file-descriptor privileged 65536 - deny -
process.max-file-descriptor system 2147483647 max deny -
와 같은 결과를 볼 수 있게 된다.

위에 나타난, 'basic'은 일반 사용자, 'privileged'는 root권한 혹은 그에 대응하는 권한을 가진 사용자, system은 전체 시스템 최대값을 의미하게 된다.

사용자의 애플리케이션이 privleged 권한으로 수행할 수 있고, 코드안에서 setrlimit을 사용하여 필요한만큼 증가하는 구조를 가지고 있다면, 솔라리스10의 기본 설정은 결코 부족하지 않게 된다.그러나, 일반 사용자인 경우 'basic'의 숫자는 때로는 모자랄 수 있으며, 이런 경우에는 기본 값을 증가시킬 필요가 있다.

이때 이 basic 값을 증가시키기 위해서는 다음과 같이 실행한다.
일단 해당 사용자(여기서는 apache)의 기본 프로젝트를 확인한다.
기본 프로젝트를 확인하기 위해서는
#projects -d
를 실행한다.

만약 'default'라고 나온다면

자원의 기본 설정을 변경하기 위해서 다음과 같이 실행한다.
#projmod -K "process.max-file-descriptor=(basic,2048,deny)" default




참고적으로, root 사용자로 웹 서버를 돌리는 행위는 보안적인 측면에서나 관리측면에서 매우 어리석은 짓이다. 설사 웹서버가 80포트에 바인딩하기 때문에 root Privilege가 필요하다 하더라도
일반 사용자가 RBAC기능을 이용하여 80포트를 바인딩하도록 하는 것이 바람직하다.
RBAC 기능은 후에 언급하도록 하겠다.

2005/08/24

썬에 입사한지 내일 정확하게 9년하고 반이 지나는 시점에서
나를 돌아볼 기회가 생겼습니다.
오랜 동안 어설프게 알아오면서 익히게된 솔라리스가 이제는
상당히 친한 친구가 되었습니다. 가끔 미운 마음도 들때가
있지만, 여전히 내가 외로울때 나를 지켜주었고, 용기를
주었던 솔라리스에 대한 얘기를 나누고 싶다는 생각이 들었습니다.

솔라리스에 관한 내 생각..
자잘한 솔라리스 기술들...
솔라리스 기반의 좋은 아키텍쳐들...

뭐 이런 것들을 실어볼 까 합니다.
많은 호응이 있기를 바라겠습니다.

주의 : 이곳에 나오는 그 어떤 내용도 저의 개인적인 견해이며
제가 소속한 한국썬마이크로시스템의 견해가 아님을 미리 밝혀둡니다.