| Brian Leonard, 2008년 11월 20일 |
필자는 윈도우의 공유 폴더를 부팅시간에 /etc/vfstab 파일을 통해서 마운트 하는 것은 불가능하다고 생각했었습니다. 왜냐하면 필수적인 smb 클라이언트 SMF 서비스가 시작되지 않았기 때문입니다. 그렇다면, smb 클라이언트에 의존적인 저의 고유의 SMF 서비스를 만들어서 마운트를 담당하도록 하면 어떨까요?
첫번째 문제로 저는 한번도 SMF 서비스를 작성해 본적이 없습니다. 이 서비스 개발자 소개 문서가 비록 완벽하게 다 들여다보진 못했지만 저를 올바른 방향으로 인도해 주었습니다. 몇번의 시도를 거친 끝에 이제 저는 부팅 시에 저의 윈도우 공유폴더를 마운트 하는 고유의 서비스를 만들었습니다. 옳든 틀리든 간에 아래에는 제가 따른 단계들을 적었고 여러분이 만들고자 하는 어떠한 서비스에 라도 대략적인 적용이 가능할 것입니다.
서비스 Manifest 의 이름과 위치 정하기
서비스 manifest 는 XML 파일로 여러분의 서비스에 대해 기술합니다. 이것을 작성하기 전에 우리들은 이것을 어디에 둘지 그리고 어떻게 부를지를 결정해야 합니다. (그리고 이것으로 무엇을 만들지에 대해서도)
장소 정하기
서비스 manifest 파일은 /var/svc/manifest 어딘가에 존재 합니다. 저의 서비스가 의존하게 될 기존의 smb 클라이언트 서비스 manifest 는 /var/svc/manifest/network/smb/client.xml 에서 찾으실 수 있습니다. 그러므로 이곳이 저희 새로운 서비스 manifest 를 위치시키에 논리적으로 올바른 위치로 생각됩니다.
이름 정하기
저는 저의 서비스 이름을 제가 연결하려는 윈도우 머신의 이름을 따서 integrity 라고 부르기로 했습니다. 그러므로 저의 manifest 파일은 /var/svc/manifest/network/smb/integrity.xml 가 될 것입니다.
좋은 XML 에디터 구하기
좋습니다. 이것은 선택 사항입니다. 그러나 저는 XML 을 증오 합니다. 딱 한가지 제가 XML 작업을 가능하게 하는 것은 DTD 를 분석하고 코드 완성, 구문 체크 및 구문 검증을 제공하는 좋은 XML 에디터 입니다. 저는 넷빈즈 를 사용할 것입니다. 우리는 권한이 필요한 디렉토리에서 작업을 할 것이기 때문에 터미널에서 다음의 커맨드를 이용하여 실행합니다 "pfexec netbeans".
서비스 Manifest 작성하기
서비스 Manifest 파일은 몇가지 필수 섹션들을 요구 합니다. 여기서 하나씩 소개해 드리도록 하겠습니다. 필자가 처음부터 하나씩 작성해 나감에 따라서 각각의 새로운 부분들은 굵은 폰트로 표시될 것입니다.
DOCTYPE 정의하기
아래의 두 라인을 XML 파일의 시작 부분에 추가 합니다. 만약 XML 에디터를 사용하기로 결정했다면 에디터는 해당 DTD 를 분석해서 코드 완성 등의 기능을 제공해 줄 것입니다.
<?xml version="1.0"?> <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
서비스 번들 지정하기
서비스 번들은 두가지 속성이 있는데 type 과 name 이 바로 그것입니다. 현재 우리들은 서비스 manifest 를 만들고 있기 때문에 우리의 type 은 'manifest' 가 될 것입니다. 이름은 자의적으로 지정 합니다 - 저는 'integrity' 를 사용합니다:
<?xml version="1.0"?> <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1"> <service_bundle type="manifest" name="integrity"> </service_bundle>
서비스 지정하기
여기서 우리들은 간단히 서비스의 name, version 그리고 type 을 지정합니다:
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="integrity">
<service
name="network/smb/integrity"
type="service"
version="1" >
</service>
</service_bundle>
서비스가 복수개의 인스턴스를 가질 수 있을지에 대해 생각해 보기
만약 복수개의 윈도우 공유폴더를 마운트 해야 했다면, 이것은 true 가 될 것입니다. 현재로써는 작업을 단순화 하기 위해 단일 인스턴스로 갑니다:
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="integrity">
<service
name="integrity"
type="service"
version="1" >
<single_instance/>
</service>
</service_bundle>
의존성 지정하기 (만약 존재한다면)
저의 경우에는 만약 SMB 클라이언트가 실행중이지 않다면 윈도우 공유폴더를 접속하도록 시도할 아무런 이유가 없습니다:
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="integrity">
<service
name="integrity"
type="service"
version="1" >
<single_instance/>
<!--
Dependencies. The SMB client must be enabled before shares can be
mounted.
-->
<dependency
name="client"
type="service"
grouping="reqiure_all"
restart_on="none">
<service_fmri value="svc:/network/smb/client"/>
</dependency>
</service>
</service_bundle>
참고로 저는 이 서비스를 절대 재시작되지 않도록 설정 하였습니다. 미래에는 좀더 견고하게 서비스를 만들 수도 있겠지만 현재로써는 이정도로도 충분합니다.
인스턴스 이름 정의하기
저의 서비스는 단일 기본 인스턴스를 가지고 있습니다. 가이드라인에서는 시스템 부팅에 필요한 필수적인 서비스들을 제외하고 모든 서비스들은 disabled 로 지정되어야 한다고 권고하고 있습니다. 필자가 혼자 쓰는 서비스라서 누군가에게 전달할 일은 없겠지만 그렇더라도 일단은 이 권고사항을 따랐습니다:
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="integrity">
<service
name="integrity"
type="service"
version="1" >
<single_instance/>
<!--
Dependencies. The SMB client must be enabled before shares can be
mounted.
-->
<dependency
name="client"
type="service"
grouping="reqiure_all"
restart_on="none">
<service_fmri value="svc:/network/smb/client"/>
</dependency>
<instance name="default" enabled="false">
</instance>
</service>
</service_bundle>
Start 및 Stop 메소드 정의하기
이것이 서비스의 몸통부분입니다. 서비스는 스크립트를 호출할 수도 있지만 저의 경우는 mount 및 umount 커맨드만을 실행하기를 원합니다:
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="integrity">
<service
name="integrity"
type="service"
version="1" >
<single_instance/>
<!--
Dependencies. The SMB client must be enabled before shares can be
mounted.
-->
<dependency
name="client"
type="service"
grouping="reqiure_all"
restart_on="none">
<service_fmri value="svc:/network/smb/client"/>
</dependency>
<instance name="default" enabled="false">
<!-- Start method: mounts the share -->
<exec_method
type="method"
name="start"
exec="mount //integrity.local/MyDocuments"
timeout_seconds="30"/>
<!-- Stop method: umounts the share -->
<exec_method
type="method"
name="stop"
exec="umount //integrity.local/MyDocuments"
timeout_seconds="30" />
</instance>
</service>
</service_bundle
속성 그룹 정하기
이것은 구성 서비스 (프로세스들이 시작되지 않음) 이기 때문에, 우리는 manifest 에 이것의 type 을 transient 로 지정해야 합니다. 만약 프로세스를 위한 서비스를 작성하는 것이었다면 이 항목은 그대로 남겨 둘 수도 있습니다:
<⁞?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="integrity">
<service
name="integrity"
type="service"
version="1" >
<single_instance/>
<!--
Dependencies. The SMB client must be enabled before shares can be
mounted.
-->
<dependency
name="client"
type="service"
grouping="require_all"
restart_on="none">
<service_fmri value="svc:/network/smb/client"/>
</dependency>
<instance name="default" enabled="false">
<!-- Start method: mounts the share -->
<exec_method
type="method"
name="start"
exec="mount //integrity.local/MyDocuments"
timeout_seconds="30"/>
<!-- Stop method: umounts the share -->
<exec_method
type="method"
name="stop"
exec="umount //integrity.local/MyDocuments"
timeout_seconds="30" />
<property_group name="startd" type="framework">
<propval name="duration" type="astring" value="transient"/>
</property_group>
</instance>
</service>
</service_bundle>
서비스 설명 추가
마지막으로 서비스에 설명을 추가 합니다. 이 정보는 우리가 svcs 커맨드를 이용해서 서비스를 검색했을때 나타나게 됩니다:
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="integrity">
<service
name="integrity"
type="service"
version="1" >
<single_instance/>
<!--
Dependencies. The SMB client must be enabled before shares can be
mounted.
-->
<dependency
name="client"
type="service"
grouping="reqiure_all"
restart_on="none">
<service_fmri value="svc:/network/smb/client"/>
</dependency>
<instance name="default" enabled="false">
<!-- Start method: mounts the share -->
<exec_method
type="method"
name="start"
exec="mount //integrity.local/MyDocuments"
timeout_seconds="30"/>
<!-- Stop method: umounts the share -->
<exec_method
type="method"
name="stop"
exec="umount //integrity.local/MyDocuments"
timeout_seconds="30" />
<property_group name="startd" type="framework">
<propval name="duration" type="astring" value="transient"/>
</property_group>
</instance>
<template>
<common_name>
<loctext xml:lang="C">
integrity.local smb share configuration
</loctext>
</common_name>
</template>
</service>
</service_bundle>
여러분의 XML을 확인하고 검증하기
만약 여러분이 넷빈즈 같은 XML 에디터를 사용한다면 여러분의 XML DTD 를 통해서 분석되고 검증 되는지를 확인 합니다.
서비스 설치하기
서비스가 정의되었기 때문에 이제 설치 되어야 합니다. 이것은 아래와 같은 svccfg 커맨드를 통해서 가능합니다:
svccfg import /var/svc/manifest/network/smb/integrity.xml
여러분의 서비스 관리하기
이제 여러분은 서비스를 다른 서비스들 처럼 관리하실 수 있습니다.
검색
bleonard@opensolaris:~$ svcs integrity STATE STIME FMRI disabled 12:43:40 svc:/integrity:default
시작
svcadm enable integrity
상세 검색
bleonard@opensolaris:~$ svcs -l integrity fmri svc:/integrity:default name integrity.local smb share configuration enabled true state online next_state none state_time Thu Nov 20 12:43:40 2008 logfile /var/svc/log/integrity:default.log restarter svc:/system/svc/restarter:default dependency require_all/none svc:/network/smb/client (online)
여러분의 서비스 또한 고유의 로그 파일을 가지고 있음을 확인...
bleonard@opensolaris:~$ cat /var/svc/log/integrity:default.log [ Nov 20 12:45:57 Enabled. ] [ Nov 20 12:45:57 Executing start method ("mount //integrity.local/MyDocuments"). ] [ Nov 20 12:45:57 Method "start" exited with status 0. ]
가장 중요한 것은...
이 작업이 제가 하려는 일을 가능하도록 하였다는 것입니다. :
bleonard@opensolaris:~/IntegrityDocs$ ls Calphalon.odt My Faxes My Videos Our Money.mny Software My Music My eBooks My Pictures
이 글의 영문 원본은
An Introduction to Creating SMF Services
에서 보실 수 있습니다.
"관리자코너" 카테고리의 다른 글
- 맥북 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
댓글을 달아 주세요