고가용성(HA) 컨테이너를 ZFS 상에 설치하는 것은 꽤 어려운 작업입니다. 썬에서 제공하는 문서는 이 주제를 다루는데에 있어서 약간 부족하지만 대부분의 경우 적절한 방향을 제시해 주고 있습니다.
이 글은 다음과 같은 주제를 다룹니다:
- 소프트웨어와 하드웨어 환경
- 운영체제 설치 및 ZFS 풀 생성하기
- SCSI 케이블을 연결하고 SCSI 리셋 해결하기
- 솔라리스 클러스터 3.2 소프트웨어 설치하기
- 존을 위한 스토리지 풀 생성하기
- 클러스터 설치하기
- 리소스 설정하기
- HA 스토리지 설정하기
- 존 생성하기
- 두번째 노드 설정하기
- 저자에 관하여
소프트웨어와 하드웨어 환경
필자가 사용하고 있는 소프트웨어 및 하드웨어 환경은 다음과 같습니다:
- 두개의 썬 파이어 280R 서버에 2Gbyte 램과 하나의 1.2Ghz 프로세서. 두서버 모두 각각 두개의 68Gbyte 하드 드라이브를 가지고 있고 다음과 같이 파티션이 구성되어 있음:
c1t0d0s0: 솔라리스 볼륨 메니저를 이용해c1t1d0s0과 미러링 된14-Gbyte/c1t0d0s1: 2 Gbytes 의 스왑 공간c1t0d0s3: 솔라리스 볼륨 메니저를 이용해c1t1d0s3과 미러링 된 8-Gbyte/varc1t0d0s4와c1t0d0s5는 메타데이타베이스를 위해 각각 10 Mbytes 씩 할당됨, 그리고 메타데이타베이스는c1t0d0s4과c1t0d0s5에 존재함.c1t0d0s6: 클러스터링을 위한 512-Mbyte/globaldevicesc1t0d0s7:/export/home에 마운트된store/home이라는 다른 ZFS 파일 시스템을 저장하기 위한 43Gbyte 의c1t1d0s7
- 하나의 StorEdge 3310 SCSI 어레이 ("just a bunch of disks" [JBOD])와 8개의 68Gbyte 하드드라이브 ZFS 파일시스템이
tank라고 불리는 RAIDZ2 스토리지 풀로 지정됨, 그리고 하나의 두개의 슬라이스를 18Gbyte 하드 드라이브;s0은 2Gbyte quorum 디바이스이고s1은 16 Gbytes 의 공유 스토리지임.- SPRAC 플랫폼을 위한 솔라리스10 5/08 (HW508)
- 솔라리스 클러스터 (이전에는 썬 클러스터로 불렸음) 3.2 2/08 소프트웨어
운영체제 설치 및 ZFS 풀 생성하기
일단 제일 첫번째로 운영체제를 설치 합니다. 필자는 소프트웨어와 하드웨어 환경 에서 설명한 대로 설정하였습니다. 왜냐하면 아직까지 SPARC 에서 ZFS 를 이용해서 부팅시키는 방법을 모르기 때문입니다. 방법을 알게 되면 바로 적용할 것입니다. 그때까지는 솔라리스 볼륨 메니저를 이용해서 메타디바이스들을 설정하고 이를 이용해서 루트 와 /var 파일 시스템을 미러링하기 위해 솔라리스 볼륨 메니저를 사용할 것입니다.
각각의 노드가 모두 동일한 구성을 가지고 동일한 루트 패스워드와 유저 ID 를 가지고 있도록 하시기 바랍니다. 이 방법을 통해서,클러스터를 설정할때 모든 것이 완벽하고 부드럽게 동작할 것입니다.
이제 필자가 마운트한 기타 모든 것들을 저장하기 위한 ZFS 스토리지 풀인 store 를 생성했습니다.
zpool create -f store c0t0d0s7 c1t0d0s7 zfs create store/home zfs set mountpoint=/export/home store/home zfs set sharenfs=rw store/home zfs set quota=10g store/home
SCSI 케이블을 연결하고 SCSI 리셋 해결하기
초기 ZFS 풀을 설정한 다음 필자의 JBOD 를 서버에 연결할때 몇가지 이슈들에 봉착했습니다. 한가지 이슈는 필자가 충분한 SCI 케이블을 가지고 있지 못했다는 것입니다. 그러므로 디바이스및 다른 NIC 를 연결시키기 위하여 케이블을 주문해야 했습니다.
모든 설정이 끝난다음의 과정은 매우 간단했습니다. SCSI 케이블을 받은 다음에 그림 1번처럼 JBOD 를 연결하였습니다.

그림 1: JBOD 와 SCSI 케이블
필자는 버스에서 SCSI 리셋이 일어나고 있음을 발견했습니다. 이것은 scsi-initiator-id 가 각각의 서버에서 7로 설정되어 있었기 때문입니다. OpenBoot 프롬프트로 들어가서 서버중에 하나로 들어가서 다음의 명령을 실행하였습니다:
setenv scsi-initiator-id 5
그다음 두 서버를 모두 재부팅해서 모든 디스크를 찾아보려 했습니다. 모든 디스크들이 한쪽 서버에서만 보이고 다른 쪽 서버에서는 보이지 않았습니다.
이때 devfsadm 을 실행하였고 마술처럼 JBOD 의 하드 드라이브들이 보이게 되었습니다. 이제 필자는 JBOD 의 모든 디스크들을 양쪽 서버에서 볼 수 있게 되었습니다.
솔라리스 클러스터 3.2 소프트웨어 설치하기
필자는 솔라리스 클러스터 3.2 소프트웨어를 설치 하였습니다.
핵심 및 다음 패키지들이 설치 되었는지 확인하였습니다:
SUNW.HAStoragePlus(HA 스토리지)SUNWsczone(HA 컨테이너)SUNW.nfs(HA NFS 로 ZFS 파일 시스템을 NFS 를 이용해 공유하고자 할 때에 필요함)SUNW.gds(HA 범용 데이타 서비스)SUNW.LogicalHostname(클러스터 전체에 통용되는 호스트 이름을 사용하기 위한 패키지)
여러분이 필요한 어떠한 패키지도 설치할 수 있습니다. 단지 여러분들의 존과 ZFS 파일시스템에 HA 를 이용하기 위해서는 위의 패키지들이 반드시 필요합니다. 필자는 모든 것을 설치하기를 권장합니다; 앞으로 어떠한 패키지가 클러스터에서 사용되게 될지 아무도 모르기 때문입니다.
솔라리스 클러스터 소프트웨어를 설치한 다음 썬에서 모든 패치와 보안 업데이트를 설치하시기 바랍니다. 패치 설치 후에 시스템을 재부팅 합니다.
존을 위한 스토리지 풀 생성하기
이제 여러분은 존을 위한 스토리지 풀을 생성할 수 있습니다.
필자는 아래의 커맨드를 이용해서 raidz2 라고 하는 하나의 큰 풀을 생성하였습니다:
zpool create -f tank raidz2 c2t8d0 c2t9d0 c2t10d0 \ c2t11d0 c3t8d0 c3t9d0 c3t10d0 c3t11d0 zfs set mountpoint=/share tank mkdir /share/HA
주의: 필자는 이후 단계를 위해서 /share/HA 디렉토리를 만들었습니다. 이것은 필자의 HA NFS 설정이 들어갈 곳입니다. 나중에 좀 더 명확하게 이유를 알게 될 것입니다.
클러스터 설치하기
이제 클러스터를 설치할 시간입니다:
usr/cluster/bin/scinstall
여러분의 클러스터를 설정하기 위한 단계를 글로써 설명 합니다. 여러분은 노드의 갯수, 그들의 이름 그리고 서로간의 통신 방법에 관하여 지정해야 합니다. 필자는 interconnect 을 위해 스위치를 사용하지 않고 크로스오버 케이블을 사용했습니다. 그리고 /globaldevices 의 기본값을 사용하였습니다.
두 노드들이 설정되고 재부팅 된 다음 시스템은 클러스터 모드로 동작하고, 모든 디바이스를 찾고, quorum 디바이스를 설정합니다. 설치 "마법사" 단계에서 quorum 디바이스를 정의하였고 이 디바이스는 JBOD 에 2-Gybte 슬라리스를 가진 18-Gbyte 하드 디스크 드라이브 입니다.
재부팅 후에 다시 scinstall 을 실행하면 quorum 디바이스 설정으로 바로 데려가 줍니다. 불행하게도 클러스터가 모든 디스크들에 연결되었을때 디바이스가 무엇이었는지 기억하지 못했습니다. 그래서 다른 노드로 건너가서 scdidadm -L. 을 실행해야 했습니다.
이 커맨드는 여러분들이 각각의 노드에 연결된 모든 디스크들을 볼 수 있도록 합니다. 필자는 quorum 디바이스가 c2t12d0s0 이고 DID 11 이 주어졌음을 확인하였습니다. 이제 d11 을 입력해서 s0 을 찾았고 이것이 저의 quorum 디바이스입니다.
필자의 시스템은 이제 아직까지는 아무것도 공유되고 모니터되지 않는 완벽하게 동작하는 클러스터가 되었습니다.
리소스 설정하기
이제 우리는 재미있는 부분을 수행하게 되는데 이것은 바로 실제로 리소스를 설정하는 것입니다. 이 부분이 가장 어렵습니다, 그러나 썬은 작업을 직관적으로 할 수 있도록 만들어 놓았습니다.
여러분에게 필요한 첫번째 작업은 여러분의 클러스터가 필요로하게될 모든 리소스들을 가진 리소스 그룹을 만드는 것입니다. 반드시 root 혹은 시스템 관리자 권한으로 로그인하시기 바랍니다.
첫번째로 서비스들을 등록합니다:
clresourcetype register SUNW.HAStoragePlus SUNW.nfs \ SUNW.gds
이제 리소스 그룹을 생성하는데, HA FNS 를 위해서 PathPrefix 를 /share/HA 로 지정합니다. 디렉토리는 이 커맨드를 실행하기 전에 반드시 존재해야 합니다. 그렇지 않으면 이 path prefix 를 사용할 수 없습니다. 이 위치는 dfstab 이 HA 에 존재하는 저의 모든 NFS share 들을 찾기 위한 장소 입니다.
clresourcegroup create -p PathPrefix=/share/HA tank_rg
이 전 커맨드에 대해 간단히 설명하자면: 여러분은 클러스터 소프트웨어에게 리소스 그룹 tank_rg 를 만들도록 하였습니다.
필자는 다음과 같은 명명 규칙을 사용하였는데 먼저 리소스 그룹의 이름은 풀이름_rg , 서비스 리소스는 서비스이름_rs , 그리고 논리적 호스트 리소스를 위한 호스트 이름은 호스트이름_lh_rs 으로 지정하였습니다. 이러한 명명 표준을 사용하게 되면 syslog 에 에러를 찾기가 훨씬 쉬워집니다.
이제 서버의 논리적인 호스트 이름을 설정합니다.
주의: 이 이름은 반드시 두 노드의 호스트 파일에 존재해야 하고 IP 주소와 연결되어 있어야 합니다.
첫째로 vi 를 이용해서 /etc/hosts 에 호스트 이름을 지정하였습니다.192.168.101.5 logicalname
그다음에 파일을 :wq 를 이용해서 저장하였고 리소스를 생성하였습니다:Clreslogicalhostname create -g tank_rg -h logicalname \ logicalname_lh_rs
HA 스토리지 설정하기
이제 HA 스토리지를 설정합니다:
clresource create -g tank_rg -t SUNW.HAStoragePlus -p \ Zpools=tank tank_hastorageplus_rs
여러분의 스토리지 풀이 솔라리스 클러스터 소프트웨어 상에서 실행됩니다. 여러분의 스토리지 풀을 다시 보기 위해서는 클러스터 리소스 그룹을 시작시켜야 합니다.clresourcegroup online -M tank_rg
df -k 를 실행하면 여러분은 스토리지 풀을 볼 수 있을 것입니다. 그러나 여러분이 지정한 마운트 포인트에 마운트 되었음을 볼 수 있습니다, 예를 들어:tank 420037632 7730096 403406064 2% /share
이제, NFS 가 동작하기 전에 여러분은 몇가지 디렉토리와 파일들을 설정해야 합니다.
리소스 그룹에 path prefix 를 /share/HA 로 지정한것을 기억하십니까? NFS 는 이 path 를 설정파일과 lock 파일들을 저장하는 장소로 사용할 것입니다. 그러므로 여러분의 NFS share 는 사실상 고가용성을 가지게 됩니다. 우리는 디렉토리를 하나 추가해서 dfstab 의 복사본을 리소스 이름들이 추가된 상태로 가지고 있어야 합니다. 그러므로써 HA NFS 리로스에 대한 접속이 이 디렉토리와 파일들을 보게 될 것입니다.
mkdir /share/HA/SUNW.nfs
cp /etc/dfs/dfstab /share/HA/SUNW.nfs/dfstab.tank_nfs_rs
파일을 복사한 다음에 디렉토리로 가서 dfstab 을 vi 를 이용해서 수정합니다:vi dfstab.tank_nfs_rs share -F nfs -o rw -d "HA NFS File Share" /share/nfs :wq mkdir /share/nfs; chmod 777 /share/nfs
그 다음으로 NFS 를 위한 리소스를 생성합니다:clresource create -g tank_rg -t SUNW.nfs -p \ Resource_dependencies=tank_hastorageplus_rs \ tank_nfs_rs
이제 NFS 를 HA 환경으로, ZFS 스토리지를 HA 환경으로 가지게 되었고 논리적 호스트 이름을 사용할 준비가 되었습니다.
존 생성하기
그 다음으로 우리는 존을 생성할 것입니다. 중요한 점으로 여러분이 존을 생성할때 여러분이 기본 디렉토리들을 공유 한다면 (/usr, /platform, /sbin, 그리고 /lib),이 디렉토리는 양쪽 모두에서 오나벽하게 동일해야 합니다. 이 문제를 해결할 수 있는 가장 쉬운 방법은 여러분의 존에 고유의 ZFS 마운트 포인트를 지정하고 zonecfg 에서 create -b 옵션을 이용하고 여러분의 ZFS 풀을 새롭게 생성된 HA 스토리지 상에 생성하는 것입니다.
zfs create tank/zones zfs create tank/zones/testzone zfs set quota=5g tank/zones/testzone
위의 작업을 통해 존이 사용할 ZFS 풀을 설정 합니다. 필자는 오직 5Gbyte 만 사용했는데 왜냐하면 이 테스존을 사용하는 이유는 단지 다른 조직에 UNIX 서버의 오류를 체크해서 결과를 필자에게 메일로 보내주는 역활만을 하기 때문입니다. 전체 솔라리스10 존 설치는 3Gbyte 의 공간을 사용하는데, 5Gbyte 를 사용함으로써 향후에 사용하게 될 소프트웨어 혹은 패치를 위해 2Gbyte 의 여유 공간을 얻을 수 있습니다.
이제 존을 설정합니다:zonecfg -z testzone create -b set autoboot=false set zonepath=/share/testzone add net set address=192.168.101.6 set physical=eri0 end verify commit exit
autoboot 가 반드시 false 로 설정되도록 합니다. 우리의 존은 솔라리스 클러스터 존 패키지내의 HA 스크립트에 의해 시작되고 정지될 것입니다. 여러분이 autoboot 를 활성화 한다면 여러분은 존을 HA 환경으로 설치할 수 없습니다.
이제 새로운 존을 설치, 부팅 및 설정할 것입니다:zoneadm -z testzone install zoneadm -z testzone boot zlogin -C testzone
설정이 완료된 다음에는 ~. 을 눌러서 여러분의 존에 콘솔 세션을 종료 합니다. 그 다음에 다음의 커맨드를 입력합니다:zoneadm -z testzone halt
여러분은 반드시 존을 halt 시켜야 합니다. 그러므로써 HA 환경에서 존을 설치하는 스크립트를 실행할 수 있습니다.
이제 여러분은 존의 리소스를 생성하기 위한 몇몇 파일들을 수정해야 합니다.
여러분이 HA 컨테이너를 설치할때 소프트웨어는 /opt/SUNWsczone 에 설치 됩니다. 이 과정을 수행할때 가장 우려가 되는 디렉토리는 바로 /opt/SUNWsczone/sczbt/util 로 존들의 부트 스크립트가 존재 하는 곳입니다.
/sczsh 는 존이 부팅되고 실행되는 동안에 사용되는 시작 스크립트로 존이 실행된 다음에 프로그램을 실행할때에 유용합니다.
/sczsmf 는 존이 실행된 다음에 서비스 관리 설비(SMF) 서비스를 부팅시키고 실행하는데에 사용됩니다.
오직 존을 부팅하고 실행하기만을 원하므로 오직 /sczbt 를 사용할 것입니다.
HA 존들을 생성할때 사용할 스크립트들을 위해서 /share/zones 아래에 /config 디렉토리를 생성하였습니다:mkdir /share/zones/config
그 다음에 /opt/SUNWsczone/sczbt/util/sczbt_config 를 /share/zones/config 로 복사하였습니다:cp /opt/SUNWsczone/sczbt/util/sczbt_config \ /share/zones/config
vi 를 이용해서 파일을 수정하였고 내용은 다음과 같습니다:RS=testzone_rs RG=tank_rg PARAMETERDIR=/share/zones/config SC_NETWORK=false SC_LH= FAILOVER=true HAS_RS=tank_hastorageplus_rs Zonename="testzone" Zonebrand="native" Zonebootopt="" Milestone="multi-user-server" LXrunlevel="3" SLrunlevel="3" Mounts=""
이전의 스크립트가 나타내는 내용은 다음과 같습니다:
RS는 여러분의 존이 사용할 리소스의 이름임.RG는 여러분이 리소스가 존재하는 리소스 그룹의 이름임. 이것은 반드시 스크립트 실행전에 미리 생성되어 있어야 함.PARAMETERDIR는 여러분의 존에 전달할 스크립트들, 파라미터들이 존재할 디렉토리 임.SC_NETWORK여러분의 존이 네트워크 ID 를 어떻게 얻어올 것인지를 지정함.만약
zonecfg을 이용해서 설정 했다면 여기서false를 사용함.만약 여러분의 존이 여러분의 클러스터에서
logicalhosts리소스를 사용하도록 설정하길 원한다면true를 입력하고SC_LH에logicalhost를 입력함.그렇지 않으면
SC_LH공백으로 놔둠.FAILOVER는 존의 fail over 가 가능한지를 지정함. fail over 가 가능하길 원하고, 공유 스토리지가 HA 환경 안에서 구성되어 있으므로true로 설정이 가능하고 다음줄에 HA 스토리지 이름을 넣어 줌.HAS_RS는 HA 스토리지 리소스 이름을 지정함. 이것은 존의 fail over 가 필요할때에 사용됨.Zonename은 말 그대로 존의 이름임; 즉 여러분의 존의 이름.Zonebrand는 어떤 타잎의 존을 여러분이 부팅하는지를 지정함.native가 기본적으로 사용됨.lx는 리눅스 컨테이너이고solaris8은 솔라리스8 레가시 컨테이너를 위해 사용됨.Zonebootopt는 존의 부트 옵션을 지정함. 사용가능한 단 하나의 옵션은 싱글 유저 모드인-s임. 그러나 우리는 멀티유저를 원하므로 그냥 공백으로 놔둘것.Milestone은 리소스가 클러스터에게 성공적으로 시작되었다고 알리기 전에 어떠한 마일스톤 레벨이 되길 원하는지를 지정함. 기본값인multi-user-server가 여기서는 적당함.LXrunlevel은 오직Zonebrand가lx일때 사용됨. 기본값을 써도 무방한데 이유는native가 사용되면 이 값은 무시 되기 때문임.SLrunlevel은 오직Zonebrand가solaris8일때 사용됨. 기본값을 써도 무방한데 이유는native가 사용되면 이 값은 무시 되기 때문임.Mounts는 존이 부팅된 후에 글로벌 존에서 여러분의 존으로 로드하길 원하는 마운트 포인트를 지정함. 반드시 여러분의 존에서 해당 마운트 포인트를 접근할 수 있어야 함을 명심할 것.
이제 부트 스크립트 작성을 모두 마쳤고, 리소스를 등록해야 합니다:clresourcetype register SUNW.gds
/opt/SUNWsczone/sczbt/util 디렉토리로 이동해서 register 스크립트를 실행합니다:/opt/SUNWsczone/sczbt/util/sczbt_register -f \ /share/zones/config/sczbt_config
서비스를 활성화 시킵니다:clresource enable testzone_rs
두번째 노드 설정하기
이제 여러분은 여러분의 존을 Ha 환경에서 부팅했고 실행하고 있습니다. 그러나 모든 작업이 끝난것은 아닙니다. 오직 클러스터 상의 한 노드에 대한 설정만을 끝냈을 뿐입니다. 만약 fail over 를 시도한다면 존 이외에 모든 것들은 정상적으로 작동될 것입니다.
두가지 작은 작업들이 남았습니다.
다른 노드에 복사해야할 두가지 XML 파일들이 존재 합니다. 둘 모두 /etc/zones 에 위치하고 있습니다. 하나는 인덱스 파일이고 다른 하나는 testzone.xml 파일입니다.
이 파일들을 여러분의 다른 노드에 복사해서 /etc/zones 디렉토리에 가져다 놓습니다. 이게 끝입니다. 여러분은 클러스터를 원하는대로 fail over, fail back 시킬 수 있습니다. 그리고 또한 아무런 문제도 겪지 않을 것입니다.
필자는 rcp 를 이용해서 파일을 복사 헀습니다. 왜냐하면 각각의 노드는 어쨌든 자유자재로 통신할 수 있기 때문입니다. 그러므로 rcp 를 사용하는 것은 논리적으로 옳은 작업입니다.
rcp 를 사용하기 위해서 클러스터 각각의 노드를 / 디렉토리의 .rhosts 파일에 추가하였습니다. vi 를 이용하여 작업을 수행했습니다.
노드 1:vi /.rhosts node2 root :wq
노드 2:vi /.rhosts node1 root :wq
이제 여러분은 rcp 를 사용하여 다른 서버로 파일을 복사할 수 있습니다. XML 파일 복사를 위해서 단순히 아래의 명령을 수행하시면 됩니다.
노드 1:rcp /etc/zones/testzone.xml node2:/etc/zones
노드 2:cd /etc/zones mv index index.org rcp node1:/etc/zones/index .
이게 끝입니다. 여러분의 XML 설정이 복사 완료 되었습니다.
이제 여러분은 여러분이 원하는대로 존을 설정하실 수 있고 또한 문제 없이 fail over 도 동작할 것입니다. 즐기시기 바랍니다!
저자에 관하여
Lucas Williams 은 UNIX 와 마이크로소프트 윈도우즈 시스템 관리자로 15년 이상 일해 왔습니다. 그는 다양한 리눅스 배포판, 솔라리스(2.6 부터 10까지), 노벨 네트워킹, 그리고 윈도우 NT 3.51 부터 2008 서버에 이르기 까지 다양한 운영체제를 경험해 보았습니다. 시스템 관리를 좀 더 쉽게 하기 위해 스크립트를 작성하고 신기술을 프로덕션 환경에 배치하기 전에 베타 테스팅을 하는 것을 담당하고 있습니다.
현재 그는 가상화 기술을 이용해서 프로덕션의 크리티컬한 시스템을 HA 환경에서 운용하는 것에 대하여 작업하고 있습니다.
이 글의 영문 원본은
Installing HA Containers With ZFS Using the Solaris 10 5/08 OS and Solaris Cluster 3.2 Software에서 보실 수 있습니다.
"관리자코너" 카테고리의 다른 글
- 맥북 13인치 코어 2 듀오에 솔라리스10 설치하기 (댓글 2개 / 트랙백 0개) 2008/06/16
- 썬 버추얼 데스크탑 커넥터 1.0(베타)을 사용한 VDI 데모 구축 (댓글 0개 / 트랙백 0개) 2008/01/23
- 솔라리스 Tip Of The Week:SMF (댓글 0개 / 트랙백 0개) 2009/01/23
- GlassFish 를 프로덕션 환경으로 설치하기 (댓글 0개 / 트랙백 0개) 2009/11/23
- 솔라리스 레디 애플리케이션 및 솔루션 (댓글 0개 / 트랙백 0개) 2008/03/13
- 솔라리스 10 에서 TCP Wrapper 사용하기 (댓글 1개 / 트랙백 0개) 2006/01/23
- 시만텍 베리타스 넷백업과 ZFS 스냅샷 통합하기 (댓글 0개 / 트랙백 0개) 2009/07/17
- ZFS, 썬의 최신 파일 시스템(Part 1: 스토리지 무결성, 보안성 및 확장성) (댓글 3개 / 트랙백 1개) 2006/11/23
- USB로 부팅하기 - 설치 (댓글 31개 / 트랙백 1개) 2007/08/20
- 파일과 디렉토리를 안전하게 옮기거나 카피 할 수 있는 방법 (댓글 6개 / 트랙백 0개) 2007/04/23
댓글을 달아 주세요