본문 : http://www.ischo.net -- 조인상 //시스템 엔지니어

+++++++++++++++++++++++++++++++++++++++++++++++++++++++


Disk 디바이스


디스크는 사용자가 시스템 사용에 있어서 관리해야할 가장 중요한 디바이스라 하겠다. 최근에는RAID를 지원하는 디스크 어레이 장비가 많이 상용화되어 데이터의 안정성에 기여하였으나 그래도 데이터 백업에는 신경을 써야 한다.

MultiPath I/O(MPIO)

SDI는 UnixWare 7에서 사용되는 많은 하드웨어 디바이스에 대한 드라이버 소프트웨어를 위한 뼈대라 할 수 있다. SDI(Storage Device Interface)를 사용하는 목적은 스토리지 디바이스들을 다루는 데 있어서 모듈식으로 관리하게 하기 위해서이다. 모듈식으로 하면 현재의 드라이버와 장래에 나올 드라이들 간의 호환성을 보장해 주고 드라이버들이 기록되어지는 방식이 표준화되는 장점이 있어서 이다.

SDI는 두 개의 층으로 구성된다: target driver, host bus adaptor driver

SDI 구조

Target Drivers 



Host Bus Adaptor 
Driver


상위층인 target driver는 디바이스 특유의 부분으로 디바이스마다 특유의 특성을 가지고 있는데, 이들 디바이스를 제어하는데 사용된다. 그리고 이들은 타겟 드라이버에 보내진 요청들을 만족시키기 위해 무슨 조치를 취해야 할 것인지를 결정한다. 타겟 드라이버들은 하드 디스크(sd01), 테이프 디바이스(st01), CD-ROM(sc01), WORM 디바이스(sw01)와 다른 mass storage 디바이스들을 위하여 존재한다. 보다 자세한 정보는 man 명령어를 이용하면 알 수 있다.

SDI의 하위층은 HBA(Host Bus Adaptor) 드라이버로서, 타겟 드라이버로부터 요청을 받아 들여서 그 요청을 만족시키 위해 디바이스로 적절한 제어 신호들을 보낸다.

UnixWare 7에서 지원하는 MPIO는 SCSI storage 디바이스로 리던던트 액세스 경로를 제공하여 준다. redundant 액세스 경로란, MPIO에는 active 경로와 inactive 경로가 있는데 정상 상태에서는 active 경로로 액세스하다가 무언가 잘못이 발생하면 active 경로가 죽고 inactive 경로가 active 경로로 대체되는 경로를 말한다. 이러한 redundant 경로를 UnixWare 7에서 기본적으로 지원하고 있다는 말이다.

















위에 있는 I/O Architecture에서, MPIO드라이버는 target driver 위층에 얹혀있다. VTOC 드라이버 에서는 디스크의 분할 정보인 파티션들과 슬라이스들을 인식하고 있다. 그리고 MPIO 드라이버는 여러 개의 경로를 지원하기 위한 것이어서 단일 경로를 갖는 스토리지 디바이스로 구성이 된 시스템은 지원하지 않는다. RAID(Redundant Array of Inexpensive Disks) 드라이버는 UnixWare 7에서의 성능을 최대화 하기 위하여 각 벤더에서 제공하고 있다.

MPIO가 지원되는 하드웨어로, 스토리지 디바이스들을 액세스 하는 여러 경로는 SDI에 의해 MPIO 드라이버로 보고된다. 그래서 MPIO 드라이버들은 사용중인 경로에서 장애가 발생하면 다른 경로를 사용하도록 해준다. 장애가 발생된 경로가 정상으로 동작하면 이 경로를 액티브로 지정하여 사용하게 된다. 다시말해 MPIO 드라이버는 부하 균형(load balancing)을 조절하는 역할도 해준다.

이런 모든 기능을 제공함으로 MPIO는 리던던트 데이터 경로를 통하여 I/O 서브시스템의 안정성을 부가 시켰고, 동시에 데이터 저장을 위한 액티브 경로를 여러 개 사용함으로 처리량을 증가시켰다.

sdipath 명령어

Multipath를 관리하는 명령어로 ‘sdipath’란 명령어를 사용하는데, 이 명령어로 디스크로 가는 여러 경로를 리스트할 수 있다. Multipath I/O는 여러 개의 HBA(Host Bus Adapter)들이 같은 버스와 멀티포트화된 디바이스들에 연결될 수 있게 하여 준다. 이들은 두 가지 목적으로 사용된다:

첫째로, HBA에 장애가 발생하였을 때 디바이스들에게로의 높은 가용성(high availablity)을 제공하여 준다. 즉 컨트롤러가 고장났을 때, OS가 해당 디스크를 액세스하기 위해 다른 I/O 경로를 통해 I/O 액세스를 하게(I/O redirect) 해준다.

두번째로, 여러 개의 컨트롤러를 통하여 해당 디스크로의 액세스를 골고루 하도록 로드 밸런싱 (load balancing of I/O)을 제공하여 준다. 현재는 멀티패스 I/O를 위한 디바이스는 디스크만이 해당된다.
옵션에 따라 사용되는 명령어는 다음과 같다:
[#] sdipath -o list [-qv] [-d device]
[#] sdipath -o fail -d device path
[#] sdipath -o repair -d device path
-o 수행될 operation을 명시하기 위하여
list MPIO 드라이버에게 알려진 I/O 경로에 대한 정보를 리스트 하기 위하여
fail 명시된 경로로의 I/O 액세스를 중지시키기 위하여
repair 명시된 경로로의 I/O 액세스를 재개시키기 위하여
-d device 3 가지 방법으로 device 대신 표기 가능
c0b0t3d0p0
/dev/rdsk/c0b0t3d0p0
device.tab에 명시된 alias 명으로
-v 보여주는 정보의 헤더를 표시하여 줌

Device Name

SCSI 디바이스의 이름을 붙이는 규칙은 특정한 형식을 갖고 있다.
c#b#t#d#s# 하드디스크 슬라이스
c#b#t#d#p# 하드디스크 파티션
c#b#t#l# 테이프와 CD-ROM 디바이스

c# 디바이스가 위치하고 있는 컨트롤러의 번호이며, 0-31 번까지 이다.
HBA를 위한 번호는 시스템에서 지원하는 보드 슬럿의 위치에 따라 정해지며
슬럿 중간에 새 컨트롤러가 장착되면 그 후단부터 번호가 밀린다. IDE 타입은
맨 뒤로 밀려난다.
b# 컨트롤러에서 지원하는 버스 번호이다. 컨트롤러에 따라 여러 개의 버스를 지원
하는 것도 있다. 0-7번까지 이다. IDE 타입에 대해서는 항상 0 이다.
t# 디바이스의 타겟 ID로, 일반적으로 디바이스에서 설정한 SCSI ID와 일치한다.
통상 부팅 디바이스를 0번으로 정하여 사용한다. 0-31까지 이다.
d# 드라이브 번호이다. 이는 또한 LUN(Logical Drive Number)으로도 알려져 있다.
경우에 따라 디스크 어레이 장비같은 것들은 SCSI ID로 설정할 수도 있지만
LUN으로도 디바이스들을 설정할 때가 있다. 0-31까지 이다. IDE 타입에 대해서는
항상 0이다.
p# 디스크에 있는 파티션을 의미한다. 전체 디스크는 p0이고, 실 파티션은 p1부터
p4까지 이다. 테이프와 CD-ROM 디바이스는 l#로 명시된다.
s# 한 디바이스내, 한 파티션내의 슬라이스 번호이다. 한 파티션의 전체 슬라이스에
대한 정보를 나타내고, 실 슬라이스 정보는 s1부터 시작한다 . 0-b7(hex)까지이다.
Sdiconfig 명령어

/sbin/sdiconfig 명령어는 어떤 디스크, 테이프, SCSI 컨트롤러가 시스템에 연결되어 있는 가를 SDI (Storage Device Interface) 서브시스템에 질의하여 표시하여 준다. ‘sdiconfig’ 명령어의 앞 부분의 숫자들이 할당된 디바이스 번호이다.
#/:>sdiconfig -l
0:0,7,0: HBA : (adsl,1) Adaptec PCI SCSI
0,0,0: DISK : SEAGATE ST15150N 0023
0,2,0: DISK : UNISYS 003557M2954S-5120657
0,5,0: TAPE : SONY SDT-5000 330B
1:0,7,0: HBA : (mega,1) MEGA SCSI
0,0,0: DISK : MegaRAIDLD0 RAID0 4149RU.64
0,0,1: DISK : MegaRAIDLD1 RAID0 4095RU.64
0,0,2: DISK : MegaRAIDLD2 RAID0 4149RU.64
2:0,7,0: HBA : (ide,1) Generic ESDI/IDE/ATA
0,0,0: CDROM : LG CD-ROM CRD-8400C1.02

Disk 디바이스 이름

디스크 이름이 붙여지는 방법은 target ID로 명명되는 방식과 LUN 번호로 명명되는 방식이 있다. 인터널 디스크는 대부분 타겟 ID즉 SCSI ID에 따라 붙여지고 외장용은 대부분 디스크 케이지의 내부적 구성에 의거하여 붙여진다. 즉 디스크 모듈에도 디스크가 설치되는 순서가 있는데 정해진 순서에 따라 구성된다. 그리고 target ID 식인지 LUN번호 방식인지는 외장형 디스크어레이 장비가 어느 것을 지원하여 주는가에 달려 있다.
target ID 방식 예) c0b0t0d0,c0b0t1d0, c0b0t2d0 ….
LUN # 방식 예) c1b0t0d0,c1b0t0d1, c1b0t0d2 ….

인터널 용 디바이스들은 대부분 시스템 기본 구성요소이며, 시스템 관리나 시스템 관련 작업에 이용할 목적으로 구성된다. 그래서 부팅 디스크, 기본 백업용및 소프트웨어 설치용 QIC&DAT 테이프 드라이브와 CD-ROM 드라이브들이 연결되어 있다. 해당 디스크에 대한 보다 자세한 정보는 ‘devattr’ 명령어로 살펴보면 된다.
#/:>devattr -v /dev/dsk/c0b0t0d0s0
MODNAME='vtoc'
alias='disk1'
bdevice='/dev/dsk/c0b0t0d0s0'
cdevice='/dev/rdsk/c0b0t0d0s0'
desc='Disk Drive 1'
inquiry='COMPAQ DGHS09Y 01C0'
real_addr='c0b0t0d0sXX'
rm_key='64'
scsi='true'
stamp='JIWjtpJdxZeS'
type='disk'

/dev/dev/c0b0t0d0s0 디바이스의 가명이 disk1이란 것과 블록 디바이스로bdevice에 있는 이름, 캐릭터 디바이스로 cdevice에 있는 이름이 참조 정보로 이용된다.

슬라이스 이름은 한 파티션 전체에 대한 정보를 s0에서 가지고 있고, 그 파티션을 몇 개로 나누 었는지에 따라 s1부터 번호가 매겨 나간다. 슬라이스에 관한 자세한 내용은 “slice” 편을 참조하면 된다.

Devattr 명령어

SCSI 디바이스에 대한 속성을 자세하게 표시하여 준다. 이 명령어는 /etc/device.tab에 있는 정보를 갖고 온다. 다음에 테이프를 예를들어 보았다. 디바이스 이름이 디스크와는 좀 다르게 붙여지며, d# 대신 l#을 사용한다.

#/:>devattr -v /dev/rmt/c0s0
alias='ctape1' bklib='SCSI' bufsize='65536'
cdevice='/dev/rmt/c0b0t6l0'
cdevlist='/dev/erct0,/dev/nrct0,/dev/rct0,/dev/rmt/c0b0t6l0n,/dev/rmt/c0b0t6l0nr,/dev/rmt/c0b0t6l0r,/dev/rmt/c0b0t6l0u,
/dev/rmt/c0s0,/dev/rmt/c0s0n,/dev/rmt/c0s0nr,/dev/rmt/c0s0r,/dev/rmt/ctape1,/dev/rmt/nrtape1,/dev/rmt/ntape1,
/dev/rmt/rta pe1,/dev/rmt/utape1,/dev/xct0'
copy='/bin/dd if=CDEVICE1 of=CDEVICE2 bs=10240'
desc='Tape Drive 1'
display='true'
erasecmd='/usr/lib/tape/tapecntl -e /dev/rmt/c0b0t6l0n'
inquiry='HP C1533A A708'
norewind='/dev/rmt/c0b0t6l0n'
pdimkdtab='true' removable='true'
retension='/usr/lib/tape/tapecntl -t /dev/rmt/c0b0t6l0n'
rewind='/usr/lib/tape/tapecntl -w /dev/rmt/c0b0t6l0n'
rewindcmd='/usr/lib/tape/tapecntl -w /dev/rmt/c0b0t6l0n'
scsi='true' type='qtape' volume='cartridge'

위의 것은 DAT 드라이브의 정보이며 /dev/rmt/c0s0란 이름은 가명으로 ctape1을 사용한다고 되어 있다. 보통 소프트웨어 패키지를 설치할 때 ‘pkgadd –d ctape1’과 같이 사용한다. 그리고 ‘dd’,‘cpio’와 ‘tar’ 같은 명령어로 테이프를 조작할 때는 /dev/rmt/c0s0 같은 디바이스명을 이용한다. 그리고 ‘tapecntl’ 같이 세부적으로 조작할 때는 /dev/rmt/c0d0t6l0n 같은 디바이스 명을 사용한다. 자세한 조작법은 명령어를 이용한 백업편을 참조하면 된다.




Device 디렉토리

디스크에 대한 디바이스 디렉토리는 /dev 디렉토리 밑에 정의된다. 그래서 디스크 뿐만이 아니라 모든 디바이스로의 액세스는 디바이스들을 직접 액세스하는 것이 아니라 특정 디바이스 파일 즉 special device file라 부르는 파일을 통하여 이루어 진다. 이들 파일이 UnixWare 7 커널내에 있는 루틴들을 액세스하는 포인터가 된다.

특히 디스크 디바이스들은 /dev/dsk와 /dev/rdsk에 위치하고 있다. /dev/dsk 디렉토리는 블록형의 디바이스(block device) 포인터들이고 /dev/rdsk 디렉토리는 캐릭터형의 디바이스(character device) 포인터들이다. 먼저 블록 디바이스 파일들의 일부를 살펴보자.

# ls –al /dev/dsk
br-------- 1 root sys 7679,184 Oct 5 21:28 c0b0t0d0p0
brw------- 1 root sys 7679,185 Oct 5 21:28 c0b0t0d0p1
brw------- 1 root sys 7679,186 Oct 5 21:28 c0b0t0d0p2
brw------- 1 root sys 7679,187 Oct 5 21:28 c0b0t0d0p3
brw------- 1 root sys 7679,188 Oct 5 21:28 c0b0t0d0p4
brw------- 1 root sys 7679, 0 Oct 5 21:28 c0b0t0d0s0
brw------- 1 root sys 7679, 1 Oct 5 21:28 c0b0t0d0s1
brw------- 1 root sys 7679, 2 Oct 5 21:28 c0b0t0d0s2
brw------- 1 root sys 7679, 3 Oct 5 21:28 c0b0t0d0s3
brw------- 1 root sys 7679, 4 Oct 5 21:28 c0b0t0d0s4
brw------- 1 root sys 7679, 5 Oct 5 21:28 c0b0t0d0s5
brw------- 1 root sys 7679, 6 Oct 5 21:28 c0b0t0d0s6
brw------- 1 root sys 7679, 7 Oct 5 21:28 c0b0t0d0s7
brw------- 1 root sys 7679, 8 Oct 5 21:28 c0b0t0d0s8
brw------- 1 root sys 7679, 9 Oct 5 21:28 c0b0t0d0s9
brw------- 1 root sys 7679, 10 Oct 5 21:28 c0b0t0d0sa
brw------- 1 root sys 7679, 11 Oct 5 21:28 c0b0t0d0sb
brw------- 1 root sys 7679, 12 Oct 5 21:28 c0b0t0d0sc
brw------- 1 root sys 7679, 13 Oct 5 21:28 c0b0t0d0sd
brw------- 1 root sys 7679, 14 Oct 5 21:28 c0b0t0d0se
brw------- 1 root sys 7679, 15 Oct 5 21:28 c0b0t0d0sf
br-------- 1 root sys 7679,440 Oct 23 07:25 c0b0t2d0p0

리스트된 내용을 잘 살펴보면 major 디바이스 번호는 7679이고, 첫번째 디스크의 파티션에 대한 minor 디바이스 번호는 184에서부터 188까지 5개인데 p0인 184는 전체 파티션을 나타내고 185 부터 첫번째 파티션에서 188은 마지막 네번째 파티션을 나타낸다. 이는 인텔 기반 컴퓨터가 디스크를 위한 파티션을 4개 까지 지원하기 때문이다.


다음에는 슬라이스를 알아보자. 각 디스크의 슬라이스 번호는 0에서 sf까지이며 s0는 전체 슬라이스를 나타내며, 실재 슬라이스는 s1부터 sf까지 15개 까지를 지원한다. 이 슬라이스 하나 하나를 파일시스템로 할당하여 마운트시켜 사용할 수 있다. 최대 슬라이스 수는 0에서 183까지 할당하여 디스크 파티션당 184개의 슬라이스를 사용할 수 있다. 그래서 첫번째 디스크의 마이너 번호를 살펴보면 184번부터 파티션을 위한 마이너 번호를 매기고 있다. 이런한 규칙을 숙지하고 있으면 실수로 디바이스를 지웠다 하더라도 디바이스의 special 파일을 만드는 ‘mknod’ 명령어를 이용하여 디바이스 파일을 만들어 복구할 수 있다.

마이너 디바이스 번호는 디스크당 256개가 할당된다. 첫번째 디스크에 할당된 번호는 0번부터 255까지로 256개가 된다. 그래서 두번째 디스크의 마이너 번호는 256번부터 부여된다.


Device 검색


디바이스를 검색하는 과정은, UnixWare 7에서는 부팅이 일어나면 /etc/rc2 스크립트를 읽는 과정 중에 /etc/scsi/pdimkdtab 실행파일이 SDI 드라이버에 의해 구성된 EDT(Equipped Device Table)을 읽고 /etc/device.tab에 있는 디바이스 테이블 엔츄리들을 갱신한다. 잠시 이와 관련된 rc2 파일을 살펴 보면 그 내용이 있음을 알 수 있다.

#:> vi /etc/rc2
# update the device table and the contents file for PDI devices
#
if [ -s /etc/scsi/installf.input ]
then
pfmt -l $LABEL -s info -g $CAT:195 "\nPlease wait while Device Database is updated.
This may take a few minutes.\n\n"
/etc/scsi/pdimkdtab -fi 2>/etc/scsi/dtab.out
fi
#
# backup the device table files in case of corruption
#
if [ \! -f /etc/.device.tab ]
then
cp /etc/device.tab /etc/.device.tab >/dev/null 2>&1
fi

디바이스들이 /etc/device.tab에 안보인다면 시스템이 해당 디바이스를 인식하지 못하고 있다는 의미이므로 사용할 수 없다. 그런 경우는 디바이스에 문제가 있던가 시스템이 지원하지 않을 때에 해당된다. device.tab의 정보를 읽어들이는 명령어로 ‘devattr’ 명령어가 있다.


이외에서 메모리와 주변장치 구성을 포함한 시스템 구성 정보를 보여주는 ‘/usr/sbin/prtconf’ 명령어가 있다. 먼저 ‘devattr’ 명령어에 관하여 알아보자.

#:>devattr -v /dev/dsk/c0b0t0d0s0
MODNAME='vtoc'
alias='disk1'
bdevice='/dev/dsk/c0b0t0d0s0'
cdevice='/dev/rdsk/c0b0t0d0s0'
desc='Disk Drive 1'
inquiry='SEAGATE ST15150N 0023'
real_addr='c0b0t0d0sXX'
rm_key='60'
scsi='true'
stamp='HIchQVFCpfxG'
type='disk'

이 명령어는 현재 디바이스가 붙어 있지 않더라도 이전에 붙였던 디바이스라도 있는 것처럼
보여준다(devattr, prtconf) . 정확한 디바이스 구성을 알려면 ‘sdiconfig’ 명령을 이용한 결과이며,
이를 근거로 ‘devattr’ 명령어를 참조하면 된다. 아래는 ‘prtconf’ 명령어 결과이다.

prtconf 명령어

주변장치나 메모리등의 시스템 정보를 간략히 보여준다.

#>prtconf

SYSTEM CONFIGURATION:
Memory Size: 64 Megabytes
System Peripherals:
Floppy Drive 1 - 1.44 MB 3.5
SCSI CD-Rom Drive 1 - LG - CD-ROM CRD-8400C
Tape Drive 1 - SONY - SDT-5000
Disk Drive 1 - SEAGATE - ST15150N - 4094 MB
Disk Drive 2 - MegaRAID - LD0 RAID0 4149R - 4148 MB
Disk Drive 3 - MegaRAID - LD1 RAID0 4095R - 4094 MB
Disk Drive 4 - MegaRAID - LD2 RAID0 4149R - 4148 MB
Disk Drive 5 - UNISYS - 003557M2954S-512
Disk Drive 6 - MegaRAID - LD0 RAID0 4149R - 4148 MB
Disk Drive 7 - UNISYS - 003557M2954S-512 - 4149 MB
80387 Math Processor


자 이제 현재 시스템에 연결되어 있으며 시스템이 인식하고 있는 정확한 구성 정보를 알아내기
위해 사용하는 명령어인 ‘sdiconfig’ 혹 ‘pdiconfig’ 명령어에 관하여 알아보자.
#/:>sdiconfig -l
0:0,7,0: HBA : (adsl,1) Adaptec PCI SCSI
0,0,0: DISK : SEAGATE ST15150N 0023
0,2,0: DISK : UNISYS 003557M2954S-5120657
0,5,0: TAPE : SONY SDT-5000 330B
1:0,7,0: HBA : (mega,1) MEGA SCSI
0,0,0: DISK : MegaRAIDLD0 RAID0 4149RU.64
0,0,1: DISK : MegaRAIDLD1 RAID0 4095RU.64
0,0,2: DISK : MegaRAIDLD2 RAID0 4149RU.64
2:0,7,0: HBA : (ide,1) Generic ESDI/IDE/ATA
0,0,0: CDROM : LG CD-ROM CRD-8400C1.02

SCSI와 (E)IDE 타입으로 붙어 있는 모든 디바이스에 관한 정보를 보여주고 있다.

/etc/scsi 디렉토리

이 디렉토리에는 SCSI 디바이스에 관한 정보와 SCSI 유틸리티들이 존재한다. 또한 /sbin 디렉토리
일부와 파일들이 링크되어 있다.
#/etc/scsi:>ls -al
-rwxr-xr-x 1 bin bin 21976 Oct 6 05:36 cpqunits
-rwxr-xr-x 1 root sys 90536 Mar 6 1999 diskcfg
drwxr-xr-x 2 bin bin 96 Oct 6 04:47 format.d
drwxrwxr-x 2 root sys 1024 Oct 6 05:21 mkdev.d
-rwxr-xr-x 1 root sys 77540 Mar 6 1999 pdi_hot
-rwxr-xr-x 1 root sys 119660 Mar 6 1999 pdi_timeout
-rwxr-xr-x 2 root sys 97716 Mar 6 1999 pdiconfig
-rwxr-xr-x 3 root sys 222220 May 21 18:13 pdimkdev
-rwxr-xr-x 3 root sys 222220 May 21 18:13 pdimkdtab
-r-------- 1 root root 2008 Apr 8 1998 pditimetab
-r-------- 1 root root 2008 Apr 8 1998 pditimetab.orig
-rwxr-xr-x 2 root sys 97716 Mar 6 1999 pdiunits
-rw-r--r-- 1 root root 960 Oct 23 07:24 sdi_edt
-rwxr-xr-x 2 root sys 1634 Apr 8 1998 sdiadd
-rwxr-xr-x 3 root sys 222220 May 21 18:13 sdighost
-rwxr-xr-x 1 root sys 4576 Apr 8 1998 sdimkosr5
-rwxr-xr-x 1 root sys 82396 Mar 6 1999 sdipath
-rwxr-xr-x 2 root sys 1634 Apr 8 1998 sdirm
-rwxr-xr-x 1 root sys 3799 Mar 6 1999 sdistatic
drwxr-xr-x 2 root sys 96 Oct 6 04:47 target.d
-r-xr-xr-x 1 bin bin 1360 Mar 6 1999 tc.index
(*.222.18.148)