ARM 베이스의 저렴한 리눅스가 임베드된 하드웨어가 나왔다. 가격은 무려 25달러. 아직 판매를 개시하고 있지는 않은 것으로 보이나, 출시될 경우 필요한 산업분야에 굉장히 저럼한 가격으로 원하는 서비스의 구성이 가능 할 것으로 생각된다.
일반적으로 생각 할 수 있는 서버/클라이언트 이외에, 예를들면 스키장의 자동화를 위한 임베디드 소프트웨어의 기반 시스템등을 생각 해 볼 수 있다. 이를테면 사용자의 손목에 부착된 바코드를 리프트에서 자동으로 스캔하는 엣지 모듈의 베이스 하드웨어, 온도센서를 부착하여 특정 온도가 되면 자동으로 눈을 뿌려준다든지 하는, 중앙의 서버와 통신하며 각 지역에 용도에 따라 분산되어있는 모듈의 기반장치로 사용이 가능 할 수도 있다는 것이다.
이러한 장비가 기존의 임베디드와 다른 것은, 어려운 SoC를 굳이 배울 필요가 없이 기존의 리눅스기반 프로그래밍 기술과 다양한 라이브러리를 사용한 일반적인 어플리케이션 수준의 소프트웨어 개발 및 구동이 가능하다는 점일 것이다.
딱 필요한 성능 만큼을 극한의 상황에서 구동해야 하는 경우는 많이 있다. 이를테면 자동차나 비행기, 또는 산 꼭대기에 있는 풍력발전 모듈의 제어, 클라우드기반 서비스와 연동 될 수 있는 모든 가능한 어플리케이션, 이를테면 게임, 영상, 기타 등등 필요한 부분은 얼마든지 있다. 이는 단일 PCB 기반의 장치에서 전원/네트워킹/USB 연결만 지원하게 되더라도 그 용도는 무궁무진해 질 수 있다.
물론 이 장치가 그러한 분야에 최적이다 라고 말하기엔 아직 정보가 부족하기는 하지만, 상상해 보라. 일반 서버 한대를 250만원 주고 구매하는 대신, 이 장비를 100대 구매해서 단순 이미지 서비스 용도로 구현 하는 것도 가능하지 않을까. 물론 10/100 이기는 하지만, 네트워크 부분만을 제외하고는 오히려 클라우드에서 사용하는 한대의 인스턴스 개념으로 사용 할 수도 있지 않을까?
100대의 인스턴스와 100대의 Raspberry. 물론 컴퓨트 클라우드의 인스턴스 만큼 신축성을 가지지는 못하겠지만, 비용이 저렴하기 때문에 분산의 개념이 잘 적용된 애플리케이션 구동에는 비슷한 성능을 보이지 않을까 한다.
하지만 모든 것이 가능하지는 않을 것이다. 다만, 기존에 우리가 상상해 왔지만 임베디드 전문가가 아니면 범접하기 힘들었던 부분들에 보다 쉽게 접근이 가능 할 것이다.
아래는 아직 개발중인 Alpha 장비(위의 사진)를 사용하여 Quake III 를 구동하는 영상. 비록 퀘이크가 오래된 게임이긴 하지만, 이 정도의 성능은 일반 모바일 장치를 뛰어넘는 것으로 볼 수 있다.
Raspberry Pi alpha PCB
이 장치의 PCB. 현재 개발중인 Alpha 버전과 나중에 상용화될 장치의 다른 점은 다음과 같다고 한다.
최종 상용버전의 크기는 신용카드 크기 정도가 될 것이며, 알파 보드는 이보다 20%정도 더 크다. 사진에서 확인 할 수 있듯, 이미 다양한 종류의 커넥터에 필요한 사이즈가 반영되어 있다.
알파보드는 6레이어로 구성이 되어 있으며, 최종 버전의 출시 이전에 해결해야할 성능상의 문제가 일부 있다. 이러한 부분들에 알파 보드에서는 비교적 고가의 칩셋, 이를테면 HDI (blind, buried vias, via-in-pad) 와 같은 기능들을 하드웨어로 처리하는 칩셋을 사용하고 있다.
알파 보드에서는 최종 버전의 보드에서는 지원하지 않는 다양한 테스트와 디버깅 기능을 포함하고 있다.
또한, 대략적인 스펙은
ARM-based application processor
SMSC LAN9512 USB 2.0 hub
10/100 Ethernet controller
모델 A와 모델 B가 출시될 예정이며, 두 장치의 차이점은 모델 A는 128MB 의 메모리, 모델 B는 256MB의 메모리가 포함된 것이다. 모델 A의 경우 $25 수준이며, 모델 B의 경우에는 이보다 5~10 달러 정도 더 비싼 수준일 것이라 한다. 2011 년도 내에는 공급 될 것으로 보인다.
Raspbearry Pi running Ubuntu 9.04
prototype with 12M Pixel camera module
12M 픽셀 카메라 모듈을 붙인 프로토타입의 위용. USB 포트 사이즈를 통해 실제 하드웨어의 크기를 짐작해 볼 수 있다.
2000년대 초반 즈음, 어느 외국의 패션쇼인가 잡지에서 '컴퓨터 옷' 을 만들어 입고 치렁치렁 부품을 달고 돌아다니는 사진을 접한적이 있다. 그때는 피식 웃고 말았지만, 이제 세상은 정말로 USB 메모리 스틱만한 '제대로' 동작하는 컴퓨터를 만들어 내고 있다. 하지만, 모바일 및 전화의 기능성으로 인해 모든이들이 들고다니는 용도의 사용성 보다는, 아마도 종전의 임베디드 분야에서 더 필요한 하드웨어가 되지 않을까 하고 생각해 본다.
요새 라우터의 기능이나 성능 때문에 리눅스를 대용으로 사용 하려는 경향은 거의 없다. 하지만 Cisco 가 실리콘 밸리의 떠오르는 샛별이 되던 그 시절 즈음 해서, 아마도 ISA 버스를 사용하는 이더넷 랜카드가 대부분이던 그 시절에, LRP ( Linux Router Project ) 라는게 있었다. 지금이야 다들 Cisco 의 config를 모델로한 대부분의 상용 라우터를 사용하지만, 궁했던 그때에는 이런 리눅스 기반 라우터를 많이들 사용하곤 했더랬다. 플로피 디스켓의 추억이 떠올라 검색을 좀 해 보니, 이런 글이. 리눅스로 라우터 만들기
관련하여 LEAP (Linux Embedded Appliance Project) 라는 프로젝트도 있는데, 좀 재미있어 보이는 듯. 역시 좀 오래된 프로젝트인데, 마지막 업데이트가 언제인지는 잘 모르겠다.
아무튼 요새는 이런 정도로 사용 할 필요는 없지만, 간혹, 아주 간혹 시스템 내부에서 간단한 라우팅 프로토콜 설정이 필요한 경우가 있을 수 있다. 단순히 Static 라우팅이 아닌, rip 또는 ospf, 경우에 따라서는 bgp 정도의 구성이 필요한 경우가 있다. 이럴때 간단하게 사용 할 수 있는 도구가 바로 Quagga인데, 필요한 데몬의 조합으로 원하는 구성이 가능하다.
zebra : static 라우팅 및 인터페이스 정의
bgpd : BGP 라우팅
ospfd : OSPF
ospf6d : OSPF IPv6
ripd : RIP v2
ripngd : RIP IPv6
다음의 페이지에 간단한 샘플 구성이 있기에 가져와 보았다.
http://www.readytechnology.co.uk/open/bgp/loadbalanced.html
이런식의 이중화 구성을 사용하는데가 아직 있는지는 모르겠지만, 어쨌든 필요하면 할 수도 있는 것이므로 간단한 설정의 예제로서 참고하도록 한다.
위의 네트워크 다이어그램에서의 조건은 다음과 같다.
r1 과 r2 는 FreeBSD & Quagga 조합의 라우터일 수도 있고, Cisco 7204/7206 일 수도 있다. 어쨌든 분명한건 라우터이다.
각 라우터는 각각의 ISP와 연결되어 있다.
2950 스위치 2대는 각각 서로 다른 사설 네트워크로 구성되어 있다. (192.168.1.0/24 , 192.168.2.0/24)
이 조직은 외부 서비스 연결을 위해 공인 IP 블럭을 가지고 있다. 각 내부 호스트들은 루프백 인터페이스에 /32 넷마스크의 공인 IP를 하나씩 가지고 있다. 따라서, NAT 구성이 반드시 필요하지는 않다.
각 서버는 리눅스로 동작하고 있으며, 이들의 커널은 Equal Cost Multi-Path 라우팅이 활성화 된 상태로 컴파일 된 것을 사용한다. 이는, 커널이 라우팅 테이블에 다수의 기본 게이트웨이를 가지도록 구성이 가능하므로, 외부로 전달되는 트래픽의 분산이 가능하다. ( 커널 config 옵션은 CONFIG_IP_ROUTE_MULTIPATH=y )
전체 서버에서의 기본 게이트웨이를 포함한 라우팅 구성은 절대 수동으로 하지 않는다. 대신, Quagga 를 전체 서버에 구성하도록 한다. 내부의 서버들에서는, Quagga 의 OSPF를 사용하여 라우터의 주소를 설정하도록 구성 할 것이다.
각각의 라우팅이 장비의 문제 등으로 인해 사용이 불가능한 경우에는, OSPF 프로토콜에 의해 5초 이내로 장애가 감지되며, 이후 라우팅 테이블에서 해당 경로를 삭제한다.
OSPF를 사용하여 장애를 감지하는 것이 최선 일 수 있다. 이는 OSPF 가 IP 계층을 기반으로 동작하기 때문이다. 만약 r2에 연결된 2950 에 케이블 문제가 발생한다 하더라도, OSPF는 이러한 상황을 잘 처리 할 수 있을 것이다.
위의 구성을 바탕으로, 실제 서비스를 구성해 보면 된다. 예제에서는 데비안 리눅스를 사용하였으므로, 이변이 없다면 그냥 우분투를 사용해도 무방하겠다. 공인 IP 주소는 A.B.C.D 로 표현 되었음에 주의 하자.
Quagga 설치
apt-get update
apt-get install quagga iproute
리눅스 인터페이스 설정. 당연히 우분투에서는 /etc/network/interfaces
auto lo
iface lo inet loopback
up ip addr add dev lo A.B.C.D/32 scope global
# notice that we use `manual' rather than `static', so that we can
# over-ride the scope parameter
auto eth0
iface eth0 inet manual
up ip link set dev eth0 up
up ip addr add dev eth0 192.168.1.10/24 scope link
auto eth1
iface eth1 inet manual
up ip link set dev eth1 up
up ip addr add dev eth1 192.168.2.10/24 scope link
아래의 내용을 /etc/quagga/zebra.conf 에 구성
hostname www1
password changeme
enable password changeme
interface lo
ip address 127.0.0.1/8
ip address A.B.C.D/32 (this is your server's real IP)
interface eth0
ip address 192.168.1.10/24
multicast
interface eth1
ip address 192.168.2.10/24
multicast
!log file /var/log/quagga/zebra.log
아래의 내용을 /etc/quagga/ospfd.conf 에 적용
hostname www1
password changeme
enable password changeme
interface eth0
no ip ospf authentication-key
ip ospf hello-interval 2
ip ospf dead-interval 5
interface eth1
no ip ospf authentication-key
ip ospf hello-interval 2
ip ospf dead-interval 5
router ospf
ospf router-id A.B.C.D
network 192.168.1.0/24 area 0
network 192.168.2.0/24 area 0
!log file /var/log/quagga/ospfd.log
/etc/quagga/daemons.conf 를 수정. set zebra=yes 및 ospfd=yes
확인
설정이 완료된 호스트를 재부팅 한다. 재부팅이 완료 되면, ip route 커맨드를 사용하여 여러개의 기본 게이트웨이가 있는지의 여부를 확인한다. 이후에는 라우터 또는 회선을 분리하여 OSPF가 잘 동작하는지 확인 할 수 있을 것이다.
위의 내용 대로 설정 했음에도 불구하고 잘 동작하지 않는다면, 다음의 내용을 확인 해 보도록 한다.
커널이 Equal Cost Multi-Path 설정이 된 상태로 컴파일 되어있는지 확인한다.
커널에서 Multicast 가 활성화 되어 있는지 확인한다. 또한, NIC 및 드라이버가 이를 지원하는지의 여부를 확인하도록 한다.
iptables 에 의해 OSPF 가 막혀 있지는 않은지 확인 한다. 만약 기존의 정책에 추가해야 할 필요가 있다면, 다음의 커맨드를 참조한다.
Image from : https://supcom.hgc.jp/english/img/supcom/DiskArray.jpg
이런 저런 용도로 JBOD이 리눅스에서 굉장히 많이 사용되고 있다. 뭐 물론 계속 사용 해 왔던 분들에게는 별 문제는 아니지만, 이제 막 이런 장비를 사용하여 Swift 등을 구현하다 보면 아주 간단한 장애 디스크 하나 찾는게 골치 아파질 때가 있다. 물론 디스크 하나 찾기위해 이 도구가 필요 한 것은 아니지만, 이러한 도구 없이 X Window의 힘을 빌리기란 시스템 하는 분들 입장에서는 여간 챙피한 일이 아닐 것이다. 아, 물론 그렇게 느끼시지 않는다면 관계 없다. 살포시 디스크 매니저를 찾아 보자.
제목에서와 같이, 이 오랜만의 포스팅은 sg3_utils 에 대한 내용을 설명한다. 아 물론, 친절하게 뭐가 뭐다 하고 설명하면 더 좋겠지만, 나는 여기서 더 친절하게 무려 sg3_utils 홈 페이지의 내용 중 가장 쓸만 하다 싶은 내용을 아예 번역을 해 버렸다. 물론 번역이 그다지 나이스한 품질은 아니지만, 일하다가 짬짬히 되는대로 써 놓은 것이기 때문에, 또 별도의 다른 번역 문서도 아직 존재하지 않는 듯 하기에 포스팅을 해 본다.
아 물론, 각 표에 있는 내용까지 번역을 했더라면 좋았겠지만, 그닥 시간이 허용하지 않아서... 한시간 동안 완전 날림 번역이지만 그래도 영어로는 죽어도 못 보겠다 하시는 분들만 보시면 된다.
sg3_utils 패키지는, 리눅스에서 디스크 관련 Low Level 작업을 할 때 꽤나 유용한 패키지다. 디스크가 두세개 정도 밖에 없다면 대략 무슨 디스크가 뭔 디스크인지 쉽게 알 테지만, 24개 48개 96개 이렇게 되어버리는 데다가 별도의 RAID 구성마저 하지 않는다면 골치가 아파질 것이다.
RAID도 없이 그렇게 무식하게 디스크를 쓰는데가 어디 있냐고 물으신다면 Swift 라 답하겠어효...
클라우드의 싸게 넣어서 준비시키고 쓰다가 쫑나면 교체해 버리고의 컨셉은 디스크 사용에도 적용되기 시작했다. 이는 바로 Swift 가 제공하는 '오브젝트 스토리지'라는 신개념 스토리지 (라고 쓰고 그냥 웹 파일 서비스 라고 읽는다) 에서는, 디스크에 별도의 볼륨 구성 없이 각 디스크를 생짜로 그냥 사용한다. 대부분의 시스템 관리자 분들 께서는 Writeback이니, ZFS의 log이니, RAID Level 이 어쩌고 저쩌고에 능통하시겠지만, 이 단순한 디스크+웹 서비스는 그 간단한 구성 만큼이나 디스크 구성도 간단하게 처리해 버린다.
따라서 별로 되게 어려울 것은 없지만, 리눅스 그 자체의 안정성이 쵸큼 중요하게 되는 것도 이 서비스라고 할 수 있겠다. Commodity Hardware 에서 어떠한 방법으로 안정성을 구가하는가가 오히려 더 중요한 포인트가 될 수도 있음이다.
아 물론, 우분투 LTS 버전이 무조건 안정적이다 하시는 분들도 계시고, 여기서 커널 바꾸면 세상 무너지는 줄 아는 분들도 계시긴 하지만, 그런 분들에게 이러한 Low Level 도구는 위험하므로 얼른 다른자료 찾아 보시길 권고한다. 물론, 그까이꺼 LED 따위 고장나면 바로 켜져야 하는거 아냐 하고 생각 하시는 분들 께서도 굳이 이런 난잡한 번역 읽느라 고생 하실 필요가 없음.
자꾸 새는데, 뭐 결국은 sg3_utils 로 해 볼 수 있는 것들이 많고, 보통 Production 단계 이전의 Dev나 STAG 환경에서 마음껏 가지고 놀아보는게 중요하겠다.
각설하고, 웹 버전으로 보고 싶으신 분들은 아래의 펼쳐보기를 누르시면 된다.
원래의 작업을 워드로 처음 해 봤더니, pdf 로 만들 수도 있어서 한번 만들어 봤다.
번역이 좀 구려도 대충 보시라.
sg3_utils 은 SCSI 장치에 커맨드를 보내기 위한 도구를 포함한 패키지다. Fiber
Channel (FCP), SAS, SCSI Pararllel Interface(SPI) 등 SCSI
커맨드 세트를 사용하는 모든 장치에 사용이 가능하다. 또한, SCSI 커맨드 세트를 사용하도록 구성된 전송 계층 및 브릿지 장치를 사용하는 하드웨어들, 이를 테면 ATAPI 또는 SATA
와 같은 구성에서도 사용 할 수 있다.
SCSI 커맨드 세트는 크게 두 가지 부분으로 나뉘는데, 하나는 모든 장치가 공통적으로 사용하는 부분이며, 다른 하나는 장치별로 특별한 세트를 사용하는 부분이다. 공통적인
부분이라 함은 가장 최근의 SCSI 표준인 SPC-3 를
기반으로하는 SCSI 메인 커맨드 (SPC)를 의미한다. 이는, SPC-3에 의해 정의된 SCSI
INQUERY 커맨드를 구현해야 한다. 또한, SCSI
Block Command(SBC)는 디스크와 같은 직접 접근이 가능한 장치를 다루도록 한다. Multi
Media Commands(MMC)는 CD, DVD 및 BD
와 같이 미디어가 포함된 장치들을 다루도록 구성되어 있다. SCSI 커맨드 세트와 전송등에
대한 정의는 www.t10.org에서 찾아 볼 수 있다. 이 사이트에서는 이러한 부분에
대한 개괄적인 내용을 다음의 링크 www.t10.org/scsi-3.htm와 함께 확인 할 수 있겠다.
sg3_utils 패키지는 리눅스 커널 2.4와 2.6에서 동작하도록
개발 되었으며, 현재도 개발이 계속 진행 중이다. 예전의
리눅스 커널 2.2를 지원하던 버전은 sg_utils 라고
명명 되었으며, 일부는 커널 2.0 시리즈를 지원하기도 했다. 이 오래된 버전에 대한 정보는 다음의 링크 http://sg.danny.cz/sg/uu_index.html에서 찾아 볼 수 있으므로 필요하면 참조 하도록 한다. 이
문서에서는 sg3_utils 의 버전 1.32에 대한 내용만을
기술하고 있다. 이 도구는 현재 FreeBSD, Solaris,
Tru64 및 Windows 시스템에 포팅 되어있다.
리눅스 커널 2.4 에서 이 sg3_utils 는 반드시 SCSI generic (sg) 드라이버
로 로드되는 장치와 함께 사용 해야 한다. (e.g. /dev/sg0 ) 리눅스 커널 2.6 에서는 일반적인 장치 이름(e.g. /dev/sda,
/dev/scd0, /dev/st0, /dev/hdd for ATAPI device)을 가진 대부분의 장치에 직접 사용 할 수 있다. 리눅스 커널 2.6.28 부터 bsg
장치들, 즉 (e.g. /dev/bsg/3:0:0:0) 와
같은 장치들에도 사용이 가능하다. 아울러, 다음의 링크 http://sg.danny.cz/sg/tools.html에서 SCSI 관련
도구들의 목록을 살펴 볼 수 있으므로 참조 하도록 한다.
Contents of
sg3_utils
이 패키지는 대략 40여개의 도구들을 포함하고 있으며, man 페이지는 일반 문서를 제공한다. 이 도구들은 다음과 같은
일반적인 커맨드 라인 기반의 스타일을 통해 사용하면 된다.
UTILITY_NAME [OPTIONS] DEVICE
한번에 하나 이상의 장치 이름을 사용 할 수 없다. (일부
특수한 경우에는 장치 이름이 필요 없을 수도 있다. ) 아래의 목록은 sg3_utils 패키지가 포함한 도구를 알파벳 순서로 나타낸 것이다.
symbolic
decoding (optional changing) of mode pages. Can also output (disk) defect
lists. Port of older scsiinfo utility.
sgm_dd
READ,
WRITE
dd
sg_dd
variant that uses memory mapped IO (only on Linux sg devices)
sgp_dd
READ,
WRITE
dd
sg_dd
variant that uses POSIX threads
sg_dd
READ,
WRITE
dd
Unix
dd command variant, uses SG_IO ioctl to send SCSI commands to copy
data. See the sg_dd page. Newer ddpt utility adds features and is ported
to "f,s,w"
sg_decode_sense
getopt
f,s,t,w
decodes
sense data given as a string of hexadecimal bytes or in binary
sg_emc_trespass
MODE
SELECT
adhoc
utility
specialized for EMC Clariion series
sg_format
FORMAT
getopt
f,s,t,w
format
or resize a SCSI disk
sg_get_config
GET
CONFIGURATION
getopt
f,s,t,w
fetch
features and profiles of a cd/dvd drive and/or its current media
sg_get_lba_status
GET
LBA STATUS
getopt
f,s,t,w
logical
block provisioning support
sg_ident
REPORT/SET
IDENTIFYING INFORMATION
getopt
f,s,t,w
default
is to report (fetch) the device identifier. With the '--set' option a new
identifier is sent to the device.
sg_inq
INQUIRY
getopt+
f,s,t,w
fetch
standard response, VPD pages or version descriptors. Also can perform
IDENTIFY (PACKET) DEVICE ATA command. VPD page decoding also performed by
sg_vpd and sdparm.
sg_logs
LOG
SENSE
getopt+
f,s,t,w
fetch
log sense pages, decode standard and some vendor pages
sg_luns
REPORT
LUNS
getopt
f,s,t,w
fetch
luns reported by a device (lun 0 or "well known lu")
sg_map
INQUIRY
adhoc
shows
mapping between sg devices and primary device node (if any). In lk 2.6 see lsscsi .
sg_map26
getopt
maps
between single Linux sg device and primary device node (and vice versa). Also
does mapping in to, and out of, sysfs. For the Linux 2.6 series.
sg_modes
MODE
SENSE
getopt+
f,s,t,w
fetch
mode pages (output mainly in hex, to decode output use sdparm)
sg_opcodes
REPORT
SUPPORTED OPERATION CODES
getopt+
f,s,t,w
fetch
supported SCSI commands or supported task management functions
sg_persist
PERSISTENT
RESERVE IN/OUT
getopt
f,s,t,w
control
persistent reservations and report reservation status
sg_prevent
PREVENT
ALLOW MEDIUM REMOVAL
getopt
f,s,t,w
control
media removal, mainly for those SCSI devices which have removable media (e.g.
CD/DVD and tape drives)
sg_raw
<user
specified>
getopt
f,s,t,w
send
user supplied cdb
sg_rbuf
READ
BUFFER
getopt+
read
from SCSI device cache. Typically for testing the SCSI transport (for
throughput or errors)
sg_rdac
MODE
SENSE/SELECT
adhoc
f,s,t,w
display
or modify RDAC redundant controller mode page
sg_read
READ
dd
read
continually from same offset. Syntax similar to sg_dd (without write side).
Can test SCSI device cache and transport performance.
sg_readcap
READ
CAPACITY
getopt+
f,s,t,w
fetch
the number of blocks and the individual block size for disks and CD/DVD media
sg_read_buffer
READ
BUFFER
getopt
f,s,t,w
read
descriptors or data
sg_read_long
READ
LONG
getopt
f,s,t,w
read
data from given LBA which includes the block and ECC data.
sg_reassign
REASSIGN
BLOCKS
getopt
f,s,t,w
reassign
a LBA from one sector on a disk (typically damaged) to a new (spare) sector.
User data copied if it is recoverable.
sg_referrals
REPORT
REFERRALS
getopt
f,s,t,w
report
data segment accessibility from target port groups
sg_requests
REQUEST
SENSE
getopt
f,s,t,w
fetch
sense data from the given device. Modern uses include getting a progress
indication (e.g. during a format) or finding the power condition state.
sg_reset
-
adhoc
Issue
a driver, (SCSI) bus or device (target or lun?) reset.
sg_rmsn
READ
MEDIA SERIAL NUMBER
getopt
f,s,t,w
Relatively
new command added to SPC-3. Format of response is vendor specific so this
utility outputs it in hex (default) or binary.
sg_rtpg
REPORT
TARGET PORT GROUPS
getopt
f,s,t,w
Specialized
for multi-ported SCSI devices where one port (or a group of them) is
preferred for IO over another (or others).
sg_safte
READ
BUFFER
getopt
f,s,t,w
fetch
information from a SAF-TE processor
sg_sanitize
SANITIZE
getopt
f,s,t,w
Send
SCSI SANITIZE command
sg_sat_identify
ATA
PASS-THROUGH
getopt
f,s,t,w
Send
ATA IDENTIFY DEVICE or IDENTIFY PACKET DEVICE commands via the SAT ATA PASS-THROUGH
(16 or 12) SCSI command.
sg_sat_phy_event
ATA
PASS-THROUGH
getopt
f,s,t,w
Sends
an ATA READ LOG EXT command via a SAT to fetch log page 11h which contains
SATA phy event counters.
sg_sat_set_features
ATA
PASS_THROUGH
getopt
f,s,t,w
Sends
ATA SET FEATURES command via SAT
sg_scan
[.c.linux]
[INQUIRY]
adhoc
Linux
only
maps
each sg device name to the corresponding numeric <host, channel, target,
lun> tuple. In lk 2.6 series the "lsscsi -g" command is similar.
sg_scan
[.c.win32]
[INQUIRY]
getopt
win32
only
shows
one device per line, with the device's various names and INQUIRY response
string on that line.
sg_senddiag
SEND
DIAGNOSTIC
getopt+
f,s,t,w
Issues
either a default self test or a short/extended foreground/background self
test. With no arguments it uses RECEIVE DIAGNOSTIC RESULTS to list all
supported diagnostic pages.
sg_ses
SEND/RECEIVE
DIAGNOSTIC
getopt
f,s,t,w
Fetches
status diagnostic pages from, and sends some control pages to, a SCSI
Enclosure Services (SES) device.
sg_start
START
STOP UNIT
getopt+
f,s,t,w
Controls
the power condition state of a SCSI device. Primary use is to spin up and
down SCSI disks. Can also load and eject removable media.
sg_stpg
SET
TARGET PORT GROUPS
getopt
f,s,t,w
Specialized
for multi-ported SCSI devices where one port (or a group of them) is
preferred for IO over another (or others).
sg_sync
SYNCHRONIZE
CACHE
getopt
f,s,t,w
Causes
disk caches to be flushed to media
sg_test_rwbuf
READ/WRITE
BUFFER
getopt
Random
pattern written to SCSI device buffer then read back and checked. Used in
testing for data corruption.
sg_turs
TEST
UNIT READY
getopt+
f,s,t,w
Issue
one or more Test Unit Ready commands. Can be used to time SCSI command overhead.
sg_unmap
UNMAP
getopt
f,s,t,w
logical
block provisioning support ("Trim" in the ATA world)
sg_verify
VERIFY
getopt
f,s,t,w
reads
indicated blocks on a SCSI disks, stops on the first error found. Does not
yield any data. Useful for media scans.
sg_vpd
INQUIRY
getopt
f,s,t,w
Decodes
standard and some vendor Vital Product Data (VPD) pages.
sg_write_buffer
WRITE
BUFFER
getopt
f,s,t,w
write
data; can be used to download firmware
sg_write_long
WRITE
LONG
getopt
f,s,t,w
writes
to a LBA, data which includes the block and ECC data. Suitable data typically
fetched by prior sg_read_long utility.
sg_write_same
WRITE
SAME
getopt
f,s,t,w
writes
a single block to one or more (consecutive) LBAs. Also supports some logical
block provisioning options.
sg_wr_mode
MODE
SELECT
getopt
f,s,t,w
writes
mode pages supplied in ASCII hex (e.g. from "sg_modes -r") to
the SCSI device. See sdparm for another method of setting mode
page parameters.
이슈가 될 만한 추가적인 SCSI 커맨드는 Main SCSI commands invoked 컬럼을 참조 하면 된다. 예를
들면, 많은 도구들에서 커맨드 라인에 지정한 장치에 대한 주변 장치를 찾아 내기 위해 SCSI INQUIRY 커맨드를 사용 하는 것과 같은 부분들이다. 위의
표에 리스트된 SCSI 커맨드들은 일부 특정한 장치 타입(e.g. 디스크의
FORMAT UNIT) 에만 관련이 되어 있으며, 이와 관련되지
않은 다른 주변 장치에 커맨드를 사용해서는 안된다. 이러한 내용에 대한 SCSI (및 ATA) 커맨드를 확인 하기 위해서는 메인 디렉토리에
포함된 COVERAGE 파일을 참조 하도록 한다.
테이블 1에 열거된 모든 도구들의 소스코드는 src 서브 디렉토리에 존재 한다. 이전 버전, 즉 1.25 에서는 이 소스 파일들은 메인 디렉토리에 존재 했었음을
참조 한다. 위의 리스트된 각 도구에 맞는 ‘man’페이지, 즉 도움말은 doc 서브 디렉토리에 있으므로 참고 하도록 한다.
위의 표에서 CLI 컬럼은, 각 도구가 가지고 있는 Command Line Interface 의
종류를 표시하고 있다. getopt_long() 함수를 사용하는 최근의 CLI 도구들은 옵션의 사용에 긴 옵션 (e.g.’--vervose’) 와
짧은 옵션 (e.g. ‘-v’) 를 함께 제공한다. 위의
표에서 getopt 로 표시된 sg3_utils에서는 이와
같은 길어진 옵션을 지원하므로, 필요한 경우 손쉽게 사용 할 수 있을 것이다. 이와는 별도로, ‘adhoc’ 으로 표시된 오리지널 도구들은 이러한
옵션의 사용에 별로 일관성이 없으므로, ‘-‘ 또는 ‘--‘ 로
시작되는 옵션을 구분해서 사용 할 필요가 있다. 또한, 유닉스의
dd 명령어와 연관된 도구들이 있는데, 이들은 dd의 다소 변덕스러운 CLI 를 공유하도록 되어있다. 마지막으로, 자주 사용되던 기존의 도구들 중 ad hoc 으로 지정된 CLI를 사용하는 도구들은,getop_long() 을 사용하도록
sg3_utils 버전 1.23 에서 변경 되었다. 이 도구들 중에는 sg_inq, sg_logs, sg_modes 와
같은 것들이 있다. 이들은 기본적으로 getopt 를 사용하여
동작 하도록 되어 있지만, 필요한 경우 “--old” 또는
“-O” 스위치를 가장 첫번째 옵션으로 사용하여 이전의 ad hoc 옵션을
사용 할 수도 있다. 또는, 환경 변수 SG3_UTILS_OLD_OPTS 를 정의하여 자동으로 ad hoc 을
사용 할 수도 있을 것이다. 이러한 타입의 도구들은 표에서 “getopt+”로
표시되어 있으므로 참고 한다.
만약 Ported 컬럼이 공백으로 되어 있다면, 그 도구는 리눅스 환경에서만 동작 할 것이다. ‘f’ 는 FreeBSD를 의미하며, ‘s’ 는 Solaris, ‘t’는 Tru64(OSF) 그리고 ‘w’는 Windows 를 지원한다는 의미이다. 이에 대한 추가적인 정보는 README, README.freebsd,
README.solaris, README.tru64, README.win32 및 INSTALL 파일을
참고하기 바란다.
Table 2. Other utilities
in sg3_utils
Utility
Main SCSI commands
invoked
directory
CLI
Ported
Notes
hxascdmp
-
utils
adhoc
f,s,w
converts
stdin (assumed binary) to ASCII hex and ASCII, sending its output to stdout
(like the Unix od command and hexdump in BSD)
rescan-scsi-bus.sh
-
archive
adhoc
copy
of Kurt Garloff's useful script
scsi_inquiry
INQUIRY
examples
adhoc
uses
deprecated SCSI_IOCTL_SEND_COMMAND ioctl
sdparm
MODE
SENSE/SELECT, INQUIRY
-->
getopt
f,s,t,w
was
in the sg3_utils package for a short time; now in own package, see sdparm . sdparm manipulates mode
pages, reads VPD pages and sends simple commands
sg_chk_asc
-
utils
getopt
f,s
check
asc/ascq codes from www.t10.org page against sg3_utils
internal table
sg__sat_identify
ATA
PASS-THROUGH
examples
adhoc
Simpler
version of sg_sat_identify that uses the Linux SG_IO ioctl directly.
sg__sat_phy_event
ATA
PASS-THROUGH
examples
getopt
Simpler
version of sg_sat_phy_event
sg__sat_set_features
ATA
PASS_THROUGH
examples
getopt
Simpler
version of sg_sat_set_features that uses the Linux SG_IO ioctl directly.
sg_simple1,2,3,4,5
INQUIRY,
TEST UNIT READY
examples
adhoc
Simple
code examples of using the scsi generic (sg) driver interface
sg_simple16
READ
examples
adhoc
Simple
code example of sending a 16 byte cdb SCSI READ command
directory 컬럼에서는 서브 디렉토리의 이름을 볼 수 있을 것인데, 이는 명시된 각 도구의 소스코드가 존재하는
위치를 나타낸다. 이 서브 디렉토리에 있는 도구들 중 일부는 해당 디렉토리 안에 있는 Makefiles 를 사용하여 빌드 할 수 있을 것이다. 테이블 2 에서는 examples 서브 디렉토리에 있는 모든 코드가 리스트
되어 있지는 않다. 또한, 이들 도구들 중 일부는 ‘man’ 페이지를 가지고 있을 수도 있을 것이다.
이 단락에서는 리눅스에 특화된 정보를 제공한다. 테이블 1에 보여진 모든 SCSI 커맨드들 중 sgp_dd 의 예외를 포함하고 있는 것들은, SG_IO ioctl 의
이슈를 가지고 있다. sgp_dd 도구는 sg 드라이버의
메이저 장치 번호(e.g. “char” major 21)를 가지고 있는 디바이스 노드에 대해 sg 드라이버의 비동기 인터페이스를 사용 한다. 만약 SG_IO ioctl 를 지원하지 않는 장치에 이 도구를 사용 했다면, 이에
대한 메세지를 출력한 뒤에 종료 될 것이다. sg3_utils 의
1.27 버전에서는 bsg 지원에 대한 내용을 소개한다.
이 패키지를 소스코드로 부터 빌드 하는 경우, ./configure 단계에서 /usr/include/linux/bsg.h 의 헤더를 참조 하려 할 것이며, bsg
char 디바이스가 /proc/devices 파일에 있어야 한다. 이렇게 빌드된 도구를 사용하여 디바이스 필드에 명시한 장치의 char
major 번호가 bsg와 매칭 된다면, sg 버전 4 인터페이스를 통해 SG_IO ioctl 을 사용 할 것이다.
해당 디바이스가 ‘active’ 인 상태에서 인터페이스를
사용하지 않도록 조심해야 한다. 예를 들어 ‘sg_format -F’
유틸리티를 마운트 되어 동작중인 파일 시스템이 하나 이상 있는 디스크에 사용하는 것은, 아마도
굉장히 멍청한 짓이 될 것이다.
Sub
directories
sg3_utils 패키지는 아래의 단락에 설명되는 몇 가지의 하위 디렉토리를 가지고 있다. sg3_utils 버전 1.25의 경우, 메인 디렉토리에 포함된 Makefiles 에 정의된 코드만을 빌드한다. (1.25의 경우 소스파일이
메인 디렉토리에 위치 한다고 하였으므로, 이는 메인 디렉토리에 위치한 코드들 만 빌드한다는 의미이다.) 1.25 버전 부터는 빌드 파일들 (i.e. configure.ac,
Makefile.am, src/Makefile.am, include/Makefile.am, lib/Makefile.am,
doc/Makefile.am) 을 사용하여 각 서브 디렉토리, lib, src, doc,
include에 있는 파일들을 참조 하여 빌드 하도록 재구성 되었다.
archive 서브 디렉토리는 최근에 src 서브 디렉토리로 부터 제외된 코드들을 포함 하도록 디자인 되었다. 전체 패키지의 사이즈를 줄이기 위해서, 각 코드의 릴리즈 별로 패키지에
포함되는 코드들은 제외 될 수 있다.
debian 서브 디렉토리는 src 서브 디렉토리에 있는 소스 코드를 리눅스 데비안 패키지(i.e. ‘.deb’) 를 빌드 하는 룰을 포함 하도록 디자인 되었다. 메인
디렉토리의 build_debian.sh 스크립트를 데비안 패키지를 만드는데 사용 할 수 있다.
doc 서브 디렉토리는 README 파일을 포함 하고 있다. 이 README 파일은 sg3_utils 와 관련된 웹 문서가 있는 url에 대한 내용을 가지고 있다. 이 서브 디렉토리의 내용을 표시하기
위해 html 코드가 사용되었다. sg3_utils 버전 1.25 에서는 man 페이지의 소스가 이 디렉토리에 있다. 이 파일들은 “.8”의 확장자로 구성되어 있으며, 이는 man 페이지의 시스템 관리자 참조 부분에 sg3_utils 의 man 페이지가 추가 될 것임을 의미한다. 대부분의 일반적인 정보에 대해서는 man sg3_utils 를 참조
하면 된다.
examples 서브 디렉토리는 지원되는 운영체제에서 사용이 가능한 몇가지의 간단한 예제 코드를 포함하고 있다. 이
도구가 SCSI 관련 도구이므로, 대부분의 예제 코드들은 SCSI Pass-through 를 사용하여 장치에 접근하고자 하는 예제 일 것이다. 아울러, 공통 라이브러리 코드를 사용한 예제도 함께 포함되어 있다. sg_persist 도구에 대한 스크립트와 데이터 역시 포함되어 있다. 이
뿐만 아니라, sg_reassign 및 sg_sending 도구에
필요한 테스트 데이터도 함께 포함되어 있으므로 살펴 보도록 한다.
getopt_long 서브 디렉토리에는 Tru64(osf)에서 지원되지 않는
getopt_long() 라이브러리 콜에 대한 구현의 내용이 들어있다.
include 서브 디렉토리는 1.25 버전부터 추가 되었으며, C 헤더
파일을 포함한다. 이 헤더 파일들은 이 패키지에 포함된 많은 도구들에서 공통적으로 사용된다. C를 기반으로 코딩되었지만, C++에서도 문제 없이 컴파일 될 것이다.
lib 서브 디렉토리는 버전 1.25부터 추가 되었으며, 대부분의
도구에서 사용되는 C 소스 파일을 포함하고 있다. 타겟 아키텍쳐(대상 시스템)의 종류 및 설정 옵션에 따라, 라이브러리로 빌드되기도 한다. 모든 소스 파일들은 C와 C++에서 문제 없이 컴파일 되도록 코딩 되어있다.
src 서브 디렉토리 역시 1.25 버전부터 추가 되었으며, 주요한
도구들의 소스코드를 포함하고 있다. 대부분의 도구는 단일 C 소스파일로
코딩되었으며, 일부의 경우에는 여러 개의 파일을 참조 하기도 한다.
scripts 서브 디렉토리는 호환성 확인을 위한 스크립트 및 기타 잡다한 동작들을 처리하기 위한 스크립트들을 포함한다.
src 서브 디렉토리의 많은 도구들과는 다르게, 대부분의 스크립트는 여러 개의 장치 이름의
사용이 가능하다. 예를 들면, ‘scsi_stop /dev/sd*’ 의
경우에는, 모든 SCSI 디스크의 동작을 중지(spin down)하도록 할 것이다. 추가적인 설명을 원하는 경우 README 파일을 참조 하도록 한다.
Exit status
이 명령줄 기반 도구들은 정상적인 동작이 완료되어 종료하는 경우 0의 상태 코드를 리턴한다. 1.21 이전의 모든 버전들은 비정상적인
모든 프로세스 종료에 대해 1의 상태 코드를 가졌다. 이후의
버전에서는 sg3_utils 도구에 대한 보다 명확한 종료 처리 및 스크립트, 그리고 별도의 래퍼를 통해 세부 구현이 가능하도록 비정상적인 종료에 대한 에러코드를 세분화 하였으며, 이에 대한 표는 아래의 테이블 3과 같다.
이는 1.22 버전부터 제공 된다.
Table 3. Exit status values
Exit
status
Description
0
no
error detected. Utility completed successfully
1
syntax
error in command line options or their arguments, or an illegal combination
of options
2
the
device reports that it is not ready for the operation requested. The device
may be in the process of becoming ready (e.g. spinning up but not at speed)
so the utility may work a little while later
3
the
device reports a medium or hardware error (or a blank check). For example an
attempt to read a corrupted block on a disk will yield this value
5
the
device reports an "illegal request" with an additional sense code
other than "invalid operation code". This is often a supported
command with a field set requesting an unsupported capability. For commands
that require a "service action" field (e.g. READ CAPACITY(16) )
this value can indicate that the command is not supported
6
the
device reports a "unit attention" condition. This usually indicates
that something, unrelated to the requested command, has occurred (e.g. a
device reset) potentially before the current SCSI command was sent. The
requested command has not been executed by the device. Note that unit
attention conditions are usually only reported once by a device
9
the
device reports an illegal request with an additional sense code of
"invalid operation code" which means that the device doesn't
support the requested command
11
the
device (or transport) reports an aborted command. In some cases this can be
caused by congestion on the transport and retrying the command may be
successful
15
the
utility is unable to open, close or use the given device. The given file name
could be incorrect or there may be permission problems. Adding the '-v' option may
give more information
20
the
DEVICE reports it has a check condition but "no sense". Some
polling commands (e.g. REQUEST SENSE) can react this way. It is unlikely that
this value will occur as an exit status
21
the
device reports a "recovered error". The requested command was
successful. Most likely a utility will report a recovered error to stderr and
continue, probably leaving the utility with an exit status of 0
33
the
command sent to the device has timed out. This occurs in Linux, in other
ports a command timeout will appear as a transport (or OS) error
97
the
response to a SCSI command failed sanity checks
98
the
device reports it has a check condition but the error doesn't fit into any of
the above categories
99
any
errors that can't be categorized into values 1 to 98 may yield this value.
This includes transport and operating system errors
위에 소개된 대부분의 종료 상태 코드는 재처리가 가능하므로, 도구의
실행을 하나 이상의 ‘-v’ 옵션과 사용하게 되면 보다 많은 정보를 얻을 수도 있겠다. 예를 들어, Unit attention(종료 상태 6) 의 경우 하나의 컨디션에 하나의 레포트만을 제공한다. 2~11과
같은 보다 낮은 종료 상태값은, SCSI 센스 키 값과 일치 한다는 것에 주의 하도록 한다. 이러한 종료 상태를 사용한 스크립트에 대한 자세한 예제에 대해서는
scripts 서브 디렉토리에 있는 쉘 스크립트들을 참조 하도록 한다.
Changing
mode page settings
SCSI 장치가 가지고 있는 설정(메타 데이터)는 사용자 프로그램 (“애플리케이션 클라이언트”라 불리는)이 mode page를 변경 함으로서 설정의 변경이 가능하다. 모드 페이지를 찾거나 이를 변경하는 것은 매우 일반적인 작업이다. SCSI 디스크의
캐쉬 관련 Writeback Cache Enable(WCE) 비트의 변경을 예로 들 수 있다. 일반적으로 제조사의 WCE설정은
(on)으로 되어있는 경우가 많지만, 일부 RAID 컨트롤러의
경우에는 off 로 되어 있을 수도 있다.
일반적으로 명령어 기반 도구는 사용이 어려운 경향이 다소 있다.
(모드 페이지 변경을 위한 SCSI 룰로 인한 작은 부분들) 리눅스에서 모드 페이지 변경을 위한 도구를 아래에 일부 설명 해 두었다.
lscsiinfo(old utility) 두가지의 중첩된
인자를 사용하는 다소 불편한 도구. (첫째 인자는 get, 두번재는 set) 유틸리티에 인식 될 수 있는 모드 페이지에 대해서만 변경이 가능하다.
lsginfo (scsiinfo 의 sg3_utils 버전) scsiinfo 와 동일한 수준으로 불편하지만, 업데이트된 모드 페이지에 대한 정보를 가지고 있음. 모드 서브 페이지와
같은 최신 기능을 지원
lsg_wr_mode (sg3_utils) ACSII hex 를 기반으로한 저수준 모드 페이지 설정 도구. sg_modes 를 사용하여 모드 페이지에 대한
정보를 변경이 가능할 것으로 추측되는 ACSII hex 형태로 리턴.
저수준 도구이지만 자주 사용됨.
lsdparm (sdparm) 모드 페이지 설정에 숫자화 된
어드레싱 또는 약어를 사용하는 도구. 모드 페이지 설정을 기본으로 되돌리는 것도 가능하다. 또한 사용자는 변경한 모드 페이지 값을 ‘저장’ 하도록 할 수도 있다. 숫자화 된 어드레싱은 임의의 필드에 대한
변경도 가능하다. ( sdparm의 경우 모드 페이지 및 모드 페이지의 필드 리스트에 대해 알지 못한다. )
lsgmode (scsirastools) “.mdf” 파일에 저장된 데이터를 통해 모드 페이지를 설정하는 방식으로 상호작용하는 도구. 대량의 디스크에
대한 지속적인 모드 페이지를 설정하는데 유용하지만, 세부 설정의 용도로 사용하기엔 까다롭다.
lhdparm (hdparm) ATA 및 SCSI 디스크에 대한 추상화를 제공하는 도구. 쓰기 캐쉬 와 같은
기능들을 이 도구를 통해 켜거나 꺼버릴 수 있지만, SCSI 장치의 모드 페이지 변경은 그다지 많이
지원하지 않는다.
lblktool (blktool) hdparm의 새롭고도 깔끔한
버전. 이는 커널 2.6시리즈에서 동작하며, SCSI 장치에 대해서는 아주 일부분의 (하지만 매우 중요한) 모드 페이지 변경만을 지원한다.
lvendor specific(e.g. 시게이트의 seatools) 일부 벤더가 지원하는 도구들. 해당 벤더가 아닌
경우에는 그다지 유용하지 않지만 일부 정보를 확인 할 수 있는 경우도 있다. 벤더와 맞는 장치의 경우
벤더가 지원하는 특수한 옵션의 설정이 가능하다. (예를 들면, 시게이트의 desktop/server 모드. 이 특수한 모드에 대한 설명은 sdparm의 man 페이지를 참조 하도록 한다. )
특수한 경우가 아니라면, 저자는 sdparm 의 사용을 권장한다.
별도의 정보 : 사용자가 변경 할 수 없는 메타 데이터의
경우, Virtual Product Data (VPD) 페이지에 저장되어 있다. VPD 페이지는 SCSI INQUERY 명령을 통해 접근이 가능하다. sg_vpd 및 sdparm 을
VPD 페이지 정보를 얻는 용도로 사용 할 수 있다.
Examples
아래의 대부분의 예제는 리눅스 장치 이름을 사용하고 있다. 다른
운영체제에서 사용되는 장치 이름에 대한 확인을 원하는 경우, 다음의 링크를 참조 하도록 한다.
INQUIRY 데이터의 확인은 ‘-i’ 스위치를 사용하면 된다. sg_map
도구는 scsi generic(sg) 장치 및 이와 대응하는 primary 장치 노드의 매핑을 보여준다. 일부 주변 장치 타입을
위해서, SCSI enclosure 와 같은, 매핑이 따로
없으며 인클로저 장치는 반드시 sg 장치 노드를 통해 접근해야 한다.
리눅스 커널 2.6에서는 sg_scan 및 sg_map이 primary
장치 노드 (/dev/sda) 에 직접적으로 작업을 수행하는 sg3_utils의 패키지들 처럼 그다지 중요하지는 않다. 하지만, sg 드라이버는 리눅스에서 별다른 드라이버가 없는 인클로저와 같은 장치들과 연동하기 위해 필요하다.
sg_persist 와 같은 도구를 사용하는 일부 예제는 examples/sg_persist_tst.sh 를 참조하면
된다. 이 도구에 대한 보다 자세한 정보는
examples/transport_ids.txt 를 찾아보도록 한다.
Windows버전의 경우 독자적인 sg_scan 도구를 가지고 있는데, 이는
일반적인 스토리지 장치를 한 줄에 하나씩 표시한다. 각 볼륨 네임은 스토리지 장치에 대응되며, 이는 []안에 나타난다. 아래의
두 예제를 통해 이를 확인 할 수 있으며, 두번째 예제는 버스 타입 필드가 추가 된 것이다.
PD0 장치명은 Physical Drive 0 의 줄임말이며, 이는
볼륨 C: 에 대응한다. USB로 연결된 PD1 은 Windows에 의해
D:와 F:로 인식된 두개의 파티션을 가지고 있다. 각
저장 장치 이름은 PD<n>, CDROM<n>, TAPE<n> 등으로
표시된다.
sg_ses 도구는 sg3_utils 1.32버전에서 대폭적으로 업그레이드 되었다. 이는 sg_ses 도구를 통해 일부 페이지와 특정 페이지의 켜거나
끄는 설정, 이를테면 LED 블링킹과 같은 동작을 엘레먼트 식별자 이름을 통해‘조인’의 형태로 수행 가능한
장점이 있다. SES 장치는 SAS 익스펜더로 확장된 장치이며, 장치 노드 /dev/sg3 ( 또는 /dev/bsg/6:0:3:0 ) 과 같다.
root@b:
# sg_ses -p 0x7 /dev/sg3
Intel
RES2SV240 0600
enclosure services device
Element descriptor In diagnostic page:
generation code: 0x0
element descriptor by type list
Element type: Array device slot, subenclosure id: 0
Overall 0 descriptor: ArrayDevicesInSubEnclsr0
Element 0 descriptor: ArrayDevice00
....
Element 9 descriptor: ArrayDevice09
Element 10 descriptor: ArrayDevice0A
....
Element 16 descriptor: ArrayDevice10
Element 17 descriptor: ArrayDevice11
.... Element 23 descriptor:
ArrayDevice17
다소 요약되어 표시하긴 했지만, 이름 스키마는
“어레이 장치 슬롯” 및 인클로저에 다시 연결된 서브 인클로저(예제에서는 1대 뿐이다), 즉
“ArrayDevicesInSubEnclsr0”의 있는 24개의
“ArrayDevice”에 대해 0으로 시작하는 hex 카운터로 보여준다 (2 hex digits). SAS 익스펜더와 SES 드라이버의 매핑을 통해, 익스펜더의 phy7 이 SES 장치의 슬롯 7번과
대응 한다는 사실을 알 수 있다. 또한, 이는 리눅스에서
머신 a의 /dev/sdb, 머신 b의 /dev/sdc 임을 함께 확인 할 수 있다.
root@b:
# sg_ses -D ArrayDevice07 --join /dev/sg3
Intel RES2SV240
0600
enclosure services device
ArrayDevice07 [7] Element type: Array device slot
Enclosure status:
Predicted failure=0, Disabled=0, Swap=0, status: OK
OK=0, Reserved device=0, Hot spare=0, Cons check=0
In crit array=0, In failed array=0, Rebuild/remap=0, R/R
abort=0
App client bypass A=0, Do not remove=0, Enc bypass A=0, Enc
bypass B=0
Ready to insert=0, RMV=0, Ident=0, Report=0
App client bypass B=0, Fault sensed=0, Fault reqstd=0,
Device off=0
Bypassed A=0, Bypassed B=0, Dev bypassed A=0, Dev bypassed
B=0
Additional element status:
Transport protocol: SAS
number of phys: 1, not all phys: 0, device slot number: 7
phy index: 0
device type: end device
initiator port for:
target port for: SSP
attached SAS address: 0x5001517e85c3efff
SAS address: 0x5000c500215725bd
phy identifier: 0x0
이제 어레이(SGPIO 사이드밴드 시그널이
연결되어 있는, 이를테면 SFF 8087케이블)에서 디스크의 물리적 위치를 찾기 위해 아래의 Locate LED( ident로도
알려져 있다) 를 깜빡이도록아래와 같이 수행한다.
이 패키지에 포함된 여러가지의 도구들은 대부분 많은 코드를 공유한다. (e.g. SCSI INQUIRY 또는 SCSI 에러 프로세싱) 따라서, libsgutils 라 불리는 라이브러리를 만들었다. Unix의 표준에 따라 라이브러리는 두개의 부분으로 나뉘어진다. 메인
파트는 이 패키지에 포함된 도구들의 실행에 필요한 런타임이며, 두번째는 개발에 필요한 라이브러리의 API를 정의하는 헤더 파일이 포함된 부분이다.
라이브러리 API는 매우 안정적이기는 하지만, www.t10.org의 표준에 따라 변경되기도 한다. 가장 최신의 데비안 버전의 라이브러리 이름은 libsgutils2-2 이다. 또한, 일부 다른 패키지는 이 라이브러리에 의존성을 가지기도 한다.
공유 또는 정적 라이브러리는 기본으로 제공된다. 빌드
이전의 설정 단계에서 다음의 옵션을 사용함으로서 패키지에 포함된 각각의 도구가 공유 라이브러리를 참조 할 필요가 없도록 구성 할 수도 있다. './configure --disable-shared'.
Download
and build
sg3_utils의 일부 최신 버전은 아래의 표에 포함되어 있다. 모든
tarball은 README와 CHANGELOG(버전 1.25부터는 ChangeLog), INSTALL, COVERAGE,
CREDITS 파일 및 man 페이지를 포함하고 있다. 다음의
링크에서 가장 최신 버전의 ChangeLog를 확인 할 수 있다. http://sg.danny.cz/sg/p/sg3_utils.ChangeLog
sg_utils-1.32exe.zip 파일은 Windows용 압축 파일이며, MinGW환경에서
구성되었다. sg3_utils_man_html.tgz파일은
man2html 도구로 기존의 man페이지를 html로
변경한 것이다.
버전 1.25의 설치는 autotool 를 사용하여‘./configure ; make ; make install’ 단계로
빌드하고 설치 할 수 있다. 이는 기존의 수동으로 작성된
Makefile 을 사용하는 방법을 대처 한 것으로, 사용이 매우 편리하다. configure.ac 및 Makefile.am 은 autotools를 사용한 빌드를 지원한다. 만약 이 파일들을 별도로
수정 했다면, ‘./autogen.sh’를 실행하여 변경사항을 반영해 주어야 한다. autotools는 기본적으로 src, lib, include 및 doc 와 같은 서브 디렉토리를 참조하여 sg3_utils에 포함된
도구들을 빌드한다. utils 및 examples 디렉토리는
아직까지 수동으로 작성된 Makefile을 사용한다. 만약 ./configure 또는 make 단계가 실패하게 된다면, ‘./autogen.sh’ 스크립트를 사용하여 autotools의
수많은 버전 및 알 수 없는 libtools 문제가 발견 될 것이다.
./configure 에는 수많은 옵션이 제공 되고 있으므로, ./configure --help 를
사용하여 어떠한 옵션을 제공하는지 확인 할 수 있다. 기본적으로
./configure 를 수행 하게 되면 Makefile을 생성하게 될 것이며, 패키지가 설치될 기본 디렉토리는 /usr/local 디렉토리가 될
것이다. 만약 이 기본 디렉토리를 /usr/bin 으로 변경하고
싶다면, ./configure --prefix=/usr ; make ; make install 을 수행
하면 된다.
! tarball은 “.tar.gz” 확장자 이외에도 bzip을 사용한
“.tar.bz2” 로도 배포된다. 1.31버전부터는 .xz 확장자도 지원한다.
아래에서는 리눅스 커널 2.2 및 일부 2.0 커널에서 사용 할 수 있는 가장 최신의 sg_utils 도구에
대한 링크를 제공한다. 물론, 더 이상의 업데이트는 없다.
클러스터링 환경에 익숙하거나, 병렬 컴퓨팅, 또는 일반 PC를 가혹하게 사용하시는 분들은 모두 이런 생각 한번쯤은 해 보셨을 것 같다.
"아, 이 여러대의 컴퓨터를 각각 별도의 OS를 사용하여 MPI와 같은 방법으로 묶지 말고, 차라리 한대의 서버처럼 묶어 버릴 순 없을까? "
90년대 후반, 인텔이 SMP를 지원하는 프로세서를 시장에 내놓으면서, 워크스테이션 좋아라하는 컴덕후들은 입이 떡 벌어져 Pentium Pro 프로세서를 구매해 대고, 프로세서를 2개 이상 설치 할 수 있는 고가의 메인보드를 구매해 댔다. 그러고나서 당시의 전세계 수퍼 컴퓨팅의 Top 100 중 가장 빠른 컴퓨터는 바로 인텔이 Pentium Pro 프로세서를 병렬로 묶은 컴퓨터라 카더라 하는 이야기를 침튀어가며 이야기 했었다.
당시에도 수퍼컴퓨터 하면 Cray가 항상 다섯손가락 안에 들었으며, 냉각팬이 아닌 화학물질로 시스템 온도를 낮추어야만 하는 이 신기한 컴퓨터의 이미지를 쳐다보며 아~ 한번 만질수 있다면 얼마나 좋을까 하는 생각들을 했었더랬다. 그 시절 1G 이더넷을 구축하는 것도 엄청난 비용이 들었으며, 10G는 아직 나오지도 않은 시점에서 그나마 Cray보다 저렴한 MPI 클러스터를 지금도 고가인 InfiniBand 를 사용해 엮어 사용하기만 해도 대단한 클러스터로 쳐 주었다.
세월은 흐르고 흘러, 그저 꿈으로만 생각했던 소프트웨어가 나왔다. 물론 그 효용성과 성능에 대해서는 일부 검증을 직접 해 볼 수 있으면 좋겠지만, 일단 상용으로 나왔다는거 자체가 이미 어느정도의 지원은 가능하며, 어지간히 동작이 가능한 수준이라고 볼 수 있겠다.
바로 그렇다. 여러대의 x86 시스템위에 하나의 OS를 올릴 수 있는 시스템 소프트웨어가 출현 한 것이다. 개발 업체의 이름은 ScaleMP (http://www.scalemp.com), 제품은 vSMP Foundation 으로 소개되고 있는듯. 제품의 구매는 삼부 시스템이라는 업체에 문의 해 보면 될 듯 하다. (http://www.samboo.co.kr) 회사의 홈페이지를 보면 원래 Cray를 전문으로 취급하던 기업 같은데, 아마 이 분야의 사람들에게는 익숙한 업체이지 않을까 짐작해 본다.
일단, x86 기반의 머신들만 가지고 한대의 OS를 사용한 기존과는 획기적으로 다른, 상상해 왔던 바로 그 클러스터 시스템이 제공하는 기능은 다음과 같다.
vSMP Foundation for SMP
기능
최대 128대의 노드를 사용하여 단 하나의 OS를 가진 시스템을 생성
Highest CPU Capacity : vSMP를 사용한 OS는 최대 16,384 개의 CPU를 단일 PC와 같이 하나의 공유메모리 기반에서 사용 가능 ( 8192개의 코어를 사용한다는 말도 있는데 이 두개의 숫자가 어떻게 다른지 써보기 전에는 모르겠다.)
Largest Memory footprint : 최대 64TB 의 메인 메모리
High Speed I/O : 빡센 데이터의 처리에 병렬 스토리지를 활용
장애 대응을 위한 InfiniBand 연결 지원
장애로 부터 자동 복구
나머지 생략
장점
기존의 단일 머신의 SMP 성능을 뛰어넘는 기절할만한 성능
투자 보호 : 서로 다른 속도의 CPU, 서로 다른 크기의 메모리, 다른 I/O 장치를 사용한 환경에서도 구성이 가능
기타 생략
OMG
Image from : http://i7.photobucket.com/albums/y286/SNOOP97DAWG/NHL/homer-simpson-5.jpg
그렇다. 입이 떡 벌어진다. 기존의 병렬 시스템들이 추구하는바가 Scale-Out 으로, 단일 시스템이 Scale-Up 의 형태로 성능을 확장하기 힘들었기 때문에 생긴 방법들이다. 하지만 이 물건은, Scale-Up 과 Scale-Out 을 모두 지원함으로서, 아니, Scale-out 의 형태를 사용하여 Scale-Up 을 구현 함으로서, 비지니스의 성장요구에 따라 점진적으로 하드웨어의 추가가 가능하며, 더군다나 대부분의 Block 레벨로 I/O를 공유하는 클러스터가 요구하는 하드웨어의 동일성마저 없다. 따라서 세월이 지나면서 HCL 만 충족하는 하드웨어를 지속적으로 구매한다면, 다양한 하드웨어를 사용한 노드의 집합으로 하나의 OS를 사용하는 거대한 시스템을 구성 할 수가 있는 것이다!
난 쩔어 버렸어~ (태지 보이스, 필승)
혹시 국내에 사용중인 환경이 있는가 궁금해서 네이버등에 검색을 쌔워보니, 뉴스 이외의 정보는 없는것으로 봐서는 그다지 많이 알려져 있지는 않은 것 같다.
실리콘밸리의 벤처 회사들을 다니다 보면, 그런 생각을 갖게된다. 얘들이 설명하는거 절반만 제대로 동작해도 이건 먹어주는 물건이다, 라는. OS라는건 나름 복잡한 물건이다. 관련 전공을 이수하신 분들이라면 한번쯤 읽어 보았을 Operating System Concepts 에서 설명하는 대부분의 내용들은 시스템이 동작하는 기본이며, PC와 서버가 발전하면서 단일 PCB상에서 연결된 장치들의 오묘한 타이밍 통제와 락, 스케줄링이 복합적으로 그리고 유기적으로 조합된 하나의 소프트웨어인 것이다. 이 새로운 패러다임의 단일 OS지원 클러스터는, 이 OS에서 제공하는 별도의 라이브러리를 사용한 별도의 소프트웨어만 동작한다면 기존의 클러스터보다 나을것이 그다지 없을 것이다. 하지만 상상해 보라. 만약, 이 OS에서 오라클이 아무 문제없이 동작하고, 리눅스 기본 패키지들이 별 문제 없이 동작한다면, 이건 정말 두손 두발 다 들어주어야 할 기존과는 다른, 그야말로 신세기 컴퓨팅 플랫폼이 되는 것이다. 물론 오라클이 동작하지 않을 거라는 심증이 좀더 크지만.
아무튼 ScaleMP 사이트의 제품 소개를 제외한 대부분의 정보는 Subscription 으로 보호되어 있다. 심지어 Whitepaper 조차 등록 후에 열람이 가능하다. 따라서 이 블로그에서 소개하는 것 이상의 정보가 필요하신 분들께서는 ScaleMP의 홈페이지 또는 삼부시스템의 홈페이지를 참조하시기 바란다.
궁금한 부분은, 각 시스템의 연결을 10G를 지원하는지의 여부 (어떻게 각 클러스터들을 연결하는지의 여부) 와 각 시스템의 Disk를 어떻게 사용하는가와 같은 부분들이다. 또는 별도의 Shared Storage를 연결해야 하는지 등도 매우 궁금하다. 나중에 알게되면 설명하겠다.
분명한 것은, ScaleMP는 컴퓨팅의 새로운 패러다임을 만들었다. 이들 역시 이 부분을 강조하는데, 기존의 클라우드와 같은 단일 서버를 여러대의 가상서버로 분리하는 것을 Partitioning 으로 정의 하며, 데이터 센터에 데스크탑을 설치해 두고 원격지의 Thin-Client로부터 접근하여 사용하는 방법을 Remotting 으로 정의 한다. 이 새로운 패러다임은 여러대의 물리서버를 사용하여 하나의 논리적인 OS로 구성하는 방법으로서, 이를 Aggregation 으로 정의하고 있다. 이는 가상화의 또 다른 모습이며, 여러분이 기존에 이해하고 있었던 가상화에 대한 신선한 충격이 될 것을 믿어 의심치 않는다.
상용 소프트웨어인데다가, 그 사용 방법 역시 널리 알려졌다고 보기엔 무리가 있다. 따라서 별도의 교육이 있지는 않은지 살펴 보니 역시 있다. 교육 과정은 다음과 같다.
VSMP101: Introducing vSMP Foundation VSMP201: System Administration (Basic)
VSMP202: System Administration (Advanced)
VSMP301: Developers (Theory)
VSMP302: Developers (Hands-on)
301과 302는 각각 8시간, 나머지는 각 4시간으로 일주일 정도의 코스가 되지 않을까 싶다. 이 일주일 정도의 교육이 의미하는 바는, 아마도 개발자가 아니라면 기존의 시스템과 크게 다르지 않기 때문에 쉽게 적응이 가능하지 않을까 하는 기대를 품게한다.
자, 이제 ScaleMP 측의 제품에 대한 설명을 좀 살펴보자.
The Versatile SMP (vSMP) Architecture
현재 특허 출원중인 Versatile SMP 아키텍처는 하이엔드 SMP 시스템의 구성을 위해 사용된다. vSMP는 기본적으로 InfiniBand 로 상호 연결된 시스템들을 사용해 기존의 시스템들을 대체한다. vSMP Foundation 은 ScaleMP가 만들어낸 아키텍처를 실제로 구현해 낸 제품이다. 이는 업계 표준의 일반적인 하드웨어를 사용하여 하나의 대형 X86 시스템을 만들어내는 기술이다. 이 기술은 특별히 하나의 하드웨어 벤더 또는 한 종류의 하드웨어를 사용할 필요가 없으므로, 기존 클러스터가 요구했던 맞춤형 하드웨어의 제작 또는 이러한 하드웨어를 제작하는 벤더만을 사용해야 하는 벤더-락-인 의 단점을 종식시킨다.
전통적인 멀티 프로세서 시스템은 프로세서간의 통신 및 공유 메모리, 사용자 정의 칩셋등이 하나의 메인보드에 집약되어있는 구성을 가진다. 이러한 구성은, 시스템이 4개 이상의 프로세서를 지원하기 위해서는 훨씬 복잡한 내부 구조로 인해 설계가 쉽지 않다. 따라서 이 이상의 프로세서를 지원하는 시스템은 거의 없다고 봐도 무방하다. 또한 프로세서의 빠른 신제품 발매주기로 인해 이러한 프로세서들을 메인보드는 지속적으로 지원해 주어야 하므로, 이렇게 수많은 프로세서의 탑재가 가능한 보드를 어렵게 설계 하는것은 큰 의미가 없다. 따라서, 기존의 Scale-UP 형태의 시스템 확장에 한계가 발생하는 동시에, 하이-엔드 컴퓨팅은 새로운 형태의 시스템을 요구 하게된다.
vSMP는, 별도의 커스텀 하드웨어를 사용할 필요가 없다. vSMP 아키텍처의 핵심은 바로 기존의 멀티 프로세서 시스템들과는 다른 형태의 칩세 서비스를(칩셋은 보통 하나의 PCB에 위치하므로 단일 시스템의 의미로 생각해도 좋다) 소프트웨어를 사용하여 구성한다는데 있다. vSMP 아키텍처는 I/O 및 시스템 인터페이스 (BIOS, ACPI)의 공유와 캐시등의 기존 OS에 필요한 모든것들을 제공한다. 이는 완전히 투명한 방식으로 구현되며, 별도의 추가적인 드라이버를 필요로 하지 않으며, 기존의 어플리케이션에 아무런 변경을 하지 않아도 동작하도록 한다.
Requirements
vSMP Foundation Requires :
Multiple high volume, 업계 표준 x86 시스템 또는 프로세서와 메모리를 탑재한 시스템 보드
HCA 리스트에 정의된 하드웨어를 사용한 InfiniBand 인프라. 케이블, 스위치.
vSMP Foundation 을 부팅하기위한 시스템 보드별 하나의 스토리지 장치. vSMP Foundation for Cloud 제품은 네트웍 부팅을 사용하므로 필요하지 않음.
One System
vSMP Foundation 은 최대 128대의 x86 시스템을 지원한다. 이 하나의 가상화된 OS는 각 노드의 메모리의 로딩이 끝나고 나면, vSMP Foundation 은 이 각 노드에 있는 컴퓨팅과 메모리, I/O 자원을 병합하여 단일화된 하나의 가상 OS와 이 OS 에서 사용할 어플리케이션의 구동이 가능하게 된다. vSMP Foundation 은 균등한 실행 환경을 제공하기위해 Virtual Machine Monitor(VMM) 의 형태를 사용한 소프트웨어 엔진을 사용한다. 또한, vSMP는 단일화된 시스템의 사용성을 위해 BIOS나 ACPI와 같은 환경을 만들어내는 부분도 포함한다.
Coherent Memory
vSMP 는 여러가지 신기술을 사용하여 각 시스템 보드간의 캐시 동일성을 유지한다. 이 복잡한 알고리즘은 실시간 메모리 활동 및 접근 패턴에 대해 블럭레벨로 동작한다. vSMP는 시스템간의 통신에 대한 지연시간을 최소화하기 위해 보드의 로컬 메모리와 최상의 캐시 알고리즘을 사용한다.
Shared I/O
vSMP Foundation 각 시스템 보드의 모든 PCI 자원을 하나로 병합하고 이를 공통의 I/O pool 리소스로서 OS와 어플리케이션에 제공한다. OS는 시스템 스토리지와 네트워크 장치를 적절히 활용 하여 최상의 성능을 제공한다.
Flexible Versatile Architecture
vSMP Foundation 소프트웨어는 vSMP 아키텍처를 구현한 것으로서, 128대의 산업 표준의 일반적인 x86 시스템을 하나로 통합하여 가상의 단일화된 OS를 생성할 수 있다. vSMP Foundation 은 최대 1024 개의 프로세서 ( 8,192 코어) 와 64TB의 공유 메모리를 사용한 가상 시스템을 생성해 낼 수 있다.
vSMP Foundation 은 이러한 각 노드의 CPU와 메모리의 크기가 서로 다르더라도 지원이 가능하며, 심지어 I/O 장치가 다르더라도 동작한다. 이는 x86 공유 메모리 시스템의 고유한 기능이다.
높은 프로세서 부하를 요구하는 컴퓨팅 어플리케이션의 경우, 최대 1.5TFLOPS 를 사용하는 단일화된 시스템의 사용이 가능해진다. 만약 어플리케이션이 메모리를 많이 사용하지만 요구되는 컴퓨팅 파워는 그다지 높지 않은 경우, 높은 속도의 프로세서와 낮은 속도의 프로세서를 복합적으로 사용하는 아키텍처가 구성이 되는 경우가 있다. 이러한 불균형 구성에서, vSMP Foundation 소프트웨어는 OS 에서는 낮은 속도의 프로세서들을 노출하지 않는 동안에는 항상 가장 빠른 프로세서들을 병합하여 사용한다.
이러한 구성은 비용과 전력의 손실은 절감하면서, 최대 사이즈의 메모리와 최고의 성능을 발휘할 수 있게 한다. 마찬가지로, 사용자는 어플리케이션의 요구에 따라 I/O를 구성할 수 있으며, 따라서 업계 최고의 유연한 고성능 x86 시스템을 구비할 수가 있게된다. 이러한 비용/성능의 두마리 토끼를 모두 잡아냄으로서, vSMP Foundation 을 사용한 시스템은 고객에게 최고의 비용 효율성을 제공할 것이다.
그런 생각을 해 본다. GPGPU를 사용한 전통방식의 클러스터가 빠를까, 여러대의 머신을 하나로 클러스터링한 ScaleMP 의 클러스터가 빠를까. 그리고 또 ScaleMP가 향후 GPGPU 를 그들의 가상 OS 레벨에서 지원하게되면 또 어떻게 될까. 또, 이렇게 묶여진 가상 OS를 다시 병렬로 묶을 수 있을까? (128 node vSMP) -- MPII -- (128 node vSMP) 이렇게 말이다.
기존에 했던 포스팅들과는 달리, 무언가 새로운 패러다임이 나타난것 같아서 흥분했다. 위의 퍼포먼스 사이트에 가시면 SPEC CPU2006 과 같은 일반적인 벤치마크 도구의 결과도 볼 수 있다.
사실, 오픈소스 진영에서 만들기는 쉽지 않은 도구다. 물론 뭐 어떤건 쉬웠겠냐마는. 물론 이 상용 소프트웨어 역시 그 기반기술의 대부분이 오픈소스에 의존하고 있을 것이라는 추측을 해 본다. 이 도구가 얼마나 많이 알려지고, 또 도입 사례가 발생할지는 모르겠지만, 이 소프트웨어의 HCL을 충족하는 하드웨어를 기존에 사용중이었다면, 충분히 테스트 해 봄직 하다 라는 생각을 해 본다. 더군다나 클라우드와 클러스터를 위한 패키지들을 함께 제공하므로, 관심있으신 분들은 직접 홈페이지에서 정보를 얻어보시는것도 좋을 것 같다.
문득 그런 생각을 해 본다. 전혀 새로울 것 없는 이 클라우드에 왜 다들 목숨들을 이렇게 걸어 대시는지들.
4년전에 아마존 서비스 테스트 하면서 그런 생각을 했더랬다. 이거 뭥미... 이렇게 I/O성능 안나오고 퍼포먼스 떨어지는데다가 공인 IP 갯수 제한도 있고.. ELB도 없던 시절이니 RR DNS나 내부에 별도의 Reverse-Proxy 를 구성해 두고 밸런싱 처리하고..
3년전에 Windows Azure 를 테스트 하면서도 비슷한 생각을 했다. 내가 뭐 닷넷 개발자도 아니고. SQL Azure 이거 이 성능 가지고 어디다 쓰지 했던.
뭐, 일찍 해 봤다고 자랑하는건 아니다. 다만, 대부분의 업장에서 이제 클라우드가 어떤건지 어렴 풋이들 이해하고 있는 듯 보이고, 주로 그 구성이 IaaS의 구성에만 촛점이 맞추어져 있는 현실.
예나 지금이나 중요한건, 메인프레임을 쓰느냐 클라이언트-서버를 사용하느냐 클라우드를 사용하느냐 하는 문제가 아니다. 더 중요한건, 실제 서비스가 어떠한 구성을 가져야 하느냐에 대한 부분일 것이다. 보안이 중요하다 한들 기업 내부 인프라가 아닌 이상, 아니 심지어 기업 인프라라 해도 모바일을 지원하기 위한 관리된 개방성이 필요하다. 일관성이 중요하다 한들, 오늘이 상반기 결산일이 아닌 이상 영업 데이터가 은행 계좌 잔고만큼 중요할리없다. 영상이나 컨텐츠의 저장과 배포를 위해 내부 시스템에서 마이크로초 단위의 디스크 seek time이 반드시 매번 중요하지는 않다. 무엇을 어디에 배치하고, 어떤 구조로 서비스를 만들어 내느냐 하는 문제는 예전부터 있어왔던 고민이고, 예전부터 있어왔던 해법이고, 예전부터 잘 처리해야 했던 부분들이다. 그게 클라우드에 넘어오면서 옵션이 조금 더 많아지고, 어떤 부분에서는 제한적인 요소도 있기 때문에 혼동하기 쉽지만, 똥과 된장을 구분할 줄 안다면 주전자를 쓰다음으며 지니가 나오길 바라지는 않을 것이다.
최근의 클라우드 광풍을 보면 다들 무슨 마법의 양탄자 쯤으로 생각하고 있는 것 같다. 동시에, 마법의 양탄자가 아니었다는 사실을 깨닫고 빠르게 포기하거나 그 효용성 자체에 의문을 제기하는 사람들도 많은듯 하다.
주걱으로 국을 뜨려하고, 숟가락으로 라면을 먹으려 하는데 그게 쉬울턱이 있나.
예나 지금이나 컴퓨팅의 본질은 다르지 않고, 빠른 서비스를 위한 인프라 구성의 핵심 부분은 그 컨셉의 측면에 있어서 대동소이하다. 4메가 메모리와 5기가의 디스크를 가졌던 서버 시스템들에서 개발하던 빠른플리케이션의 코딩 방법이 42기가 메모리와 2페타 바이트를 가진 시스템을 위한 코딩과 핵심 컨셉이 다를리 없다. 여기에 클러스터링과 분산 컴퓨팅의 개념만 추가하면 무엇을 어떻게 만들어야 할 지에 대해서는 누가 굳이 그려주지 않아도 답은 뻔하지 않겠나.
우주 왕복선에서 요구되는 연료의 연소와 노즐의 치밀한 각도 계산과 같은 실시간성이 요구되는 웹 서비스는 없다. 가급적 빠르면 좋은 시스템이라는 전제하에, 대부분의 비지니스 요구사항은 굳이 필요없는 RTOS와 같은 기능성을 요구하고 있지는 않은가 생각해 볼 일이다.
또, 그러한 요구사항을 클라우드 서비스에 들이대는 우를 범하지는 않아야 하겠다. 어플리케이션이 아무런 수정없이 클라우드에 적용되고, 기대했던 바와 같이 탄력성 있게 고객을 수용할 가능 성이 가장 높은 구조를 손에 꼽으라면, 아마도 클러스터링의 개념에 가장 충실했던 어플리케이션이 아니겠는가 싶다.
클라우드에 서비스를 마이그레이션 할 때 가장 먼저 인정해야 하는것은, 비용이 아니라 바로 클라우드의 한계와 장애이다. 컴퓨팅 클라우드를 사용할때, 가장 높은 비용의 인스턴스를 사용할 것이 아니라 4메가 메모리를 가진 언제 고장나도 이상할 것이 없는 시스템 이라는 전제하에 구조를 짜야 할 것이다.
하이브리드 클라우드 만드는데 기존 인프라와 빡세게 통신이 발생될 가능성이 있는 부분을 선택한다면 실패할 가능성이 높다고 말해주고 싶다. 캐시에 대한 고민없이 클라우드에 있는 디스크가 우리꺼보다 더 좋을꺼라는 환상을 가지고 있다면 얼른 깨어나시길. 아마존의 EBS가 Private Cloud 구성에 가장 중요한 덕목이 되었다면 어플리케이션 구조부터 다시 보시길 진심으로 권고하고 싶다. 그렇게 만드는거 아니라고.
Share nothing 이라는 컨셉, Live Migration의 필요성등이 사설 클라우드를 만들고자 한다면 그 필요성에 비추어 반드시 재고되어야 할 것들이다. 아마존 클라우드의 각 서비스에 대한 분석을 제대로 했다면, 클라우드에서 구현해야 하고, 구현 할 수 있는 것이 무언인가에 대해 다들 이렇게 고민할 이유가 없다.
진정 오라클을 잘 사용하고 있는 사업장에서는, Lock과 Latch가 가져오는 시스템 지연속도 등을 고려하고, 논리적인 관계는 쿼리와 어플리케이션에 녹아있지만 실제 FK를 걸어서 사용하지는 않는다. 내부 쿼리 처리가 어찌나 빠른지 페이지를 열면 데이터베이스에서 뽑아져 나오는 정보는 이미 페이지에 표시되어 있고, 이미지가 천천히 올라와 주신다. 이정도로 데이터베이스를 사용할 줄 아는 조직, 그렇게 많이 못봤다. 다들 오라클 주머니만 채우고 있지 않나.
클라우드에 서비스를 구성 할 지 말지를 고민하기 전에, 서비스가 어떤 서비스인지 부터 고민하고 어떻게 인프라가 구성되어야 하는지에 대한 밑그림이 먼저 그려져야 하지 않겠는가.
좋든 싫든, 또 지난시절 언제나 그래왔듯이 컨셉을 이해하고 그 구현을 고민하는 사람들에게는 지난날의 시스템도 이미 충분히 잘 동작하고 있을 것이다. 또 이런 시스템을 굴리고 있는 조직에서는 주변에서 하도 떠들고 있는 클라우드에 마이그레이션이 어떻게 되어야 하는지, 어떤 부분을 적용할 수 있는지의 여부도 면밀히 살펴보고 있을 것이다. 이런 분들에게는 이 새로운 환경은 그저 필요에 의해서 사용되고, 효율적으로 사용 될 것임을 믿어 의심치 않는다.
대기업의 기존 인프라는 클라우드가 필요 없을 것이다 라는 식으로 이야기 하는 분들이 있는데, 당장 옮기기는 힘들긴 하지만, 그런건 단정 지을 수 있는게 아니다. 지금의 시스템들을 언제까지나 사용할 리도 없고, IBM pSeries를 다음번에 매번 구매해야 할 필요성이 있는건 아니다. 세상의 모든 데이터베이스가 RDBMS만 되어야 하지 않는다면, 자연히 클라우드는 아니라도 클러스터의 필요성은 생겨날 것이다.
물론 컨셉을 이해하고 적용하시는 분들도 계시겠지만, 또 마케팅과 인문과학 출신으로 도배된 IT조직에서 귀까지 닫고 있는건 그들 사정이겠지만, 자꾸 말도 안되는 소리를 하는 분들이 있어 답답함에 간단히 적어본다.
원래 꼭 해야 했던건, 그게 클라우드라고 해서 안해도 되는건 아니다. 다만, 원래 꼭 해야 되는걸 하지 않았을때 클라우드는 예전보다 더 심한 좌절과 프로젝트의 처절한 실패만을 불러올 뿐이다. 서비스의 클라우드 마이그레이션은 일견 쉬워 보일지 모르겠으나, 그 기술적 진입장벽은 전보다 높아졌음을 이해할 필요가 있을 것이다. 한가지 더 중요한 사실은, 클라우드는 또 하나의 새로운 인프라 형태일 뿐이지 기존의 모든 것을 완전히 대체 할 수 있는 무언가는 아니다. 필요한곳에 적절히 사용 할 때, 비용과 성능, 그리고 가용성의 여러마리 토끼를 잡을 수 있을 것이다.