Mostrando postagens com marcador terminal. Mostrar todas as postagens
Mostrando postagens com marcador terminal. Mostrar todas as postagens

sexta-feira, 7 de dezembro de 2012

Consoles virtuais no Linux

Um console virtual, ou terminal virtual, é uma combinação conceitual de um dispositivo de entrada (teclado) e um dispositivo de saída (monitor) para interface usuário-computador. É uma funcionalidade de alguns sistemas operacionais como Unix, BSD e Linux, onde o usuário pode trocar de terminal, abrindo outra interface, estando no mesmo terminal físico.

No Linux, por padrão, os seis primeiros consoles virtuais são para terminais em modo texto e do sétimo console virtual em diante são para terminais em modo gráfico. Quando o usuário inicia o sistema Linux, em modo texto ou modo gráfico, e se loga, ele está conectado ao primeiro console virtual disponível. Mas os outros consoles também estão prontos para serem usados.

Para conectar-se a um outro console, mantenha pressionada a tecla Alt à esquerda enquanto pressiona uma das teclas de função, de F1 à F6. A cada tecla de função, uma nova tela com um prompt de conexão é apresentado. É possível manter-se conectado a vários consoles e ir trocando entre eles.

Para alternar entre os consoles virtuais, no ambiente modo texto usa-se a mesma combinação de teclas Alt + Fn. No ambiente gráfico do X Window usa-se a combinação Ctrl + Alt + Fn. De uma outra forma, a combinação Alt + Seta pra Esquerda alterna para o console virtual anterior e a combinação Alt + Seta pra Direita alterna para o próximo console virtual.

Os consoles ativos são especificados pelo arquivo de configuração '/etc/sysconfig/init'. O comando 'tty' retorna o nome do terminal em que está conectado.

segunda-feira, 26 de abril de 2010

Serviço de Área de Trabalho Remota do Windows

O Serviço de Área de Trabalho Remota (Remote Desktop Services, RDS) do Windows torna possível administrar um servidor remotamente, executando uma aplicação ou uma área de trabalho completa do servidor a partir de um computador cliente, através da rede. Uma vez conectado, o RDS permite controlar com o mouse e teclado o computador remoto, enquanto é mostrado no computador local a tela do ambiente operacional remoto.

Quando uma conexão é estabelecida entre um cliente e um servidor com o Serviço de Área de Trabalho Remota, apenas comandos de mouse e teclado e a tela do ambiente são enviados pela rede. O protocolo utilizado para a comunicação entre um cliente e um servidor com o Serviço de Área de Trabalho Remota é o RDP (Remote Desktop Protocol), comunicando por padrão através da porta TCP 3389.

Este serviço de terminal remoto pode ser executado em dois modos, porém é o Modo de Administração Remota que não requer um licenciamento extra. Neste modo, os administradores poderão gerenciar o servidor a partir de qualquer local. Assim, para que a conexão seja efetuada, a conta de usuário utilizada deverá ser membro do grupo dos Administradores.

No Windows XP e superiores apenas as versões Professional ou superiores possuem o serviço. As versões Home não trazem o RDS. Sua configuração é bastante simples. Vou mostrar simplificadamente os passos para o Windows XP e Windows 7.

No Windows XP basta ir em "Iniciar -> Painel de controle -> Desempenho e manutenção -> Sistema" (ou clique com o botão direito em Meu computador e vá em Propriedades) e na guia "Remoto" marque "Permitir que usuários se conectem remotamente a este computador". Clique no botão "Selecionar usuários remotos", depois em "Adicionar", escreva o nome de algum usuário cadastrado no XP e OK para encerrar, pronto. O usuário selecionado deverá possuir uma senha no sistema, senão não será aceito.

No Windows 7, acesse "Painel de Controle -> Sistema e segurança -> Sistema" (ou clique com o botão direito em Meu computador e vá em Propriedades). Clique, no canto superior esquerdo da tela, em "Configurações remotas" e em "Assistência Remota" clique em "Permitir conexões de Assistência Remota para este computador". Abaixo, em "Área de trabalho remota" escolha, "Permitir conexões de computadores que estejam executando qualquer versão da Área de trabalho remota". Clique no botão "Selecionar usuário" para definir quais usuários do computador e pronto.

Os computadores clientes não necessitam de configuração especial, basta ter o aplicativo cliente para o serviço de terminal. O Windows XP e o Windows 7 já possuem. Vá em "Iniciar -> Todos os Programas -> Acessórios" e clique em "Conexão de Área de Trabalho Remota". Na janela que abrir digite o endereço do computador servidor. Se desejar, clicando no botão "Opções" é possível personalizar a conexão.

No Linux existe o cliente "rdesktop" para o Serviço de Área de Trabalho Remota do Windows, que suporta todas as versões de servidores, incluindo Windows NT Server 4.0, Windows 2000 Server, Windows Server 2003, Windows Server 2008, Windows XP, Windows Vista e Windows 7. Sua linha de comando é como este exemplo: rdesktop -5 -a 16 -g 1024x768 192.168.1.101

Certifique-se de que a máquina que será acessada não tenha um firewall bloqueando o RDS. O Windows 7 costuma reconfigurar o firewall automaticamente na ativação do serviço, já no Windows XP pode ser necessário fazer tal ajuste.

terça-feira, 13 de abril de 2010

Teclado musical para PC speaker

Até o início dos anos 90, os micro-computadores compatíveis com o IBM PC utilizavam o PC speaker para reproduzir músicas polifônicas ou efeitos sonoros. Com a criação das placas de som, capazes de reproduzirem sons complexos independentemente da CPU, o PC speaker ficou com seu uso basicamente no processo de inicialização da máquina ou em terminais em modo texto, para comunicação de códigos de erro, avisos etc.

O PC speaker cria ondas sonoras usando o Intel 8253/8254, um chip Temporizador de Intervalo Programável (Programmable Interval Timer, PIT). O PIT é o mais antigo temporizador usado nos IBM PC compatíveis. É usado para execução de funções de contagem e cronometragem através de um oscilador de cristal de 1,193182 MHz e contém três contadores: o contador 0 é usado pelo sistema operacional para o tempo do sistema; o contador 1 foi usado historicamente para a RAM; e o contador 2 é usado pelo PC speaker. Nos PCs x86 modernos o PIT não está mais incluído em um chip separado, sua funcionalidade está incluída no chipset "southbridge" da placa mãe.

O programa abaixo explora um recurso disponível nos terminais que é a reprodução de "beep" pelo PC speaker. A função ioctl(), da linguagem C, fornece uma interface para a manipulação do terminal e o argumento "KIOCSOUND" desta função gera um som no PC speaker.

O código fonte apresentado a seguir é uma versão bem simplificada e foi baseado no programa Beep (http://www.johnath.com/beep/). Contém apenas o necessário para a reprodução dos sons e com uma interface básica para o usuário. Está adequado para ser compilado no ambiente Linux. Por razões de segurança do sistema, provavelmente somente o root tem permissão de acesso ao dispositivo "/dev/sonsole", sendo assim, um usuário comum não conseguirá reproduzir som, a não ser que faça algumas alterações no ambiente. Segue o código:

/*
  Teclado musical para o speaker interno, em ambiente Linux.
  Compilar com o camando: gcc teclado-musical.c -o teclado-musical
*/

#include <fcntl.h>       /* O_WRONLY */
#include <stdio.h>       /* fprintf, stderr, printf */
#include <stdlib.h>      /* exit */
#include <unistd.h>      /* STDIN_FILENO */
#include <linux/kd.h>    /* KIOCSOUND */
#include <termios.h>     /* ICANON, ECHO, TCSANOW */

#define CLOCK_TICK_RATE 1193182  /* Frequência do oscilador do chip i8254
da placa mãe, em Hz */
#define DURACAO_PADRAO  200  /* Em milisegundos */

#define DO  262  /* Frequências das notas */
#define RE  294
#define MI  330
#define FA  349
#define SOL 392
#define LA  440
#define SI  494

#define ESC 27  /* Valor decimal ASCII da tecla de saída do programa */

char meugetch() {  /* Função que substitui o getchar() para não emitir echo
na tela e ser necessário o <enter> */
  
  struct termios tant, tnovo; /* Cria as variáveis com a estrutura termios */
  
  char ch;
  
  tcgetattr( STDIN_FILENO, &tant );  /* Backup dos atributos do terminal
  atual */
  tnovo = tant;  /* Cópia dos atributos atuais para um novo terminal */
  tnovo.c_lflag &= ~( ICANON | ECHO );  /* Desativa caracteres especiais
  e o echo no modo local */
  tcsetattr( STDIN_FILENO, TCSANOW, &tnovo );  /* Usa imediatamente os
  novos atributos */
  ch = getchar();  /* Lê um caractere do teclado */
  tcsetattr( STDIN_FILENO, TCSANOW, &tant );  /* Usa de volta os
  atributos anteriores */
  
  return ch;
}

void toca_nota(int freq, int duracao) {  /* Reproduz o som no console */

  int console_fd;  /* Se a variável receber -1 significa que o arquivo não
  pode ser aberto */

  if((console_fd = open("/dev/console", O_WRONLY)) == -1) {  /* Abre o
    console para somente escrita e checa se não houve erro */
    fprintf(stderr, "Impossivel abrir /dev/console para escrita.\n");
    /* Imprime na saída de erro */
    perror("open");  /* Imprime a mensagem de erro na saída de erro
    padrão */
    exit(1);  /* Saída com erro */
  }

  if(ioctl(console_fd, KIOCSOUND, (int)(CLOCK_TICK_RATE/freq)) < 0) {
    /* Gera o som no console */
    perror("ioctl");  /* Imprime a mensagem de erro na saída de erro
    padrão */
  }
  
  usleep(1000*duracao);  /* Tempo de espera para a duração do som */
  ioctl(console_fd, KIOCSOUND, 0);  /* Encerra o som */
  close(console_fd);  /* Fecha o uso da escrita no console */

}

int main() {
  
  char tecla;

  printf("Digite teclas zxcvbnm para notas\nou ESC para sair\n");
  do{
    tecla = meugetch();
    switch(tecla){
      case 'z':
         toca_nota(DO,DURACAO_PADRAO);
         break;
      case 'x':
         toca_nota(RE,DURACAO_PADRAO);
         break;
      case 'c':
         toca_nota(MI,DURACAO_PADRAO);
         break;
      case 'v':
         toca_nota(FA,DURACAO_PADRAO);
         break;
      case 'b':
         toca_nota(SOL,DURACAO_PADRAO);
         break;
      case 'n':
         toca_nota(LA,DURACAO_PADRAO);
         break;
      case 'm':
         toca_nota(SI,DURACAO_PADRAO);
         break;
    }
  }while(tecla != ESC);
  
  return 0;
}

A função meugetch() não é necessária para a reprodução de som pelo PC speaker, o que ela faz é tratar a entrada pelo teclado para que não seja necessário pressionar a tecla Enter em cada nota. Caso prefira, com a biblioteca ncurses também é possível aprimorar esta entrada pelo teclado.

sábado, 6 de junho de 2009

Gravando um DVD de dados em terminal de texto no Linux

Os aplicativos em modo texto para gravação de CD e DVD no Linux são uma forma muito eficiente de ter seus dados copiados para estes tipos de mídia. São ferramentas que proporcionam um controle total no processo e permitem a escolha de qualquer parâmetro de gravação.

Antes de qualquer gravação é necessária a organização dos arquivos que serão copiados. Uma maneira segura é juntá-los dentro de um diretório, assim tudo o que estiver lá dentro não será esquecido. Uma solução ainda mais eficiente é a geração de uma imagem de DVD, na qual pode-se testar se tudo está como deseja antes de queimar uma mídia.

Para a geração de uma imagem existe uma ferramenta chamada "genisoimage", do pacote de mesmo nome, capaz de criar sistemas de arquivos híbridos com ISO9660/Joliet/HFS e opcionalmente com atributo Rock Ridge. Esta ferramenta possui uma vasta variedade de parâmetros, bem documentada em sua página manual, e permite obter qualquer sistema que desejar. Segue um exemplo de uma linha de comando com os parâmetros comentados:

genisoimage -r -J -joliet-long -iso-level 4 -l -V nome -o imagem.iso diretório/

-r: Adiciona a extensão Rock Ridge para o sistema de arquivos e setando os arquivos e diretórios com permissões e modos em valores mais proveitosos, como dono e grupo setados em zero, permissão de escrita removida etc. Reconhecido no Linux apenas.

-J: Adiciona a extensão Joliet para o sistema de arquivos, permitindo nomes com até 64 caracteres.

-joliet-long: Permite nomes de arquivos Joliet com até 103 caracteres.

-iso-level: Especifica o nível do ISO9660, de 1 a 4, que vai do modo mais compatível, com nomes de no máximo 8.3 caracteres, ao mais relaxado, o nível 4, usando o padrão ISO-9660:1999, onde os nomes dos arquivos podem ter até 207 caracteres e não há mais o limite de 8 níveis para os subdiretórios.

-l: Permite 31 caracteres para o nome dos arquivos, relaxando as restrições do padrão ISO9660.

-V: Especifica um nome para o volume, de até 32 caracteres.

-o: Especifica o arquivo de saída para a imagem gerada.

Neste exemplo será gerado o arquivo "imagem.iso" contendo tudo que estiver dentro do "diretório/", excluindo o próprio, ou seja, na raiz do sistema de arquivo gerado ficarão os arquivos e subdiretórios existentes dentro do diretório especificado.

Uma outra forma de gerar uma imagem é em um processo de cópia de um DVD, onde utiliza-se a ferramenta "dd", do pacote "coreutils", para copiar o conteúdo da mídia e gerar a imagem. Segue um exemplo:

dd if=/dev/dvd of=imagem.iso

Este comando simplesmente faz uma cópia idêntica do sistema de arquivo do DVD para a imagem especificada.

Antes de gravar a imagem em uma mídia vazia convém testar se os arquivos foram copiados corretamente para a imagem, utilizando o comando "mount" como no exemplo abaixo:

mount -o loop -t iso9660 imagem.iso /mnt/iso/

Todo o sistema de arquivo contido na imagem será aberto em modo somente leitura no diretório "/mnt/iso/". Se os arquivos não estiverem corrompidos, tudo estará certo. O comando "umount /mnt/iso/" fechará esta montagem.

Arquivo imagem correto, tudo pronto para gravar na mídia. Um programa muito bom para isso é o "growisofs" do pacote "dvd+rw-tools". Este programa suporta todos os tipos de mídias DVD inclusive mídias Blu-ray.

Para que este comando funcione é necessário saber o nome do dispositivo do gravador, usando o comando abaixo:

wodim --devices

Como retorno aparece uma informação semelhante a que está abaixo:

wodim: Overview of accessible drives (2 found) :
----------------------------------------------------------------
0 dev='/dev/scd0' rwrw-- : 'HL-DT-ST' 'DVD-RAM GSA-H50N'
1 dev='/dev/scd1' rwrw-- : 'HL-DT-ST' 'DVD-ROM GDR8163B'
----------------------------------------------------------------

Neste exemplo percebe-se que o gravador é o dispositivo "/dev/scd0". Então um exemplo de linha de comando para o growisofs fica assim:

growisofs -dvd-compat -speed=4 -Z /dev/scd0=imagem.iso

-dvd-compat: Proporciona o máximo de compatibilidade com o resultado da mídia DVD, necessário para filmes e em DVD de dados faz com que a sessão fique fechada.

-speed: Determina a velocidade de gravação, em x.

-Z: Especifica o dispositivo do gravador, que por sua vez recebe o nome do arquivo da imagem.

Como podem perceber, são comandos simples que fazem muito. Consultem as páginas manuais destas ferramentas e vejam o quanto elas são capazes de fazer.