O controlador st provê a interface para
vários dispositivos de fita SCSI. Atualmente, o controlador controla
todos os dispositivos detectados do tipo
“acesso-seqüencial”. O controlador st usa o
número de dispositvo principal 9.
Each device uses eight minor device numbers. The lowermost five
bits in the minor numbers are assigned sequentially in the order of
detection. In the 2.6 kernel, the bits above the eight lowermost bits are
concatenated to the five lowermost bits to form the tape number. The minor
numbers can be grouped into two sets of four numbers: the principal
(auto-rewind) minor device numbers, n, and the
“no-rewind” device numbers, (n + 128). Devices opened
using the principal device number will be sent a REWIND command when
they are closed. Devices opened using the “no-rewind” device
number will not. (Note that using an auto-rewind device for positioning the
tape with, for instance, mt does not lead to the desired result: the tape is
rewound after the mt command and the next command starts from the beginning
of the tape).
Em cada grupo, quatro números menores estão
disponíveis para definir dispositivos com características
diferentes (tamanho do bloco, compressão, densidade, etc). Quando o
sistema inicia, apenas o primeiro dispositivo está disponível.
Os outros três são ativados quando as características
padrões são definidas (veja abaixo). (Alterando as constantes
durante a compilação, é possível mudar o
balanço entre o número máximo de unidades de fita e o
número de número de dispositivo secundário para cada
unidade. A alocação padrão permite controlar 32
unidades de fita. Por exemplo, é possível controlar até
64 unidades com dois números secundários para diferentes
opções).
Os dispositivos são tipicamente criados por:
mknod -m 666 /dev/st0 c 9 0
mknod -m 666 /dev/st0l c 9 32
mknod -m 666 /dev/st0m c 9 64
mknod -m 666 /dev/st0a c 9 96
mknod -m 666 /dev/nst0 c 9 128
mknod -m 666 /dev/nst0l c 9 160
mknod -m 666 /dev/nst0m c 9 192
mknod -m 666 /dev/nst0a c 9 224
Não há dispositivos de bloco correspondentes.
The driver uses an internal buffer that has to be large enough to
hold at least one tape block. Before Linux 2.1.121, the buffer is allocated
as one contiguous block. This limits the block size to the largest
contiguous block of memory the kernel allocator can provide. The limit is
currently 128 kB for 32-bit architectures and 256 kB for
64-bit architectures. In newer kernels the driver allocates the buffer in
several parts if necessary. By default, the maximum number of parts is 16.
This means that the maximum block size is very large (2 MB if
allocation of 16 blocks of 128 kB succeeds).
The driver's internal buffer size is determined by a compile-time
constant which can be overridden with a kernel startup option. In addition
to this, the driver tries to allocate a larger temporary buffer at run time
if necessary. However, run-time allocation of large contiguous blocks of
memory may fail and it is advisable not to rely too much on dynamic buffer
allocation before Linux 2.1.121 (this applies also to demand-loading the
driver with kerneld or kmod).
O controlador não suporta especificamente qualquer marca ou
modelo de unidade de fita. Depois que o sistema inicia, as
opções do dispositivo de fita são definidas pelo
firmware da unidade. Por exemplo, se o 'firmware' seleciona o modo de
blocagem fixa, a unidade de fita usará este modo. As
opções podem ser alteradas com chamadas ioctl(2)
explícitas e mantidas em efeito quando o dispositivo é fechado
e reaberto. As opções definidas afetam, tanto os dispositivos
com auto-rebobinamento, quanto os sem rebobinamento.
Opções diferentes podem ser especificadas para
dispositivos diferentes, dentro de um subgrupo de quatro. As
opções fazem efeito quanto o dispositivo é aberto. Por
exemplo, o administrador do sistema pode definir um dispositivo que grava em
blocos fixos com uma certa blocagem e outro que grava em blocos
variáveis (se a unidade suportar ambos os modos).
O controlador suporta partições se a unidade
de fita suportá-las. (As partições em fita não
tem nada ver com as partições em disco. Uma fita particionada
pode ser vista como várias fitas lógicas.) O suporte a
partições tem que ser habilitado com um ioctl(2). A
localização da fita é preservada em cada
partição através das alterações na
partição. A partição usada para
operações subseqüentes, é selecionada com um
ioctl(2). A mudança de partição é
executada junto com a próxima operação para evitar
movimento desnecessário da fita. O número máximo de
partições um uma fita é definido por uma constante
durante a compilação (originalmente quatro). O controlador
contém um ioctl(2) que pode formatar uma fita com uma ou duas
partições.
O dispositivo /dev/tape é geralmente criado como um
vínculo símbólico ou fixo para o dispositivo de fita
padrão no sistema.
Starting from Linux 2.6.2, the driver exports in the sysfs
directory /sys/class/scsi_tape the attached devices and some
parameters assigned to the devices.
O controlador suporta operações nos modos de
blocagem fixa e variável (se suportado pela unidade). No modo de
blocagem fixa a unidade grava blocos de tamanho específico e o
tamanho do bloco não é dependente do contador de bytes
gravados, usado pelas chamadas do sistema. No modo de blocagem
variável, um bloco é gravado para cada chamada de
gravação e o contador de bytes determina o tamanho do bloco.
Observe que os blocos na fita, não contém quaisquer
informações sobre o mode de gravação. Durante a
leitura, o importante é usar comandos que aceitam o tamanho dos
blocos gravados.
In variable-block mode the read byte count does not have to match
the tape block size exactly. If the byte count is larger than the next block
on tape, the driver returns the data and the function returns the actual
block size. If the block size is larger than the byte count, an error is
returned.
In fixed-block mode the read byte counts can be arbitrary if
buffering is enabled, or a multiple of the tape block size if buffering is
disabled. Before Linux 2.1.121 allow writes with arbitrary byte count if
buffering is enabled. In all other cases (before Linux 2.1.121 with
buffering disabled or newer kernel) the write byte count must be a multiple
of the tape block size.
In Linux 2.6, the driver tries to use direct transfers between the
user buffer and the device. If this is not possible, the driver's internal
buffer is used. The reasons for not using direct transfers include improper
alignment of the user buffer (default is 512 bytes but this can be changed
by the HBA driver), one or more pages of the user buffer not reachable by
the SCSI adapter, and so on.
Um marcador de arquivo é automáticamente gravado na
fita se a última operação na fita antes de
fechá-la foi uma gravação.
Quando um marcador de arquivo é encontrado enquanto lendo,
a seguinte é comcluído. Se houver dados no 'buffer' quando um
marcador de arquivo é encontrado, estes dados serão
retornados. A próxima leitura retornará zero bytes. A leitura
seguinte retornará os dados do próximo arquivo. O fim dos
dados gravados é sinalizado pelo retorno de zero bytes durante duas
leituras consecutivas. A terceira leitura retornará um erro.
O controlador suporta três requisitos ioctl(2). Os
requisitos não reconhecidos pelo controlador st são
passados para o controlador SCSI. As definições abaixo
são do /usr/include/linux/mtio.h:
Este requisito leva um argumento do tipo (struct
mtop *). Nem todos as unidades suportam todas as
operações. O controlador retorna um erro EIO se a
unidade rejeitar uma operação.
/* Structure for MTIOCTOP - mag tape op command: */
struct mtop {
short mt_op; /* operations defined below */
int mt_count; /* how many of them */
};
Operações de fita magnéticas para uso
normal:
- MTBSF
- Retrocede espaços sobre mt_count marcadores de
arquivos.
- MTBSFM
- Retrocede espaços sobre mt_count marcadores de arquivos.
Reposiciona a fita no lado EOT último marcador de arquivo.
- MTBSR
- Retrocede espaços sobre mt_count registros (blocos da
fita).
- MTBSS
- Retrocede espaços sobre mt_count setmarks.
- MTCOMPRESSION
- Habilita compressão de dados se mt_count não for zero
e desabilita a compressão se mt_count é zero. Este
comando usa o MODO page 15 suportado pela maioria das fitas DATs.
- MTEOM
- Vai para o final da mídia gravada (para acrescentar arquivos).
- MTERASE
- Erase tape. With Linux 2.6, short erase (mark tape empty) is performed if
the argument is zero. Otherwise, long erase (erase all) is done.
- MTFSF
- Avança mt_count marcadores de arquivos.
- MTFSFM
- Avança mt_count marcadores de arquivos. Reposiciona a fita
no lado BOT do último marcado de arquivo.
- MTFSR
- Avança espaços sobre mt_count registro (blocos da
fita).
- MTFSS
- Avança espaços sobre mt_count setmarks.
- MTLOAD
- Executa o comando load SCSI. Um caso especial está
disponível para alguns carregadores automáticos HP. Se
mt_count é a constante MT_ST_HPLOADER_OFFSET mais um
número, o número é enviando para a unidade controlar
a carga automática.
- MTLOCK
- Bloqueia a porta da unidade de fita.
- MTMKPART
- Format the tape into one or two partitions. If mt_count is
positive, it gives the size of partition 1 and partition 0 contains the
rest of the tape. If mt_count is zero, the tape is formatted into
one partition. From Linux 4.6, a negative mt_count specifies the
size of partition 0 and the rest of the tape contains partition 1. The
physical ordering of partitions depends on the drive. This command is not
allowed for a drive unless the partition support is enabled for the drive
(see MT_ST_CAN_PARTITIONS below).
- MTNOP
- Nenhuma operação—descarrega o 'buffer' do
controlador. Ele pode ser usado antes de ler o estado com
MTIOCGET.
- MTOFFL
- Rebobina a fita e coloca a unidade fora de linha.
- MTRESET
- Reinicia a unidade.
- MTRETEN
- Retensiona a fita.
- MTREW
- Rebobina.
- MTSEEK
- Posiciona no número de bloco especificado em mt_count. Esta
operação requer uma unidade SCSI-2 que suporte o comando
LOCATE (endereço de dispositivo específico) ou uma
unidade Tandberg-compatível SCSI-1 (Tandberg, Archive Viper,
Wangtek, ... ). O número do bloco deverá ser aquele
previamente retornado pelo MTIOCPOS se o endereço
específico do dispositivo foi usado.
- MTSETBLK
- Define o tamanho do bloco para o valor especificado em mt_count. Um
tamanho de zero define o modo de bloco de tamanho variável.
- MTSETDENSITY
- Define a densidade para o código em mt_count. O
código de densidade suportado pela unidade pode ser encontrado na
documentação da unidade.
- MTSETPART
- A partição é alternada para mt_count. As
partições são numeradas a partir de zero. Este
comando não é permitido em uma unidade, a menos que o
suporte a partições esteja habilitado (veja
MT_ST_CAN_PARTITIONS abaixo).
- MTUNLOAD
- Executa o comando SCSI unload (não ejeta a fita).
- MTUNLOCK
- Desbloqueia a porta da unidade de fita.
- MTWEOF
- Grava mt_count marcadores de arquivos.
- MTWSM
- Grava mt_count setmarks.
Operações de Fita Magnética para configurar
opções de dispositivo (superusuário):
- MTSETDRVBUFFER
- Set various drive and driver options according to bits encoded in
mt_count. These consist of the drive's buffering mode, a set of
Boolean driver options, the buffer write threshold, defaults for the block
size and density, and timeouts (only since Linux 2.1). A single operation
can affect only one item in the list below (the Booleans counted as one
item.)
- Um valor zero nos 4 bits de alta órdem será usado para
definir o modo de buferização da unidade de fita. Os modos
de buferização são:
- 0
- A unidade não informará o estado GOOD nos comandos de
gravação até que os blocos de dados sejam gravados na
mídia.
- 1
- A unidade informará o estado GOOD nos comandos de
gravação assim que todos os dados tenham sido transferidos
do 'buffer' interno da unidade.
- 2
- A unidade pode informar o estado GOOD nos comandos de
gravação assim que: (a) os dados foram transferido do
'buffer' interno da unidade e (b) todos os dados em 'buffer's de
inicializadores diferentes foram gravados com sucesso para a
mídia.
- To control the write threshold the value in mt_count must include
the constant MT_ST_WRITE_THRESHOLD bitwise ORed with a block count
in the low 28 bits. The block count refers to 1024-byte blocks, not the
physical block size on the tape. The threshold cannot exceed the driver's
internal buffer size (see DESCRIPTION, above).
- To set and clear the Boolean options the value in mt_count must
include one of the constants MT_ST_BOOLEANS,
MT_ST_SETBOOLEANS, MT_ST_CLEARBOOLEANS, or
MT_ST_DEFBOOLEANS bitwise ORed with whatever combination of the
following options is desired. Using MT_ST_BOOLEANS the options can
be set to the values defined in the corresponding bits. With
MT_ST_SETBOOLEANS the options can be selectively set and with
MT_ST_DEFBOOLEANS selectively cleared.
- As opções padrões para um dispositivo de fita podem
ser definidas com MT_ST_DEFBOOLEANS. Um dispositivo de fita inativo
(i.e., um dispositivo com número menor 32 ou 160) é ativado
quando as opções padrões para ele são
definidas na primeira vez. Um dispositivo ativado herda daquele ativado na
inicialização as opções não definidas
explicitamente.
- As opções Booleanas são:
- MT_ST_BUFFER_WRITES
(Padrão: true)
- Coloca no 'buffer' todas as operações de
gravação usando a blocagem fixa. Se esta opção
é false e a unidade usa um bloco de tamanho fixo, então
todas as operações de gravação devem usar um
múltiplo do tamanho do bloco. Esta opção deve ser
definida como falsa para se obter uma gravação
confiável em sistemas multi-volumes.
- MT_ST_ASYNC_WRITES
(Padrão: true)
- Quando esta opção é verdadejra, a
operação de gravação retorna imediatamente sem
esperar que os dados sejam transferidos para a unidade se os dados
estão ajustados dentro do 'buffer' da unidade. O limite de
gravação determina quando o 'buffer' está cheio mas
depois um novo comando de escrita SCSI é usado. Quaisquer erros
relatados pela unidade serão retidos até a próxima
operação. Esta opção deve ser definida como
falsa para se obter uma gravação confiável em
sistemas multi-volumes.
- MT_ST_READ_AHEAD
(Padrão: true)
- Esta opção faz o controlador prover leitura buferizada e
leitura a frente em blocos fixos. Se esta opção é
false e a unidade usa um tamanho de bloco fixo, todas as
operações de leitura devem ser múltiplos do tamanho
do bloco.
- MT_ST_TWO_FM
(Padrão: false)
- Esta opção modifica as características do controlador
quando um arquivo é fechado. A ação normal é
gravar uma marca de arquivo simples. Se esta opção é
true o controlador gravará duas marcas de arquivo e um caracter de
retrocesso sobre a última marca.
- Nota: Esta opção não pode ser true para unidades de
fita QIC uma vez que elas não podem sobrescrever a marca de
arquivo. Estas unidades detetam o final dos dados gravados testando se a
fita está em branco. A maioria das unidades atuais também
detetam o final dos dados gravados e o uso das duas marcas de arquivo
são necessária apenas quando há intercambio de fita
com outros sistemas.
- MT_ST_DEBUGGING
(Padrão: false)
- Esta opção ativa várias mensagens de
depuração de erros do controlador (só tem efeito se o
controlador foi compilado com DEBUG definido com valor diferente de
zero).
- MT_ST_FAST_EOM
(Padrão: false)
- This option causes the MTEOM operation to be sent directly to the
drive, potentially speeding up the operation but causing the driver to
lose track of the current file number normally returned by the
MTIOCGET request. If MT_ST_FAST_EOM is false, the driver
will respond to an MTEOM request by forward spacing over
files.
- MT_ST_AUTO_LOCK
(Padrão: false)
- When this option is true, the drive door is locked when the device file is
opened and unlocked when it is closed.
- MT_ST_DEF_WRITES
(Padrão: false)
- As opções da fita (tamanho do bloco, modo,
compressão, etc.) pode variar quando muda-se de um dispositivo
vinculado a uma unidade, para outro vinculado a mesma unidade dependendo
de como os dispositivos estão definidos. Esta opção
define quando as mudanças são forçadas pelo
controlador através de comandos SCSI e quando a unidade auto-deteta
que as capacidades são confiáveis. Se esta
opção é false, o controlador envia os comandos SCSI
imediatamente quando o dispositivo é alterado. Se a
opção é true, os comandos SCSI não são
enviados até que uma gravação seja requisitada. Neste
caso o firmware da unidade tem permissão para detetar a estrutura
da fita durante a leitura e os comandos SCSI são usados apenas para
certificar-se que a fita é gravada de acordo com a
especificação correta.
- MT_ST_CAN_BSR
(Padrão: false)
- When read-ahead is used, the tape must sometimes be spaced backward to the
correct position when the device is closed and the SCSI command to space
backward over records is used for this purpose. Some older drives can't
process this command reliably and this option can be used to instruct the
driver not to use the command. The end result is that, with read-ahead and
fixed-block mode, the tape may not be correctly positioned within a file
when the device is closed. With Linux 2.6, the default is true for drives
supporting SCSI-3.
- MT_ST_NO_BLKLIMS
(Padrão: false)
- Algumas unidades não aceitam o comando SCSI READ BLOCK
LIMITS. Se ele é usado, o controlador não usá-o.
A desvantagem é que o controlador não pode checar antes de
enviar os comandos se o tamanho de bloco selecionado é
aceitável pela unidade de fita.
- MT_ST_CAN_PARTITIONS
(Padrão: false)
- Esta opção habilita o suporte a várias
partições em uma fita. Ela aplica-se a todos os dispositivos
vinculados à unidade.
- MT_ST_SCSI2LOGICAL
(Padrão: false)
- Esta opção instrui o controlador a usar o endereço
lógico de bloco definido no padrão SCSI-2 durante as
operações de procura e ( com os comandos MTSEEK e
MTIOCPOS e durante alterações na
partição). Do contrário o endereço
específico do dispositivo é usado. É altamente
recomendável definir esta opção se a unidade suporta
os endereços lógicos, porque eles também contam as
marcas de arquivo. Há algumas unidades que só suportam o
endereçamento lógico de bloco.
- MT_ST_SYSV
(Padrão: false)
- Quando esta opção é habilitada, o dispositivo de fita
usa a semântica do System V. Do contrário a do BSD é
usada. A diferença mais importante entre as semânticas
é o que acontece quando um dispositivo usado para leitura é
fechado: na semântica System V a fita é avançada para
a próxima marca de arquivo se a mesma não foi encontrada
durante a utilização do dispositivo. Na semântica BSD
a posição da fita não se altera.
- MT_ST_NO_BLKLIMS
(Padrão: false)
- Enables immediate mode (i.e., don't wait for the command to finish) for
some commands (e.g., rewind).
An example:
struct mtop mt_cmd;
mt_cmd.mt_op = MTSETDRVBUFFER;
mt_cmd.mt_count = MT_ST_BOOLEANS |
MT_ST_BUFFER_WRITES | MT_ST_ASYNC_WRITES;
ioctl(fd, MTIOCTOP, mt_cmd);
O tamanho padrão do bloco para um dispositivo pode ser
definido com MT_ST_DEF_BLKSIZE e a densidade padrão com
MT_ST_DEFDENSITY. Uma operação OU é executada
entre os valores dos parâmetros e o código da
operação.
With Linux 2.1.x and later, the timeout values can be set with the
subcommand MT_ST_SET_TIMEOUT ORed with the timeout in seconds. The
long timeout (used for rewinds and other commands that may take a long time)
can be set with MT_ST_SET_LONG_TIMEOUT. The kernel defaults are very
long to make sure that a successful command is not timed out with any drive.
Because of this, the driver may seem stuck even if it is only waiting for
the timeout. These commands can be used to set more practical values for a
specific drive. The timeouts set for one device apply for all devices linked
to the same drive.
Starting from Linux 2.4.19 and Linux 2.5.43, the driver supports a
status bit which indicates whether the drive requests cleaning. The method
used by the drive to return cleaning information is set using the
MT_ST_SEL_CLN subcommand. If the value is zero, the cleaning bit is
always zero. If the value is one, the TapeAlert data defined in the SCSI-3
standard is used (not yet implemented). Values 2–17 are reserved. If
the lowest eight bits are >= 18, bits from the extended sense data are
used. The bits 9–16 specify a mask to select the bits to look at and
the bits 17–23 specify the bit pattern to look for. If the bit
pattern is zero, one or more bits under the mask indicate the cleaning
request. If the pattern is nonzero, the pattern must match the masked sense
data byte.
Esta requisição leva um argumento do tipo (struct
mtget *).
/* structure for MTIOCGET - mag tape get status command */
struct mtget {
long mt_type;
long mt_resid;
/* the following registers are device dependent */
long mt_dsreg;
long mt_gstat;
long mt_erreg;
/* The next two fields are not always used */
daddr_t mt_fileno;
daddr_t mt_blkno;
};
- mt_type
- Arquivo cabeçalho define vários valores para mt_type,
mas o controlador atual só informa os tipos genéricos
MT_ISSCSI (Fita SCSI-1 genérica) e MT_ISSCSI (Fita
SCSI-2 genérica).
- mt_resid
- contém o número da partição da fita
atual.
- mt_dsreg
- reports the drive's current settings for block size (in the low 24 bits)
and density (in the high 8 bits). These fields are defined by
MT_ST_BLKSIZE_SHIFT, MT_ST_BLKSIZE_MASK,
MT_ST_DENSITY_SHIFT, and MT_ST_DENSITY_MASK.
- mt_gstat
- dá informações genéricas do estado
(independente do dispositivo). O arquivo cabeçalho define macros
para testar estes bits de estado:
- GMT_EOF(x)
- A fita está posicionada após a marca de arquivo (sempre
false após uma operação MTSEEK).
- GMT_BOT(x)
- A fita está posicionada no inicio do primeiro arquivo (sempre false
após uma operação MTSEEK).
- GMT_EOT(x)
- Uma operação da fita alcançou o final físico
da Fita.
- GMT_SM(x)
- A fita está posicionada na setmark (sempre false após uma
operação MTSEEK).
- GMT_EOD(x)
- A fita está posicionada no final do dado gravado.
- GMT_WR_PROT(x)
- A unidade está protegida contra gravação. Para
algumas unidades isto pode significar que a mesma não suporta
gravação no tipo mídia atual.
- GMT_ONLINE(x)
- O último open(2) encontrou uma fita na unidade e pronta para
operação.
- GMT_D_6250(x)
- GMT_D_1600(x)
- GMT_D_800(x)
- Reporta informações de estado
“genéricas” sobre a densidade atual definida em
9-track enas para unidades de fita de ½".
- GMT_DR_OPEN(x)
- A unidade não contém uma fita.
- GMT_IM_REP_EN(x)
- Modo de Informação Imediata. Este bit é definido se
não há garantias que os foram fisicamente gravados na fita
quando a chamada de gravação retorna. Ele é definido
zero apenas quando o controlador não buferiza os dados e a unidade
está definida para não colocar os dados no 'buffer'.
- GMT_CLN(x)
- The drive has requested cleaning. Implemented since Linux 2.4.19 and Linux
2.5.43.
- mt_erreg
- O único campo definido em mt_erreg é o contador de
erros recuperados, nos 16 bits de baixa órdem (como definido por
MT_ST_SOFTERR_SHIFT e MT_ST_SOFTERR_MASK). Devido a
inconsistências na forma como as unidades informam os erros
recuperados, o contador freqüentemente não é mantido
(a maioria das unidades não informam por padrão erros de
programas, mas isto pode ser alterado com o comando SCSI MODE
SELECT).
- mt_fileno
- Informa o número atual do arquivo (base-zero). Este valor é
-1 quando o número do arquivo é desconhecido (por exemplo,
depois de MTBSS ou MTSEEK).
- mt_blkno
- Informa o número de bloco (base-zero) do arquivo atual. Este valor
é -1 quando o número do bloco é desconhecido (por
exemplo, depois de MTBSF, MTBSS, ou MTSEEK).
This request takes an argument of type (struct
mtpos *) and reports the drive's notion of the current tape block
number, which is not the same as mt_blkno returned by
MTIOCGET. This drive must be a SCSI-2 drive that supports the READ
POSITION command (device-specific address) or a Tandberg-compatible
SCSI-1 drive (Tandberg, Archive Viper, Wangtek, ... ).
/* estrutura para MTIOCPOS - comando para obter a posição da fita */
struct mtpos {
long mt_blkno; /* número do bloco atual */
};