Tag Archive for 'como funciona?'

Como um pacote RPM chega no YUM?

Desde que inven­ta­ram os geren­ci­a­do­res de paco­tes e apli­ca­ti­vos como YUM e apt-get, ins­ta­lar softwa­res no Linux ficou até mais sim­ples do que ins­ta­lar um soft­ware no Win­dows, basta uma linha de comando tão sim­ples quanto “yum ins­tall pacote” e a mágica acontece.

Como pri­meiro post desse ano, esco­lhi mos­trar como são os bas­ti­do­res de envio de paco­tes para o YUM, ou seja: como um soft­ware chega da fonte ori­gi­nal até o seu Fedora.

A pri­meira coisa a fazer é escla­re­cer que o Pro­jeto Fedora tem deze­nas de empa­co­ta­do­res e que esses empa­co­ta­do­res fazem parte de um grupo cha­mado “pac­ka­gers”, que tem per­mis­sões espe­ci­ais de acesso. Cada empa­co­ta­dor é res­pon­sá­vel por gerar o RPM para um ou mais softwa­res que ele “adota”; ou seja: o empa­co­ta­dor encon­tra um soft­ware inte­res­sante em qual­quer lugar (Sour­ce­forge, Laun­ch­pad etc) e decide criar um RPM ofi­cial para o Fedora.

A sub­mis­são de um pacote é bas­tante rigo­rosa e pode levar meses para que um pacote seja apro­vado. É pre­ciso seguir à risca toda a meto­do­lo­gia de empa­co­ta­mento e que o soft­ware a ser empa­co­tado seja con­si­de­rado “livre” o bas­tante para entrar no Fedora (diver­sos revi­so­res ava­liam o RPM, ana­li­sando o código e a licença). Os deta­lhes desse pro­cesso são irre­le­van­tes para este artigo; o que nos inte­ressa aqui é que, para enviar o pacote aos repo­si­tó­rios, é pre­ciso ser um empacotador.

Diver­sas fer­ra­men­tas foram pre­pa­ra­das de modo a faci­li­tar a vida de quem empa­cota para o Pro­jeto Fedora e basta executar

user@computer:$ su –c “yum ins­tall fedora-packager”

para ins­ta­lar uma cole­ção de scripts e fer­ra­men­tas essen­ci­ais para a cri­a­ção de RPMs e para o envio dos paco­tes pron­tos para os ser­vi­do­res do Pro­jeto (com­pi­la­do­res, cvs, rpmbuild…).

Após ins­ta­lar o “fedora-packager”, é pre­ciso executar

user@computer:$ fedora-packager-setup

na pasta home do usuá­rio. Este comando pre­para o ambi­ente de desen­vol­vi­mento, ajus­tando as macros para o rpm­build, gerando e con­fe­rindo cha­ves que serão usa­das durante a comu­ni­ca­ção com os ser­vi­do­res CVS.

Por moti­vos de orga­ni­za­ção, a mai­o­ria dos empa­co­ta­do­res cria uma pasta de tra­ba­lho durante a remessa de paco­tes; eu crio a pasta “cvs”, mas o nome tanto faz:

user@computer:$ mkdir ~/cvs
$ cd ~/cvs

Como comen­tei no começo, ter o pacote apro­vado é um pro­cesso tra­ba­lhoso e, logo que apro­vado, ele (o pacote) ganha uma pasta (e per­mis­sões) no CVS. O empa­co­ta­dor deve, antes de mais nada, sin­cro­ni­zar sua pasta local com a pasta vir­tual nos ser­vi­do­res do Pro­jeto Fedora:

user@computer:$ fedora-cvs pacote

No meu exem­plo, vou mos­trar o pacote BKChem, um soft­ware para dese­nho de estru­tu­ras mole­cu­la­res em 2D:

user@computer:$ fedora-cvs bkchem

Esse script vai bai­xar meu “dire­tó­rio de tra­ba­lho” direto do CVS para o meu disco rígido. Eis o con­teúdo dele:

user@computer:$ ls /home/lonely/cvs/bkchem/
com­mon CVS devel F-10 F-11 F-12 F-9 Makefile

Observe que há dire­tó­rios para algu­mas ver­sões do Fedora (F-12, F-11, F-10…) e para a ver­são de desen­vol­vi­mento, que cha­ma­mos de Rawhide.

Nova­mente, con­vém lem­brar que o meu RPM já está pronto e eu ape­nas vou remetê-lo para os ser­vi­do­res do Pro­jeto Fedora de modo a deixá-lo dis­po­ní­vel para todos os usuários.

O meu RPM, de fato, não será usado para nada. Cada um dos RPMs dis­po­ni­bi­li­za­dos pelo pro­jeto Fedora é com­pi­lado e assi­nado lá, por isso, em vez de enviar o RPM, eu envio o SRPM (Source RPM), um para cada ver­são ativa do Fedora (atu­al­mente, as ver­sões ati­vas são Fedora 11, 12 e Rawhide).

Nova­mente, a vida fica menos com­pli­cada por­que um script checa e envia o SRPM:

user@computer:$ ./common/cvs-import.sh –b F-11 ~/rpmbuild/SRPMS/bkchem-0.14.0–1.pre1.fc12.src.rpm

Veja o termo em negrito, ele define para qual “branch” (ver­são do Fedora) esse SRPM irá. No caso, man­dei três vezes: F-11, F-12 e devel.

Veja aqui o upload sendo feito e as men­sa­gens exi­bi­das durante a verificação.

Quando esse pro­cesso ter­mina, você é levado a uma tela do VI onde entra um pequeno log sobre o upload. Veja aqui.

Ao sal­var o log, o pro­cesso de “com­mit” do SRPM ter­mina com mais algu­mas che­ca­gens (que você pode ver aqui).

Pacote SRPM envi­ado, log feito, chega a hora de com­pi­lar o pacote lá no ser­vi­dor. Vou come­çar a com­pi­la­ção para o Fedora 11 e, por isso, entro na pasta F-11:

user@computer:$ cd F-11/
ls
bkchem-crash.patch bkchem.desktop bkchem-setup.patch bkchem.spec branch CVS import.log Make­file sources

Sin­cro­nizo nova­mente a pasta, para garan­tir que eu e os ser­vi­do­res esta­mos tra­ba­lhando com as mes­mas ver­sões de arquivos:

user@computer:$ cvs up

e, digito o comando que faz a com­pi­la­ção do meu RPM lá nos ser­vi­do­res do Pro­jeto Fedora:

user@computer:$ make build

Essa com­pi­la­ção gera paco­tes para todas as arqui­te­tu­ras dis­po­ní­veis pelo Pro­jeto (veja). Aliás, o soft­ware que com­pila, checa e assina cada RPM chama-se Koji. Todo o pro­cesso de com­pi­la­ção tem que ser feito para cada uma das ver­sões cor­ren­tes do Fedora, lembre-se. Isso sig­ni­fica que, depois de fazer isso para o Fedora 11, fiz, tam­bém para o Fedora 12 e para o devel.

Enfim, depois de pas­sar pelo Koji, o empa­co­ta­dor vai ao Bodhi, que é a inter­face res­pon­sá­vel por puxar os RPMs pron­tos para os repo­si­tó­rios. Nele você define se o pacote vai para “tes­ting” ou “sta­ble”, define se o pacote é uma atu­a­li­za­ção de segu­rança, um con­serto de bug ou uma melho­ria, além, é claro, de mar­car o pacote como neces­si­tando ou não de um reboot após a atualização.

Pronto! Em breve o pacote estará alcan­çando um repo­si­tó­rio perto de você e com um sim­ples “yum ins­tall” você poderá des­fru­tar de um pacote novinho.

  • Share/Bookmark

Como funciona: Pacotes RPM

A pala­vra RPM é um acrô­nimo recur­sivo que sig­ni­fica RPM Package Mana­ger. De modo resu­mido ele é o equi­va­lente aos paco­tes .deb ou, se pre­fe­rir, aos arqui­vos .exe do Win­dows, já que serve para ins­ta­lar, desins­ta­lar e atu­a­li­zar arqui­vos e/ou softwa­res no sis­tema operacional.

Se você não gosta de his­tó­ria, pode pular a seção seguinte e ir direto para “Como funciona?”.

Um pouco de história

No iní­cio da década de 90 já era evi­dente a neces­si­dade de criar um “geren­ci­a­mento de paco­tes” que fosse fun­ci­o­nal e sim­ples de usar. Até então, o método mais comum de ins­ta­la­ção de softwa­res era a tra­di­ci­o­nal com­pi­la­ção e ins­ta­la­ção direta pelo código fonte. Esse método, no entanto, era uma clara des­van­ta­gem por­que excluía os usuá­rios menos téc­ni­cos e fazia com que o sis­tema ope­ra­ci­o­nal tivesse quase ou nenhum con­trole sobre os softwa­res que eram ins­ta­la­dos. Era comum que um soft­ware não pudesse mais ser desins­ta­lado ou que, para garan­tir a desins­ta­la­ção, o código fonte tivesse que ser man­tido no sis­tema. Foi por isso que a Red Hat ini­ciou as pes­qui­sas em busca de um método de geren­ci­a­mento de paco­tes que fosse efe­tivo e simples.

RPP

Foi o nome do geren­ci­a­dor de paco­tes usado pelos pri­mei­ros Red Hats. O RPP foi a “musa ins­pi­ra­dora” para mui­tas das habi­li­da­des que o RPM de hoje em dia aca­bou her­dando. Ele tinha uma uti­li­za­ção sim­ples, bas­tando uma linha de comando para ins­ta­lar um pacote; per­mi­tia a exe­cu­ção de scripts de pré e pós instalação/desinstalação; era capaz de fazer uma veri­fi­ca­ção dos paco­tes para des­co­brir se alguma alte­ra­ção nos arqui­vos tinha sido feita e sal­vava as infor­ma­ções do pacote (como des­cri­ção, ver­são, nome e lis­tas de paco­tes) em um banco de dados. Aca­bou não vin­gando por­que, embora fosse rela­ti­va­mente efi­ci­ente, não con­se­guia tra­ba­lhar com o código fonte ori­gi­nal dos softwa­res que ins­ta­lava. Isso que­ria dizer que cada empa­co­ta­dor pre­ci­sava hac­kear o soft­ware antes de empacotá-lo para que ele fun­ci­o­nasse bem com o RPP. Além disso, o RPP era inca­paz de tra­ba­lhar com arqui­te­tu­ras dife­ren­tes da x86… Embora tenha sido o geren­ci­a­dor de paco­tes RPP o grande dife­ren­cial da Red Hat no iní­cio da empresa, logo ficou claro que a limi­ta­ção de não poder tra­ba­lhar com outras arqui­te­tu­ras viria a se tor­nar um pro­blema e por esse motivo, as pes­qui­sas por um geren­ci­a­mento melhor de paco­tes continuou.

PMS (Pac­kage Mana­ge­ment System)

O PMS não foi desen­vol­vido pela Red Hat. Ao con­trá­rio, era desen­vol­vido por um grupo de desen­vol­ve­do­res che­fi­a­dos por Rik Faith que cri­a­ram a dis­tri­bui­ção cha­mada Bogus Linux . Os paco­tes PMS não eram muito bons por­que usa­vam um banco de dados pobre­mente dse­nhado e facil­mente cor­rup­tí­vel, tam­bém esta­vam limi­ta­dos a ape­nas uma arqui­te­tura mas intro­du­zi­ram o con­ceito de tra­ba­lhar dire­ta­mente com o código fonte do “ups­tream” (i.e. dos desen­vol­ve­do­res ori­gi­nais). Qual­quer mudança neces­sá­ria para que o soft­ware fun­ci­o­nasse era apli­cada por sim­ples patches.

PM

Pouco depois, Rik Faith e Doug Hoff­man , já con­tra­ta­dos pela Red Hat, con­ti­nu­a­ram tra­ba­lhando num geren­ci­a­dor de paco­tes e desen­vol­ve­ram o PM, que jun­tava todas as van­ta­gens do RPP e do PMS. Infe­liz­mente, her­dou tam­bém as fra­que­zas dos dois geren­ci­a­do­res de paco­tes e pos­suía um banco de dados muito cor­rup­tí­vel, além de, claro, con­ti­nuar sendo com­pa­tí­vel com somente um tipo de arquitetura.

RPM 1 (Finalmente)

Espelhando-se nas duas bem suce­di­das ten­ta­ti­vas de cri­a­ção de geren­ci­a­mento (RPP e PMS), Marc Ewing e Erik Troan come­ça­ram a tra­ba­lhar em um ter­ceiro geren­ci­a­dor de paco­tes que se cha­ma­ria RPM (Red Hat PackageManager).

Ape­sar de ins­pi­rado pelo RPP, PMS e PM, o RPM iria focar em resol­ver todos os pro­ble­mas que esses geren­ci­a­do­res antes não tinham con­se­guido resol­ver. A lin­gua­gem de pro­gra­ma­ção esco­lhida foi o Perl, por ser fácil e rápido de programar.

Ape­sar do RPM 1 ter sido, rela­ti­va­mente, um êxito, apre­sen­tava diver­sos problemas:

  • Era muito mais lento do que se tivesse sido escrito em C;
  • O banco de dados era extre­ma­mente frá­gil e que­bra­diço, corrompendo-se à toa;
  • Não era pos­sí­vel exe­cu­tar o geren­ci­a­dor por um dis­quete, já que o fato de ser escrito em perl con­su­mi­ria um espaço extra;
  • Embora fun­ci­o­nasse em outras arqui­te­tu­ras, o fun­ci­o­na­mento ocor­ria com problemas
  • O geren­ci­a­dor de paco­tes não era “expan­sí­vel’. O que sig­ni­fi­cava que qual­quer mudança maior no código faria com que os paco­tes ante­ri­o­res se tor­nas­sem incom­pa­tí­veis com as ver­sões futuras.

RPM 2

Marc e Eric rees­cre­ve­ram o RPM total­mente, usando dessa vez a lin­gua­gem C. Essa deci­são aumen­tou em muito a velo­ci­dade de exe­cu­ção do geren­ci­a­dor de paco­tes. Adi­ci­o­nal­mente, o banco de dados foi rede­se­nhado e per­mi­tia que as con­sul­tas fos­sem exe­cu­ta­das em 1/10 do tempo que antes era tomado pelo RPM 1. Atu­al­mente, o RPM está na ver­são 4.4.2.3.

Como fun­ci­ona?

Um RPM é, na ver­dade, um meta pacote. Para faci­li­tar o enten­di­mento, pense nele como um pacote com diver­sos rótu­los cola­dos nele e que cada um des­ses rótu­los con­tém um tipo de infor­ma­ção que é “inte­res­sante” que seu sis­tema saiba. O soft­ware que você deseja ins­ta­lar está lá, com­pac­tado por um pro­cesso antigo e efi­ci­ente cha­mado cpio.

O que vem no RPM está “pré-compilado”. Isso quer dizer que o soft­ware foi pre­pa­rado em outra máquina, o resul­tado da com­pi­la­ção foi empa­co­tado e tudo que você faz é ins­ta­lar o soft­ware pronto para usar.

A ana­to­mia de um pacote RPM é a seguinte:

  1. O iní­cio do pacote RPM é a “guia” que ensina ao sis­tema ope­ra­ci­o­nal que se trata de um pacote RPM. Nessa seção exis­tem cabe­ça­lhos lidos pelo sis­tema que são impor­tan­tes para o manu­seio do pacote. Aqui cabe uma boa ana­lo­gia com o GRUB.
  2. Esta seção arma­zena assi­na­tu­ras que garan­tem a auten­ti­ci­dade dos paco­tes. É pos­sí­vel, por exem­plo que um dis­tri­bui­dor assine seus RPMs com sua pró­pria marca, que é iden­ti­fi­cada pelo sis­tema. Isso reforça a segu­rança e per­mite a um usuá­rio ins­ta­lar (ou não) somente softwa­res dis­po­ni­bi­li­za­dos por dis­tri­bui­do­res cuja assi­na­tura seja con­fiá­vel (como Fedora, Red Hat, Man­driva, Opensuse…).
  3. Na ter­ceira seção per­ma­ne­cem as infor­ma­ções como nome do soft­ware, ver­são, rele­ase, des­cri­ção, lista de arqui­vos, depen­dên­cias… Essas entra­das são arma­ze­na­das no banco de dados do RPM.
  4. A quarta (e maior) seção con­tém, final­mente, os arqui­vos com­pac­ta­dos. Na figura ela é repre­sen­tada por .tar.gz mas isso é mera­mente ilus­tra­tivo. Na ver­dade, o método de com­pres­são é o cpio. Cada pacote RPM tem uma limi­ta­ção de tama­nho: 2 GB para sis­te­mas 32 bits e 4 GB para sis­te­mas 64 bits.

g2474

Agora que você já entende como é um pacote RPM, está pronto para des­co­brir o que ele faz. Não vou entrar aqui em deta­lhes de como criar um pacote, isso foge ao escopo do nosso artigo, no entanto, de qual­quer forma, antes de botar a mão na massa para fazer um RPM é sem­pre bom enten­der como ele funciona.

Quando você ins­tala um soft­ware qual­quer com o ./configure, make e make install, ele veri­fica se seu sis­tema está ok para rodá-lo, busca as pas­tas cor­re­tas, gera os links, ins­tala as pági­nas de manual e exe­cuta quais­quer outras ope­ra­ções neces­sá­rias. Num pacote RPM ocorre exa­ta­mente o mesmo, mas o soft­ware é enga­nado e acaba se ins­ta­lando numa árvore de dire­tó­rios falsa cha­mada “fake root”. A árvore falsa é exa­ta­mente igual á árvore do seu sis­tema ope­ra­ci­o­nal, mas é “vazia”, sem nenhum outro soft­ware; tudo que existe nessa árvore falsa é o soft­ware que foi “enga­nado” e se ins­ta­lou na árvore de dire­tó­rios falsa. Depois disso, o soft­ware que monta os RPMs (cha­mado RPM­Build) pega essa árvore falsa e a com­pacta den­tro do pacote.

Durante a ins­ta­la­ção do soft­ware que, agora, está den­tro do RPM o soft­ware é des­com­pac­tado e “colado” em cima da árvore de dire­tó­rios de verdade.

Como a árvore falsa e a árvore ver­da­deira são exa­ta­mente iguais, o resul­tado disso é que o RPM acres­centa o novo soft­ware com seus arqui­vos, links e docu­men­ta­ções à árvore exis­tente, algo muito pare­cido com um “copiar e colar” em larga escala.

Tudo que você ins­ta­lou via RPM fica regis­trado num banco de dados SQLite que fica loca­li­zado em /var/lib/rpm (mas não tente abrir esse banco de dados dire­ta­mente, geral­mente o resul­tado é amargo). Se seu RPM foi bem feito ele con­tém uma lista de todo e qual­quer arquivo que foi copi­ado para o seu HD. Cabe ao pro­gra­ma­dor do pacote (empa­co­ta­dor) dizer ao RPM o que ele está jogando no disco, caso con­trá­rio, um RPM mal feito, ao ser desins­ta­lado, pode dei­xar lixo inú­til para trás.

Um pacote RPM é, afi­nal, algo muito simples.

  • Share/Bookmark

Como funciona? — Entradas nos menus

menusVamos ao pri­meiro artigo da série infi­nita “Como fun­ci­ona?”, que deve agra­dar aos mais curi­o­sos e pode, mais cedo ou mais tarde, aca­bar ser­vindo para algo em algum momento.
Lembro-me de uma época em que mui­tos apli­ca­ti­vos ins­ta­la­dos no GNOME não gera­vam uma entrada nos menus do KDE e vice-versa. Era uma coisa chata que acon­te­cia por falta de padro­ni­za­ção em um pequeno deta­lhe: a cri­a­ção de entrada nos menus. Hoje em dia isso rara­mente acon­tece já que GNOME e KDE ado­tam um esquema muito seme­lhante para gerar tais entra­das e, basi­ca­mente, o que fun­ci­ona para um tam­bém vai fun­ci­o­nar para o outro. Con­ti­nua valendo tam­bém a máxima de que a solu­ção mais sim­ples é, mui­tas vezes a melhor.
Cada soft­ware que opera com inter­face grá­fica, para gerar uma entrada no menu, neces­sita de um arquivo com exten­são .desk­top e é esse arquivo que diz onde e como a apli­ca­ção será aberta, assim como con­tém as des­cri­ções e comen­tá­rios sobre o soft­ware quando você passa o pon­teiro do mouse por cima e vê um pequeno pop-up expli­ca­tivo.
A sin­taxe é bem sim­ples e mesmo os menos expe­ri­en­tes enten­dem logo o fun­ci­o­na­mento do arquivo: o sis­tema ope­ra­ci­o­nal busca na pasta /usr/share/applications pelo arquivo .desk­top cor­res­pon­dente ao soft­ware e usa seus parâ­me­tros para gerar a entrada no menu.
Vejam o arquivo .desk­top do pidgin:

[Desktop Entry]
Encoding=UTF-8
Name=Internet Messenger
Name[ar]=مرسال الإنترنت بِدْجِن
Name[es]=Cliente de mensajería de Internet Pidgin
Name[fr]=Messagerie internet Pidgin
Name[ja]=Pidgin インターネット・メッセンジャー
(...)
Name[pt_BR]=Mensageiro da Internet Pidgin
Exec=pidgin
Icon=pidgin
StartupNotify=true
Terminal=false
Type=Application
Categories=Network;InstantMessaging;X-Red-Hat-Base;
X-Desktop-File-Install-Version=0.15

Todo arquivo .desk­top começa com [Desk­top Entry] , a ordem da entrada dos parâ­me­tros não importa mas é impor­tante saber que os arqui­vos .desk­top são case sen­si­tive e pid­gin é dife­rente de Pid­gin.
Encoding=UTF-8 diz que a entrada no menu é codi­fi­cada em UTF-8, isso é um padrão.
Name=Internet Mes­sen­ger é o nome que apa­rece na entrada de menu no idi­oma gené­rico padrão (inglês sem­pre), mas caso seu idi­oma nativo esteja dis­po­ní­vel, o arquivo é inte­li­gente o bas­tante para ter uma lista de tra­du­ções que se ajus­tam ao idi­oma do sis­tema.
Exec=pidgin é o nome do exe­cu­tá­vel. Se você digi­tar pid­gin no ter­mi­nal ele será aberto, então, aqui você ensina à entrada no menu como abrir o exe­cu­tá­vel.
Icon=pidgin diz ao menu qual ícone usar. Ele pro­cura den­tro da pasta /usr/share/pixmaps e cria um vín­culo entre o arquivo .desk­top e o ícone esco­lhido. Tam­bém é pos­sí­vel digi­tar o cami­nho com­pleto ao ícone, como por exem­plo Icon=/usr/share/pixmaps/pidgin.png, mas a forma sim­ples é pre­fe­rí­vel. Quando escre­ve­mos Icon=pidgin o sis­tema já sabe que deve pro­cu­rar den­tro da pasta pix­maps pelo arquivo cor­res­pon­dente com exten­são .PNG e, caso não encon­tre, pro­cura por .SVG e, final­mente, .XPM. Inte­res­san­te­mente, o pró­prio arquivo .desk­top assume a apa­rên­cia do ícone ao qual se refere.
StartupNotify=true diz que o sis­tema deve noti­fi­car ao usuá­rio da aber­tura do apli­ca­tivo. Uma ampu­lhe­ti­nha que gira ou algo pare­cido.
Type=Application dis­pensa comen­tá­rios.
Categories=Network;InstantMessaging;X-Red-Hat-Base; diz exa­ta­mente onde seu ícone vai entrar. Games, Escri­tó­rio, Inter­net: é aqui onde isso é defi­nido e a exis­tên­cia ou não de um sub­menu depende do seu sis­tema. Alguns usam o sub­menu Ins­tant­Mes­sa­ging, mas o Fedora não usa. Observe os “;” que sepa­ram as categorias.

Quer saber mais detalhes?


No pró­ximo capí­tulo, como fun­ci­ona o GRUB?

  • Share/Bookmark