Dor de cabeça

Anteontem formatei o laptop e instalei o slamd64. Por ordem de prioridade, lá vão os problemas…

Problema 1: placa ATI Radeon Xpress 1100. O “ati” do Xorg não suporta. Eu não consigo instalar os drivers proprietários. Baixei lá do site da ATI e rodei normalmente o arquivo e ele não abre o instalador gráfico que deveria abrir:

root@laptop:~# ./ati-driver-installer-8.32.5-x86.x86_64.run
Creating directory fglrx-install
Verifying archive integrity... All good.
Uncompressing ATI Proprietary Linux Driver-8.32.5..............................
==================================================
 ATI Technologies Linux Driver Installer/Packager
==================================================
Detected configuration:
Architecture: x86_64 (64-bit)
X Server: X.Org 6.9.x 64-bit
Removing temporary directory: fglrx-install
root@laptop:~#

(e, sim, não estou em root por su, o que poderia fazer eu não ter um DISPLAY, mas entrei no X como root mesmo)

Essa série 1100 parece ser nova porque há pouca informação sobre ela na internet. Alguém sabe ajudar?

Sem configurar a placa, não consegui usar 1280×800, aí tudo está “gordo” e desfigurado, porque estou usando 1024×768 num monitor widescreen (driver vesa).

Problema 2: 64 bits. Firefox com Flash, codecs proprietários do mplayer, Java. Achei que fosse mais fácil… O hlegius fez um comentário bem pessimista lá no outro post… E ele tem razão. Estou com o live-cd do Gentoo amd64 baixado esperando um CD virgem pra gravar (devo comprar hoje a tarde), todo mundo fala bem do Gentoo pra 64bits. Ainda tô baixando também o Ubuntu pra 64bits pra ver como é que é…

Eu não sei como se faz pra emular um subsistema de 32bits pra rodar Flash por exemplo. Depois também vou precisar de ajuda… mas a prioridade agora é o monitor mesmo.

Problema 3: Resto do hardware. Gravador de DVD, webcam, wireless. Nunca useu nenhum dos três. Vai ser uma experiência nova super divertida, com mais dor de cabeça ainda.

Problema 4: Teclado. Depois tenho que dar uma olhada no Xmodmap (acho que é isso que eu tenho que usar) pra fazer o ponto de interrogação (Altgr+W) funcionar.

Problema 5: O som hdaudio funciona, mas dá um monte de erro quando o udev detecta e inicia o alsa. Depois tenho que verificar…

Conclusão: Pelo visto esse mês (no mínimo) vai ser só dor de cabeça. Mas o aprendizado com certeza vai ser grande. ;) Quem já tiver passado por esses problemas e quiser me ajudar nessa aventura será muito bem recompensado (por Deus ou algum cara assim que você acreditar, porque meu dinheiro acabou na compra desse laptop… hehehe).

I’ve got the power!

Pequeno post feito a 64 bits

Acer Aspire 5050-3205 comprado por 2500 reais num camelódromo de Balneário. Posto melhor sobre ele quando acabar de baixar, instalar e configurar o slamd64, que aí vou conhecê-lo melhor. Primeira impressão: lindo, portátil, a webcam é muito legal!

Veio com um Windows XP que estou pra tirar; no mais, tudo parece funcionar perfeitamente. Só não gostei do layout do teclado que é, em uma palavra, ridículo. Para usar o ponto de interrogação é necessário pressionar AltGr+W e a barra é AltGr+Q ou Fn+; (não sei qual é pior).

Inédito! Fotos do recém-nascido!

Teoria da conspiração (ou: Hail Eris!)

Conheci o discordianismo semana retrasada, quando vi uma comunidade no orkut chamada 23 e perguntei ao Schneider do que se tratava. Para me responder, ele sugeriu que eu escrevesse ddate no meu Slackware… E não é que eu tinha mesmo esse aplicativo discordiano?

tiago@laptop:~$ ddate
Today is Sweetmorn, the 49th day of The Aftermath in the YOLD 3172

Depois daquele dia, em todo lugar que eu passo eu vejo uma referência discordiana escondida! Parece que temos muito discordianos entre nós e eles parecem estar tomando conta de tudo, para em breve tomar o poder. Será que eu fui o único a perceber a conspiração? Se era secreto, não duvido que este post suma em algum tempo, porque a Dreamhost também deve ter discordianos!

Mas vejam só… Hoje eu descobri que o Rafael e o Cardoso lêem o 1001 gatos! O Patrick (do Slackware) também deve estar envolvido (pô, o foco da distribuição é simplicidade e ele coloca um aplicativo discordiano nela?). Agora pessoas próximas também começam a se envolver. Acho que vou ler o Principia Discordia pra entrar nessa nova religião agora no início e não ser eliminado depois como o resto do mundo.

udev e suas regras maravilhosas

Participei nos dias 8 e 9 do IV Encontro Nacional Linuxchix Brasil em Florianópolis. O evento teve umas palestras interessantes, entre as quais destaco as do pessoal do FreeBSD, a do Luiz Fernando Capitulino sobre o desenvolvimento do Kernel, a do Hélio Castro sobre interfaces gráficas 3D, mas em especial a do Piter PUNK sobre o udev (talvez porque eu sou um usuário Slackware =). E é sobre o udev que eu resolvi falar nesse artigo…


Tenho até vergonha de dizer que até semana passada eu não tinha percebido que o hotplug não estava mais sendo inicializado no meu Slackware… Só depois da palestra que aprendi que o Kernel 2.6 acaba com a necessidade do hotplug substituindo por um novo e poderoso aplicativo chamado udev. Isso é uma mudança e tanto, que traz alguns prós e contras (na verdade, eu só vi prós).

O que é o udev?

Bom… Segundo a Wikipedia, udev is the device manager for the Linux 2.6 kernel series. Its primary function is managing device nodes in /dev. It is the successor of devfs and hotplug, which means that it handles the /dev directory and all user space actions when adding/removing devices, including firmware load.

Como funciona o udev

Na inicialização do sistema, o udev vê no /sys que dispositivos foram encontrados pelo Kernel e adiciona os dispositivos ao /dev (por enquanto, vou fingir que ele só adiciona os dispositivos ao /dev).

Depois, seu daemon fica rodando para adicionar novos dispositivos assim que eles aparecerem.

É bem mais rápido que no hotplug e parece funcionar bem.

E onde está a mágica?

O udev possue um diretório de regras (/etc/udev/rules.d) onde adicionamos arquivos de texto com uma sintaxe super fácil para dizer o que queremos fazer com cada dispositivo que é adicionado ao sistema.

E o que queremos fazer com cada dispositivo que é adicionado ao sistema?

Hmmm… Isso depende muito da sua necessidade, mas deixe-me citar algumas possibilidades das regras do udev:

  • Dar nome aos dispositivos – Pra que uma pasta /dev cheia de nomes difíceis que você não entende? Com o udev, você pode chamar seu sda1 de pendrive ou o seu hdc de cdrom.
  • Dar nomes diferentes para dispositivos iguais – Hoje em dia vivemos pluggando pendrives, máquinas digitais, MP3 players, etc. em nossas placas USB. Com o udev, podemos fazer com que a nossa máquina da Canon chame-se /dev/canon, a nossa máquina da Sony chame-se /dev/sony, o pendrive da mamãe chame-se /dev/mamae e o nosso MP3 Player chame-se /dev/mp3player.
  • Adicionar links simbólicos aos dispositivos – Podemos fazer nosso CD-ROM ter vários links como cdrom, dvd, cdrw, cdwriter
  • Mudar permissões dos dispositivos – Podemos fazer com que o pendrive da mamãe possa, logo que for pluggado em qualquer porta USB, ser acessado por ela (e somente por ela).
  • Executar comandos quando ocorrem alterações nos dispositivos – Sempre que a mamãe colocar o seu pendrive numa porta USB podemos montá-lo para ela e já abrir o dispositivo no Konqueror e quando ela pluggar a sua máquina digital da Canon podemos mudar suas permissões, linká-la para /dev/camera e abrir o digiKam.
  • … entre provavelmente muitas outras coisas que eu não me lembro ou não sei fazer (eu só conheço o udev há quatro dias!)

Claro que o udev pode ser útil para servidores também, para trocar hardware ou reiniciar o computador com segurança (ex.: você pode dizer que o HD principal seja sempre /dev/principal e assim mesmo que ele passe a ser o seu Second Slave ele funciona), mas estou focando mais o uso doméstico. A “mamãe” é um usuário leigo que não precisa saber montar dispositivos ou qual o nome do programa que baixa as fotos da máquina. Ela simplesmente plugga a sua máquina e o digiKam abre.

Legal… E como é que eu faço essas regras?

A sintaxe dos arquivos em /etc/udev/rules.d é muito simples. Você simplesmente separa por vírgulas as condições que você quer para que as ações que você quer fazer e as ações.

A máquina fotográfica da mamãe

ACTION=="add", BUS=="usb", SYSFS{product}=="Canon Digital Camera",
GROUP="camera", MODE="0660", SYMLINK+="camera", RUN:="/bin/su mamae -c
'/usr/bin/abredigikam.sh'"

Aqui em casa, usei um “abredigikam.sh” assim:

#!/bin/bash

export DISPLAY=":0"
/opt/kde/bin/digikam
Sinais do exemplo
  • Os dois iguais (==) são para expressar condição, como no C (e em um monte de linguagens derivadas dele).
  • O “=” atribui
  • O “+=” atribui “mais uma coisa” (append)
  • O “:=” atribui uma coisa como constante (ou seja, neste caso eu ou os scripts de regras da minha distro não conseguem mais mudar o valor do “RUN”).
Variáveis do exemplo
  • ACTION: A ação que está sendo feita com o dispositivo (neste caso é a adição dele – add)
  • BUS: Barramento. Neste caso, a USB.
  • SYSFS: Variáveis específicas deste dispositivo (depois vou mostrar como encontramos elas)
  • GROUP: Grupo em que o dispositivo está.
  • MODE: Permissões do dispositivo.
  • SYMLINK: Links simbólicos para o dispositivo.
  • RUN: Comando Shell para executar.

Não conheço todas as variáveis, mas para saber mais você pode consultar o Writing udev rules (o objetivo desse post não é entrar em detalhes).

udevmonitor

O udevmonitor é um aplicativo que imprime os eventos recebidos pelo Kernel e o evento que o udev manda depois do proessamento de regras em tempo real. Veja o que acontece, por exemplo, quando pluggo uma máquina digital na minha porta USB:

UEVENT[1158086870.385094] add@/devices/pci0000:00/0000:00:02.0/usb1/1-1
UEVENT[1158086870.388950] add@/devices/pci0000:00/0000:00:02.0/usb1/1-1/1-1:1.0
UEVENT[1158086870.389571] add@/class/usb_device/usbdev1.3
UDEV  [1158086870.390983] add@/devices/pci0000:00/0000:00:02.0/usb1/1-1
UDEV  [1158086870.404378] add@/devices/pci0000:00/0000:00:02.0/usb1/1-1/1-1:1.0

É interessante para acompanharmos os dispositivos que são encontrados pelo udev. Veja agora o udevmonitor quando eu despluggo a minha máquina:

UEVENT[1158089965.438657] remove@/devices/pci0000:00/0000:00:02.0/usb1/1-1/1-1:1.0
UEVENT[1158089965.438765] remove@/class/usb_device/usbdev1.3
UEVENT[1158089965.438794] remove@/devices/pci0000:00/0000:00:02.0/usb1/1-1
UDEV  [1158089965.440899] remove@/devices/pci0000:00/0000:00:02.0/usb1/1-1/1-1:1.0
UDEV  [1158089965.443341] remove@/class/usb_device/usbdev1.3
UDEV  [1158089965.444795] remove@/devices/pci0000:00/0000:00:02.0/usb1/1-1

udevinfo

O udevinfo imprime informações sobre um dispositivo. Para descobrir que o SYSFS{product} da minha máquina era Canon Digital Camera foi este comando que eu utilizei, da seguinte maneira:

<strong># udevinfo -q all -n usbdev1.4</strong>
P: /class/usb_device/usbdev1.4
N: usbdev1.4
S: bus/usb/1/4

(descobri que ela estava na usbdev1.4 usando o udevmonitor)

Aí agora sabendo o path eu descobri todo o resto: (a saída é grande, use a barra de rolagem)

# udevinfo -a -p /class/usb_device/usbdev1.4
Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/class/usb_device/usbdev1.4':
    KERNEL=="usbdev1.4"
    SUBSYSTEM=="usb_device"
    DRIVER==""
    SYSFS{dev}=="189:3"

  looking at parent device '/devices/pci0000:00/0000:00:02.0/usb1/1-1':
    ID=="1-1"
    BUS=="usb"
    DRIVER=="usb"
    SYSFS{configuration}==""
    SYSFS{product}=="Canon Digital Camera"
    SYSFS{manufacturer}=="Canon Inc."
    SYSFS{maxchild}=="0"
    SYSFS{version}==" 1.10"
    SYSFS{devnum}=="4"
    SYSFS{speed}=="12"
    SYSFS{bMaxPacketSize0}=="8"
    SYSFS{bNumConfigurations}=="1"
    SYSFS{bDeviceProtocol}=="00"
    SYSFS{bDeviceSubClass}=="00"
    SYSFS{bDeviceClass}=="00"
    SYSFS{bcdDevice}=="0001"
    SYSFS{idProduct}=="30f9"
    SYSFS{idVendor}=="04a9"
    SYSFS{bMaxPower}=="  2mA"
    SYSFS{bmAttributes}=="c0"
    SYSFS{bConfigurationValue}=="1"
    SYSFS{bNumInterfaces}==" 1"

  looking at parent device '/devices/pci0000:00/0000:00:02.0/usb1':
    ID=="usb1"
    BUS=="usb"
    DRIVER=="usb"
    SYSFS{configuration}==""
    SYSFS{serial}=="0000:00:02.0"
    SYSFS{product}=="OHCI Host Controller"
    SYSFS{manufacturer}=="Linux 2.6.17.11 ohci_hcd"
    SYSFS{maxchild}=="4"
    SYSFS{version}==" 1.10"
    SYSFS{devnum}=="1"
    SYSFS{speed}=="12"
    SYSFS{bMaxPacketSize0}=="64"
    SYSFS{bNumConfigurations}=="1"
    SYSFS{bDeviceProtocol}=="00"
    SYSFS{bDeviceSubClass}=="00"
    SYSFS{bDeviceClass}=="09"
    SYSFS{bcdDevice}=="0206"
    SYSFS{idProduct}=="0000"
    SYSFS{idVendor}=="0000"
    SYSFS{bMaxPower}=="  0mA"
    SYSFS{bmAttributes}=="e0"
    SYSFS{bConfigurationValue}=="1"
    SYSFS{bNumInterfaces}==" 1"

  looking at parent device '/devices/pci0000:00/0000:00:02.0':
    ID=="0000:00:02.0"
    BUS=="pci"
    DRIVER=="ohci_hcd"
    SYSFS{modalias}=="pci:v000010B9d00005237sv0000103Csd00000024bc0Csc03i10"
    SYSFS{local_cpus}=="1"
    SYSFS{irq}=="10"
    SYSFS{class}=="0x0c0310"
    SYSFS{subsystem_device}=="0x0024"
    SYSFS{subsystem_vendor}=="0x103c"
    SYSFS{device}=="0x5237"
    SYSFS{vendor}=="0x10b9"

  looking at parent device '/devices/pci0000:00':
    ID=="pci0000:00"
    BUS==""
    DRIVER==""

Os contras

Hmmm… Na verdade, pelo que eu me lembro da palestra, o udev só tem um contra. Ele vai detectando os dispositivos e jogando-os no /dev na ordem em que ele vai encontrando-os. Então, às vezes a minha placa de rede SiS pode ser detectada como eth0 e a Realtek como eth1 e no outro dia o contrário. Mas contornar isso é muito simples, usando aquelas regras (e inclusive podemos dar os nomes /dev/placa-sis e /dev/placa-realtek para nossas placas). =)

Encontrou um erro?

Eu ainda tô conhecendo o udev (como eu disse, conheci ele nesse final de semana), então meu texto pode ter alguma falha ou pode estar faltando alguma informação. Por favor, comente se encontrar algum erro ou quiser sugerir algo legal… =)

Para mais informações…

$ man udev

… e a página do udev

Onde anda o Slackware 11?

Ok… O Patrick tá trabalhando pra caramba, tem bastante gente colaborando, estamos tendo um monte de atualizações todo dia no slackware-current, o Slackware 11.0 vai ser estável do jeito que deve ser, mas… Tá demorando, né?

  1. 15/06: Although there’s still quite a bit in the TODO queue here I’m making my steps carefully as -current is very stable, and I think it should ship as a stable 11.0 soon so that we can get back to the business of breaking things in -current.
  2. 14/07: We *are* getting closer to 11.0, friends. I’m hoping for a larger changeset soon, but this should be fun to play with for now as I work on the TODO list; merging, compiling, and initial testing.
  3. 03/08: I know I told at least a few people that I wasn’t planning on including this in Slackware 11.0 at the last minute, and there have been a couple of patches needed for it already. Please test quickly.
  4. 14/08: There are still a few changes yet to happen, but let’s call this Slackware 11.0 release candidate 1.
  5. 19/08: This is mostly frozen now unless bugs (or irresistible upgrades) come up, so I’ll call this update Slackware 11.0 release candidate 2.

Se realmente forem só bugs ou atualizações irresistíveis, acho que na semana que vem poderemos ter uma versão nova da nossa tão querida distribuição.

A última versão do Slackware (a 10.2) é do dia 14 de setembro do ano passado. Um ano sem uma versão é um tempo considerável (claro que, pra não ser injusto com o Bill, não vale comparar com os atrasos dos sistemas proprietários). A rápida correção de bugs e lançamento de novas versões é uma entre as \infty{} vantagens que vejo no software livre; espero que essa versão saia logo! =D

© 2005–2020 Tiago Madeira