domingo, 31 de agosto de 2014

mtime, ctime, and atime (Perderabo, 31/07/2005)

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1




Jaboatão dos Guararapes, PE, 31 de agosto de 2014.

Tradução livre para a lingua portuguesa de texto postado por Perderabo (em 31/07/2005 - http://www.unix.com/tips-and-tutorials/20526-mtime-ctime-atime.html)



mtime, ctime, and atime (Perderabo, 31/07/2005)

O Unix mantém 3 marcas temporais para cada arquivo: mtime, ctime, e atime.   A maioria das pessoas parece entender atime (access time), é quando o arquivo foi lido pela última vez.   Parece existir alguma confusão entre mtime e ctime, no entanto.   ctime é a hora de mudança do inode, enquanto que mtime é a hora de modificação do arquivo.   "Mudança" e "modificação" são praticamente sinônimos.   Não existe dica a saber ao se ponderar tais palavras.   Ao invés disso, você precisa focar no que está sendo mudado.   mtime muda quando você escreve no arquivo.   Ele é a idade dos dados dentro do arquivo.   Sempre que mtime muda, muda também ctime.   Mas, ctime muda umas poucas vezes mais.   Por exemplo, ele mudará se você mudar o proprietário ou as permissões sobre o arquivo.

Vamos dar uma olhada em um exemplo concreto.   Nós executamos um pacote chamado Samba que permite acessos a arquivos de PC.   Para mudar a configuração do Samba, eu simplesmente edito um arquivo chamado smb.conf.   (Isso muda mtime e ctime).   Eu não preciso adotar qualquer outra ação para instruir o Samba que eu mudei aquele arquivo.   De vez em quando Samba examina o mtime no arquivo.   Se o mtime mudou, Samba re-lê o arquivo.   Mais tarde naquela noite nosso sistema de cópia de segurança executa.   Ele utiliza ctime, o qual também mudou, de forma que ele produz uma cópia de segurança do arquivo.   Porém, digamos que alguns dias depois eu perceba que as permissões de smb.conf são 666.   Isso não é bom... qualquer pessoa pode editar o arquivo.   Então eu faço um "chmod 644 smb.conf".   Isso muda apenas ctime.   O Samba não relerá o arquivo.   Entretanto, mais tarde naquela noite, nosso aplicativo de cópia de segurança percebe que ctime tem mudanças, então ele produz uma cópia de segurança do arquivo.   Dessa maneira, se nós perdermos o sistema e necessitarmos recarregar nossas cópias de segurança, nós obtemos a nova configuração de permissão melhorada.

Aqui está um segundo exemplo.   Digamos que você tenha um arquivo de dados chamado employees.txt o qual é uma lista de empregados.   E você tem um aplicativo para imprimi-lo.   O aplicativo não apenas imprime os dados, mas ele obtém o mtime e o imprime também.   Agora alguém solicitou uma lista de empregados do final do ano 2000 e você encontrou uma fita magnética de cópia de segurança que tem aquele arquivo.   Muitos aplicativos de restauração restaurarão o mtime também.   Quando você executar aquele aplicativo, ele imprimirá um mtime do final do ano 2000.   Porém o ctime é hoje.   Então, outra vez, nosso aplicativo de cópia de segurança verá o arquivo como necessário de ser copiado.

Suponha que o seu aplicativo de restauração não restaurou o mtime.   Você não quer que o seu aplicativo imprima a data de hoje.   Bem, sem problema.   mtime está sob seu controle.   Você pode configurá-lo para o que você quiser.   Então, simplesmente faça:

$ touch -t 200012311800 employees.txt


Isso configurará o mtime de volta à data que você quer e ele configura ctime para agora.   Você tem controle completo sobre mtime, porém o sistema permanece no controle do ctime.   Então, mtime é um pouco como a data em uma carta, enquanto que ctime é como o carimbo de postagem no envelope.

Disponível em: <http://www.unix.com/tips-and-tutorials/20526-mtime-ctime-atime.html>. Acesso em: 31 ago. 2014.



Jamenson Ferreira Espindula de Almeida Melo
Linux user nº 166197
https://linuxcounter.net/cert/166197.png

Impressão digital da chave:
234D 1914 4224 7C53 BD13  6855 2AE0 25C0 08A8 6180


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)

iQEcBAEBAgAGBQJUAqjzAAoJECrgJcAIqGGAwJ8H/1JFDWVd+Ix1jRVbCvhF+LkD
U6ee/QhR3yqHD4PsYiCrjWZzdOpC5ZQXYwAFaAhAwdIDJuyOsaZn57w5u1u/Hgkf
aBXljT1Bk6UKBkpVY0NiEwWABl2xjtBPuSLVTi0ml1g/UoraOIYPhUQTU4hlvvg7
ogmrTOyeFvDoPV7kxK90enNNtcZmHGiCwYdQQnZCSQHjBQvbDKYgOgZRwpBS7yne
Ol1NNdhw7dRlrdtvbO7skmC297T4Gt8Pc0UkV2utRJQigDbWh/pYNgWBpADZ1P+G
MnqCDNqA9ZDFxIdbO6JnRjO8ygbsSdzdnZ4stCs//MsVdJ+dFhPDV3KAMSpH0F8=
=1+7B
-----END PGP SIGNATURE-----

segunda-feira, 25 de agosto de 2014

Teclado Zmax (Vendor 0x4d9 Product 0x1702) desconfigurado dentro do ambiente do Servidor X

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1



Jaboatão dos Guararapes, PE, 25 de agosto de 2014.

Assunto: Teclado Zmax (Vendor 0x4d9 Product 0x1702) desconfigurado dentro do ambiente do Servidor X.


__________________________


Configuração correta [no arquivo /etc/X11/xorg.conf.d/90-zmax-keyboard.conf]:

Section "InputClass"
    Identifier      "teclado Zmax"
    MatchIsKeyboard "on"
   
    Option        "XkbRules"    "xorg"
    Option          "XkbModel"      "abnt2"
    Option          "XkbLayout"     "br"
    Option        "XkbVariant"    "abnt2"
EndSection


________________________________

Saída do comando "cat /var/log/Xorg.0.log | egrep 40[3,4]":

[ 11408.403] (II) config/udev: Adding input device SIGMACHIP Usb Mouse (/dev/input/mouse0)
[ 11408.403] (II) No input driver specified, ignoring this device.
[ 11408.403] (II) This device may have been added with another device file.
[ 11408.403] (II) config/udev: Adding input device   USB Keyboard (/dev/input/event6)
[ 11408.403] (**)   USB Keyboard: Applying InputClass "evdev keyboard catchall"
[ 11408.403] (**)   USB Keyboard: Applying InputClass "teclado Zmax"
[ 11408.403] (II) Using input driver 'evdev' for '  USB Keyboard'
[ 11408.403] (**)   USB Keyboard: always reports core events
[ 11408.403] (**) evdev:   USB Keyboard: Device: "/dev/input/event6"
[ 11408.403] (--) evdev:   USB Keyboard: Vendor 0x4d9 Product 0x1702
[ 11408.403] (--) evdev:   USB Keyboard: Found keys
[ 11408.403] (II) evdev:   USB Keyboard: Configuring as keyboard
[ 11408.403] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/input/input9/event6"
[ 11408.403] (II) XINPUT: Adding extended input device "  USB Keyboard" (type: KEYBOARD, id 11)
[ 11408.403] (**) Option "xkb_rules" "evdev"
[ 11408.404] (**) Option "xkb_model" "abnt2"
[ 11408.404] (**) Option "xkb_layout" "br"
[ 11408.404] (**) Option "xkb_variant" "abnt2"
[ 11408.404] (II) config/udev: Adding input device   USB Keyboard (/dev/input/event7)
[ 11408.404] (**)   USB Keyboard: Applying InputClass "evdev keyboard catchall"
[ 11408.404] (**)   USB Keyboard: Applying InputClass "teclado Zmax"
[ 11408.404] (II) Using input driver 'evdev' for '  USB Keyboard'
[ 11408.404] (**)   USB Keyboard: always reports core events
[ 11408.404] (**) evdev:   USB Keyboard: Device: "/dev/input/event7"
[ 11408.404] (--) evdev:   USB Keyboard: Vendor 0x4d9 Product 0x1702
[ 11408.404] (--) evdev:   USB Keyboard: Found keys
[ 11408.404] (II) evdev:   USB Keyboard: Configuring as keyboard
[ 11408.404] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.1/input/input10/event7"
[ 11408.404] (II) XINPUT: Adding extended input device "  USB Keyboard" (type: KEYBOARD, id 12)

________________________________

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQEcBAEBAgAGBQJT+seBAAoJECrgJcAIqGGAhG8H/06XgYsLdPbwGdezK3ofsJV6
WbhfqY0Qh/NC4xSB6UT51h649iwppMBZ2poGGRgGWAsBFC/X9l2Lti8IcOQlkPt1
6pTsJEAjv4YBhrHL46duGXVpkHrSTXTG8COg8GH7xSvBQwNsGO9qn+HqFXXGtIjo
fdu+D6dXqizhS7lFz568+VJorCH752JuHPqc+5YB/3PDSeTEHrOCVpE+JllBQMWe
YrjHqYxVWycAHd4YjwXCqL9PEaR6DS/4jcf4qErno2Y0grMx/yLQhCx9MmdrxjWK
ZsirjLJ1/lvzO/fHUpbAwZ6PnerC2mV07naIsYB1uOO968EuV3t8gsOjYBGLeXM=
=Wo56
-----END PGP SIGNATURE-----

quinta-feira, 21 de agosto de 2014

Console no GNU/Linux


Jaboatão dos Guararapes, PE, 21 de agosto de 2014.

Eis uma tradução livre para a língua portuguesa (português brasileiro) do documento intitulado "console.txt", de autoria de Antonino Daplas.   Esse documento está armazenado sob o diretório "Documentation/console" (linux/Documentation/console/).

Console Drivers
==========

O kernel do linux tem 2 tipos gerais de drivers de console.  O
primeiro tipo é atribuído pelo kernel a todos os consoles virtuais
durante o processo de inicialização.   Esse tipo será chamado 'driver
de sistema', e é permitido existir apenas um driver de sistema.  O
driver de sistema é do tipo persistente e nunca pode ser descarregado,
apesar de eventualmente poder se tornar inativo.

O segundo tipo deve ser explicitamente carregado e descarregado.  Esse
será chamado de 'driver modular' por este documento.  Múltiplos drivers
modulares podem coexistir a qualquer tempo, cada qual compartilhando o
console com outros drivers, incluindo o driver de sistema.  Entretanto,
drivers modulares não podem apossar-se de console que esteja atualmente
ocupado por algum outro driver modular.  (Exceção: Drivers que chamarem
do_take_over_console() terão sucesso no apossamento independentemente do tipo do driver ocupando os consoles).  Eles apenas podem apossar-se de
console que esteja ocupado por driver de sistema.   Dentro do mesmo
símbolo, se o driver modular estiver liberado pelo console, o driver de
sistema se apossará.

Drivers modulares, do ponto de vista do desenvolvedor, tem de chamar:

     do_take_over_console() - carrega e vincula o driver à camada de console
   
     give_up_console() - descarrega driver, funcionará apenas se o
     driver for desvinculado completamente

Em kernels mais novos, as seguintes também estão disponíveis:

     do_register_con_driver()
     do_unregister_con_driver()

Se sysfs estiver habilitado, o conteúdo de /sys/class/vtconsole pode ser
examinado.   Isso mostra as infra-estruturas do console atualmente registrado pelo sistema, os quais são chamados vtcon<n>, onde <n> é um número inteiro de 0 até 15.   Assim:

       ls /sys/class/vtconsole
       .  ..  vtcon0  vtcon1

Cada diretório em /sys/class/vtconsole tem 3 arquivos:

     ls /sys/class/vtconsole/vtcon0
     .  ..  bind  name  uevent

O que esses arquivos significam?

     1. bind - este é um arquivo leitura/escrita. Ele mostra o estado
     do driver se leitura, ou atua para vincular ou desvincular o
     driver aos consoles virtuais quando escritos. Os valores
     possíveis são:

    0 - significa que o driver não está vinculado e se echo'ed,
    ordena a desvinculação do driver

        1 - significa que o driver está vinculado e se echo'ed, ordena a
        vinculação do driver

     2. name - arquivo somente-leitura.  Mostra o nome do driver neste
     formato:

    cat /sys/class/vtconsole/vtcon0/name
    (S) VGA+

        '(S)' significa driver de (S)istema, isto é, não pode ser
        diretamente comandado para vincular ou desvincular

        'VGA+' é o nome do driver

    cat /sys/class/vtconsole/vtcon1/name
    (M) frame buffer device

        Nesse caso, '(M)' significa um driver (M)odular, um que pode
        ser diretamente comandado para vincular ou desvincular.

     3. uevent - ignore este arquivo

Quando do desvinculamento, o driver modular primeiro é isolado, e então
o driver de sistema se apossa do console vago pelo driver. 
Vinculamento, por outro lado, vinculará o driver aos consoles que estão
atualmente ocupados por um driver de sistema.

NOTA1: Vinculamento e desvinculamento devem ser selecionados em Kconfig.  Isso é feito sob:

Device Drivers -> Character devices -> Support for binding and unbinding
console drivers

NOTA2: Se quaisquer dos consoles virtuais estiverem no modo KD_GRAPHICS, então o vinculamento e desvinculamento não ocorrerá.  Um exemplo de uma aplicação que configura o console para KD_GRAPHICS é o servidor X.

O quão útil é esta característica?  Isto é bastante útil para
desenvolvedores de drivers de console.  Desvinculando o driver da camada
de console, uma pessoa pode descarregar o driver, produzir mudanças,
recompilar, recarregar e revincular o driver sem qualquer necessidade de
reinicializar o kernel.   Para usuários comuns que desejarem alternar do
console framebuffer para o console VGA e vice versa, esta característica
também torna isso possível. (NOTA NOTA NOTA: Por favor, leia fbcon.txt
sob Documentation/fb para mais detalhes).

Notas para desenvolvedores:
==========================

do_take_over_console() está atualmente quebrado em:

     do_register_con_driver()
     do_bind_con_driver() - função privada

give_up_console() é uma embalagem para do_unregister_con_driver(), e um
driver deve ser completamente desvinculado para essa chamada ter
sucesso.  con_is_bound() verificará se o driver está vinculado ou
não.

Orientações para escritores de drivers de console:
=================================================

Para que o vinculamento e desvinculamento de um console funcione
adequadamente, drivers de console devem seguir estas orientações:

1. Todos os drivers, exceto drivers de sistema, devem chamar ou
do_register_con_driver() ou do_take_over_console().  
do_register_con_driver() apenas adicionará o driver à lista interna do
console.   Ela não se apossa do console.   do_take_over_console(), como
o nome implica, apenas se apossará (ou vínculo a) do console.

2. Todos os recursos alocados durante con->con_init() devem ser
liberados em con->con_deinit().

3. Todos os recursos alocados em con->con_startup() devem ser liberados
quando o driver, que foi previamente vinculado, se tornar desvinculado. 
A camada de console não tem uma chamada complementar a con->con_startup(), de forma que compete completamente ao driver verificar quando for lícito liberar tais recursos.   A chamada con_is_bound() em con->con_deinit() ajudará.   Se a chamada retornou false(), então é seguro liberar os recursos.   Tal balanço tem de ser feito pois con->con_startup() pode ser chamado novamente quando uma requisição para revincular o driver ao console chegar.

4. Quando da saída do driver, assegure-se de que o driver esteja
totalmente desvinculado.   Se a condição estiver satisfeita, então o
driver deve chamar do_unregister_con_driver() ou give_up_console().

5. do_unregister_con_driver() também pode ser chamado em condições que
tornem impossível para o driver atender a requisições do console.  Isso
pode acontecer com o console framebuffer que repentinamente perca todos
os seus drivers.

A safra atual de drivers de console ainda deveria funcionar corretamente,
porém o vinculamento e desvinculamento deles podem causar problemas. 
Com ajustes mínimos, esses drivers podem funcionar corretamente.

==========================
Antonino Daplas <adaplas@pol.net>