국내에서 일을 하다 보면, 참 많은 사람들을 만나게 된다. 국내에서 컨설팅에 대해 가지고 있는 의견들이 각각 있겠지만, 아무래도 나는 기술 컨설팅이기 때문에 내 입으로 뱉은 말은 적어도 구현이 되어 돌아가는 모습을 보여주어야 하는 경우가 많았다. 뱉어 놓고 동작 안하면 그건 곧 신뢰의 상실이기 때문에, 가급적이면 첫 대면에 해법을 주려고 노력하는 편이다. 하지만, 뭐 도둑놈들 이라는 시각을 내가 그게 아닙니다 할 수는 없을 것 같기도 하다.
실리콘 밸리의 벤처와 일을 본격적으로 한지 대략 1년여가 흘러가고, 그 사이에 많은 벤처 및 그들의 솔루션에 대한 소개 자료들을 받아서 검토해 보면서 느낀건, 참 일하는 방법들 많이 다르구나 싶은 생각이 들 때가 많다. 실리콘 밸리의 벤처 및 그들 업체의 기술자라고 해도 각양각색 천차만별이어서, 누구는 정말 대단하기도 하고, 어떤이는 또 그 반대의 경우도 많다. 사실, 그 반대의 경우가 더 많거나, 아니면 일반적으로 보편적인 수준의 기술자들이 참 많은데 이들이 우리나라 기업과 일을 하게 되면 필요 이상의 신뢰를 확보하는 경우를 많이 보게 된다.
이게 참 어떻게 보면 신비스러운 부분인데, 나름 찬찬히 생각해 보니 이건 일반적으로 국내 기업과 해외 기업이 함께 일하게 되는 경우 한국 회사간의 갑-을 관계가 전혀 발생하지 않는 경우가 많기 때문으로 생각된다. 컨설팅이라는건 기본적으로 도움이 필요한 조직에 적재적소의 도움을 제공하기 위해 행하는 일련의 작업임은 누구나 알고 있다. 여기에 더하여 생각 해 보면, "작업의 의뢰" 란 결국 "도움의 요청"이며, 이 도움에 "댓가"를 지불하기 때문에 실제 업무 관계에 있어서는 오히려 영향력이 외부업체에 더 많이 실리게 되는, 한국 회사간의 관계에서는 참으로 찾아 보기 힘든 사태들이 발생하게 되는 것이다. 더군다나 이 도움을 주는 주체가 외국인을 주축으로 구성되었다면, 도움에 대한 대가는 수직 상승 하게 된다.
이는 역으로 이야기 해 본다면, 같은 한국 회사들 간의 협력에 보통 상하관계가 형성 되는 것이 올바른가 하는 이야기도 될 수 있을 것이다. 이런 현장에서 직접 뛰고 있는 분들 중에는, 실제 개인적인 인간관계에 있어서 별 문제없는, 아니 오히려 친근해 보이기까지 할 수 있는 사람이 외국인을 주력으로 구성된 컨설팅 팀에 대하는 태도와, 필요한 물품을 납품하는 국내 업체의 인력들을 대하는 태도가 극히 상반되는 모습을 보이는 경우를 많이 목격해 왔다.
왜 그럴까?
좀 다른 이야기지만, 얼마전 샌디에고의 퀄컴 본사에 입사한 커널 엔지니어이자 친한 친구의 이야기를 들어보면, 해외와 국내, 더 정확하게는 미국과 한국의 기업들이 사람을 채용하는데 필요한 요구조건을 확인하는데 굉장히 다른 방법을 사용한다고 한다. 우리나라는 일종의 스펙 공화국이라고 할 수도 있겠는데, 따라서 국내 1위의 대기업이라고 해도 인터뷰는 보통 이력서를 중심으로 구술하는 형태로 진행 된다. "어디서 뭐했구요, 뭘 배웠구요, 토익은 몇점이고 자격증은 뭐를 가지고 있어요" 로 대변되는 인터뷰의 형태. 하지만, 1차 전화 인터뷰, 2차 현장 인터뷰의 형태로 진행되는 미국 회사들의 면접의 경우, 이력서는 1차에서 이사람이 무엇을 했었는지에 대해서만 확인하고, 2차에서는 실무적인 내용에 필요한 질문을 해당 업체의 엔지니어들과의 만남을 통해 이 사람이 정말 그 내용을 알고 있는지를 확인 한다. 따라서 인터뷰의 내용은 대략 "MMU를 소프트웨어로 어떻게 구현할 수 있을까요", "barrier()와 wmb()의 차이점에 대해 이야기 해 보세요" 와 같이 굉장히 실무적으로 디테일한 질문들을 장장 7시간에 걸쳐서 받게 된다. 그리고 대답도 보통 5초 이내에 시작하지 못하면 "알겠습니다" 되는 분위기 속에서. 그 녀석은 원체 대단한 녀석이라 그 수많은 질문 가운데 대답하지 못했던 것은 단 하나 였으며, 따라서 미국에 비자도 없고, 국내에서 내노라 하는 대학을 졸업한 것도 아닌데, 오퍼는 미국 현지의 아이비 리그 박사 수년차의 대우를 받고, 하고 싶은일 하게 되었다는 해피해피 스토리를 들려주었다.
난, 여기에 많은 답이 있지 않을까 싶다. 이녀석은 틈만 나면 재미로 커널 코드를 보는 녀석이고, 어셈블러따위는 국딩때 즐겨 사용 했던 놈이었던 거다. MIT에서 특수한 목적으로 만든 드라이버에 버그가 있으면 고치고, 커널에 버그가 있으면 고치고, 재미있어 보이는 각 대학 및 오픈 프로젝트에 코드를 반영하는, 그래 그녀석은 분명히 난 놈이었다.
근데 그런 난놈이 국내에서는 그닥... 으로 치환되었었다. 하긴 그녀석 국내 있을때도 그닥.. 레벨은 아니었긴 하지만. ㅋ 이제는 그닥... 으로 대접 받지는 않겠지.
다시 돌아와서, 결국은 이러한 여러가지 사회 문화적 인프라의 차이로 인해 발생하는 해외 근로자와 국내 근로자의 차이, 조직에서 사람을 채용하는데 필요한 것이 과연 무엇인가에 대한 관점의 차이가 프로젝트를 하는데 있어 이게 되냐 마냐를 결정하는 주요한 차이를 가지게 되기 때문에, 높은 비용을 지불 하게 될 수밖에 없게 되며, 갑이 갑이지만 을로서 오버라이드 되는 현상도 나타나는 것이다.
하고 싶은걸 계속 하고 또 그래서 여가의 시간마저 좋아하는 것에 투자할 수 있다면, 당연히 다른 사람보다 많은 성취를 이룰 수 있게 될 것이다. 그게 다만 해외에서 더 많이 인정을 받게 될 가능성이 다분하기는 하며, 국내에서는 스펙에 좌절하고, 대기업 문턱을 밟지 못해 눈물을 좍좍 흘리게 될 지도 모른다. 무엇을 어떻게 선택하고 해야 할런지는 본인의 판단의 몫이지만, 결국 일에 필요한 사람은 저런 녀석이 되는게 아닐까.
너무 일반화 하지 않았나 싶은 생각도 들지만, 그게 전반적인 감상인 것도 맞는듯 하다.
개인이 취할 수 있는 가장 최선의 선택은, 해외의 좋은 학교를 졸업하고 거기서 좋은 직장을 얻거나, 한국에 돌아와 거부 할 수 없는 스펙으로 승리를 쟁취하면 되지 않겠나. 굳이 한국에 돌아와야 할 필요가 있겠냐마는. 그럼 어떠한 이유에서라도 그렇게 할 수 없고, 심지어 국내의 좋은 학교도 힘들었다면, 어떨까.
두서 없는 글의 나만의 결론은, 하고 싶은게 있어서 그걸 직업으로 선택하려면 엄청나게 잘 할 수 있어야 한다, 그런 거 같다. 좀 못하더라도 억지로 하는 사람보다야 낫지 않겠는가.
요새 라우터의 기능이나 성능 때문에 리눅스를 대용으로 사용 하려는 경향은 거의 없다. 하지만 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 도구에
대한 링크를 제공한다. 물론, 더 이상의 업데이트는 없다.
어느덧 날이 밝아온다. 한동안 자동화 코드의 개발과 클라우드의 구조 설계등의 리뷰에 온 정신을 쏟느라 정신이 없었다. 아울러 번역중인 책의 밀린 진도를 빼느라 그 어느때보다 바쁘게 살지 않았는가 싶다.
어디의 웹 페이지에서인가, "공포스럽다" 라는 이 책을 읽은 분의 덧글을 보고 나서 책의 제목이 주는 묘한 마력에 이끌려 이런 저런 리뷰를 찾아 보다가, 결국 구매를 했다. 번역서 라는 부분도 비록 분야는 다르지만 어떤 도움이 되지 않을까 싶었던 부분도 있기도 했지만, 나와는 전혀 관계 없을 것 같은, 그리고 이전에 크게 관심도 별로 없었던 '자본'과 '권력' 이라는 주제가 다른 서적들과는 다르게 분명 어떤 매력이 있었던 것 같다.
책의 내용 및 성향에 대한 간략한 리뷰나 후기들은 간단한 검색으로 쉽게 찾아 볼 수 있다. 오히려 책을 읽는 중간중간, 또 다 읽고 나서도 머릿속을 떠나지 않는 질문들은, 비록 이 책이 말하고 있는 모든 것이 진실이 아니라는 가정을 세우더라도 발생하는 자연스러운 의문들이었다. 대충 몇 가지만 말해 보자면,
- 우리나라에 미군은 언제까지 주둔할 것이며, 그들은 어떤 목적으로 한국에 있는가.
- 국내의 자본들은 과연 그들보다 더 거대한 자본에 의해 침식당하거나 지배관계에 있지는 않는가.
- 리먼브라더스의 몰락과 이로 인한 세계경제의 곤란은 과연 예기치 못한 것이었는가.
- 미국 채권 및 달러, 그리고 금, 석유, 광물과 같은 가치 불변의 자원은 어떤 관계가 있는가.
- 내 개인의 삶은 위의 질문들에 대해 어떻게 대처해야 하며, 대처 한다고 해서 그 결과의 변화가 있는가.
뭐, 이 정도 인 것 같다. 이보다 많은 것들이 있긴 하지만, 웬지 영화 '아일랜드'의 장면이 생각나서 더 쓰는건 오바스럽지 싶다. 이들은 정치적 사상과도 관계가 없으며, 다만 나와는 크게 관계 없어 보이는 돈의 흐름이 내 처지를 결정할 수도 있지 않을까 하는 질문의 연장선이 아닐까 싶다. 단순히 음모론에 너무 빠진것 아니냐 하는 생각이 들기도 하지만, 기실 미국까지 가지 않아도 비슷한 행태는 많은 곳에서 접할 수 있기 때문에, 이 책이 주는 공포가 나와는 아무 관계가 없다 라고 말할 수 있을 처지가 되지도 못하는 것 같다.
저자는 굉장한 사람이다. 책의 처음과 끝을 동일한 어조로 전체를 관통하는 하나의 주제를 수많은 인명과 기업의 고유명사로 부터 이끌어내고 있다. 이러한 일련의 작업은 분명 개인이 달성하기에는 쉽지 않은 것이며, 이러한 세세한 분석작업을 통해 저자가 확보한 자료는 분명 책에는 넣을 수 없었던 내용들이 더 있지는 않을까 하는 생각마저 들게한다.
누구나 읽어서 재미지는 책은 아닌 것 같다. 다만, 흥미를 가지고 완독하게 되면 이 책의 진실성을 믿거나 믿지 않거나의 여부를 떠나서, 돈의 흐름에 따른 간결한 인과 관계를 살펴볼 수 있는 좋은 시각을 만들어 낼 수 있지 않을까.
책의 일부 내용은 깊이 탐구하거나 그 내용을 포스팅하게되면 공격받기 십상이겠다 하는 생각도 든다. 게다가 나는 일본 그 자체에 대한 반감은 크지 않지만, "월가의 비지니스를 이해하지 못한 일본의 군국주의자들에 의한 진주만 공격" 에 대한 저자의 발언 외에 일본의 전사 및 일본 내부 자본에 대한 소개가 없는 점에 대해서는 현재 일본이 가진 경제대국의 호칭에 비추어 볼때 전혀 관계가 없지는 않을 것이라는 의문에서 자유롭지 못한 듯 하다.
그런 말이 생각난다. "진실은 무겁다."
좋은 번역서인듯.
저자의 다른 책 중 한국어로 번역된 책들은 쉽게 찾아 볼 수 있다. 한가지 신기한 것은, 저자에 대한 위키피디아의 소개는 일어와 한국어로만 존재하는 듯 하며, 영문 버전에서는 찾아 볼 수 없다.
[체르노빌의 아이들]
[원전을 멈춰라]
[왜 인간은 전쟁을 하는가]
[미국의 경제 지배자들]
저자의 후쿠시마 원전 사태에 대한 코멘트
http://www.sheffnersweb.net/blogs/accuratemaps/announcement/fukushima-nuclear-crisis-worse-than-you-think/
오랜만에 전에 다니던 회사의 임원분과, 부사수로 뽑아 놓고 미처 데려오지는 못했던 후임, 그리고 대한민국에서 먹어주는 프론트엔드 개발자를 만나고 왔다. 오랜만의 송파 나들이는 참 일하면서 왜 그렇게 올림픽 공원에 자주 가서 머리를 식히지 못했었나 하는 아쉬움이 새록새록 떠오르는 하루였달까.
가끔 나는 복이 많은 사람인것 같다 라는 생각을 해 본다. 무엇에 그리 미쳤는지 내가 해결 할 수 있거나, 내가 무언가 이룰 수 있는 것들에 대한 갈망이 날이 갈 수록 커지기만 한다. 그로인한 수혜는 지난 수년간 한해한해 무언가 얻지 못했던 한해가 없었던 것이 아닐까. 시스템의 Implementation 이란, 한번 구축하게 되면 자주 손댈일이 없는 마치 저수지와 같은 것임에도 불구하고, 많은 기회를 통해 새로운 시스템들, 새로운 서비스들에 몸담아 그 구조를 생각하고 그 구현을 이루어 냈다. 심플렉스 인터넷을 다니던 시절부터, 기술이사님과 나누었던 수많은 이야기들, 그리고 실제 서비스에 반영할 수많은 오픈 소스들에 대한 사전 연구, 서비스 도입 여부의 타진, 관계 부서장들과의 흡연실 생활 등등등 2년이 채 안되는 기간에 했던 일이라고 하기엔 너무 많은 일들을 정말 즐겁게, 또 다이나믹하게 함께 일하는 사람들과 대화 하며 정보를 나누는, 어떻게 보면 현재 내가 어떻게 시스템을 다루어야 하는가에 대한 수많은 엔트리 포인트를 남겨주었던 회사였다. 아니, 회사도 회사지만 난 아직도 그 기술이사님을 사수로 생각한다. 뭐, 살다보니 서운하게 해 드린 경우도 있었지만.
돌이켜 생각해 보면 개념없이 남의 문제 생긴 시스템을 분석해 주겠다고 솔로 컨설턴트로 활동한 적도 많았다. 나름 5개 이상의 업체와 그들의 시스템적인 문제들, 이를테면 리눅스 솔루션의 솔라리스 포팅이라던가, HPC 클러스터의 구성, 턱시도와 오라클 관련 이슈들, 웹로직을 필두로 한 각종 WAS의 JSP 메모리 leak 추적 등. 매번 매달렸고, 매번 성공했었다. 사실 성공하지 못하면 보수 자체가 없는 것과 더불어, 계약으로 인해 엄청난 손해를 볼 수 있다는 심리적 마지노선의 역할이 중대 했을 수도 있겠지만, 가장 기본적인 요소는 호기심이 아니었을까. 어려울 것 같은 문제는 오히려 쉽게 눈에 띄었고, 쉬울것 같은 문제는 언제나 바로 옆에 있는 답을 알아내기위해 숱한 밤을 지새워야 했다. 지금 생각해 보면, 참 미쳤던게 아닐까.
그 다음 회사도 심각한 시스템/네트워크/스토리지 전반에 문제를 안고 있었고, 그 문제를 해결 하고 싶다는 욕망에 사로잡혀 입사해서 2년을 다녔다. 일본이 주 고객이었던 탓에 총체적인 문제를 해결 하기 위해 한달에 한번의 작업 공지만 허용 되었고, 따라서 모든 것을 처리하는데 총 3개월이 걸렸다. L4 이중화 설정, MSSQL SAN 클러스터, IP Aliasing 을 사용한 다수의 닷넷 서버들. 데이터 센터의 찬바람을 도와주는이 없이 혼자 3개월을 맞고나니, 무릎에 건염이라는 생전 듣도 보도 못한 걸을수도 없는 통증에 모든 작업 이후에는 일주일을 앓아 누워있기도.
그 회사를 수많았던 이유로 인해 정리하고, KT 클라우드에 뛰어든지 다음달이면 이제 만 1년이다. 컴퓨트 클라우드의 구성, 그리고 자동화, DevOps 로서의 역할, 최초 구성단계의 수많았던 시행 착오들을 거치면서 컴퓨트 클라우드 프로젝트는 마무리로 달려가고, 스토리지 클라우드에 몸담아 해외 벤처와의 일종의 가교 역할을 하다 보니, 이게 또 사람이라고 그 짧은 1년에 얻은 수확이 적지않다. 이 회사의 프로젝트가 끝나면 다음 프로젝트들이 줄 서 있고, 이제는 진정한 기술 컨설턴트로서 한발짝 한발짝 다가가고 있는게 아닐까 싶기도 하고.
그런 시간들을 보내고 나서 만난 오늘의 지인들은, 각자의 고민을 내가 함께 지내왔던 시간속에 그대로 머물러 있는채 가지고들 있었다. 조직 내에서의 인간관계, 기술 신뢰도가 떨어지는 협업 구성원들에 대한 불만, 팀의 무관심으로 인한 핵심 업무의 관계 없는 다른 팀으로의 이전 등등. 이 분들의 고민을 듣던 와중에 문득 느꼈던 것은, 지난 1년의 경험으로 다시 한번 그런 상태들을 해결 할 수 있게 도와주고 싶다 라는 것이었다. 물론, 냉정하게 이야기 해서 컨설턴트로의 방문이 아닌 이상, 즉 각 조직에 영향력을 끼칠 수 없는 레벨로의 투입은 의미가 없다. 그리고 대기업과 동일하게 발생하는 중소기업의 인력으로 인한 문제는 대기업보다 더 풀기 어려운 것도 사실이다. 인력 관리가 쉬웠어요 라고 말할 수 있는 조직은 강남의 화류계에도 없으리라.
해답없는 고민들 속에서 스스로의 미래들을 생각하는 모습은 지인들의 보다 좋은 미래에 대한 즐거운 상상으로 이어지게 한다. 어느회사건 내 등 쳐먹었던 회사가 아닌 이상 불편한 관계로 정리 했던 적이 없으며, 그 조직들에 있었던 좋은 사람들은 언제 만나도 즐겁다. 다만, 일견 불합리해 보이는 구성이라도 관리의 입장에서 조율 해야 하는 것은 쉬운일이 아닐것이며, 그 사람들 사이에 연계 되어 있는 여러가지 관계의 매듭이 꼬인데 더 꼬여있는 모습은 진정 유쾌한 광경은 아니리라.
문득, 그런 결론을 내려본다. 서비스를 제대로 만들고 싶고, 좋은 아이템을 추구하고, 잘 팔아먹을 궁리를 하는 이 모든 활동을 통해서 전체의 이익을 상승시키려는 노력을 하는 사람들은, 눈 앞의 패스워드 권한따위와 같은, 같지도 않은 이권에는 관심도 없다. 그것은 이권이 아니라 도구일 뿐일텐데, 이를 권력으로 승화시키려는 움직임은 또한 어느 조직에나 있기에 서글프기도 하다. 큰 기업에는 그들의 룰이 있고, 작은 기업에는 큰 기업이 가지지 못한 무엇이 필요하지 않겠나. 밥그릇이 소중하면 지키려고 하지말고, 농사를 더 잘 짓는 방법을 생각해는 그런 힘 말이다.
서로 다른 전문성을 가지고 있는 사람들이 모여있는, 그런 프로젝트 그룹의 힘, 또 그 전문성을 가지고 있는 사람들 아래서, 일을 어떻게 해야 잘 할 수 있는지 배워가는 후임들을 양성하는, 그런 힘들.
친하다고 전문가 제쳐두고 지 후임한테 일줘서 프로젝트 말아먹는 그따위짓 말고 말이다.