MTIO(4)

명칭
mtio - FreeBSD 자기테이프 인터페이스

해설
/dev/[nr]sa* (이)라는 이름의 스페셜 파일은, SCSI 테이프 드라이브를 나타내고 있습니다. 이 드라이브는, 시스템에 접속할 수가 있습니다. /dev/[nr]sa*.ctl (은)는, 컨트롤 디바이스로, SCSI 테이프 드라이버에 ioctl 시스템 콜을 발행하는데 사용할 수 있습니다. 이것에 의해, 테이프를 언마운트 한 후도 계속해 유효하게 할 필요가 있다 파라미터를 설정할 수 있습니다.

되감아 용디바이스는, 마지막 읽어들여, 써 넣어, 그리고 시크 요구가 종료하든가, 혹은 테이프의 마지막에 도달했을 때에, 자동적으로 테이프를 되감습니다. 통상, 권반환을 실시하지 않는 디바이스명에는, 캐릭터 ‘n’ 하지만 붙일 수 있습니다.

테이프에는, 고정장 레코드도 가변장 레코드도 써 넣을 수가 있습니다. 새로운 정보를 얻고 싶은 경우는, sa(4) (을)를 참조해 주세요. 테이프의 마지막에는, end-of-file 마커가 2 개 붙일 수 있어 테이프 파일의 말미에는, end-of-file 마커가 1 개 붙일 수 있습니다. 테이프가 되감아지지 않은 경우에는, 테이프의 위치는 2 개의 테이프 마크의 사이에 헤드가 오는 곳이 되어, 다음번의 글로 2 번째의 end-of-file 마커 하지만 덧쓰기되게 됩니다.

자기테이프 디바이스는 모두 mt(1) 명령로 제어됩니다.

raw 자기테이프 디바이스에서는, ioctl(2) 에서의 조작이 얼마인가 가능합니다. 이하의 선언은 <sys/mtio.h> (으)로부터의 것입니다.

    /*
     * 자기테이프 IO 제어 명령용 구조체 및 선언
     */
    /* MTIOCTOP - 자기테이프 조작 명령용 구조체 */
    struct mtop {
    	shortmt_op;		/* 이하로 선언하는 조작 */
    	daddr_tmt_count;	/* 몇회 조작하는 것인가 */
    };
    /* 조작 */
    #define MTWEOF		0	/* end-of-file 레코드를 쓴다 */
    #define MTFSF		1	/* 빈파일까지 전진 */
    #define MTBSF		2	/* 빈파일까지 후퇴 */
    #define MTFSR		3	/* 빈레코드까지 전진 */
    #define MTBSR		4	/* 빈레코드까지 후퇴 */
    #define MTREW		5	/* 되감아 */
    #define MTOFFL		6	/* 되감아 드라이브를 오프 라인으로 한다 */
    #define MTNOP		7	/* 아무것도 하지 않는다. 스테이터스를 설정할 뿐 */
    #define MTCACHE		8	/* 콘트롤러 캐쉬를 유효 */
    #define MTNOCACHE	9	/* 콘트롤러 캐쉬를 무효 */
    #if defined(__FreeBSD__)
    /* 디바이스용의 블록 사이즈를 설정합니다. 디바이스가 가변장의 것이다 */
    /* 경우, 0 이외의 파라미터를 주면(자), 받아들일 수 있었던 파라미터치의     */
    /* 블록 사이즈를 가진 고정 블록장의 것으로 바꿀 수 있습니다. 블록   */
    /* 사이즈를 0 에 되돌리면(자), 디바이스는 다시 가변장 블록의 것으로 돌아옵니다.   */
    #define MTSETBSIZ	10
    /* 디바이스의 밀도를 설정합니다. 밀도의 값은 SCSI II 의 사양으로 정해져    */
    /* 내려 0 에서 0x17 까지의 값을 받습니다. 오픈 모드 때 마셔 이   */
    /* 값을 설정해 주세요.                                                */
    #define MTSETDNSTY	11
    #define MTERASE		12	/* EOM 까지 소거 */
    #define MTEOD		13	/* EOM 까지 공백으로 한다 */
    #define MTCOMP		14	/* 압축 모드의 선택 0= 오프, 1= 정의 */
    #define MTRETENS	15	/* 테이프의 느슨해져 수선 */
    #define MTWSS		16	/* 세트 마크 기입 */
    #define MTFSS		17	/* 세트 마크까지 전진 */
    #define MTBSS		18	/* 세트 마크까지 후퇴 */
    #define MT_COMP_ENABLE		0xffffffff
    #define MT_COMP_DISABLED	0xfffffffe
    #define MT_COMP_UNSUPP		0xfffffffd
    /*
     * mt_dsreg 의 값으로, 지금 디바이스가 무엇을 하고 있는지를 나타낸다.
     */
    #defineMTIO_DSREG_NIL	0	/* 미지 */
    #defineMTIO_DSREG_REST	1	/* 아무것도 하지 않는다 */
    #defineMTIO_DSREG_RBSY	2	/* 테이프와 통신중 (그러나, 조작하고 있지 않습니다) */
    #defineMTIO_DSREG_WR	20	/* 기입중 */
    #defineMTIO_DSREG_FMK	21	/* 파일 마크의 기입중 */
    #defineMTIO_DSREG_ZER	22	/* 소거중 */
    #defineMTIO_DSREG_RD	30	/* 읽기중 */
    #defineMTIO_DSREG_FWD	40	/* 보내 안 */
    #defineMTIO_DSREG_REV	41	/* 반환중 */
    #defineMTIO_DSREG_POS	42	/* 하드웨어에 의한 위치 결정중 (방향 불명) */
    #defineMTIO_DSREG_REW	43	/* 되감아 안 */
    #defineMTIO_DSREG_TEN	44	/* 느슨해져 수선중 */
    #defineMTIO_DSREG_UNL	45	/* 없애 안 */
    #defineMTIO_DSREG_LD	46	/* 없애 안 */
    #endif
    /* MTIOCGET 용의 구조체 - 자기테이프 상태 취득 명령 */
    struct mtget {
    	shortmt_type;		/* 자기테이프 디바이스의 종류 */
    /* 다음의 2 개의 레지스터는 거의 디바이스 의존입니다 */
    	shortmt_dsreg;		/* ``디바이스 상태''레지스터 */
    	shortmt_erreg;		/* ``에러''레지스터 */
    /* 디바이스 의존 레지스터의 마지막 */
    	shortmt_resid;		/* 나머지 카운터 */
    #if defined (__FreeBSD__)
    	daddr_t mt_blksiz;	/* 현재 효력이 있는 블록 사이즈 */
    	daddr_t mt_density;	/* 현재 효력이 있는 기록 밀도 */
    	daddr_t mt_comp;	/* 현재 효력이 있는 압축법 */
    	daddr_t mt_blksiz0;	/* 모드 0 용 블록 사이즈 */
    	daddr_t mt_blksiz1;	/* 모드 1 용 블록 사이즈 */
    	daddr_t mt_blksiz2;	/* 모드 2 용 블록 사이즈 */
    	daddr_t mt_blksiz3;     /* 모드 3 용 블록 사이즈 */
    	daddr_t mt_density0;	/* 모드 0 용 기록 밀도 */
    	daddr_t mt_density1;	/* 모드 1 용 기록 밀도 */
    	daddr_t mt_density2;	/* 모드 2 용 기록 밀도 */
    	daddr_t mt_density3;    /* 모드 3 용 기록 밀도 */
    /* 이하의 것은, 아직 실장되고 있지 않습니다.  */
    	u_charmt_comp0;		/* 모드 0 용 압축법 */
    	u_charmt_comp1;		/* 모드 1 용 압축법 */
    	u_charmt_comp2;		/* 모드 2 용 압축법 */
    	u_charmt_comp3;		/* 모드 3 용 압축법 */
    /* 미실장 부분 마지막 */
    #endif
    	daddr_tmt_fileno;	/* 현재 위치의 파일 번호 */
    	daddr_tmt_blkno;	/* 현재 위치의 블록 번호 */
    };
    /* MTIOCERRSTAT - 테이프 에러 상태를 취득하는 명령용 구조체 */
    /* 현재는, SCSI 테이프용만 서포트되고 있습니다.  */
    struct scsi_tape_errors {
    	/*
    	 * 조작용으로 SCSI Check Condition 를 써내는 명령의
    	 * 마지막 실행 결과로부터, 이러한 멤버가 보관 유지됩니다.
    	 * MTIOCERRSTAT 를 발행하면(자) 보관 유지되고 있던 멤버가 클리어 됩니다.
    	 */
    	u_int8_t io_sense[32];	/* 데이터 I/O 용의 최종 센스 데이터 */
    	u_int32_t io_resid;	/* 마지막 데이터 I/O 로부터의 나머지 카운터 */
    	u_int8_t io_cdb[16];	/* 최종 센스 데이터를 만든 명령 */
    	u_int8_t ctl_sense[32];	/* 제어 I/O 용의 최종 센스 데이터 */
    	u_int32_t ctl_resid;	/* 마지막 제어 I/O 로부터의 나머지 카운터 */
    	u_int8_t ctl_cdb[16];	/* 최종 제어 센스 데이터를 만든 명령 */
    	/*
    	 * 이것들은, 읽고 쓰기시의 누적 에러 카운터입니다.
    	 * (어떻게 누적 에러 카운터를 리셋트 할까는
    	 * 아직 정해져 있지 않습니다. )
    	 * ( 아직 실장되고 있지 않습니다만, 장소만은 확보되어 있습니다. )
    	 */
    	struct {
    		u_int32_t retries;	/* 실행한 리트라이의 총수 */
    		u_int32_t corrected;	/* 실행한 잘못 정정의 총수 */
    		u_int32_t processed;	/* 잘못 정정의 성공 총수 */
    		u_int32_t failures;	/* 잘못 정정 / 리트라이 실패 총수 */
    		u_int64_t nbytes;	/* 처리한 총바이트수 */
    	} wterr, rderr;
    };
    union mterrstat {
    	struct scsi_tape_errors scsi_errstat;
    	char _reserved_padding[256];
    };
    /*
     * mt_type 바이트용 정수. 이러한 정수는, 리스트 되고 있다
     * 타입과 호환성이 있는 콘트롤러로 동일한 것입니다.
     */
    #defineMT_ISTS		0x01	/* TS-11 */
    #defineMT_ISHT		0x02	/* TM03 매스 버스: TE16, TU45, TU77 */
    #defineMT_ISTM		0x03	/* TM11/TE10 유니버스 */
    #defineMT_ISMT		0x04	/* TM78/TU78 유니버스 */
    #defineMT_ISUT		0x05	/* 유니버스상의 SI TU-45 에뮬레이션 */
    #defineMT_ISCPC		0x06	/* SUN */
    #defineMT_ISAR		0x07	/* SUN */
    #defineMT_ISTMSCP	0x08	/* DEC TMSCP 프로토콜 (TU81, TK50) */
    #define MT_ISCY		0x09	/* CCI Cipher */
    #define MT_ISCT		0x0a	/* HP 1/4 테이프 */
    #define MT_ISFHP	0x0b	/* HP 7980 1/2 테이프 */
    #define MT_ISEXABYTE	0x0c	/* Exabyte */
    #define MT_ISEXA8200	0x0c	/* Exabyte EXB-8200 */
    #define MT_ISEXA8500	0x0d	/* Exabyte EXB-8500 */
    #define MT_ISVIPER1	0x0e	/* Archive Viper-150 */
    #define MT_ISPYTHON	0x0f	/* Archive Python (DAT) */
    #define MT_ISHPDAT	0x10	/* HP 35450A DAT 드라이브 */
    #define MT_ISMFOUR	0x11	/* M4 Data 1/2 9 트럭 드라이브 */
    #define MT_ISTK50	0x12	/* DEC SCSI TK50 */
    #define MT_ISMT02	0x13    /* Emulex MT02 SCSI 테이프 콘트롤러 */
    /* 자기테이프 I/O 제어 명령 */
    #define	MTIOCTOP_IOW('m', 1, struct mtop)	/* 자기테이프를 조작한다 */
    #define	MTIOCGET_IOR('m', 2, struct mtget)	/* 테이프 상태 취득 */
    /* 다음의 2 개의 명령은 어디에서라도 사용되어 있지 않은 것 같습니다.  */
    #define MTIOCIEOT_IO('m', 3)			/* EOT 에러를 무시 */
    #define MTIOCEEOT_IO('m', 4)			/* EOT 에러 유효 */
    /*
     * 32 바이트 type 2 구조를 풀 서포트하는 SCSI-3 SCC (스트림
     * 디바이스)가 좀 더 출현할 경우에는, 이 사양이 대상으로 하는 전엔티티
     * (64 비트의 블록, 논리 파일 레코드 번호등 )(을)를 이러한 ioctl 가
     * 취급할 수 있도록(듯이), 재고할 필요가 있겠지요.
     */
    #define	MTIOCRDSPOS	_IOR('m', 5, u_int32_t) /* 논리 블록 주소를 취득 */
    #define	MTIOCRDHPOS     _IOR('m', 6, u_int32_t) /* 하드웨어 블록 주소를 취득 */
    #define	MTIOCSLOCATE	_IOW('m', 5, u_int32_t) /* 논리 블록 주소를 찾는다 */
    #define	MTIOCHLOCATE	_IOW('m', 6, u_int32_t) /* 하드웨어 블록 주소를 찾는다 */
    #define MTIOCERRSTAT	_IOR('m', 7, union mterrstat) /* 테이프의 에러를 취득 */
    #ifndef KERNEL
    #defineDEFTAPE"/dev/nrsa0"
    #endif
    #ifdefKERNEL
    /*
     * 마이나데바이스 번호
     */
    #define	T_UNIT		003		/* 유니트의 선택 */
    #define	T_NOREWIND	004		/* 권반환을 실시하지 않는다 */
    #define	T_DENSEL	030		/* 기록 밀도의 선택 */
    #define	T_800BPI	000		/* 800 bpi 를 선택 */
    #define	T_1600BPI	010		/* 1600 bpi 를 선택 */
    #define	T_6250BPI	020		/* 6250 bpi 를 선택 */
    #define T_BADBPI	030		/* 미정의치를 선택 */
    #endif
    #endif /* _SYS_MTIO_H_ */

관련 파일
/dev/[nr]sa*

관련 항목
mt(1), tar(1), st(4)

역사
mtio 의 메뉴얼은 4.2BSD 그리고 등장했습니다. i386 버젼은 최초로 FreeBSD 2.2 그리고 등장했습니다.

버그
스테이터스는, 디바이스에 의등 없는 포맷으로 돌려주어지도록(듯이) 해야 합니다.

스페셜 파일의 명명에 대해서는, 좀 더 일관한 만큼 셋집 들이마셔 방법으로 다시 해야 합니다.