You are on page 1of 476

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.

html

CURSO DE LINUX PARA NOVATOS, BRUTOS Y EXTREMADAMENTE TORPES

Autor:AntonioCastroSnurmacher.

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Primeraedicin(Nov2008)
(PreviamentefuepublicadoenEne2000enformatohtmlenla webhttp://www.ciberdroide.com)

Estapginapuedeserredistribuidalibrementebajolostrminos delalicenciaGPL.Vase(GPLtextooriginal)osiloprefiere (TraduccinespaolanooficialdelaGPL)Almargendelas obligacioneslegalesquesederivandelusodeestalicencia rogamossearespetadalareferenciaasulugardepublicacin originalwww.ciberdroide.com.yasuautororiginalAntonioCastro Snurmacher(Madrid01/01/2000).

CopyrightMadrid(Enero2000).

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

AusenciadeGaranta Estaausenciadegarantasehaceextensaacualquiertipodeuso deestematerialymuyespecialmentealasprcticas,ejercicios,y deejemplosqueencuentreenestaspginas.Debertrabajar siempresalvoindicacincontrariaconunSOLinuxyconun usuariodistintode'root'sinprivilegiosespeciales.Comodirectorio detrabajoseprocurarusareldirectorio'/tmp'oalgnotroqueno contengainformacinvaliosa.Tampocoseconsiderabuenaidea practicarenunamquinaquecontengainformacinvaliosa. Todoestosonrecomendacionesdeprudencia.Encualquiercaso sialgosalemaltodalaresponsabilidadsernicamentesuya.En ningncasopodrreclamaranadiepordaosyperjuicios derivadosdelusodeestematerial.Abstngasedehacerprcticas sinoestdispuestoaasumirtodalaresponsabilidad. Notasdelautor: Estecursohasidoreeditadoparacambiarelformatodeltexto.No sehatocadoapenaseltextoqueesdehaceochoaos.Est pendientedecorreccinortogrficaydeestilo.Peseasusfallos, hasidoampliamentedescargadoenInternet.Lamayorpartedel cursoconservasuvigenciagraciasatratarlosfundamentosUNIX delS.OLinux.Elcursoesunaintroduccingeneralalossistemas operativotipoUnixengeneralyLinuxenparticular. Perdonelacrudezadenuestrottuloperocuandoterminela primerapartedeestecursosentirquehasuperadouna desagradablefasedesuexistenciaypodrrersedelafaltade conocimientosdesuvecino.

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Cuandotermineustedlasegundapartenoscomosesentir usted,peroyomesentirfelizporquetodavanoestterminada, yparacuandodecidaterminarlaseguramentehabrquecambiar algunascosas.Lasegundapartedeadministracinhaperdido msvigenciaquelaprimeraquecontinuasiendobsica. Parauncorrectoaprovechamientodelcursoserecomiendauna lecturasecuencialdecadaunodeloscaptulosenorden establecidoenestendice.(secuencialquieredecirprimeroel1, luegoel2,luegoel3,etc...) Efectivamenteesteltimocomentarioentreparntesisva especialmentededicadoanuestropblicopredilectoalquenos referimosenelttulo,peroalgunoslistillostambindeberan probarnuestrocurso. Lasconvencionesutilizadasenestecursoylametodologade trabajotambinseexplicandeformaprogresivaporlocual saltarseuncaptulopuedellevarleainterpretarerrneamenteel materialdelcurso.Posiblementeesteustedtentadodeempezar directamenteporlasegundapartedelcursoperodemomentono sehaconsideradofacilitarestalabor. Estecurso,comoyahemoscomentado,constaporelmomentode dospartesbastantedistintas.

*LaprimeraparteIniciacinalSOLinuxasumeunnivelcerode conocimientos.Nisiquieraasumiremosunaciertaexperienciacon ordenadoresylascosasseexplicarnenestaprimerapartepaso apasofacilitandolomximoposiblelalabordelalumno. RomperemosalgunosmitosquepresentanaLinuxcomoSOpara gurs.Enestapartenoentraremosnuncaaexplicarcosasque necesitenforzosamenteunacuentadesuperusuario.Ello 4

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

implicaraciertoriesgoyaquesetratadeunusuarioconpermisos enelsistemaparahacercosasdetodotipo.

LasegundaparteUsuarioavanzadodeLinuxasumequeyaha asimiladolaprimerapartedelcursoyprobablementetodassus inseguridadeshabrndesaparecido.Estapartetocaralgunos temasmsrelacionadosconlaadministracindelsistemay puntualmentenecesitaremosaccesoaunacuentade superusuario,peronoseruncursodeadministracinde Linux.Elobjetivonoesadministrarunsistemaconmuchos usuariossinolograrunrazonableniveldeautosuficienciacon Linuxconsiderandolasnecesidadesdeadministracindel sistemaenordenadorespersonalesconLinuxydebe contemplarsecomouncursointermedioentreuncursode IniciacinyunodeAdministracin.

Encualquiercasofinalizadoestecursoqueempiezadesdeun niveldeconocimientoscero,yqueavanzaconsolidandolos conceptospasoapaso.Peseaelloesuncursomuyambicioso. Conllograrconlunabasedeconocimientosqueledarnuna granseguridadalahoradeabordarcualquierdesafoenesteS.O.

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ndicedecontenido
PARTE(I)INICIACICIONALS.O.LINUX............................................7 AQUIENVADIRIGIDOESTECURSO.............................................7 INTRODUCCIONALINUX..............................................................12 ALGUNOSCONCEPTOSBSICOS.................................................18 ELMANUALDELSISTEMA............................................................26 LASHELL...........................................................................................30 INTRODUCCINALOSPROCESOS..............................................50 MSSOBREPROCESOSYSEALES............................................57 SISTEMADEFICHEROS(Primeraparte).........................................72 SISTEMADEFICHEROS(Segundaparte)........................................87 SISTEMADEFICHEROS(Terceraparte).......................................100 ALGUNOSCOMANDOSTILES..................................................116 EXPRESIONESREGULARES.........................................................148 ELEDITORVI(Primeraparte).........................................................163 ELEDITORVI(SegundaParte)........................................................187 PROGRAMACIONSHELLSCRIPT(PrimeraParte)......................201 PROGRAMACIONSHELLSCRIPT(SegundaParte)....................214 EJERCICIOSRESUELTOSDESHELLSCRIPT...........................277 PARTE(II)USUARIOAVANZADODELINUX...............................286 INTRODUCCINALASEGUNDAPARTEDELCURSO..........286 LAMEMORIAVIRTUALENLINUX............................................319 LAPRIMERAINSTALACIONDELINUX....................................333 TERMINALES...................................................................................354 PROGRAMACIONDETAREASENELTIEMPO........................373 INTRODUCCIONAREDES............................................................387 ELARRANQUEENLINUXYCOMOSOLUCIONARSUS PROBLEMAS(PrimeraParte)..........................................................416 ELARRANQUEENLINUXYCOMOSOLUCIONARSUS PROBLEMAS(SegundaParte).........................................................433 CONSEJOSGENERALESPARACOMPILARKERNELS...........457

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

PARTE(I)INICIACICIONALS.O.LINUX
AQUIENVADIRIGIDOESTECURSO
Estaprimerapartedelcursoesunaintroduccingeneralalossistemas operativostipoUnixengeneralyLinuxenparticular. EstonopretendeserunHOWTOniunaFAQ,niunaguadeusuario,de programacin,odeadministracin.Tampocoesunaenciclopediasobreel tema.EstoesuncursodeiniciacindeUnixusandoLinuxparailustrar losejemplos. Tampocoesunaguaparahacerlascosasarrastrandoysoltandodesdeun escritorio precioso. Linux tiene varios escritorios de este tipo pero nosotrosusaremoslaconsola.Unescritoriopuedesermsagradabley msintuitivoperonotodaslascosaspuedenhacerseapretandounsolo botn.Ademsestoesuncursoyparaaprenderausarunescritoriono hacefaltauncurso. Ustednonecesitaparaestaprimerapartedelcursoteneraccesoauna cuenta de administrador (root), ni tendr que usar ningn entorno de programacinsalvolapropiashell. Lo que se busca es consolidar unas bases tericas de los conceptos fundamentales comunes a los SO tipo Unix. En una palabra se busca comprenderelfuncionamientodeesteSO.Apesardeellosuenfoquees prctico porque se ilustran los conceptos con ejercicios y porque se profundiza especialmente sobre los aspectos que pueden resultar de utilidadmsinmediataparaunnovato. NoprejuzgueaLinuxcomounsistemanoaptoparausted. Al finalizar la primera parte del curso usted tendr conocimientos suficientesparaentendercomofuncionaLinuxparaunusoanivelde 7

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

usuario normalito y podr utilizar el potentsimo lenguaje shellscript. Este lenguaje ylabasedeconocimientos deestecursoleabrirnuna enormevariedaddeposibilidades. Pordecirlo dealgunamaneracuandotermine laprimera partedeeste cursoserplenamenteconscientedelaenormepotenciayflexibilidadde esteSOysesentircapazdehacercosasqueahoraquizsleparezcan impensables. Esperamosqueestonoleconviertaenunrepugnantelistilloinformtico peroyadijimosquenonoshacemosresponsablesabsolutamentedenada. Cuando termine la segunda parte se sentir afortunado de ser un ... Mmmm...supervivientequellegalfinaldelcurso. Usaremosunlenguajeacordealafaltatotaldeconocimientosprevios,en cambioasumiremosquepuedeusarunordenadorconLinuxinstaladoy listoparapracticar. Esdecirnoexplicaremos comoseinstalalinuxni comocrearunacuentadeusuarioperoasumiremosqueyadisponede ambascosasyqueescapazdeabrirunasesindetrabajo(esdecirhacer loginconunusuarioypasswordvlidas) Siesustedunvirtuosodelazadnylapala,enhorabuenaporqueeste cursoeselindicadoparaustedperosustituyaesasherramientasporun ordenador.Losejemplosyejerciciosestnpensadosparaquelospruebe ensuordenadorconsuSOLinux,ylapala,azadnyotrasartessimilares no le sern de mucha utilidad para este curso. (Esperoque mi amigo Davidseenterebiendeestoltimo). Buenoconestetipodecomentariosquizspiensequeestecursoespoco serio.Elusodeunpoquitodehumorloharemosdurantelasprimeras leccionesparaquesesientamasrelajado. LinuxesunSOtipoUnixyporlotantosusconceptosmsbsicosson comunes a los que incorpora cualquier sistema tipo Unix y resultan

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

bastante distintos de otros conceptos que forman parte de la cultura microinformticafundamentalmentedeMicrosoft. La documentacin de Linux es muy abundante, sin embargo muchas vecesseasumeunaculturageneraldeUnixquerealmentenosiempre existe.LasgeneralidadesmsbsicasdeUnixmuchasvecessetratande un modo superficial ypocosistemtico quizs porquesontemas muy viejos. Elcontenidodeestecursoesenmsdeun90%serviraparacualquier SOtipoUnixynosoloparaLinux. Enestecursoseexplicarnconceptosqueincidenelconocimientointerno delsistemaoperativo.Aestasalturasmsdeunoempezarapreguntarse sirealmenteesnecesarioconocertodosestosdetallesparaunsimpleuso deunSO.Lociertoesqueactualmenteexistenescritoriosgrficosque permitenhacerbastantescosasdeformaintuitiva.EnLinuxtenemospor ejemplo KDE o GNOME que permiten usar los programas de forma mucho ms amistosa e intuitiva. Sin embargo la amistosidad tiene un precio. Los entornos intuitivos no permiten hacer cualquier cosa y consumenmuchosrecursosdeCPUymemoria.EnLinuxestosentornos sonunaopcinnounaobligacin.Estecursoestaorientadoalusode Linuxdesdelaconsola.Parasacarleelmximoprovechoyparaalcanzar ciertodominiodellenguajeshellscriptnoquedamsremedioquetratar estostemasperoestamossegurosdequeunavezalcanzadoelfinalde estecursotendrunavisindeUnixquelepermitiratreverseconcosas impensablesahora. Tambinseproponeelaprendizajedeloscomandosmsinteresantesdel sistemaparapoderhacerungrannmerodecosasyalcanzarunaltonivel deautosuficienciaensumanejo. Estecursoessuficienteparaqueunapersonaquenicamentepretenda defenderseenestesistemaoperativoconsigasupropsito,peroadems permite que elusuarioconozca aspectos quesonimprescindibles para poderavanzarmuchomsporsucuentasieseessudeseo. 9

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Seevitarenloposiblemencionaraspectosrelativosalaadministracin delsistemayaqueestoseraobjetodeotrocurso. Existen documentos que tratan de la administracin de Linux y de la instalacindeLinux. Si usted pretende usar su propio SO Linux en su ordenador personal convendraquecontinuaraaprendiendolaadministracindeunSOLinux yaqueustedseraeladministradordesusistema.RecuerdequeLinuxno fueconcebidocomosistemamonousuario.Solounarecomendacinmuy bsica.Tengaensuordenadorcomomnimodosusuarios.Unoserael superusuario'root'concapacidadilimitadaparalobuenoyparalomaloy otro su usuario de trabajo normal. La razn es que una equivocacin cometidadesdeunusuarionormalsolopuedetenermalasconsecuencias paraelreadetrabajodeeseusuario.Porelcontrariounaequivocacin desde'root'puededestruirtodalainformacindesusistema. DadoquevamosausarLinuxdesdeconsolayalgunosusuariospueden tenerexperienciapreviaconMsdos,meparecenecesariohacerunanueva advertenciadestinadaaestosusuarios. El comportamiento del interprete de comandos de Msdos y de Linux tienenalgunasemejanzaperoalgunascosasqueestamosacostumbradosa usar en Msdos no son otra cosa que burdas imitaciones de las extraordinariasposibilidadesdelinterpretedecomandosdeLinux.Como consecuenciadeestounintentodehacerenLinuxcosasparecidasalas quehacemosenMsdospuedellevaradesagradablessorpresasyaqueen Linux se requiere tener una idea de como funciona el interprete de comandos. Darunarelacindecomandosequivalentesentre(UnixoLinuxyMsdos) sin explicar nada ms puede llevar a confusiones peligrosas. En otras palabras,puedescagarlasitepasasdelisto.Enestesentidoloscomandos bsicosparaelmanejodeficheros'rm','mv',y'cp'nosedeberanusarsin comprender correctamente el funcionamiento bsico del interprete de comandosdeLinuxyenparticularcomoesteexpandelasordenes. 10

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Un intento de usarLinuxsinunpequeoesfuerzodeasimilacin de algunos conceptos puede llevar a situaciones muy frustrantes. Existe inclusohoyendaunagrancantidaddeprofesionalesquehantenidoque trabajardurantemesesoaosconalgnSOtipoUnixsinquenadieles explicaralascuatrocosillasbsicasimprescindibles.Estoocurreporque para otros SO resulta perfectamente posible aprender por uno mismo practicandoconelsistemaperoennuestraopininlosSOdetipoUnix requieren la asimilacin de unos conceptos bastante simples pero en absolutointuitivos.Losusuariosquetienenalergiaalosmanualesyque norecibieronformacinparaUnixraramentelleganaentenderesteSOy eslgicoqueseencuentrenadisgustoyquemaldiganaesteSO.Muchos noconsideraronnecesarioquefueraimportanteasimilarunosconceptos bsicospreviosyaquelaexperienciaanteriorconotrosSOmsintuitivos lesindujoapensarqueconelsimpleusodelSOpodranalcanzarese conocimientoporellosmismos.Losquetuvieronlasuertederecibirun buencursooparalosquetuvieronlapacienciadeinvestigarporsucuenta losfundamentosdeesteSO,esfcilquelleguenaenamorarsedeel.Unix siemprehadespertadoestasdosreacciones.Hayquienloadorayhay quienloodia.LosqueloadoranaseguranqueesunSOsencillo,elegante, potente y flexible. Los que lo odian dicen que es difcil de usar. Intentamosconestecursoquellegueapensarcomolosprimeros.

11

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

INTRODUCCIONALINUX
Unpocodehistoria Linuxesunkernel(unncleodeunsistemaoperativo)creadoporLinus Torwalds. Naci en Finlandia el 28 de Dic 1969 y estudi en la universidaddeHelsinki.DesarrollLinuxporquedeseabadisponerdeun SOUnixensuPC.ActualmentetrabajaenlosEE.UU. LinusT.quisocompartirsucdigoparaquecualquierapudierausarloy contribuir a su desarrollo. Dado que en GNU ya haban desarrollado bastantesherramientasparaUnixconlamismafilosofadesoftwarelibre pronto se consigui un SO Linux/GNU totalmente libre. Dos de las herramientasmsimportantesaportadasporGNUfueronelinterpretede comandos,yelcompiladordeC. En los comienzos Linux era un sistema principalmente adecuado para hackersypersonasconmuchosconocimientostcnicos.Actualmenteya noesas.Elcrecimientoennmerodeusuariosvienesiendoexponencial desdesuscomienzosen1991.Actualmenteyaempiezaaservistocomo unaalternativaalosSOdeMicrosoft.Puesestahistoriadelahistoriade Linuxestancortacomosupropiahistoria,porlocualesteapartadoyaes tambinhistoria.Nosedesmoralice.Sinohaentendidoesteltimojuego depalabras,puedepasaralsiguienteapartadosinpreocuparsemuchopor ello. Tiposdelicenciaslibres La licencia ms utilizada en Linux es la licencia GPL de GNU. Sin embargo hay otras licencias igualmente aceptables bajo el trmino de softwarelibre.

12

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Unbuenlugarparainformarsesobrelostiposdelicenciaslibresesel 'DebianPolicyManual'enestedocumentoseestablecenunoscriterios para establecer si Debian considera o no libre una licencia. Esto se describeacontinuacindeformaresumida.

Libertaddedistribucin

Se refiere a la libertad de comercializar el software sin que sea necesariopagarderechosdeningntipo.

Cdigolibre

Seconsideraqueelcdigoeslibrecuandolosfuentessondedominio pblico.

Integridaddelosfuentes

Serecomiendanorestringirlosderechosdemodificacindelcdigo fuente,aunqueseaceptanalgunasfrmulasquerestringenlaformade efectuar ciertas modificaciones pero no entramos en estos detalles ahora.

Nodiscriminacinparagruposopersonas

Lalicencianoconsideradistincinalgunaparaningntipodepersona ogrupo.

Nodiscriminacinparaactividadopropsito

Por ejemplo no se distingue entre uso comercial, domstico, educativo,etc.

Distribucindelalicencia

13

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Lalicenciaafectaralassucesivasdistribucionesdelosprogramasde formaautomticasinnecesidaddetrmitealguno.

LalicencianodebedeserespecficadeDebian

EsdecirDebiannoadmitiraunalicenciaqueimpidaelusodeun programafueradeladistribucinDebian.

Lalicencianodebecontaminarotrosprogramas

Lalicencianodebeimponerrestriccinalgunaaotrosprogramas.Por ejemplonoseraadmisibleobligaraqueelprogramasolosepueda redistribuirenunmedioquenocontengasoftwarecomercial.

Ejemplosdelicenciaslibres

GPL,BSD,yArtisticsonejemplosdelicenciaslibres. Cada licencia tiene sus peculiaridades. Porejemplo siusteddesarrolla aplicaciones haciendo uso de fuentes protegidas pajo la licencia GPL estarasumiendoparatodosudesarrollolacondicindeGPL.Encambio podradesarrollarsoftwarepropietarioderivadodefuentesbajolicencia BSD. La GPLsehahechomuypopularporqueprotegeellegadodel softwarelibreparaquecontinecomotal. QueesLinux/GNU QuizshaledoqueLinuxsignifica'L'inux'I's'N'not'U'ni'X'.Peroen realidadLinuxesunncleodeSOtipoUnix.SucompatibilidadPosixes alta.ElSOsecomplementaconunaseriedeaplicacionesdesarrolladas porelgrupoGNU.Tantoestasaplicacionescomoelncleosonsoftware libre. Linux/GNU es un SO tipo Unix, SO Multiusuario, Multitarea, Multiprocesador,Multiplataforma,Multilingue,nacidoenlaredderedes Internet.

14

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

UnixseoriginoenloslaboratoriosBelAT&Tacomienzosde1970yel Msdos tom muchas ideas de este SO pero sus planteamientos eran mucho ms modestos y solo se intento implementar unas burdas imitacionesdeunascuantasbuenasideasdeUnix.Elsistemaenrbolde directorioslaredireccindeentradasalidaylaestructuradeuncomando porejemplo.MsdosnacicomounjuguetitocomparadoconUnixyluego lanecesidaddemantenerlacompatibilidadconversionesanterioresha condicionado fuertemente el crecimiento de Msdos primero y de Windowsdespus.PorelcontrarioUnixhamantenidolacompatibilidad conversionesanterioressinningnproblema.TradicionalmentelosSO Unixsehancaracterizadoporserpocointuitivosdecaraalusuario.Esto esta cambiando rpidamente porque Linux est ofreciendo cada vez entornos ms intuitivos para su utilizacin. Esto es resultado del acercamientoprogresivodeLinuxhaciaelusuariodomsticoyofimtico. Detodasformasexisteunabarreradetipoculturalqueconvienetener presente.Muchosusuarioshoyendasabenloquesignifica'formata:'.a: eselnombredeunaunidaddedisqueteenMsdosoenWindowsperoen Linux no existen unidades lgicas. En Linux deberamos hablar de sistemasdeficherosenlugardeunidadeslgicasqueesunconceptomuy distinto. DistribucionesdeLinux LinuxesunncleodeunSOperoparatenerunSOoperativocompleto hay que acompaarlo de un montn de utilidades, dotarlo de una estructuradedirectorios,ascomodotarlodeficherosdeconfiguracin,y scripts para muydistintas tareas.Unscriptesunficheroquecontiene instruccionesparaelintrpretedecomandos.Todasestascosasjuntasy bienorganizadassonlascosasquedebeproporcionarunadistribucin. Algunas distribuciones incluyen software comercial de su propiedad. OtrasencambiosoloincorporansoftwareGPLosimilar.(softwarelibre) DistribucioneslibressonSlackwareyDebianporejemplo.Distribuciones propietariassonRedHat,SuSE,Caldera,Mandrakeetc.

15

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Cada distribucin tiene sus propias caractersticas quela hacenms o menosadecuadaparaciertosusos. Unodelosaspectosmsimportantesdelasdistribucionesessusistema deactualizacindepaquetesquepermiteactualizarelSOacadanueva versinteniendoencuentalasdependenciasentreunospaquetesyotros. Lasaplicacionesenformatobinariopuedenfuncionarenunadistribucin yencambionofuncionarenotra.Sinembargopartiendodelosfuentesde una aplicacin casi siempre basta con recompilar la aplicacin para obtenerunbinarioquefuncioneenesadistribucin.Estosedebealuso delibrerasdinmicasquepuedenvariardeunasdistribucionesaotras. Paraobtenerunbinarioquefuncioneencualquierdistribucinsepuede compilarunaaplicacinestticamentelocualhacequeelejecutablesea mucho mayor. Estos problemas estn en vas de solucin ya que las diferentesdistribucionesestnhaciendoesfuerzosdeestandarizacinpara que cualquier aplicacin pueda funcionar en cualquier distribucin de Linux.Entretodasellashayalgunasespecialmentefamosasporalgunau otrarazn.

Slackware esunadistribucintotalmentelibreymuysencillaenel sentido de que est poco elaborada. Resulta adecuada para cacharrearconella.FuecreadaporPatricVolkerding.Fueunade lasprimerasytuvosupocadegranaugeperoactualmenteha cedido protagonismo. No dispone de un buen sistema de actualizacin. Debian esunadistribucin totalmente libredesarrollada porun grupomuynumerosodecolaboradoresenelmspuroespritude Linux.Sucalidadesextraordinaria.Setratadeunadistribucin muyseriaquetrabajaporelplacerdehacerlascosasbienhechas sin presiones comerciales de ningn tipo pero que resulta ms adecuadaparausuariosconconocimientospreviosyaqueelgrado de amistosidad en especial para los novatos deja bastante que desearsisecomparaconalgunasdistribucionescomerciales.Los usuariostpicosdeDebiansonaquellosquetienencomomnimo algnconocimientotcnicoyquetampocotienenreparosalahora 16

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

deinvestigarunpocolascosas.Elidiomasobreelcualtrabajay secoordinaelgrupoDebianeselInglesyporejemplolosbugs deben ser reportados en Ingles. La seguridad, y la deteccin y rpidacorreccindeerroressonsuspuntosfuertes.Soportaun enormenmerodepaquetes.Esunadistribucintremendamente flexible.Susistemademantenimientodepaquetes'dpkg'tambin esdelomejor. RedHat esactualmenteladistribucinmsampliamentedifundida aunque eso no significa que sea la mejor. Ofrece un entorno amigablequefacilitalainstalacin.Incorporasoftwarepropietario degrancalidad.Elsistemadepaquetes'RPM'esmuybuenoy utilizadoporungrannmerodedistribuciones. SuSE Es una distribucin comercial alemana que ha tenido un crecimiento espectacular. Ofrece un entorno muy amigable que facilita mucho la instalacin. Seguramente es la ms fcil de instalarydemantener.CapacidaddeautodeteccindeHardware. Incorpora abundante software propietario de gran calidad. En generalsepuededecirqueesmuycompletaymuyrecomendable paracualquieraquenotengamuchosconocimientosdeLinux. Caldera Es una distribucin comercial. Ofrece un entorno amigablequefacilitalainstalacin.Incorporasoftwarepropietario degrancalidad.

Laeleccindeunadistribucinvienecondicionadapormuchosfactores. Haymuchasdistribucionesactualmenteycadapocoaparecennuevas.

17

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ALGUNOSCONCEPTOSBSICOS
Visinpanormica: Ensumomentotrataremoslostemasabordadosenestecaptulodeforma completa.Enestemomentodadoquepartimosdecerosehacenecesario al menos esbozarunaseriedeconceptos quesontanelementales que difcilmentesepuedeexplicaralgosinhacerreferenciaaellos. Porotraparteestosconceptosestninterrelacionadosdetalformaque tampocosepuedeabordarningunodeellosendetalleenestemomento. PorellonuestroprimerobjetivoesofrecerunavisinpanormicadelSO. Porborrosaqueresultesiempresermejorestoqueempezardirectamente abordandoendetallelostemas. UsaremosmuchasvecesdeformaindistintaUnixyLinux.Nosoncosas equivalentes pero en este curso consideraremos ambas cosas como equivalentessalvoqueconcretemosdetallesespecficosdeLinux.Para nosotrosLinuxesunSOtipoUnixyprecisamentenoscentraremosenlos aspectos ms generales de estos sistemas operativos. Entre sus caractersticas ms destacables est la de ser un SO multitarea y multiusuario.Unsistemamultitareaesaquelquepuedeejecutarvarios procesos simultneamente. Para ello se puede usar uno o ms procesadoresfsicos.Enelcasodeunsoloprocesadorloqueocurrees queeltiempodelprocesadorsevarepartiendoparaatenderlosdistintos procesos creando la ilusin de que todo ocurre simultneamente. Un sistema multiusuario es aquel que est pensado para ser utilizado por variosusuariossimultneamente.Enlaprcticaunsistemamultiusuario requierecapacidadmultitarea.EnelcasoconcretodeLinuxesademsun SOmultiplataformayaquepuedefuncionarendiferentesarquitecturas.

18

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Losconceptosquemencionemosenestecursoprocuraremosilustrarlos conejemplos. Elcomando'echo'esuncomandoquevamosausarmuchoparapracticar. Estecomandoselimitaavisualizarenpantallatodoaquelloqueselepasa comoargumentos.Poresonosresultarmuytil. Loprimeroquevamosapracticaryquenodebeolvidareselhechode que en Unix los ficheros, comandos etc. deben indicarse exactamente respetandoladiferenciaentremaysculasyminsculas.
$ echo hola $ ECHO hola

Lasegundalneahabrproducidounmensajedeerrorporquenoexiste ningncomandollamadoECHOconmaysculas. Variablesdeentorno: Empezaremoshablandodelasvariablessinprofundizarahoraenello. Unavariablesoloesunelementoquetieneunnombreyqueescapazde guardarunvalor.Paradefinirunavariablebastaponersunombreunigual ysuvalor.(Ojonodejarespacios).


$ VAR33=valor_de_la_variable_VAR33

EnUnixlasvariablesdelsistemasellamanvariablesdeentorno.Para consultarelvalordeunavariableseutilizaelnombredelavariable precedidopor'$'.


$ echo $VAR33

Paravertodaslasvariablesysusvaloresseutilizaelcomandoset.

19

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Parahacerlavariableexportableseusaelcomando'export'.Sepuede hacerqueunavariableseadesololecturaconelcomando'readonly'.Este comando sin parmetros mostrar todas las variables que son de solo lectura.Pruebeestoscomandos:
$ set $ readonly $ export

Existen algunasvariables predefinidas yhaytresvariables importantes quemencionaremosenseguidayqueson$PATH,$PS1y$PS2. Directorios: Aqutambintenemosquehacerunpequeoavancesobrelaestructura de directorios de Unixporque si nopuede que nose entienda lo que vamosahablarsobrelavariable$PATH. EnUnixlaestructuradedirectoriosesenformaderbolsimilaralade Msdos.Dadoquelaestructuradedirectoriosseorganizacomolasramas deunrbolparalocalizarunpuntocualquierahayqueutilizarcadauno de los directorios que conducen a ese punto desde el directorio raz. Nosotroslollamaremos caminoyenUnixselesuelellamarpath.Se empiezaeneldirectoriorazrepresentadopor'/'yseavanzaporlasramas deeserbolseparandocadaidentificadorporunnuevocarcter'/'.De esta forma '/usr/local/bin' indica un lugar concreto en el rbol de directorios.QuizssepregunteporquUnixusa'/'enlugarde'\'comoen Msdos.RecuerdequeMsdosfueposterioraUnixyqueaBillGatesle gusta inventar cosas totalmente nuevas y revolucionarias. Aunque el astutolectoryasehabrdadocuenta,adviertoalosdespistadosqueestoy ironizando. Aprovechandoqueestamoshablandodedirectoriosmencionaremosque haydirectoriosconsignificadoespecial.Esteldirectorioraz'/'queya hemosmencionado.Esteldirectorio'home'queeselpuntodondeel 20

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

sistemanossitaparatrabajarcuandoentramosenl.Recordemosqueen Unixnormalmentenodisponemosdetodoelsistemaparanosotrossolos. Luegopodemoscambiardedirectoriodetrabajo.Eldirectoriodetrabajo actualserepresentacomodirectorio'.',Eldirectorioanteriorodirectorio padredeestedirectorioserepresentapor'..'.Loscomandos'cd','mkdir'y 'pwd' sirven para cambiar de directorio actual, crear un directorio y averiguarenquedirectorionosencontramosactualmente. Estamosdandoideasenformaintuitiva.Enrealidadcuandodigo"...en que directorio nos encontramos actualmente ..." es una forma de expresarse. Normalmente el usuario no estar en un directorio sino sentado en una silla sentado delante de una pantalla, pero la shell mantieneentodomomentoalgndirectorioabiertocomodirectoriode trabajoactual. Comandos Uncomandoesgeneralmenteunficheroejecutablelocalizadoenalguna partedenuestrosistema.Existeunavariablellamada$PATHque contieneunalistadecaminosdebsquedaparaloscomandostodosellos separadospor':'.Compruebeelvalordesuvariable$PATH. $echo$PATH Siuncomandonoestlocalizadoenningunodeesoscaminosdeberser referenciadoindicandoelcaminocompletoyaquedeotraformanopodr serreferenciado.Siquieresaberdondeseencuentraunejecutableuseel comandowhich.Estecomandobuscarenloscaminoscontenidosenla variable$PATHhastaqueencuentreelcomandoyentoncesmostrarel camino completo que conduce al comando. Puede ocurrir que un comandoseencuentreduplicadoyquelosdossitiosdondeseencuentre figuren en el $PATH. En ese caso se ejecutar el comando que se encuentreenelprimercaminoreferenciadoenel$PATH.Igualmenteel comando which solo mostrar el primer camino referenciado en el 21

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

$PATH.Estamosusandouncomandollamadoechoparamostrarvalores. Vamosalocalizarlo. $whichecho Echo esta situado en uno de los caminos contenidos en $PATH. En resumidas cuentas $PATH es una variable que usa el interprete de comandosparalocalizarloscomando.Enlaleccinsiguientehablaremos de'man'.Esuncomandoquesirveparaconsultarelmanualenlneade Linux.Puesbienexisteunavariablellamada$MANPATHquecontiene lalistadeloscaminosdondeelcomando'man'debebuscarlaspginas delmanual.Lavariable$MANPATHserusadaporelcomando'man'y quizsalgnotro.Lavariable$PATHserusadaporlashellyquizspor algn otro comando como por ejemplo 'which' del cual acabamos de hablar. Somosconscientesdequenoestamosexplicandograncosaahora,pero sonconceptosmuyelementalesquevamosautilizarantesdeexplicaren profundidadtodoelsistemadeficherosdeUnix. Msadelantetambinhablaremosmsdetenidamentesobrelasvariables de entorno. Estamos dando unos pequeos esbozos sobre algunas cuestionesporquehaymuchainterrelacindeunosconceptosconotrosy resultaimposibleabordarnadaenprofundidadalprincipio. Usuarios Linuxesunsistemaoperativomultiusuarioyesoimplicaunafilosofade uso muy distinta a la del tradicional ordenador personal. Cuando un usuario va a usar un SO Tipo Unix lo primero que necesita hacer es identificarseparaserautorizadoaabrirunasesindetrabajo.Tambines multitareayporelloenelmismoinstantevariosprocesospuedenestar funcionando y cada uno puede pertenecer a usuarios distintos. La informacinqueseguardaeneldiscodurotambinpuedepertenecera distintosusuariosyparaevitarquetodoelloprovoqueconflictosexisten 22

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

unosatributosdeusuarioqueseasocianalosficherosalosdirectorios,a losprocesos,etc.Enfuncindeestohaycosasqueestarnpermitidasa ciertosusuariosyaotrosno. Losusuariospuedenestarorganizadosendiferentesgruposafindepoder manejar permisos a nivel de grupo. Esto se hace para simplificar la administracindelsistema. Losusuariosylosgruposdentrodelsistemasemanejancomounnmero llamadoUIDyGIDrespectivamente.Losnmerosenunordenadorse manejanconmuchamsfacilidadqueunliteral.Poresoelnombrede usuarioyelnombredegruposeguardarnsoloenunficherojuntoal nmeroUIDyGIDasociado,peroparaelsistemaunusuario,ungrupo, unproceso,unfichero,ymuchasotrascosasseidentificanporunaclave numrica.Paraunordenadorresultamssencilloconsultarsielproceso 456pertenecientealusuario105tienepermisodeescrituraenelfichero 48964queconsultarsielusuario'pepito'pertenecientealgrupo'alumnos' tiene permiso de escritura en el fichero '/home/pepito/leccion005.txt'. Cuandoelordenadortienequemostrarinformacinenformatointeligible buscarladescripcincorrespondienteacadaclavenumrica.Cadaclave recibe un nombre como por ejemplo los UID, GID que ya hemos comentadootraseraporejemploelPID,paraprocesosyexistenotras muchasmsqueiremosaprendiendoyqueformanpartedelajergade esteSO. Para ver los datos de identificacin relativos a su usuario pruebe lo siguiente: $ id El comando 'id un' o el comando 'whoami' muestran su nombre de usuario. $ whoami 23

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Existe un usuario especial que goza absolutamente de todos los privilegiosyquesellamaroot.SunmerodeusuarioesdecirsuUIDes 0. ElNcleodelsistema(kernel) Elncleodelsistemallamadotambinkerneleselencargadoderealizar lamayoradefuncionesbsicasdelsistemaygestionaentreotrascosasla memoria,losficheros,losusuarios,lascomunicaciones,losprocesos,etc. Lagestindeestascosassehacenpormediodeunlimitadonmerode funcionesquesedenominanllamadasalsistemayquepuedenserusadas porlosprogramas.Losprocesosqueusanunallamadaalsistemacambian sumododeejecucin.Mientrasestnejecutandolallamadadelncleose dicequeestnenmodoncleoycuandoestnejecutandocdigoqueno pertenecealncleosedicequeestnenmodousuario.Sondosnivelesde ejecucindistintosyaqueelmodoncleoesunmodoprivilegiado.Esto garantiza a nivel de hardware que ningn programa de usuario pueda accederarecursosgeneralesdelsistemaniinteractuarconotrosprocesos anoserqueuselasllamadasdelncleolascualesestablecernsitieneo nopermisoparahacerciertascosas.Estoproporcionagranrobustezde funcionamiento. Un programa mal diseado no perjudicar jams al sistema ni a otros procesos. Cada proceso tiene su propia zona de memoria y no puede acceder fuera de ella ni intencionadamente ni accidentalmente. Para que un programa pudiera tener un efecto destructivoenelsistematendraquepertenecera'root'operteneceral propioncleodelsistemaysoloeladministrador'root'puedealterarel dicho ncleo. Si el ordenador aparece un buen da destrozado a martillazostambinbuscaranlaformadeculpara'root'paranoperderla costumbre. Procesos Unprocesoadiferenciadeunprogramaesalgovivoesdeciralgoque estfuncionando.Enunsistemamultitareacomoeste,unprogramapuede dar lugar a varios procesos. A cada proceso le corresponder con un 24

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

nmero de identificacin llamado PID que le identifica totalmente. Ademsdeestoseguardalainformacindeidentificacindelusuario propietario.Cuandounusuarioejecutauncomandosearrancaelproceso correspondientedelcualgeneralmentepermanecercomopropietario.Es decirelsistemanoaceptardenesannimas.Siemprefigurarunusuario parahacercadacosa.EstoseindicaconunnmeroUIDparaidentificar elusuariocorrespondiente.NosiempreesteUIDsecorrespondeconel usuario que arranc elproceso.Porelloexisteadems deunUID un identificadordeusuarioefectivo(EUID)queeselquerealmenteestenido encuentaporelsistemaalahoradeconcederpermisoparahacerciertas cosas. El EUID de 'root' es 0. Ahora no importa como pero algunos comandosdeformabiencontroladapodranconvertirnosvirtualmenteen superusuarioshaciendoquesuEUIDvalga0.Estoserviraporejemplo parapermitirhacercosasespecialesymuyconcretasnadamsqueen condiciones normales solo 'root' podra hacer. No hemos mencionado intencionadamentealgunascosas(comoporejemploelgrupodeusuario), porqueestamossimplificandomuchointencionadamenteparaintentarque enestemomentosolocapteunaprimeraideageneral. Sisesienteunpocomareadoyconfusoreljeseyacostmbreseaesta sensacin. Los primeros pasos suelen ser los ms complicados. EspecialmenteenUnixporquenofuediseadocomounsistemaintuitivo.

25

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ELMANUALDELSISTEMA
man(1),apropos(1) Generalidadesdelmanual ManeselmanualenlneadetodoslossistemasoperativostipoUnix. Estanoeslaleccinmsatractivadeestecursoperosiqueesunadelas msnecesarias.Unodelosobjetivosdelcursoesalcanzarciertonivelde autosuficienciaenLinux.Mannoeslanicafuentedeinformacinpero frecuentementesueleserelprimersitiodondesesuelemirar.Siusted haceunaconsultaenunalistadeusuariosdeinternetdeLinuxsobreun temaquepodrahaberaveriguadoporsimismoconsultandoelmanual alguienlerecordar(entonomsomenosamabledependiendodelda quetenga)queesainformacinestabaenelmanual. Sepuedenexplicarmuchascosassobremanperoesimprescindibleque practiqueusted.Paraellodeunrpidoprimervistazoalapginaman relativaalcomandoman. Mientras no indiquemos lo contrario conviene que pruebe todos los comandosqueseindicanamododeejemplo.Sitieneposibilidaddeusar dossesionesleresultarmscomodopracticarsobrelamarcha.Teclee ahoraelcomandosiguiente: $manman Habrvistoundocumentoqueexplicaelusodemanyquetieneuna estructuracaractersticadetodaslaspginasman.

26

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Laspginasdelmanualutilizanunformateadordedocumentosllamado troff.Permiteespecificarelestilodeundocumento.(Maneraenquese ven los ttulos, encabezados, prrafos,donde aparecen los nmeros de pgina,etc.Debidoasuflexibilidadtroffresultabastantedifcildeusar. nroffygroffsirvenparalomismoperonoexplicaremossusdiferencias. Pensamos que solonecesitar conocersuexistencia.Sinoinstalaestos programasnopodrusarmanensuordenador. Otroejemplo.Paraobtenertodalainformacinrelativaalcomando'ls' hagalosiguiente: $manls Cuandonoseconoceexactamentelapalabraquesedeseabuscarsepuede buscarporpalabraclave.Paraellousaremoslaopcink,ylaopcinf. Estaopcinnoestdisponibleenmuchossistemasdebidoaquehayque generar referencias y esto consume mucho espacio en disco. El administradorpuedegenerarlasreferenciasusandoelcomando'catman' Cuandonoconocemoselnombredeuncomandoytampocoencontramos nadaporpalabraclaveperosabemosqueesloquehacepodemosusarel comando'apropos'.Comprubelotecleandolossiguientescomandos: $aproposman $aproposapropos $manapropos Si tiene su sistema Linux correctamente configurado para imprimir documentosenformatoPostScrippodrimprimirunapginadelmanual haciendo $mantman|lpr

27

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Seccionesdelmanual Paraindicarenundocumentounareferenciaaunapginadelmanualse sueleindicarconelcomandoseguidodelaseccinentreparntesis.El ttulodeestaleccin'man(1)'esunejemplo.Paraconsultaruncomando en una seccin concreta habra que teclear man <nmero_seccin> <comando_o_funcin>. Veamos un par de ejemplos con printf(1) y printf(3). $man1printf $man3printf Comohabrpodidoobservarserefierenacosasdistintas.Enelprimer casoprintfesuncomandoyenelsegundounafuncinestndardeCcon elmismonombre.Sinoseindicalaseccinlabsquedasellevaacabo en todas las secciones de manual disponibles segn un orden predeterminado,yslosepresentalaprimerapginaencontrada,incluso siesapginaseencuentraenvariassecciones.Porelcontrariousandola opcinapresentar,secuencialmente,todaslaspginasdisponiblesenel manual.Compruebeestoconlossiguientesejemplos: $manprintf $manaprintf Consultelasseccionesqueestndisponiblesensusistemaen man(1). Acabamosdeindicarloquesignificaman(1)asqueelastutolectorya deberaestarmirandoenlaseccin1delmanual. Conclusiones Parafinalizartambinmencionaremosotrafuenteimportantedeconsulta enLinuxquesonlosHOWTOsylosFAQs.Estossondocumentosque explicancomohaceralgoolaspreguntasmsfrecuentesrelativasaun determinado tema. Este tipo de documentos monotemticos son 28

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

frecuentes en Linux. Proceden de contribuciones desinteresadas de usuarios bien informados y estn disponibles en distintos formatos (HTML.textoplano,etc).Suelensermsdidcticosquelaspginasde man, pero man es la referencia obligada para cada comando y cada funcinimportante.Nosevitatenerquerecordartodaslasopcionesde cada comando ya que frecuentemente cada comando tiene un amplio juego de opciones.Hayalgunos documentos enespaolespecialmente adecuadosparanovatos. Hemos visto unas pocas opciones del comando man. Intente utilizar algunas otras opciones. Es importante que se familiarice con l. Las pginasmannoestnpensadasparaensear,perocadavezquetengauna dudadecomoseutilizaalgotendrquerecurriraellascomoprimera fuentedeinformacin. Con esto pretendemos que abandone usted algunas de sus viejas costumbres.Antesustedpensabadelasiguientemanera: Sifuncionaaceptablementeparaquetocarlo. Sinofuncionaapagamosyvolvemosaencender Sinadadeestosirvellamamosaunamigo. Ahora ya sabe que tambin puede optar por una lectura del manual. Hgalo pero consulte de momento solo la informacin relativa a los nmeros de seccin, partes de un manual, y las opciones a, k, t. Asumimosquenoesnecesariolalecturaenprofundidadporquehabr cosasqueaunnopuedeinterpretar.Tengaencuentaquepartimosdeun nivelcero.Annosabeustedloquesignificanalgunascosas.Poresouna vezfinalizado elcursoconvendrquevuelvaamirarestapginaman relativaalcomandomanparasacarlemsprovecho.

29

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

LASHELL
sh(1)ksh(1)csh(1)bash(1) IntroduccinalashelldeUnix ExistenvariasshellsparaUnix,KornShell(ksh),BourneShell(sh),C Shell(csh),ymuchasms. Existenalgunasparapropsitosespeciales. PorejemplolaremoteShell(rsh)seutilizaparaejecutarcomandosenun ordenadorremoto.LaSecureShell(Ssh)seutilizaparaestableceruna conexinseguraconunordenadorremoto. LamsutilizadaenLinuxeslaBourneAgainSHell(bash). NosotrosdemomentovamosatratarprincipalmentelaBourneShellque eslamsestndar. La KornShell y la Bash son distintos superconjuntos distintos de la BourneShell y por ello todo lo que se diga para la BurneShell ser vlidotambinparalaKornShellyparalaBash. EnLinuxsesueleusarlaBourneAgainSHell(bash),comosustitutadela BourneShell (sh). Puntualmente tambin explicaremos alguna peculiaridaddelabash. Parasaberqueshellestusandoustedhagalosiguiente: $ps|grep$$ Siaparecebashoshpuedecontinuarsinproblemasyaqueestusando unashelladecuadaparapracticarloquevieneacontinuacin.Encaso 30

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

contrariotecleelcomando'sh'oelcomando'bash'antesdecontinuar. Vuelvaarealizarlacomprobacinanterioryverqueahoraestausando otrashell. EncualquiercasocualquierShellesunprogramanormalycorriente,pero incorporamuchosdelosconceptosmsprcticosdeUnix.Notienenada departicularquealgunossistemasincorporenalgunasShellsdistintas. UnaShellnoessolounintrpretedecomandos.UnaShellessobretodo unintrpretedeunpotentelenguaje. Estructuradelalneadeorden Sabeustedloqueesunintroductor?(eningleslollamanprompt).Pues esaquelloqueelinterpretedecomandosmuestraparaindicarqueest esperandoaqueseintroduzcaunaorden.EnUnixelintroductordela orden de comandos no es siempre el mismo. Por defecto suele venir configuradodistintosintroductoresparadistintosinterpretesdecomandos ytambinseusaunintroductordistintoparaelusuarioroot.Sinembargo elintroductorpuedeservariadoyaqueesalmacenadoenunavariabledel sistema.Enrealidadlashellutilizadosintroductoresdistintos.Paraver cualesestutilizandoahoratecleelosiguiente: $echo"Introductor1=$PS1" $echo"Introductor2=$PS2" Cuandoapareceelprimerintroductordelsistema$PS1indicaquelashell est esperando la introduccin de unaorden. Las ordenes se terminan mediante.Sidespusdepulsarlashellnoconsideraqueelcomandoeste completo quedar esperando ms entrada mostrando el segundo introductor$PS2. Sialgunaveznoescapazdeterminarlaintroduccindeuncomando pruebeaabortarusando<CtrlC>

31

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Unaordenconstardeunnmerovariabledeelementosseparadospor blancos,opor<tab>. En una orden se pueden distinguir comandos, opciones, argumentos, metacaracteres, comentarios, comandos internos...etc. Los blancos se usanparasepararlasopcionesyargumentospresentesenunalineade ordenes y usados de esta forma (como separadores) una secuencia de blancostieneelmismoefectoqueunosolo.(OjoenUnixlasmaysculas yminsculassonsignificativas.) Acontinuacinsemencionadeformanoexhaustivaloselementosdel lenguajeshellscript.Nointentamosqueseaprendatodosestoselementos nivamosacomentarahoratodosellos.Bastarquesehagaunaideade quetiposdeelementospuedenintervenir.

Comandos:

Sonficherosejecutables.Paraquelashelllocaliceelcomandodeber estarenunsubdirectorioqueformepartedelavariablePATHodelo contrariodebeespecificarseelcaminocompleto.

Opciones:

Generalmentelasopcionesdeuncomandosonletrasprecedidasdeun signo''.Enalgunoscomandossepuedenponervariasopcionescomo varias letras seguidas precedidas del signo ''. Algunas opciones pueden venircomo'<opcion>'yconcretamente enLinuxesmuy frecuentepoderusarlasopcioneshelpyversionencasitodoslos comandos. Precisamente con la opcin help obtendremos generalmente la lista de opciones disponibles para un comando. Tambin es frecuente el uso de opciones precedidas por '+'. En algunoscomandoselordendelasopcionesesmuysignificativo.No merece la penahablar ms de esto ahoraporque vamos ausarun montn de comandos con un montn de opciones en este curso y tendremosocasindepracticarmuchoconellas. 32

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Metacaracteres:

Tienenunsignificadoespecialparalashellysonunodelossiguientes caracteres: ;&()|>><espacio><tab>

Operadoresdecontrol:

||&&&;;;()|<nuevalinea>

argumentos: Son literales tomados como parmetros de entrada para algn comando. comentarios: Todo lo que sigue al carcter '#' hasta <nuevalnea> ser un comentario. Palabrasreservadas:

Sonpalabrasreservadasparaimplementarellenguajeshellscript.Son palabrasreservadas: case, do,done,elif,else,esac,fi,for,function,if,in,select,then, until,while,time.

Comandosinternos:

Comandos que estn implementados dentro de la propia shell. No necesitanPATH.Ejemplosdecomandosinternosson: cd,exec,arg,eval,exit,... Paraunareferencia exacta ycompleta debera acudiralapginaman bash(1)aunqueesoresultaraexcesivoenestemomento.

33

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Vamos a dar una serie de ejemplos para que los practique en su ordenador.Noesnecesarioqueintroduzcaloscomentarios.
$#Ordenconunnicocomandosinopcionesniargumentos $ls $#Ordensinocionesperocontresargumentos $ls./.. $#Ordenconuncomandoyunaopcin $lsl $#Ordenconuncomandoytresopcionesindicadadevariasformas $#distintasperoequivalentesentresi.

$lstrl

$lsrtl $lsltr $lsltr $lsltr $lsltr $lsltr $#Opcionesqueempiezancon'' $lshelp $lsversion $lscolor=auto $#Ejemplodeopcionesyargumentossensiblesalorden. $datednowR $datedRnow $#ejemplodeopcionqueempiezapor'+' $date+'%a%b%e%H:%M:%S%Z%Y'

Expansindelalineadeorden:

34

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Existeundetallemuyimportanteenelfuncionamientodelashell.Una cosaesloquenosotrosescribimosyotraloquelashellordenaquese ejecute.Antesdequelashellejecutecomandoalgunoexpandelalneade ordenes.Esdeciresalneasetransformaenotralneamslarga.Laorden resultantepuedesermuylargaytenermuchosargumentos.Porejemplo un'*'sersustituidoporlalistadeficherosqueseencuentrenenel directorioactual.Quizsalguienencuentrequeexisteunparecidoconel usode'*.*'enMsdosporejemploperoelparecidoesmuysuperficialy engaoso.CuandoenUnixhacemos'ls*'elintrpretedecomandos expandeelasteriscoyelcomandolsrecibeunalistadeficherosquetiene quelistar.EnMsdoscuandohacemos'dir*.*'elinterpretedecomandos noexpandenada.Elcomandodirrecibecomoargumentonolalistade ficherosquetienequelistarsinoun'*.*'yserelpropiocomandodir quientengaqueexpandirelargumentoparaobtenerlalistadeficheros quetienequelistar.PorlotantolaexpansinenUnixestcentralizadaen elinterpretedecomandoselcualpermitehacerexpansionesmuchoms potentesqueenMsdos.Uncomandonoesmsqueunejecutableylos ejecutablesgeneralmenteadmitenargumentos.EnUnixloscomandos tomanlosargumentosquelespasalashelldespusdelaexpansin. El'*'seexpandeenbasealosnombresdeficherospresentesennuestro directorioactual,sustituyndoseporunacadenadecaracterescualquiera quenoempieceporunpunto. Vamosarealizarunaprcticacompleta.Algunosdeloscomandosque vamos ausar como'cd','mkdir','touch'yotrossoncomandos queno explicamos en este momento pero que servirn para situarnos en un directoriodetrabajoycrearalgunosficherosparalaprctica.

$comando... salidadel comando... 35

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ahora introduzca los comandos que indicamos a continuacin y compruebelasalidaobtenida. $cd/tmp $mkdirpruebas $cdpruebas $#Yahemoscreadoundirectoriodepruebasyyaestamos dentrodel. $#Paracomprobarlohacemos $pwd /tmp/pruebas $#Ahoracreamosunosficherosparapracticar $touchkk1kk2kkkkkk.txtkk.docj2.txt.kk $echo* kk1kk2kkkkkk.txtkk.docj2.txt $echok* kk1kk2kkkkkk.txtkk.dox $echo*xt kk.txtj2.txt $echo*. $echo.* .kk $echo*.* kk.txtkk.docj2.txt Fjese que los resultados dependen de los ficheros existentes en el directorioactual.Losmismoscomandosrealizadosdesdeotrodirectorio distintodaranotroresultado. Mantengalasesindelaprcticaenestepuntoporquecontinuaremos haciendoalgunasprcticasmsdesdeestemismopunto.

36

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

El'?'seexpandecomounnicocarcterytampocoexpandeunpuntoen el comienzo del nombre del fichero. Introduzca ahora los siguientes comandosycompruebelasalidaobtenida. $echo??? kk1kk2 $echokk? kk1kk2 Acontinuacinnotecleenadayaqueelresultadoessolounahiptesis. Supongamosqueobtenemosunerrordeestetipo. $ls* ksh:/bin/ls:arglisttoolong Estosignificaqueel'*'seexpandeenunnmerodemasiadograndede ficherosyesoresultaunproblemaparaelinterpretedecomandos.La formadeobtenerlalistadeficherosserahaciendo: $ls Otambin. $ls. Siquisiramosaveriguarelnmerodeficherospodramoscontarloscon 'wc'.Aquestamosusandoun'|'queaunnohemosexplicadoperoquelo explicaremosenelprximocaptuloderedireccindeentradasalida. $ls|wcl

37

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

PeculiaridadesdeexpansinenlabashdeLinux Solovamosamencionarunascuantasyremitimosallectoralapgina delmanualdebashparamsinformacin.

Expansindecorchetes.

Esteesuntipodeexpansinquenotieneparanadaencuentalos ficherosexistenteseneldirectorioactual. $echoa{d,c,b}e adeaceabe

Expansindelatilde.

Estaesunacaractersticaespecial delashelldeLinuxqueresulta realmentetil.Expandelatildecomodirectoriohome. $echo~ $echo~root $echo~root/*

ArithmeticExpansion.

Estopermiteexpandirexpresiones$((expression)) $echo$(((4+11)/3)) 5 Enbash(1)enelapartadodeEXPANSIONsemencionanmscosas.

38

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Redireccindeentradasalida: Normalmente los procesoutilizan para entrada y salida de datos unos dispositivos estndar. Son entrada estndar, salida estndar y salida estndar de errores. Generalmente se utiliza como entrada estndar la entradadetecladoycomosalidaestndarysalidaestndardeerroresla pantalla.Lasalidaestndarseusacomosalidanormaldedatosylasalida estndardeerroresseusaparasacarmensajesqueindicanalgnerror, aunquetambinseusasimplementecomoflujoalternativoencasodeque noresultedeseablesumezclaconotrosdatosquedebensalirporsalida estndar. Sepuedealterarflujodedatosquevadesdeundispositivoestndaraun programa o viceversapuedeserredirigidoaotrodispositivo,oaotro programa,ofichero,etc. Desdelashellsepuedehacerestodevariasformas.

>

Redirigelasalidaestndaraunficheroodispositivo.

<

Redirigelaentradaestndartomndoladesdeunfichero.

Comunicadosprocesospormediodeentradasalida.Ojonoconfundir conMsdos.EnUnixlosprocesoscomunicandirectamentepasndose losdatosdirectamentesincrearningnficherotemporal.Elproceso queleequedaraenesperamientraselelprocesoqueescribemantenga abiertoeldispositivodesalidaestndarinclusosimomentneamente noseproducesalida.Cuandoelprocesoescritorterminacierratodos 39

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

susficherosyelprocesolectoracusarlacondicincomounfinde datosdeentrada.

>>

Redirigelasalidaestndaraunficherosinsobrescribirlo.Enlugarde elloaadealfinaldelmismo.

<<FIN

Redirigeentradaestndardesdelapropialneaderdenes.(Enlugar deFINsepuedeusarcualquierliteral).

2>

Redirigelasalidaestndardeerroresaunficheroodispositivo.

2>&1

Redirigelasalidaestandarddeerroresdondeestaredirigidolasalida estndar.(0=entradaestndar,1=salidaestndar,2=salidadeerrores estndar) Ejemplos Laordensiguientenoproduceningnresultadovisibleporquelasalida estndarseredirigealdispositivo/dev/null.Estedispositivoescomoun pozosinfondo.AdiferenciadeunapapeleradeWindowsnosepuede recuperarluegonada. $date>/dev/null Ahoraunejemplocurioso.Elcomando'time'sirveparamedirconsumos detiemposdeotroscomandosyparaevitarmezclasdedatosensalida

40

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

estndarsedecidiquelasalidanormaldetimefueralasalidaestndar deerrores. $timewhoami>/dev/null Podemosverelconsumodetiempodelcomando'whoami'porqueeste saleporlasalidaestndardeerrores.Esunejemplodeutilizacindela salidaestndardeerroresparasacarinformacinquenotienenadaque verconningnerror.Sinembargotimeesuncomandointernoyporello losiguientenofuncionaracomoustedpiensa. $timewhoami2>/dev/null Enestecasolaredireccinafectasoloalcomandowhoami. Los comandos internos sonpartedela shell ypararedirigir susalida habraqueredirigirlasalidacompletadelashell.Dejaremosestoparaun captuloposterior. Antesdecontinuarvamosaasegurarnosqueestamosenunsitioseguro paratrabajar. $cd/tmp $mkdirpruebas>/dev/null $cdpruebas $#Paracomprobarqueestamosen'/tmp/pruebas'hacemos $pwd /tmp/pruebas Elcontenidode'/tmp'sueleservaciadocuandorearrancalamquinao quizsenalgnotromomento.Contieneinformacintemporal.Hemos usado/dev/nullparaignorarlasalidadeerroresdelcomandomkdir.Siya exista '/tmp/pruebas' mkdir habra dado un error pero nosotros lo 41

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ignoramosporquesolonosinteresaquelocreeencasodequenoexistay encasocontrariodaigual.Eldispositivo'/dev/null'tambinresultatil parasimularunaentradanuladedatos.Porejemploparacrearunfichero vaci.Siyaestamossituadosen'/tmp/pruebas'pruebelosiguiente: $cat</dev/null>kk $lslkk Elmismoefectopodramosconseguirusando. $>kk $lslkk Esto se puede utilizar para vaciar ficheros respetando los permisos originales. Vamosmirarelcontenidodeldirectorioraz $lsl Ahoraqueremosrepetirelcomandoperoguardandoelresultadoenel ficherokk $lsl/>kk Novemosnadaporquetodalasalidavaapararalfichero.Paravisualizar elcontenidodeunficherousaremoselcomando'cat'. $#Mostrarelcontenidodelficherokk. $catkk

42

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

$#Equivalealanterior. $cat<kk $#Parecidoalosdosanteriores./dev/ttyesundispositivoque $#seidentificacomonuestroterminal. $cat<kk>/dev/tty Tambin podemos visualizar la salida de un comando a la vez que guardamos la salida en un fichero. El comando tee acta como un bifurcacin. $lsl/|teekk1 $catkk1 Recuerdequeloquesigueaun'|'hadesersiempreunejecutable. $touchkk $date|kk Estohabrdadounerror.Probemosahoraaredirigirlasalidaestndarde erroresaunficheroylasalidaestndaraotro. Stouchkk $date|kk2>errores>salida $caterrores $catsalida Existeuncomando'yes'quesirveparagenerarcontinuamenterespuestas afirmativasenformadecaracteres'y'yfinalesdelnea.Estecomando estpensadoparaserusadocon'|'yproporcionarentradasafirmativasa uncomando.Usaremoselcomando'head'quesirveparasacarporsalida 43

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

estndarsolounaprimerapartedelosdatosdelaentrada.Lacantidad datospuedeespecificarseennmerodelneasenbytes,etc..Nosotros vamosautilizarbytes.Lasalidade'yes'laentregaremosaheadparaque tomelos 1000primeros bytes quepasamosalprograma'wc'paraque cuentelneaspalabrasycaracteres. $yes|headbytes=1000|wc 5005001000 Tuberarota Elcomando'yes'podrafuncionareternamente.Susalidaredirigidapor lasbuenasaunficherollenaraeldisco(cosanadadeseableporcierto)y acabara dando un error. En lugar de esto lo hemos redirigido a un programaqueaceptarsololos1000primeroscaracteresyluegocerrar suentradaprovocandounerrordeTuberarota. Lashelltambinpermiteintroducirdatosenunaformaespecialquese llamadocumentoaqu.Paravariarunpocousaremosahoraelcomando 'sort'quesirveparaordenar.Observequeenesteejemplounfindelnea noterminaelcomando.Porelloaparecerelintroductorsecundario$PS2 quenosotrosindicamosconun'>'enamarillo.
$ # Para ordenar unas lineas que introducimos en la propia linea de $ # ordenes usamos el operador '<<' seguido de una clave de $ # finalizacin, de la entrada. $ sort <<FIN > aaaaa > cccccc > zzzzz > bbbb > yyyy > FIN aaaaa bbbb cccccc

44

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html yyyy zzzzz

Operadorgrave: Cuando colocamos algo dentro de las comillas graves '`' la shell lo interpretaracomounacadenacuyovaloressustituidoporelresultadode esecomandoqueproduceesecomandoensalidaestndar. $echodateproduce`date` dateproducelunene1020:59:12CET2000 Elresultadoessolounejemploynopuedecoincidirexactamenteconel resultadoobtenidoporustedyaquedeberaponerlafechacorrectaensu sistema. Quizaselejemploqueacabamosdeusarnoledeunaideaexactadela potencia del operador grave. Recuerde que esto ocurre durante la expansindelalneaderdenesantesdeejecutarseelcomandoecho.Por ellopodemoshacercosascomolassiguientes. $#Ejecutamosdateyguardamoselresultadoenunficherocuyo $#nombreconstruimosenbaseanuestronombredeusuarioyal $#aodelafechaactual. $date>fichero`whoami``date+%Y` $lslfichero* $catfichero* Hemosusadouncomandoparaconstruirelnombredelficherodesalida. No mostramos los resultados pero confiamos en que ya los ha comprobado.

45

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Caracteresdeescape: Dado que la Shell interpreta caracteres. Blancos como separadores. Asteriscoseinterrogacionescomocomodines.Operadorgrave.Comillas dobles,Comillasnormales,$,etc...Seplanteaelproblemadequehacer cuando queremos usar estos caracteres como tales sin que sean interpretadosporlashell.Existenvariasformasdeescaparcaracterespara quelashellnolosexpanda,ointerprete. Lashellnoelnicoprogramaconcapacidaddeexpandireinterpretar caracteres especiales. Por ejemplo find, egrep, sed, y otros tambin interpretanciertoscaracteresqueademspuedencoincidirconalgunosde los que interpreta la shell. Para usar caracteres especiales que pueden interpretarseporlashellhabrqueescaparlossiemprequedeseemosque lleguenalcomando. Vamosavertresformasdistintasdeescaparcaracteres:

Cuando usamos las dobles comillas, los comodines asterisco, interrogacinycaracteresenblanconoseinterpretan,aunquesise interpretan'$',comillasgraves'`',yotros. Cuandousamoscomillassimplesserespetatodoelcontenidode lacadenasinexpandirnada. Cuando usamos el carcter '\' escapamos el carcter que va inmediatamente despus. Cuando es un carcter que tiene un significadoespecialparalashell,dejardeteneresesignificado especial.

Vamosavertodoestoconunosejemplos: $#Laordensiguientemuestraelmismoliteralqueelentrecomillas. $echo"**?*" $#Enestecasolashellinterpreta`pwd`y$PATH,encambio'*'y $#'?'noseinterpretan. 46

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

$echo"*?`pwd`$PATH" $#Enestecasoseconservatodoelliteralsininterpretar. $echo'*?`pwd`$PATH' $#Acontinuacinlaordenmostrardoscomillasdobles. $echo\"\" $#Elcaracter<nuevalinea>tambinpuedeserescapadoyeneste $#casopuedeservirparaintroducircomandosmuylargosdeforma $#mslegible.Parahacerestapruebadeberpulsarlateclade $#<nuevalinea>justoacontinuacindelcaratcter'\' $lsl/|\ $headn10|\ $tee/tmp/resultado|\ $wc Ejercicio: Lassiguientesrdenesproducenresultadoscuyaexplicacinnoresulta trivial.Estoesdebidoaquepermitimosconlaopcinequeelcomando 'echo'interpretecaracteres.Porlotantoloqueocurreesqueprimeroel intrpretedecomandosinterpretaloscaracteresdelalneaderdenesy luego el comando echo interpreta los caracteres recibidos. Consulte la pginamandeecho(1)ybusquelaopcine.Ejecuteloscomandosque leproponemosacontinuacineintenteexplicarlosresultados.Puedeque necesitepapelylpiz. $echoe\n n $echoe\\n

47

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

$echoe\\\n $echoe\\\\n \n$echoe\\\\\n \n$echoe\\\\\\n \ $echoe\\\\\\\n \ $echoe\\\\\\\\n \\n Resumen Hemosvistomuchascosasquenospermitenhacernosideadelapotencia delaBourneShelldeUnix.LabashdeLinuxesunsperconjunto.Es decirescompatibleperomspotente. Queremosresaltarqueparalaspersonasquehanconseguidoterminareste captuloyasehaconseguidoalgoimportante.Personasacostumbradasal usosdeMsdoscometenbarbaridadesqueluegonisiquierasoncapacesde explicar. La clave muchas veces est en la expansin de la lnea de rdenes. En realidad este tema no est agotado ni mucho menos y lo completaremos encaptulos posteriores aunqueintercalaremos material msligeroporquenodeseamoshacerlesufrirdemasiado.Sololojustoy porellocreoqueeselmomentodeconfesarqueexistauntrucopara realizarmsfcilmenteelejercicioanterioraunquenolomencionamos antes porque habra resultado demasiado fcil y cmodo. Se trata de activar la trazadelashellcon'setx'.Deestaformapodemosverel resultadodelaexpansindelneaderdenesprecedidaporelsigno'+'. $setx 48

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

+setx $echoe\\\\\\\\n +echoe'\\\\n' \\n $set+x +set+x Puede utilizar este truco cuando no sepa que est ocurriendo con la expansindeunalneaderdenesquenofuncionacomoustedpensaba.

49

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

INTRODUCCINALOSPROCESOS
Queesunproceso A estas alturas ms de uno empezar a preguntarse si realmente es necesarioconocertodosestosdetallesparaunsimpleusodeunSO.Este cursoestaorientadoalusodeLinuxdesdelaconsolayresultanecesario conocer estas cosas incluso para un usuario normalito. No vamos a describir detalladamente como estn implementados los procesos en Linux. Quizsparauncursodeprogramacinavanzadasifueranecesario,pero lo que nosotros vamos a describir es nicamente los detalles ms importantesdesdeunpuntodevistadidcticoyprcticoparaunusuario normal. Enunsistemamultitareatodofuncionaconprocesosasqueconocerunos cuantos principios bsicos sobre procesos le resultar de la mxima utilidad. En un sistema monotarea se usa frecuentemente el trmino programaindistintamenteparahablardeunprogramaenpapel,encdrom, endiscodurooenfuncionamiento.Enunsistemamultitareanosedebe usareltrminoprogramaparahablardelaejecucindelmismo.Ensu lugar hablaremos de proceso indicando con ello que esta arrancado y funcionando.Unprogramapuededarlugaravariosprocesos.Porejemplo en un mismo instante varios usuarios pueden estar usando un mismo editor.Unprocesopuedeestardetenidoperoadiferenciadeunprograma existeunainformacindeestadoasociadaalproceso.Unprogramaes algo totalmente muerto. Un proceso detenido es ms bien como si estuvieradormido. Losprocesostienenorganizadalamemoriadeunaformaespecialmuy eficiente.Porejemplolaprtedecdigodelprocesoesunapartedesolo 50

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

lecturaypuedesercompartidaporvariosprocesosalavez.Imaginemos quehayvariosusuariosenelsistemausandounmismoeditor.Enese casoseraundesperdiciotenerlamismainformacindecdigodeese programarepetidavariasvecesenmemoriayocupandounrecursotan valiosocomoeslamemoriaRAM. Enelcasodetenervariosprogramasdistintosenejecucintambinse suele dar el caso de que contengan partes comunes de cdigo pertenecientes alibreras que contienen grancantidad defunciones de propsitogeneral.Parahacerunusoeficientedeestaslibrerasexisten librerasdinmicasdeusocompartido.EnLinuxelusodeestaslibreras noestorganizadodeunaformaunificadaparatodaslasdistribuciones por lo cual los ejecutables binarios pueden ser incompatibles entre distintasdistribuciones.Esteproblemasepuedesolucionarpartiendode los fuentes y recompilando la aplicacin en nuestro sistema. Por esta raznunbinariodeRedHat,oSusepuedenofuncionarenSlackwareoen Debian. PIDyPPID A cada proceso le corresponder un nmero PID que le identifica totalmente.Esdecirenunmismomomentoesimposiblequeexistandos procesosconelmismoPID.Lomismoquetodoslosprocesostienenun atributoPIDqueeselnmerodeprocesoqueloidentificaenelsistema tambinexisteunatributollamadoPPID.Estenmerosecorrespondecon elnmeroPIDdelprocesopadre.Todoslosprocesosdebendetenerun proceso que figure como padre pero entonces que ocurre si un padre muereantesquealgunodesushijos?Enestoscasoselproceso'init'del cualhablaremosenseguidaadoptaraestosprocesosparaquenoqueden hurfanos. Elprocesoinit Cuandoarrancaelsistemasedesencadenaunasecuenciadeprocesosque agrandes rasgoseslasiguiente. Primero secargaelncleo deLinux 51

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

(Kernel) de unaforma totalmente especial y distinta a otros procesos. Dependiendo de los sistemas puede existir un proceso con PID=0 planificador,oswapper.EnLinuxyencasitodoslossistemastipoUnix seguirunprocesollamado'init'.ElprocesoinittienePID=1.Leeun fichero llamado inittab dondeserelacionan unaseriede procesos que deben arrancarse para permanecer activos todo el rato (demonios). Algunos de ellos estn definidos para que en caso de morir sean arrancados de nuevoinmediatamente garantizando laexistencia deese serviciodeformapermanente. Esdecir'init'esunprocesoquevaagenerarnuevosprocesosperoestano es una cualidad especial. Esmuyfrecuente queunprocesocualquiera generenuevosprocesosycuandoestoocurresedicequegeneraprocesos hijos. Estenoesuncursodeadministracinperodiremosqueainitselepuede indicar que arranque el sistema de diferentes formas, por ejemplo en modomonousuarioparamantenimiento.Esteesuncaptuloenelcual pueden surgir muchas preguntas retorcidas tales como, que pasa si matamosainit,oquieneselpadredeinit,perononosinteresaresponder aestoyaqueinitesunprocesomuyespecialysupadreanms.Encada sistema de tipo Unix las respuestas a cosas como estas pueden variar mucho porque aese nivel la implementaciones varan mucho. Ningn programanormalnecesitarusaresetipodeinformacin.Quedanmuchos detalles interesantes relativos a temas de administracin. Los curiosos siempretienenelrecursodemirarlapginamandeinit(8)ydeinittab(5) peronosotrosnoinsistiremosmsenestetema.(Quealivioverdad?) UIDyEUID Los procesos tienen un EUID (Efectiv User Identif), y un UID normalmenteamboscoinciden.ElUIDeselidentificadordeusuarioreal quecoincideconelidentificadordelusuarioquearrancelproceso.El EUIDeselidentificadordeusuarioefectivoysellamaasporqueesel

52

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

identificadorquesetieneencuentaalahoradeconsiderarlospermisos queluegoexplicaremos. ElUIDesunodelosatributosdeunprocesoqueindicapordecirlode algunamaneraquieneselpropietarioactualdeeseprocesoyenfuncin de ello podr hacer ciertas cosas. Por ejemplo si un usuario normal intentaraeliminarunprocesodelcualnoespropietarioelsistemanolo permitirmostrandounmensajedeerrorenelqueadviertaqueustedno eselpropietariodeeseprocesoyportantonoestautorizadoahaceresa operacin.Porelcontrarioelusuariorootpuedehacerloquequieracon cualquier procesoyaqueelsistema nocomprueba jams siroottiene permisosonoparahaceralgo.rootsiempretienepermisosparatodo. Esto es cierto a nivel de llamadas del sistema pero nada impide implementaruncomandoquehagacomprobacionesdepermisosincluso conroot.AlgunoscomandosenLinuxtienenopcionesquepermitenhacer estas cosas y solicitar confirmacin encasodedetectar unaoperacin peligrosaoinfrecuente. ElUIDtambinesunatributopresenteenotroselementosdelsistema. Porejemplolosficherosydirectoriosdelsistematienenesteatributo.De estaformacuandounprocesointentaefectuarunaoperacinsobreun fichero.ElkernelcomprobarsielEUIDdelprocesocoincideconelUID del fichero. Por ejemplo si se establece que determinado fichero solo puede ser leido por su propietario el kernel denegar todo intento de lecturaaunprocesoquenotengaunEUIDigualalUIDdelficherosalvo quesetratedeltodopoderosoroot. Aunqueestamosadelantandocosassobreelsistemadeficherosvamosa continuar con un ejemplo. Comprobaremos cual es el UID de su directoriohome.
$ $ $ $ $ # Cambiamos el directorio actual a home cd # Comprobamos a quien pertenece 'uid' y 'guid' ls -ld . # Ahora obtenemos el 'uid' y el 'gid' con sus

53

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html valores numricos. $ ls -lnd .

Si su directorio home est configurado de forma lgica deber pertenecerle a usted. Si esto no es as reclame enrgicamente a su administrador, pero si el administrador resulta ser usted sea ms indulgente y limtese a corregirlo y no confiese su error a nadie. En realidad casi todo lo que se encuentre dentro de su directorio home deberapertenecerleausted.Usteddebeserelpropietariodesudirectorio homeporquedeotraformaydependiendodelospermisosasociadosa estedirectoriolosprocesosqueustedarranqueseveranobienincapaces detrabajarconl,oloqueespeorcualquierapodrahacercualquiercosa conl.Comoeslgicohemosmencionadodepasadaeltemadepermisos dedirectoriosparailustrarunpocolautilidaddeluidperoestoseveren detalleenelcaptulodedicadoalsistemadeficherosdeLinux. Algunos ficheros ejecutables poseen un bit de permisos que hace que cambieelEUIDdelprocesoqueloejecuteconvirtindoseenelUIDdel propietario del fichero ejecutado. Suena complicado pero noloes.Es decirimaginemosqueustedejecutauncomandopropiedadderootque tieneestebit.PuesbienenesemomentoelEUIDdesuprocesopasaraa serelderoot.Graciasaestounprocesopuedetomartemporalmentela identidad de otro usuario. Por ejemplo puede tomar temporalmente la identidadderootparaadquirirprivilegiosdesuperusuarioyasacceder porejemploaficherosdelsistemapropiedadderoot. ElsistemarecibecontinuamentepeticionesdelosprocesosyelEUIDdel procesodeterminar queelkernelleconcedapermisoparaefectuar la operacindeseadaono. MuchasvecessorprendequeenLinuxapenasseconozcanunospocos casosdevirus,mientrasqueenotrossistemasparecenestaralaordendel da. Es perfectamente posible realizar un virus que infecte un sistema Linuxperodeunaformaodeotraeladministradortendraquedarlelos

54

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

privilegiosqueleconviertenenpeligroso.Poresonoesfcilqueestos viruslleguenmuylejos. Comosecreaunnuevoproceso Elncleodelsistemallamadotambinkerneleselencargadoderealizar la mayora de funciones bsicas que gestiona entre otras cosas los procesos.Lagestindeestascosassehacenpormediodeunlimitado nmero de funciones que se denominan llamadas al sistema. Estas llamadas al sistema estn implementadas en lenguaje C y hablaremos ahoraunpocosobreunpardeellasllamadasfork()yexec().Silogramos quetengaunavagaideadecomofuncionanestasdosimportantsimas funciones facilitaremos la compresin de muchas otras cosas ms adelante. Lallamadaalsistemaexec() Cuandohablamosdeprocesodebeustedpensarsolamenteenalgoquese estejecutandoyqueestvivo.Unprocesopuedeevolucionarycambiar totalmentedesdequearrancahastaquemuere.Lonicoquenocambiaen un proceso desde que nace hasta que se muere es su identificador de procesoPID.Unadelascosasquepuedehacerunprocesoescambiarpor completo sucdigo.Porejemplounprocesoencargadodeprocesarla entradaysalidadeunterminal(getty)puedetransformarseenunproceso deautentificacindeusuarioypassword(login)yesteasuvezpuede transformarseenuninterpretedecomandos(bash).Silallamadaexec() fallaretornarun1.Estonoescursodeprogramacinasquenosda igualelvalorretornadoperoloquesinosinteresaessaberquecuando estallamadatienexitonoseproducejamsunretorno.Enrealidadno tendra sentido retornar a ningn lado. Cuando un proceso termina simplementedejadeexistir.Enunapalabramuereyyaest.Lallamada exec() mantiene el mismo PID y PPID pero transforma totalmente el cdigodeunprocesoenotroquecargardesdeunarchivoejecutable. Lallamadaalsistemafork() 55

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Laformaenqueunprocesoarrancaaotroesmedianteunallamadaal sistemaconlafuncinfork().Lonormalesqueelprocesohijoejecute luegounallamadaalsistemaexec().fork()duplicaunprocesogenerando dos procesos casi idnticos. En realidad solo se diferenciaran en los valoresPIDyPPID.Unprocesopuedepasaralprocesohijounaseriede variables pero un hijo no puede pasar nada a su padre a travs de variables.Ademsfork()retornaunvalornumricoqueser1encasode fallo,perositienexitosehabrproducidoladuplicacindeprocesosy retornarunvalordistintoparaelprocesohijoqueparaelprocesopadre. Alprocesohijoleretornarelvalor0yalprocesopadreleretornarel PID del procesohijo. Despus dehacer fork()sepuedenhacervarias cosas pero lo primero queseutiliza despusdelforkes unapregunta sobreelvalorretornadoporfork()paraassabersieseprocesoeselpadre o el hijo ya que cada uno de ellos normalmente deber hacer cosas distintas.Esdecirlapreguntaseradeltiposisoyelpadrehagoestoysi soyelhijohagoestootro.Confrecuenciaaunquenosiempreelhijohace unexec()paratrasformarsecompletamenteyconfrecuenciaaunqueno siempreelpadredecideesperaraquetermineelhijo. Tambin normalmente aunque no siempre esta parte de la leccin es necesarioreleerlamsdeunavez. Estamosdandopequeosdetallesdeprogramacinporqueenestasdos llamadasdelsistemasonmuysignificativas.Sufuncionamientoresulta chocanteysucomprensinpermiteexplicarunmontndecosas.

56

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

MSSOBREPROCESOSYSEALES
Lasformasdecomunicacinentreprocesos Losprocesos notienenunafacilidaddeaccesoindiscriminada aotros procesos.Elhechodequeunprocesopuedainfluirdealgunamaneraen otroesalgoquetienequeestarperfectamentecontroladopormotivosde seguridad.Comentaremossolomuyporencimalasdiferentesformasde comunicacinentreprocesos. 1. Atravsdevariablesdeentorno: Soloesposibledepadresahijos. 2. Medianteunaseal: Soloindicaquealgohaocurridoysolollevacomoinformacindeun nmerodeseal. 3. Medianteentradasalida: Eslaformamscorrienteaniveldeshell.Yahemoscomentadoel operadorpipe'|'queconectadosprocesos. 4. MediantetcnicasIPCuotras: Semforos,Memoriacompartida,Colasdemensajes. 5. Mediantesockets: Estesistematienelapeculiaridaddequepermitecomunicarprocesos queestnfuncionandoenmquinasdistintas. 57

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Noprofundizamossobreestoporqueahoranoestamosinteresadosenla programacin.Msadelantesicomentaremosbastantesobrevariablesy entradasalidaporquedaremosnocionesdeprogramacinenshellscript. Tambindaremosacontinuacinunospequeosdetallesquetienenque verconelarranquedelsistemaporquetambinnosresultarutilpara comprendercomofuncionanlascosas. Secuenciadearranqueenunasesindeconsola Para consultar la dependencia jerrquica entre unos procesos y otros existeenLinuxelutilsimocomandopstree.Noesesencialyquizsnolo tengaustedinstaladoperoresultamuyprctico.Sidisponedelpruebe loscomandos'pstree',y'pstreep'.Nosotrosvamosamostrarelresultado deamboscomandosenelsistemaqueestamosusandoenestemomento para que en cualquier caso pueda apreciar el resultado pero le recomendamos que lo instale si no dispone de l ya que resulta muy prctico.Tambinpuedeusarcomosustitutode'pstree'elcomando'ps axf'peronoespereunresultadotanbonito.
$ pstree init-+-apache---7*[apache] |-atd |-bash---pstree |-2*[bash] |-bash---vi |-bash---xinit-+-XF86_S3V | `-mwm-+-.xinitrc---xterm---bash | `-.xinitrc---xclock |-cron |-getty |-gpm |-inetd |-kflushd |-klogd |-kpiod |-kswapd |-kupdate |-lpd |-portmap

58

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html |-postmaster |-sendmail |-sshd |-syslogd `-xfs

Esteformatonosdaunrboldeprocesosabreviadoenelqueprocesos conelmismonombreyquetenganunmismopadreaparecerndeforma abreviada.Enelejemploanterioraparece'2*[bash]'indicandoquehay dos procesos bashcomo hijos deinit, ytambin hayalgunos proceso apachearrancados.Elqueexistanmuchosprocesosarrancadosnoindica necesariamenteunaltoconsumodeCPU.Puedequeestntodosellos haciendoelvago.Buenoenelcasodeapachequizsestnhaciendoel indio.(Estoltimoesunabromaquenohepodidoevitar).
$ pstree -p init(1)-+-apache(204)-+-apache(216) | |-apache(217) | |-apache(218) | |-apache(219) | |-apache(220) | |-apache(1680) | `-apache(1682) |-atd(196) |-bash(210)---pstree(1779) |-bash(211) |-bash(212)---vi(1695) |-bash(215)---xinit(1639)-+-XF86_S3V(1644) | `-mwm(1647)+-.xinitrc(1652)---xterm(1660)---bash(1661) | `-.xinitrc(1655)---xclock(1673) |-bash(214) |-cron(199) |-getty(213) |-gpm(143) |-inetd(138) |-kflushd(2) |-klogd(131) |-kpiod(4)

59

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html |-kswapd(5) |-kupdate(3) |-lpd(153) |-portmap(136) |-postmaster(168) |-sendmail(179) |-sshd(183) |-syslogd(129) `-xfs(186)

Enesteotroformato.AparececadaprocesoconsuPID.Podemosverque el Proceso 'init' tiene pid= 1y harealizado varios forks()generando procesosconpid>1.Enalgunossistemaslageneracindenmerosde PIDparaprocesosnuevosserealizaensecuencia. Enotrosresultaun nmeroimpredecible. Entre los procesos generados por 'init' estn los procesos 'getty'. Se arrancarun'getty'porcadaterminal.Esteprocesoconfiguralavelocidad yotrascosasdelterminal,mandaunsaludoyluegosetransformacon execelproceso'login'.TodosestosprocesosseejecutanconEUIDyUID =0,esdecir comoprocesosdelsuperusuarioroot.Cuandoelproceso 'login'conocenuestraidentidaddespusdevalidarusuariopasswordse transformarconexecenlashellespecificadaeparanuestrousuarioel fichero/etc/passwd Paraverlalneaquecontienesusdatospruebeahacerlosiguiente: $grep`whoami`/etc/passwd La lnea tiene el siguiente login:contrasea:UID:GID:nombre:dir:intrprete formato.

Vamos a suponer que su shell por defecto sea la bash. Si esta shell arrancara con el EUID = 0tendramos todos los privilegios del super usuarioperoestonoocurreas.EstashellyatendrnuestroUIDynuestro 60

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

EUID.Vamosarepresentartodoestomarcandolospuntosenlosque ocurrealgnfork()conunsigno'+'.
[init]-+fork()->[getty] | +fork()->[getty]-exec()->[login]-exec()->[bash] +fork()-exec()->[comando] | +fork()->[getty] |

Lashellpuedearrancaruncomandomedianteunfork()yluegounexec() y esperar a que este muera. Recuerde que la funcin exec() no tiene retorno posible ya que finaliza con la muerte del proceso. En ese momentolashelldetectalamuertedesuhijoycontinuasuejecucin solicitando la entrada de un nuevo comando. Cuando introducimos el comando'exit'estamosindicandoalashellquefinaliceysupadre'init'se encargar de lanzar nuevo proceso 'getty'. Lgicamente 'exit' es un comandointernodelashell.Quizslellamelaatencinquelamuertede 'bash'termineprovocandounnuevo'getty'cuando'getty'pasa'login'y estea'bash'peroenestasecuenciagettyloginbashnohayningnfork() poresogetty,login,ybashsonenrealidadelmismoprocesoendistintos momentosconelmismoPIDobtenidoenelfork()realizadopor'init'solo quehaidocambiandosupersonalidadmanteniendolamismaidentidad (mismoPID).Para'init'siempresetratdelmismohijoylamuertede cualquieradeellos(getty,loginobash)provocaquesearranqueunnuevo 'getty'sobreesemismoterminalconelfindequeeseterminalnoquede sinservicio. LapresentacindelmensajedeLoginesmostradapor'getty'.Unavez introducido el identificador de usuario ser 'login' quien muestre la solicitud de introduccin de la password, y una vez introducido el password ser lashellquienmuestre elintroductor decomandos pero estamoshablandosiempredelmismoproceso. A modo de ejercicio compruebe estas cosas por usted mismo usando algunosdeloscomandosqueyaconoce.Parahacerestaprcticanobasta 61

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

conusarunterminalremotosinoquenecesitarunPCcompletoparair haciendocosasdesdedistintassesiones.Leproponemoshacerlomso menosdelasiguientemanera: 1. Entre en cada uno de los terminales disponibles de forma que todos los terminales estn ocupados por un intrprete de comandos.Bastarconhacerloginentodosellos. 2. Luegocompruebequenohayningnproceso'getty'. 3. Hagaunexitdesdeunodeestosterminales. 4. Compruebe desde otro termina que ahora si existe un proceso 'getty'yanotesupid. 5. Introduzcaelnombredeusuarioeneseterminalquequedlibre. 6. Compruebeahoradesdeotrasesinqueexisteunprocesologin conelPIDqueustedanot. 7. Terminedeidentificarsetecleandolapassword 8. Compruebedesdeotrasesinqueahoraexisteunashellconel PIDqueanotamos. Sinotieneelcomando'pstree'tendrqueusar'ps'peroconpstree puedevermsfcilmenteloqueocurrirahora. 9. Ahoratecleeelcomando'sleep222'desdelasesinquetieneel PIDanotadoporusted. 10. Compruebedesdeotrasesinqueelinterpretedecomandosha realizadounfork()generandouncomandoqueestejecutandoel comandoindicado. Sinohapodidorealizarelejercicioanteriortendrqueconfiarenquelas cosassoncomodecimosyyaest. Comandops Muestralosprocesosactivos.Estecomandoesmuyutilparasaberque comandosestnfuncionandoenundeterminadomomento.

62

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Siemprequesemencioneuncomandopuedeconsultarlapginamandel mismo.Enelcasode'ps'selorecomendamosyaqueesuncomandomuy tilconunagrancantidaddeopciones.Nosotrosmencionaremosalgunos ejemplosperoseaconsejaprobar'ps'probandolasdistintasopcionesque semencionanenlapginadelmanual. Ejemplos:


$ # Para ver todos sus procesos que estn $ # asociados a algn terminal. $ ps PID TTY STAT TIME COMMAND ....... $ # Para ver todos sus procesos y los de otros $ # usuarios siempre asociados a algn terminal. $ ps a PID TTY STAT TIME COMMAND ....... $ # Para ver todos sus procesos estn asociados o $ # no a algn terminal. $ ps x PID TTY STAT TIME COMMAND ....... $ # Para ver todos los proceso asociados al $ # terminal 1 $ ps t1 PID TTY STAT TIME COMMAND ....... $ # Para ver todos los procesos del sistema. $ ps ax

63

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html PID TTY STAT TIME COMMAND .......

Estosejemplosqueacabamosdeverobtienenunmismoformatodedatos. Explicaremoselsignificadodeestosatributos.
PID

Eselvalornumricoqueidentificaalproceso. Eselterminalasociadoaeseproceso.Losdemoniosdel sistemanotienenningnterminalasociadoyenestecampo figurarun? Tiene tres campos que indican el estado del proceso (R,S,D,T,Z) (W) (N) La S indica que el proceso est suspendido esperando la liberacin de un recurso (CPU, Entrada Salida, etc.) necesario para continuar. Explicaremossoloalgunosdeestosestadosensumomento. IndicaeltiempodeCPUquellevaconsumidoeseproceso desdequefuearrancado. Muestra el comando y los argumentos que le fueron comunicados.

TTY

STAT

TIME

COMM AND

Existen muchas opciones para el comando ps que ofrecen unformato distinto.Lerecomendamosespecialmentequepruebe'psu','psl',y'psf' EnUnixloscomandossuelenservirparaunasolacosa,aunquesuelen tener muchas opciones. La entrada de los comandos suele tener una estructurasimpleylasalidadeloscomandostambin.Siuncomandono encuentranadaquehacerexistelacostumbredequeterminedemodo silencioso. Todo esto permite que los comandos puedan combinarse enganchadolasalidadeunoconlaentradadeotro.Algunoscomandos

64

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

estnespecialmentediseadosparaserusadosdeestaformayselessuele denominarfiltros. Lasalidadelcomando'ps'sepuedefiltrarcon'grep'paraquemuestre sololaslneasquenosinteresan. Configuracindelterminal Conviene que comprobemos si su terminal est correctamente configurado para poder interrumpir un proceso. Normalmente se usa <CtrlC> pero estodepende dela configuracin de suterminal. Sien algnmomentosuterminalquedadesconfiguradohaciendocosasraras como por ejemplo mostrar caracteres extraos intente recuperar la situacintecleandoelcomando'reset'.EstosoloesvlidoparaLinux. Para otros sistemas puede ser til 'stty sane' que tambin funciona en Linuxperonoestaneficazcomoelcomando'reset'.Paracomprobarla configuracin de su terminal puede hacer 'stty a' aunque obtendr demasiadainformacinquenoescapazdeinterpretar,podemosindicarle quesefijeenelvalorde'intr'.Deberavenircomo'intr=^C'.Sinolo localizahaga'sttya|grepintr'.Deestaformasoloobtendrunalnea. Paraconfigurarelterminaldeformaquepuedainterrumpirprocesoscon <CtrlC>puedeintentarconfigurarsuterminalhaciendo'stty^V^C'.El carcter<CtrlV>nosemostrarenelterminalyaqueactaevitandoque elsiguientecarcter(<CtrlC>ennuestrocaso)noseainterpretadocomo carcterdecontrol. NopretendemosahoraexplicarlosterminalesdeLinuxperosiqueremos quecompruebesucapacidadparainterrumpirprocesoscon<CtrlC>ya queusaremosestoenlasprcticasquesiguen.Unapruebainofensivapara comprobar la interrupcion deunprocesoes el siguiente comando que provoca una espera de un minuto. Deber introducir el comando e interrumpirloantesdequeeltiempoestablecido(60segundosseagote).
$ sleep 60 <Ctrl-C>

65

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Sinohaconseguidointerrumpirelprocesonosigaadelanteparaevitar que alguna de las prcticas deje un proceso demasiado tiempo consumiendorecursosdesumquina.Siestaustedsoloenlamquina esotampocotendramuchaimportanciaperoesmejorqueaveriguela formadeinterrumpirelprocesodelejemploanterior. Comandotime Da los tiempos de ejecucion. Este comando nos da tres valores cuya interpretacines:
real user sys. Tiempo real gastado (Duracin real) Tiempo CPU de usuario. Tiempo CPU consumido como proceso de kernel. (Es decir dentro de las llamadas al kernel)

Lamayoradeloscomandosestngranpartedeltiemposinconsumir CPUporquenecesitanesperarparahacerentradasalidasobredispositivos lentosqueademspuedenestarenusocompartidosporotrosprocesos. ExisteuncomandocapazdeesperartiemposingastartiempodeCPU.Se trata del comando 'sleep'. Para usarlo le pasaremos un argumento que indiqueelnmerodesegundosdedichaespera. PorejemplovamosacomprobarcuantaCPUconsumeunaesperade6 segundosusandosleep
$ time sleep 6 real user sys 0m6.021s 0m0.020s 0m0.000s

El resultado obtenido puede variar ligeramente en cada sistema pero bsicamenteobtendruntiempo'real'deunos6segundosyuntiempode CPU('user'+'sys')muypequeo.

66

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Vamos a medir tiempos en un comando que realice operaciones de entradasalidaascomoprocesodedatos.


$ time ls /* > /dev/null real user sys 0m0.099s 0m0.080s 0m0.010s

EnestecomandoverqueelconsumototaldeCPUessuperioraldel comandosleep.Encualquiercasoeltiemporealtardadoenlaejecucin delcomandoessiempremuysuperioralconsumodeCPU. Vamosaprobaruncomandoqueapenasrealiceotracosaqueentrada salida. Vamos a enviar 10Mbytes al dispositivo /dev/null. Existe un comando'yes'queprovocalasalidacontinuadeuncarcter'y'seguidode uncarcterretornodecarro.Estapensadoparasustituirlaentradadeun comando interactivo en el cual queremos contestar afirmativamente a todo lo que pregunte. Nosotros filtraremos la salida de 'yes' con el comando'head'paraobtenersololos10Mbytesprimerosproducidospor 'yes'ylosenviaremosaldispositivonulo'/dev/null'quevieneaserun pozosinfondoenelcualpodemosintroducircualquiercosasinquese llene,peronopodremossacarabsolutamentenada.Enunapalabravamos aprovocarprocesodeentradasalidaperfectamenteintil.
$ time yes | head --bytes=10000000 > /dev/null Tubera rota real user sys 0m6.478s 0m5.440s 0m0.900s

67

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Podemos hacer un consumo fuerte de CPU si forzamos a clculos masivosquenotenganapenasentradasalida.Porejemplopodemosponer acalcularelnmeroPIcon300cifrasdecimales.'bc'esuncomandoque consisteenunacalculadora.Admiteusointeractivoperotambinacepta quelepasemoslasoperacionesdesdeotroprocesocombinandoentrada salida.
$ time ( echo "scale=300; 4*a(1)" | bc -l ) 3.1415926535897932384626433832795028841971693993751058 20974944592307\ 816406286208998628034825342117067982148086513282306647 09384460955058\ 223172535940812848111745028410270193852110555964462294 89549303819644\ 288109756659334461284756482337867831652712019091456485 66923460348610\ 454326648213393607260249141272 real user sys 0m2.528s 0m2.520s 0m0.010s

EnunPentium200Mhzestecomandotard3segundospara300cifrasy 20segundosusando600cifras.Decimosestoparaqueveaqueeltiempo quesetardaaumentaexponencialmenteyquedependiendodelapotencia desuordenadorpuedesuponerbastantetiempodeproceso.Quizstenga quevariarelnmerodecifrassignificativasparapodermedirtiemposcon comodidad. Estecomando'time'esuncomandointernoperoenLinuxtambinhayun comandoexternollamadodelamismaforma.Parapoderejecutarlocon estashelldeberaincluirelcaminocompleto.Nodeseamosabusardesu escaso 'time' as que no lo comentaremos. Para buscar en el man el comando'time'quehemosexplicadoodecualquierotrocomandointerno tendraquemirarenlapginadelmanualdebash.

68

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Comandokill Estecomandoseutilizaparamatarprocesos.Enrealidadenvasealesa otrosprocesos,perolaaccinpordefectoasociadaalamayoradelas sealesdeunixesladefinalizarelproceso.Lafinalizacindeunproceso puedeveniracompaadadelvolcadodelainformacindelprocesoen disco.Segeneraunfichero'core'eneldirectorioactualquesolosirve paraque los programadores localicen elfalloqueprovocestabrusca finalizacindelproceso.Porejemplosielprocesointentaaccederfuera delespaciodememoriaconcedidoporelkernel,recibirunasealquelo matar.Lomismoocurrirsiseproduceunadivisinporcerooalgn otrotipodeerrorirrecuperable. Unprocesounixpuedecapturarcualquiersealexceptolaseal9.Una vezcapturadalasealsepuedeactivarunarutinaquepuedeprogramarse contodalibertadpararealizarcualquiercosa. 'kill'pordefectoes'kill15'envaunSIGTERMygeneralmenteprovoca cierreordenadodelosrecursosenuso.Estasealpuedeserignorada,o puede ser utilizada como un aviso para terminar ordenadamente. Para matarunprocesoresultarecomendableenviarprimerounkill15ysino seconsiguenadarepetirconkill9.Esteltimo9envaSIGKILLqueno puedeserignorada,yterminainmediatamente.Solofallarasinotenemos permisosparamatareseproceso,perosiesunprocesonuestro,kill9 resultaunaopcinseguraparafinalizarunproceso. Lassealesactanfrecuentementecomoavisosdequehaocurridoalgo. Existen muchos tipos de seales para poder distinguir entre distintas categorasdeincidenciasposibles. Comandonice ElmultiprocesoestaimplementadoconcediendocclicamentelaCPUen rodajasdetiempoacadaprocesoqueestaenejecucin.

69

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Existen dos nmeros de prioridad. La prioridad NICE y la prioridad concedida por el Kernel mediante un algoritmo. Esta ltima no tiene porque coincidir con nice y puede valer mas de 39. En cambio el comandonicesoloaceptavalorescomprendidosentre0y39,siendo20el valorpordefecto.Cuandonicesubeelvalorsignificaqueelprocesotiene bajaprioridad.Elcomando'nice10'incrementaraelvalorniceen10(es decirbajalaprioridad).Parabajarelvalordenice(Esdecirparasubirla prioridad)hacefaltapermisosdesuperusuario. Enunsistemaconpocacargadetrabajonosenotarapenasdiferenciaal ejecutaruncomandoconbajaprioridadoconaltaprioridad.Peroenun sistemaconlaCPUsobrecargadaloscomandosejecutadosconprioridad msbajasevernretrasados.yaqueelkernelconcedermstiempode CPUalosprocesosconprioridadmsalta. Hayotroscomandosdeinters.Porejemplo'top'muestralosprocesos quemasCPUestnconsumiendo.'vmstat'sacainformacindelconsumo dememoriavirtual. Hayquetenerencuentaqueelsistemagastarecursosenlagestindelos procesos.Porejemplosiestamoscompartiendounamquinaconotros usuarios y tenemos que realizar 15 compilaciones importantes terminaremos antes hacindolas en secuencia una detrs de otra que lanzndolastodasalavez.LaavariciadequererusartodalaCPUposible paranosotrospuedeconduciraunasituacinenlacualninosotrosni nadiesacargranprovechodelaCPU.Elsistemarealizarunacantidad enormedetrabajoimproductivodestinadoamantenersimultneamente funcionando una gran cantidad de procesos que gastan mucha CPU y muchamemoria.Lamquinacomienzaausareldiscoduroparasuplirla faltadeRAMycomienzaagastarcasitodoeltiempoenelintercambio delaRAMconeldiscoduro.Aestasituacinseladenominaswaping. Comandorenice

70

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Sirveparacambiarlaprioridaddeunproceso.Siguelamismafilosofa que el comando nice pero hay que identificar el o los procesos que deseamos cambiar su prioridad. Se puede cambiar la prioridad de un procesoconcretodadosuPIDolosprocesosdeunusuariodandosuUID o todos los procesos pertenecientes a un determinado grupo dando su GID. Tanto el comando nice como el comando 'renice' tienen mayor intersparaunadministradordesistemasqueparaunusuarionormal. Consultelaspginasdelmanualparamsdetalles.

71

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

SISTEMADEFICHEROS(Primeraparte)
Introduccin Esteessindudaunodeloscaptulosconmayorintersprctico. Amenudolapalabraficherosepuedeusardedosformas.Ficherosen sentidoampliocomocualquiercosaquetienenombreenunsistemade ficheros y otra como ficheros propiamente dichos que ms tarde llamaremosficherosregulares.Estosltimossonlaclasedeficherosms normalitosysirvenparacontenerinformacinlegibleoejecutable. Setratadeunacoincidenciadenombresespecialmentelamentableporque dificultamitrabajodeexplicarahoralascosas. Por ejemplo cuando hablamos de generalidades para los nombres de ficherosycuandohablemosdetiposdeficherosestaremoshablandode ficheros en sentido amplio, en cambio cuando hablamos de dirigir la salidaaunficheroocuandodecimosqueleemosunficheronosreferimos aficherospropiamentedichosesdecirficherosregularesquesonlosque seusannormalmentecomocontenedoresdeinformacin. Las palabras no siempre significan lo mismo usadas en diferentes contextosasquenosotrosconfiaremosensucapacidaddededucciny usaremos indistintamente la palabra fichero para ambas cosas aunque reconocemos queesunacostumbrequenofacilitalas cosas,peropor desgraciaverestetrminoutilizadoendiferentessitiosusadoparaambas cosas.Nosepreocupeytengapacienciaalfinyalcabosiyahallegado hastaaqu,susagacidadaquedadoprcticamentedemostrada. Comprendertodoestocuandohablemosdetiposdeficheros.

72

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Paraponerapruebaunavezmssusagacidad,(santapaciencialasuya) usaremoseltrminoficherosensusdosacepciones paradescribiruna clasedeficherosllamadadirectorios. Los directorios pueden considerarse como una clase de ficheros que pueden contener toda clase de'ficheros' (ensentido general) incluidos nuevosdirectorios,locualhacequelaestructurafinaltengaestructura similaraladeunrbol. Lasramasdeunrbolformanlaestructuradetodoelrbolydeforma muysimilarlosdirectoriosformanelarmazndetodalaestructuradel sistemadeficheros. UnsistemadeficherosenUnixtieneestaestructuraderbolyelpuntode origensellamaroot(raz)ysecaracterizaporqueelpadrede'root'resulta serelmismo'root'ysesimbolizapor'/'. Yasabemosqueestoesraroperonopreguntecomoalguienpuedeser padre de si mismo. Esto sencillamente es un truco para rematar la estructuradetodoelrboldealgunaforma. Ojo,alsperusuariotambinselellama'root'peronotienenadaquever conesto.Essolootramolestacoincidencia. Nombresdeficheros Un nombre defichero valido para elncleo deLinux puedecontener cualquier carcter salvo el carcter '/' y salvo el carcter '\0' (carcter nulo).Sinembargonoesprudenteusarcaracteresespecialesinterpretados por la shell ($,",',&,#,(,),*,[,],{,}, etc..) Tampoco debe empezar por el carcter '' que puede ser confundido con una opcin. Por ejemplo si llamamosaunfichero'r'nosolonopodremosborrarlosinoquesepuede confundirconlapeligrossimaopcin'r'deborradorecursivo.

73

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Cuandounusuarioesdadodealtasedefinelashellpordefectoqueusar yeldirectorio deentrada.Estedirectoriodeentradaalsistemaserel valordelavariable$HOME. Encadadirectoriohaydosentradascomomnimoqueson'.'y'..'que referencian respectivamente al directorio actual y al directorio padre. (Cuandonotenemosenlavariable$PATHreferenciadoelsubdirectorio actualtendremosqueejecutarloscomandosdenuestrodirectorioactual mediante./comando) El carcter '/'seutilizaparasepararlosdiferentes componentes deun nombredeficheroyporesonosepuedeusarcomoparedeunnombrede fichero.ElcarcternuloseusacomofindecadenaenlenguajeCquees ellenguajeenelqueestescritoelSO.Poresotampocosepuedeusarese carctercomonombredefichero. Cuando usamos un nombre de fichero que empieza por '/' se llama nombre de camino completo o nombre de camino absoluto. Si por el contrarioempiezapor'.',por'..',oporunnombresedenominarnombre decaminorelativo,porquesuutilizacindependedelsubdirectorioactual dondenosencontremos.Laltimapartedelnombredespusdelltimo carcter'/'sellamanombrebase.basename(1).
$ # Ejemplo de uso del comando basename $ basename /usr/include/sys/signal.h signal.h

Losficherosqueempiezanpor'.'notienenrealmentenadadeespecial. Yaexplicamosquelashellnoexpandelosnombresdeestosficherosy algunoscomandoscomo'ls'yotroslosconsiderandeunaformaespecial. Por ejemplo al usar el comando 'ls' sin parmetros no muestra esos ficheros.Portodoelloaparentanserinvisiblescuandoenrealidadson algunoscomandoscomo'ls'yelpropio'bash'quieneslostratandeforma especial.Muchosficherosquesondeusoparticulardealgunosprogramas

74

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

seusandeestaformaparaqueelusuariopuedaignorarlosencondiciones normales. En 'msdos' existeunconceptollamado extensin.Correspondeconun mximo de tres caracteres despusdel ltimo puntoenunnombrede fichero.EnUnixlosnombrespuedentenervariospuntosydespusdel ltimopuntopuedehabermsdetrescaracteresalfanumricosyaqueno existeelconceptodeextensin.Deexistirnombresqueterminandeuna ciertaformapuedetenersignificadoespecialparaalgunosprogramaspero noparancleo(kernel)ytampocoparaelintrpretedecomandos. Loquesitieneuntratamientoespecialaniveldesistemaoperativoson los caracteres '/' queforzosamente indican los elemento de uncamino formadoporlasucesindecaracteres.Esdecirserimposiblecrearun fichero con nombre 'x/a' dentro de un directorio porque el sistema interpretaraquequeremoscrearunfichero'a'dentrodeundirectorio'x'.

75

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Comandosparamanejarelsistemadeficheros Relacin de comandos ms importantes para manejar el sistema de ficheros.


ls <lista> Muestra el contenido de directorio actual. cd <dir> Cambiar a un subdirectorio. mkdir <lista-dir> Crea uno o mas directorio. rmdir <lista-dir> Borra uno mas directorios. cp <lista> Copiar uno o mas ficheros al ultimo de la lista. Si mas de dos el ultimo debe ser un directorio. mv <lista> mover o renombrar ficheros o directorios al ultimo nombre de la lista. Si mas de dos el ultimo debe ser un directorio. rm <lista> borrar la lista de ficheros. ln Crear un enlace a un fichero touch Crea un fichero vaco o modifica la fecha de un fichero pwd muestra el camino absoluto del directorio actual. chmod Cambia los permisos de un fichero. chown Cambia el propietario de un fichero. chgrp Cambia el grupo de un fichero. du <fichero> Ocupacin de un fichero tree Listado recursivo tree -d Mostrar rbol de directorios file <fichero> Obtiene informacin sobre el tipo de Ficheros

Recuerdequetieneasudisposicinelcomando'man'paraconsultarlas distintasopcionesdecadaunodeestoscomandos. Aliasparaelusodeloscomandosmsfrecuentes El comando 'cd' es un comando interno que sirve para cambiar de directorio actual.Existeotrocomandointernollamado'alias'quesirve 76

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

paraalgoquenotienequeverconelsistemadeficherosysinembargolo mencionaremosaquporrazonesprcticas. En muchos sistemas parecer que existe la disponibilidad de usar un comando 'll' que sirve para mostrar un directorio con abundante informacin.Enrealidadsetratadeunalias.Ustedpuedeverificarlos alias definidos para su usuario tecleando 'alias' sin argumentos. Generalmenteseusaparaabreviarelusodecomandosmuyutilizados. Estopuederesultarledeintersparapersonalizarsuentorno. Cuando el interprete de comandos arranca se ejecutan una serie de ficheros '/etc/profile', '~/.bash_profile', '~/.bash_login', y '~/.profile' en esteorden.En'.bash_profile'sueleexistirunapartequepreguntaporla existenciadeun'~/.alias' yencasoafirmativoloejecuta.Estefichero '.alias' contiene una serie de comandos de alias que permanecern disponiblesdurantesusesindetrabajoconesashell. Podraparecerqueestamosobsesionadosconlashellyquenosabemos hablar de otra cosa pero solo queremos proporcionarle ahora unos consejosprcticosquelefacilitenelusodesusistema.Paraellotendra queeditarelfichero'.alias'presenteensu$HOMEyaadirlaslneas siguientes:
alias alias alias alias alias alias alias alias ll='ls -lrt --color=auto' ll.='ls -adlrt --color=auto .[a-zA-Z0-9]*' ls='ls --color=auto' ls.='ls -adrt --color=auto .[a-zA-Z0-9]*' md='mkdir' mv='mv -i' rd='rmdir' rm='rm -i'

Puedeejecutarelfichero'.alias'paradefinirtodosestosalias
$ . .alias

77

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Opuedeejecutarcualquieradeestoscomandosaliasahoramismo,por ejemplo
$ alias ll='ls -lrt --color=auto'

Luegotecleeelcomando'alias'.Comprobarquequedadefinido.Teclee elnuevocomando'll'ycompruebesuefecto. Elbashsoloexpandelosaliasdelaprimerapalabradeuncomandoysolo cuandonovanentrecomillados.Poresocuandodefinimosunaliasque sustituye a un comando(Porejemplo "ls='ls color=auto'")tendremos queusar'ls'entrecomillassimplesodoblesparasinodeseamosquese produzcalaexpansindelalias. Para eliminar una definicin de alias utilice el comando 'unalias' En nuestrocaso.
$ unalias ll

Paranotenerqueteclearmanualmentecadavezcadaunodeestosaliases paraloquesirveelfichero'.alias'. Sinosabeeditarlotendrqueesperaraqueexpliquemoselmanejodel editor'vi'yvolveraestaseccinparamodificarsufichero'.alias'.Los alias sern definidos la prxima vez que entre en una nueva sesin. Explicaremoslasventajasdeusaralgunosdelosaliasqueacabamosde proponerle. llLosficherosmsinteresantessongeneralmentelosmsrecientesypara evitarquedesaparezcanduranteunscrolllargolosmostraremosenltimo lugar.Laopcindecolorautocolorealasalidadelcomandonicamente silasalidaocurreenelterminal.

78

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ll.Sirveparalistarficherosqueempiezanporunpuntoydespustienen unaletraodgitocomosegundocarcter.Normalmentelosficherosde configuracin de su usuario se encuentran en su $HOME y utilizan nombresdeestetipoquenoaparecenenlaexpansindeun'*'. rm Estealiasevitausar'rm'talcualestaadindolelaopcinipara confirmarantesdeborrar.Realmentetil.Esmuyrecomendableusar'rm' pordefectodeestaforma.Sinodeseaserinterrogadoacadaficherosi realmente desea borrarlo o no, utilice este alias tal como est pero aadiendolaopcinf.rmf<listadeficheros>borrarsilenciosamente todoloqueustedordenequenotienequecoincidircontodoloqueusted supone que ha ordenado. En especial si no pone cuidado al usar la expansindeordenesdelashell. La respuesta a la pregunta de como recuperar un fichero borrado accidentalmentees...'Deningunaforma'. CosassimpticasdeUnixyLinux. Puede que sepa de alguien que en cierta ocasin recuper una informacin valiosa usando trucos o herramientas especiales pero no cuenteconello.Hayprogramasdeborradoqueusanpapelerasyquizs pienseenponerunaliasdermparaqueuseunodeestosprogramas.Esto introduceineficienciaenelsistemaperopuedehacerseaniveldeusuario. Lomscorrectoesusarunabuenapolticadecopiasdeseguridad. mvSetratademoverinformacinperoaplicamoselmismoprincipioque para'rm'. Ejemplosdeusodeloscomandosestudiados Ejecutaremospasoapasounaseriedecomandosycomprobaremoslo queocurre.
$ # Crearemos un alias para ls con algunas opciones

79

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ $ $ $ $ $ $ alias ll='ls -lrt --color=auto' # Creamos en /tmp una serie de directorios anidados cd /tmp mkdir kkkk cd kkkk # Consultamos en que directorio estamos situados pwd

/tmp/kkkk $ # Continuamos creando ficheros y directorios $ echo xx > kk1 $ echo xx > kk2 $ echo xx > kk3 $ mkdir kkkk $ # Usamos el alias por primera vez para ver el contenido $ # del directorio actual. $ ll total 4 -rw-r--r-kk1 -rw-r--r-kk2 -rw-r--r-kk3 drwxr-xr-x kkkk 1 acastro 1 acastro 1 acastro 2 acastro acastro acastro acastro acastro 3 abr 16 20:01 3 abr 16 20:01 3 abr 16 20:01 1024 abr 16 20:01

$ # Continuamos creando ficheros y directorios $ cd kkkk $ echo xx > kk1 $ echo xx > kk2 $ echo xx > kk3 $ mkdir kkkk $ cd kkkk $ echo xx > kk1 $ echo xx > kk2 $ echo xx > kk3 $ cd /tmp/kkkk $ # El alias ll corresponde con el comando ls con una serie de $ # opciones pero podemos aadir nuevas opciones. Por ejemplo $ # podemos hacer un listado recursivo de toda la

80

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html estructura de $ # ficheros y directorios que cuelga del directorio actual. $ # /tmp/kkk $ ll -R . total 4 -rw-r--r-kk1 -rw-r--r-kk2 -rw-r--r-kk3 drwxr-xr-x kkkk kkkk: total 4 -rw-r--r-kk1 -rw-r--r-kk2 -rw-r--r-kk3 drwxr-xr-x kkkk kkkk/kkkk: total 3 -rw-r--r-kk1 -rw-r--r-kk2 -rw-r--r-kk3 1 acastro 1 acastro 1 acastro 3 acastro acastro acastro acastro acastro 3 abr 16 20:01 3 abr 16 20:01 3 abr 16 20:01 1024 abr 16 20:03

1 acastro 1 acastro 1 acastro 2 acastro

acastro acastro acastro acastro

3 abr 16 20:03 3 abr 16 20:03 3 abr 16 20:03 1024 abr 16 20:04

1 acastro 1 acastro 1 acastro

acastro acastro acastro

3 abr 16 20:04 3 abr 16 20:04 3 abr 16 20:04

$ # Con el comando tree y la opcin -d podemos ver la estructura $ # simplemente con los directorios y como estn colocados. $ tree -d . `-- kkkk `-- kkkk

81

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 2 directories $ # Para ver la estructura completa usamos el comando $ # tree sin opciones. Vemos ahora tambien los ficheros. $ tree . |-|-|-`-kk1 kk2 kk3 kkkk |-- kk1 |-- kk2 |-- kk3 `-- kkkk |-- kk1 |-- kk2 `-- kk3

2 directories, 9 files $ # Con find podemos buscar usando muchos criterios. Por ejemplo $ # por nombre. $ find . -name 'kk*' ./kk1 ./kk2 ./kk3 ./kkkk ./kkkk/kk1 ./kkkk/kk2 ./kkkk/kk3 ./kkkk/kkkk ./kkkk/kkkk/kk1 ./kkkk/kkkk/kk2 ./kkkk/kkkk/kk3 $ # Podemos buscar por fecha de modificacin comparanda con la $ # fecha de otro fichero. Por ejemplo que ficheros son ms $ # recientes que './kkkk/kk2' ? $ find . -newer ./kkkk/kk2

82

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

./kkkk ./kkkk/kk3 ./kkkk/kkkk ./kkkk/kkkk/kk1 ./kkkk/kkkk/kk2 ./kkkk/kkkk/kk3 $ # Podemos comprobar la ocupacin de los directorios $ du . 4 8 12 ./kkkk/kkkk ./kkkk .

Paraborrartodoestosesueleusarlaopcindeborradorecursivo.No debeusarestaopcincomorootsinestarmuysegurodeloquehace.Esta opcinborrarecursivamenteyesmuypeligrosaporqueunerrorpuede borrar recursivamente desde un lugar equivocado un montn de informacin. Noesnecesarioborrarnadaporqueen/tmplainformacinsueleborrarse durante el arranque. Si quiere intentarlo con las precauciones mencionadas teclee 'rmfr/tmp/kkkk'.Siloprefierepuededejarlosin boraryaquenoocupacasinadayseborrarlaprximavezquesevace el'/tmp'queserseguramentecuandovuelvaaarrancarelordenador. Paraqueloscomandosanteriorespuedanfuncionarcorrectamente deberemostenerlospermisosadecuadossobrelosficherosylos subdirectorios. Evidentementehaymuchosmsynopodemosexplicarlostodosahora peroquizsseabuenomostrarunapequealistadealgunosdeellosque veremosmsadelanteenposteriorescaptulos.
sum Obtiene un valor de checksum cksum Obtiene un valor de checksum largo y por tanto ms seguro

83

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html gzip find tar fichero. cpio fichero. Compresor de GNU Buscar ficheros Empaqueta ficheros y directorios en un solo Empaqueta ficheros y directorios en un solo

Sistemaplanodeficheros Laestructuraenformaderboltieneelinconvenientedequeserequiere irrecorriendoelrbolparairlocalizandocadaunodeloselementos.Por ellosehacenecesariounsistemamuchomsdirecto. A cada ficheros se le asocia un nmero para poder localizarlo directamente.Dichonmerosellamainodo.Losnmerosdeinodosson elndicedelsistemaplanodeficheros,tambinllamadoporellotablade inodosCadaficherodecadasistemadeficherostieneuninododistinto salvoquesetratedeunenlacergido(hardlink).Sinembargohayinodos quenosecorrespondenconningnfichero. Unficheroensentidoestrictoindicacapacidaddecontenerunasecuencia debytes. Uninodoindicabsicamentelacapacidaddetenerunnombreasociadoal sistemadeficheros. Unficherotieneasociadasfuncionesdeposicinydelecturayescritura deinformacindentrodelfichero.Uninodoesunareferenciamuydirecta aunficheroyagrandesrasgostieneasociadasfuncionesquepermiten manejaryconstruirlaestructuraderboldelsistemadeficheros. Tiposdeficheros

Regular.Sonmerosalmacenesdeinformacin.Algunoscontiene cdigoejecutable. DirectoriosSonunatablaconnmerosdeinodosynombresde ficheros. 84

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ficheros especiales. Pueden ser dispositivo tipo carcter o dispositivodebloques.Elmanejodeestosficherosdependedel dispositivoenparticular. Fifosonpipesconnombre.SonpropiosdeSystemVyenBSDno existenperoenLinuxsiestndisponibles. Enlacessimblicos(symboliclinks).Sonficherosquecontieneun puntero a otro fichero que podra perfectamente estar en un sistemadeficherosdistinto. El Soket es un fichero especial de 4.3 BSD y se utiliza para comunicarprocesosquepuedenestarenmquinasdistintas. Enlacesrgidos(hardlinks).Realmenteesunnicoficheroque puedeservistocondistintosnombresdentrodeunmismosistema deficheros.Esdecirsepuedenobservarcomosifueranficheros idnticosconelmismoinodo.Lainformacinresideenunmismo lugar y lo que ocurra aparentemente en un sitio ocurrir instantneamente en el otro lugar. Los enlaces de este tipo no puedenocurrirentresistemasdeficherosdistintos.Notodoslos sistemasdeficherossoportanhardlinksyaqueesunconcepto muyligadoalosSOtipoUnix.

Generalmente los diferentes tipos de ficheros son capaces de aceptar operacionesdeapertura,cierre,lecturayescrituradeformasimilar.Por ello se puede redirigir una entrada y una salida a diferentes tipos de ficheros.PartedelaenormepotenciayflexibilidaddelosSOtipoUnix residenenestehecho.Graciasaestolacombinacindeentradassalidas entreprocesos,ficheros,dispositivos,etc..resultamuysencillayflexible. Existe una salvedad importante. Los directorios en este sentido son totalmente especiales y un intento de escribir en un directorio dar siempre un error aunque sea realizado por 'root'. No tiene sentido permitirlo.Losdirectoriossecrean,borran,ymodificanconcomandos especficosparaellos.
$ echo > . bash: .: Es un directorio

85

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Atributosdefechaenficheros EnUnixyLinuxlosficherosensentidoampliotienenasociadassiempre tres fechas. En realidad estas fechas estn almacenadas internamente comoelnmerodesegundostranscurridosdesdeel'1deEnerode1970'. Una de ellas indica el tiempo del ltimo acceso realizado sobre ese fichero.Laotraindicalafechadecreacin(enrealidadeslafechadel ltimo cambio de estado) de ese fichero y la ltima y quizs ms importante(eslaquevemosalconsultarcon'lsl')indicalafechadela ltimamodificacin. Enrealidadsicambiamoselestadodeunficheroporejemplocambiando permisos o el propietario se modificarn las fechas de creacin y del ltimoacceso.Poresolafechaquehemosdenominadodecreacinpuede serposterioralafechademodificacindelfichero. Cuandosecreaunficherolastresfechastendrnelmismovalor.Cuando seleeunficherosemodificalafechadeaccesodelmismoperoaccederal nombredeunficherooconsultarelestadodeunficheronomodifica ningunafecha.Sufechadeaccesotampocoyaqueenrealidadloquese haceesleerlainformacindeldirectorioquelocontieneelcualsique vermodificadasufechadeacceso. Lasfechasdemodificacinasociadasalosdirectorioscambianconlas altas,obajasdeloselementosdentrodeldirectorio.Estoesdebidoaque dichasoperacionesseconsiderancomosifueranescriturasenelfichero especialdetipodirectorio.Undirectorioesalfinyalcabounasimple tabla. Esto lo recordaremos cuandohablemos depermisos asociados a directorios. Paramodificarlasfechasdemodificacinydeaccesodeunficherose puedeusarelcomandotouch(1)

86

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

SISTEMADEFICHEROS(Segundaparte)
Permisosdeficheros Usaremoseltrminoficheroensusentidomsamplio.Esdecirqueel temadepermisosesaplicableadistintostiposdeficherosconalgunas matizacionesqueexplicaremosmsadelante.Losficherostienenmuchos atributosademsdesunombre.Paraverlosmssignificativosharemos:
$ ls -l /

Supongamosquetenemoselsiguienteficherollamado'kkkkk'
-rwxrwxrwx
1 root root 14740 abr 15 12:05 kkkkk ^^^^^^^^^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ |||||||||| | | | | | | | | |__nombre del fich. |||||||||| | | | | | | | | |||||||||| | | | | | | | |__minutos : Fecha y |||||||||| | | | | | | |_____hora : hora de la |||||||||| | | | | | |____da del ms : ltima |||||||||| | | | | |________ms : modificacin |||||||||| | | | | |||||||||| | | | |___________ Tamao en bytes |||||||||| | | | |||||||||| | | |_______nombre del grupo |||||||||| | |____________nombre del propietario del fichero |||||||||| | |||||||||| |_______________nmero de enlaces rgidos (hard links) |||||||||| ||||||||||___001____________ permiso de ejecucin para : Un usuario |||||||||____002____________ permiso de escritura para : cualquiera ||||||||_____004____________ permiso de lectura para : ||||||| |||||||______010____________ permiso de ejecucin para : Un usuario ||||||_______020____________ permiso de escritura para : pertene|||||________040____________ permiso de lectura para : ciente al |||| : grupo |||| ||||_________100____________ permiso de ejecucin para : El usuario |||__________200____________ permiso de escritura para : propieta||___________400____________ permiso de lectura para : rio | |____________________________tipo de fichero - Fichero regular (fichero normal)

87

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
d l p b c Directorio Enlace simblico Fifo con nombre Dispositivo de bloques Dispositivo de caracteres

En ingls se usan los trminos owner , group, y others para designar respectivamentealpropietario,algrupoyacualquierusuario. Notacinnumricaparapermisos Recuerdequetambintenemosquepensarenlaposibilidaddequemi amigoDavidacostumbradoalusodelazadndecidahacerestecursoy tenamos un compromiso de explicar las cosas partiendo de cero. Los permisosdelosficherossonalmacenadosenformatobinarioysepuede referenciar numricamente. Vimos que a cada permiso individual le asocibamosunnmerodetresdgitosformadopordoscerosyuntercer nmeroquepodasernicamente1,2,o4.Porejemploelpermisode escrituraparaunusuariocualquieraera002.Conestosnmerossepuede codificarlospermisosdelaformaqueindicamosenelsiguienteejemplo:
r w x - - w x - r - x 735 4 2 1 - 0 2 1 - 4 0 1 ) Esto equivaldra a un permiso ( 4+2+1 , 0+2+1 , 4+0+1 = 7,3,5

Lospermisostambinpuedenrepresentarsecomounasecuenciadebits. Un bit es un valor que solo puede valer 0 o 1. En el caso anterior podramosrepresentarlodelaforma111010101donde1indicaquesi haypermiso0quenolohayylaposicindecada0ycada1representaa cadaunodelospermisos. Umask Esuncomandointernodelbash.Seutilizacuandosecreanficheros. Nopodemosprofundizarmuchoentemasdematemticabinariaporque nossaldramosdeltemaperolaumaskseaplicamedianteunaoperacin llamadaANDNOT. 88

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Consiste en tomar a umask como una mscara donde los bits a 1 especificanlosbitsdepermisosquesepondrnacero. Porejemplosiqueremosabrirunficheroconpermisos664ytenemosuna umaskde022obtendremosunfichero644.
664 110 110 100 022 000 010 010 ----------------644 110 100 100

Esto tiene la utilidad de proteger el sistema frente a cierto tipo de descuidosdurantelacreacindeficheros. Porejemplosupongamosqueunadministradordeunsistemaconsidera que por defecto todos los ficheros que el crea deberan carecer de permisosdeejecucinydeescrituraparatodoelmundoyqueparalos usuariosdesumismogrupodeberandecarecerdepermisodeejecucin. Paraelloestableceruna'umask=023'.Esdecirunaumaskqueelimina lospermisos.w.wx Paraunscriptquegenereficherosquesolodebanseraccesiblesparael usuarioqueloshageneradousaramos.'umask=077' Comandochmod EstecomandosirveparaalterarunaseriedeatributosdelficheroExiste dos formas de usarlo. Una indicando el tipo de acceso y a quien lo queremos conceder o eliminar. Existen una serie de atributos que se puedenmodificarusandoestecomando.
04000 02000 01000 00400 00200 00100 00040 Set uid on execute. Set gid on execute. Save text on image after execution. Permiso de lectura para el propietario (owner) Permiso de escritura para el propietario Permiso de ejecucin para el propietario Permiso de lectura para el grupo (group)

r w x r

89

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 00020 00010 00004 00002 00001 w x r w x Permiso Permiso Permiso Permiso Permiso de de de de de escritura para el grupo ejecucion para el grupo lectura para cualquiera escritura para cualquiera ejecucion para cualquiera

(others)

Los atributos Set uid, Set gid, y Save text no los explicaremos de momento. Consulte las pginas del manual relativas a este comando. Como de costumbre el manual resulta imprescindible a la hora de recordar la utilizacindeuncomandoperonoalahoradecomprenderconceptos nuevos. No se preocupe con los ejercicios que le proponemos a continuacincomprenderperfectamente:
$ $ $ $ $ cd /tmp echo > kk ################################## chmod 777 kk ls -l kk .... .... ......

-rwxrwxrwx

$ ################################## $ chmod 707 kk $ ls -l kk -rwx---rwx .... .... ......

$ ################################## $ chmod 421 kk $ ls -l kk -r---w---x .... .... ......

$ ################################## $ chmod 124 kk $ ls -l kk ---x-w-r-.... .... ......

$ ################################## $ # 'chmod 0 kk' equivale a 'chmod 000 kk'

90

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ chmod 0 kk $ ls -l kk ---------.... .... ......

$ ################################## $ chmod +r kk $ ls -l kk -r--r--r-.... .... ......

$ ################################## $ chmod +x kk $ ls -l kk -r-xr-xr-x .... .... ......

$ ################################## $ chmod -r kk $ ls -l kk ---x--x--x .... .... ......

$ ################################## $ chmod u+r kk $ ls -l kk -r-x--x--x .... .... ......

$ ################################## $ chmod a-x kk $ ls -l kk -r-------.... .... ......

$ ################################## $ chmod g+x kk $ ls -l kk -r----x--.... .... ......

$ ################################## $ chmod o+x kk $ ls -l kk -r----x--x .... .... ......

91

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

$ ################################## $ chmod a+rwx kk $ ls -l kk -rwxrwxrwx rm kk .... .... ......

Comandochown Elcomando'chown'sirveparacambiarelUIDyelGIDdeunfichero. Estosolosepuedehacersitenemoslospermisosparaello.Normalmente suusoestreservadoa'root'yporellonodiremosnadams.Esmuy posiblequesiustedusaLinuxenunordenadorpersonalnecesitealgunos deestosconocimientosperosesaledelospropsitosdeestecurso.Le bastaconsaberqueexisteyparaquesirve. Concesindeaccesoporpartedelkernel Explicaremoselfuncionamientodelospermisosdelaformamsprecisa quenosseaposible. Paraellousaremosunasabreviaturasqueyaconocemos.

EUIDeselIdentificadordeusuarioefectivodeunproceso EGIDeselIdentificadordegrupoefectivodeunproceso UIDenunficheroesunatributoqueidentificaalpropietario. GID en un fichero es un atributo que identifica al grupo del propietario.

Enrealidadhablamosdepropietariocomoelusuarioquecreoelfichero. ElKernelrealizarelsiguientetestparaconcederaunprocesoelacceso deciertotipoaunfichero. 1. SielEUIDdelprocesoes0sedaacceso.(rootpuedehacerloque sea) 92

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

2. SielEUIDdelprocesoesigualalUIDdelowner(propietariodel fichero)seconcedeelaccesosilospermisosdeusuariorwxson losadecuados. 3. SielEUIDdelprocesoesdistintoalUIDdelowner,ysielEGID delprocesoesigualalGIDdelowner,seconcedeelaccesosilos permisosdegruporwxsonlosadecuados. 4. SielEUIDdelprocesoesdistintoalUIDdelowner,ysielEGID delprocesoesdistintoalGIDdelowner,seconcedeelaccesosi lospermisosdeothersrwxsonlosadecuados. NOTAelcomandormpermiteborrarcualquierficheroseacualseanlos permisoscuandoelprocesotieneunEUIDcoincidenteconelpropietario del fichero. nicamente ocurre que si el fichero esta protegido contra escritura suele pedir (dependiendo de la configuracin) confirmacin antesdeborrarlo.Elpermisoparaborrarunficheronoseguardacomo atributo del fichero. Esto se hace a nivel de directorio y pasamos a explicarloinmediatamente. Significadodelospermisosendirectorios Paraentendercomofuncionanlospermisosaplicadosaundirectoriohay queimaginarqueundirectorioesunficheronormalquesolocontieneuna tablaenlaqueserelacionanlosficherospresentesenesedirectorio.En todoslosdirectoriosexistensiempreunpardeentradasobligadasqueson '.'y'..'paraeldirectorioactualyparaeldirectoriopadrerespectivamente. Vamosaexplicarlosobrelamarchaalavezquehacemoselejercicio. Recuerde usar un usuario normal (distinto de root) para realizar los ejercicios.
$ $ $ $ $ $ $ cd /tmp mkdir kk cd kk echo > k1 echo > k2 cd /tmp chmod 777 kk

93

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ ## Para ver como ha quedado los permisos hacemos ... $ ls -ld kk drwxrwxrwx kk 2 ..... ......

$ ## Para ver que ficheros contiene el directorio kk hacemos ... $ ls kk k1 k2

Si un directorio no tiene permiso de lectura, resultara imposible para cualquiercomandoincluidolsaveriguarcualessucontenido. Sinabandonarlasesinanteriorcontinuamoselejercicio


$ ###(1)### $ ## Eliminamos los premisos de lectura del directorio kk $ chmod -r kk $ ls -ld kk d-wx-wx-wx $ ls -l kk ls: kk: Permiso denegado $ ## En este intante podemos entrar dentro del directorio $ ## Incluso podemos crear un nuevo fichero pero ya no podemos $ ## Saber cual es el contenido del directorio. $ cd kk $ pwd /tmp/kk $ echo > k3 $ ls -l 2 ..... ...... kk

94

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ls: .: Permiso denegado $ ## Hemos podido meternos dentro del directorio kk porque aun $ ## Tenemos permiso para ello pero seguimos sin poder saber $ ## cual es su contenido. $ cd /tmp

Sinosetienepermisodeejecucinenundirectorionosepodrhacercd aesedirectorio,nianingunodelosdirectoriosquecuelgandeel.Esto imposibilitatodaslasoperacionesqueutilicenesedirectoriocomoparte delcamino. Sinabandonarlasesinanteriorcontinuamoselejercicio


$ $ $ $ ###(2)### ## Ahora eliminamos permiso de ejecucin chmod -x kk ls -ld kk 2 ..... ...... kk

d-w--w--w-

$ ## Intentamos entrar $ cd kk bash: cd: kk: Permiso denegado $ ## No hemos podido entrar $ rm kk/k2 bash: cd: kk: Permiso denegado $ $ $ $ $ ## Tampoco nos deja borrar el fichero desde fuera # ## Recuperamos permiso de ejecucin chmod +x kk ls -ld kk 2 ..... ...... kk

d-wx-wx-wx

95

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ rm kk/k2 $ ls kk k1

Si no tiene permiso de escritura no se podra dar altas, baja o modificacionesenlatablaloquesetraduceenquenosepuedenborrar susficherosnicrearotrosnuevos,nirenombrarficheros. Sinabandonarlasesinanteriorcontinuamoselejercicio
$ $ $ $ ###(3)### ## Ahora eliminaremos permisos de escritura chmod 666 kk ls -ld kk 2 ..... ...... kk

dr-xr-xr-x

$ ## Ahora no tenemos permiso de escritura $ cd kk $ ls rm: borrar `k1'? (s/n) s rm: k1: Permiso denegado $ echo > k3 bash: k3: Permiso denegado $ touch k3 touch: k3: Permiso denegado $ ## Sin permiso de escritura en el directorio no se pueden $ ## Crear ficheros nuevos dentro de el ni borrar ficheros $ ## Pero los ficheros son perfectamente accesibles $ echo "Mensaje de prueba" > k1 $ cat k1

96

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Mensaje de prueba $ $ $ $ ## Vamos a limpiar chmod 777 /tmp/kk rm /tmp/kk/* rmdir /tmp/kk

SetuidySetgid Cadaprocesotieneun(R)UID,(R)GID,EUID,yEGUID.Cadafichero tieneunUIDyunGIDowner. Elcomando'chmod4000'poneelbitsetuid.Estohacequeelproceso queejecuta estecomandotemporalmente cambiesuEUIDtomandoel valor UID del fichero. Es decir el proceso sufre un cambio de personalidadyseconvierteenlapersonaquefiguracomopropietariade esefichero.Paraellolgicamenteeseficherodeberserunejecutable.El comando passwdsirveparacambiarlaclave.Setratadeuncomando propiedadderootconsetuid.Porlotantomientrasestamosejecutando estecomandoadoptamoslapersonalidadde'root'.Graciasaellosenos permiteaccederalaclaveparamodificarlaygraciasaqueesecomando no permite hacer nada ms que eso se evita que este proceso con personalidadde'root'puedahacerotrascosas. Busque el comando 'passwd' en su sistema. Podra estar en '/usr/bin/passwd'perosinoseencuentraenesesitiopuedelocalizarlocon 'whichpasswd' Hagaunllparacomprobarsuspermisosyverqueespropiedadde'root' yquetieneuna's'enlugardeuna'x'enlapartedelospermisosparael propietario.
-rwsr-xr-x 1 root /usr/bin/passwd root 28896 jul 17 1998

El comando 'chmod 2000' pone el bit setgid on execute. Hace algo parecidoalanteriorperoaniveldegrupo.Esdecirelprocesoqueejecuta 97

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

estecomandotemporalmentecambiesuEGIDtomandoelvalorGIDdel fichero.Porejemploelcomadolprnosolonosconvierteen'root'cuando loejecutamossinoquenoscambiaelgrupoporelgrupodeimpresin.


-rwsr-sr-x 1 root /usr/bin/lpr lp 14844 feb 7 1999

Elcomando'chmod1000'poneelbitsticky.Seusapocoytenams utilidad en sistemas Unix ms antigos. Sirve para que el proceso permanezcaenmemoriaRAMtodoelratomientrasseestejecutando. Normalmente cuando muchos procesos usan la memoria RAM se van turnando en su uso y se descargan a disco para ceder su espacio en memoria RAM a otros procesos. Con el uso de este bit se evita la descargaadisco.Esunaformadeaumentarlavelocidaddeeseproceso. Paraverelaspectodeestospermisosrealiceelsiguienteejercicio.Realice siemprelosejerciciosdesdeunusuarionormaldistintoderoot.
$ $ $ $ cd /tmp echo > kk chmod 4000 kk ll kk 1 ..... ..... kk

---S------

$ chmod 4100 kk ---s-----1 ..... ..... kk

$ chmod 2000 kk ------S--1 ..... ..... kk

$ chmod 2010 kk ------s--1 ..... ..... kk

$ chmod 1000 kk ---------T 1 ..... ..... kk

$ chmod 1001 kk

98

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

---------t

1 ..... ..... kk

99

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

SISTEMADEFICHEROS(Terceraparte)
Tiposdeenlaces(links)ysumanejo La palabra link es inglesa y para el concepto que vamos a tratar podramostraducirlaporenlace.Haydostiposdeenlacesllamados'hard link'y'symboliclink'.Podriamostraducirloporenlacergidoyporenlace simblico.Eltrminoenlacesimblicoseusaconfrecuenciaenespaoly parecemuyadecuadoperorealmentenoexisteunatraduccinparahard linktanaceptada.Nosotrosemplearemoseltrminorgidoparahardque literalmentesignificaduro. Ya hemos mencionado algunas cosas sobre ellos pero sin profundizar demasiado. Elmanejodeambostiposdeenlacessehaceconelcomando'ln'.Como es habitual un repaso a la pgina man de este comando es muy recomendable.Lacreacindeunenlacergidoyunosimblicoesmuy similar.Ladiferenciaesqueparaelenlacesimblicotendremosqueusar laopcins. Como es habitual asumimos que las prcticas se realizarn desde un usuariodistintoderoot.
$ $ $ $ $ $ $ $ $ $ cd /tmp mkdir /tmp2 cd tmp2 echo xxxx > ej0 ## Ahora creamos un par de enlaces rgidos con ej0 ln ej0 ej1 ln ej0 ej2 ## Creamos tambin un enlace simblico ejs1 a ej0 ln -s ej0 ejs1 mkdir dir1

100

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ ## Tambin creamos un enlace simblico dir2 a dir1 $ ln -s dir1 dir2 $ ls -l drwxr-xr-x lrwxrwxrwx -rw-r--r--rw-r--r--rw-r--r-lrwxrwxrwx 2 1 3 3 3 1 pepe pepe pepe pepe pepe pepe user 1024 may 18 17:28 dir1 user 4 may 18 17:28 dir2 -> dir1 user 1 may 18 17:26 ej0 user 1 may 18 17:26 ej1 user 1 may 18 17:26 ej2 user 3 may 18 17:28 ejs1 -> ej0

Conestoacabamosdecreardentrodetmpundirectoriotmp2ydentrode elhemoscreadoyaalgunosficheros,algunosdirectoriosyunoscuantos enlaces rgidos y simblicos. Los enlaces rgidos no muestran nada particular listados con 'ls l' pero los enlaces simblicos vienen acompaadosdeunaflechaqueapuntaaotronombredefichero. Elfichero'ej0'lohemoscreadoconuncontenido'xxxx'paraverquepasa conesecontenidomsadelante.Elnombredeusuario'pepe'yelnombre degrupo'users'sonficticiosyensusistemaobtendrotracosa.Hayuna columna de nmeros a continuacin de los permisos. Se trata de una columnaqueindicaelnmerodeenlacesrgidosqueestnasociadosaun mismofichero.Enelcasode'ej0','ej1','ej2'apareceun3yestclaro porquesonenlacescreadospornosotrosperoeldirectorio'dir1'tieneun 2. Esto significa que existe otro enlace rgido para ese directorio que nosotrosnohemoscreado.Sehacreadoautomticamentealcrear'dir1'. Acurdesequetodoslosdirectoriossecreanconunpardeentradasque son'.'y'..'El2porlotantoenestecasosedebealaentrada'.'dentrodel propio 'dir1' y si dentro de 'dir1' existieran directorios habra que contabilizar cada unodel los '..' delos directorios hijos como enlaces rgidosde'dir1'.Unficherosecorrespondeconunnicoinodo.Esdecir tieneunanicaentradaenlatablaplanadelsistemadeficheros,pero quizsaparezcavariasvecesendistintaspartesdelsistemadeficheros,o condistintonombre.Siestoltimonolehaquedadoclarovuelvaaleerlo despusdefinalizarestecaptuloporquevamosaseguirexplicandoque

101

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

esunenlacergido.Ahoraretomamoslaprcticaenelpuntodondela dejamosycontinuamos.
$ cat ej0 xxxx $ echo kkkkkkkkk > ej1 $ cat ej0 kkkkkkkkk $ cat ejs1 kkkkkkkkk

Vemosqueelcontenidodelosdistintosenlacescon'ej0'esidntico,ysi modificamos el contenido de cualquiera de ellos se afectar instantneamenteelcontenidodelosrestantes.Enrealidadlainformacin esaccesibledesdedistintosnombresdeficherosperonosoncopiassino que se trata de la misma unidad de informacin. Continuamos con el ejercicio.

$ rm ej0 $ cat ejs1 cat: ejs1: No existe el fichero o el directorio $ cat ej1 kkkkkkkkk

Aquyavemosunadiferencia.Peseaque'ej1'secrecomounenlacede 'ej0','ej1'mantieneaccesiblelainformacininclusoaunquedesaparezca 'ej0'.Esoesporqueenelcasodelosenlacesrgidosdaigualcualesel enlaceoficherooriginal.Sontotalmenteequivalentesylainformacin solo desaparecer del sistema cuando el ltimo enlace rgido sea 102

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

eliminado. La diferencia con el enlace simblico es que acta simplementeaccediendoalnombredelficheroquetienealmacenadoen suinterior.Poresoenelcasoqueacabamosdever'ejs1'quedaapuntando a'ej0'queesunficheroqueyanoexiste.Continuamosconelejercicioy ahorausaremosunaopcinpara'ls'quenohabamosvistoantes.Setrata delaopciniquesirveparavisualizarelnmerodeinodo. Un inodo es una clave numrica para el acceso al sistema plano de ficherosdondecadapuntocapazderecibiroentregarinformacin,tiene unanicaclave.Poresolosdistintosenlacesrgidoscontienenelmismo valordeinodo.Loderecibiroentregarinformacinsetraduceenchorros de bytes producidos en operaciones de lectura escritura pero estas funciones peseamanejarse siempreigual realizan cosasmuydistintas dependiendo deltipo defichero. Unficheroregulares unalmacn de informacin.Otrostiposdeficherosnosonmeroscontenedoresdebytes. Porejemplolosdispositivosespecialesdebloquesodecaracterespueden verse como emisores y receptores de bloques o caracteres respectivamente asociados a un dispositivo. Tampoco son meros contenedoresdebyteslossockets,enlacessimblicos,fifosconnombre, etc.Salvolosdirectorios,todossoncapacesderecogerchorrosdebyteso deentregarchorrosdebytesoambascosasalavezylomsimportante, todosellostienenasociadouninodoyalmenosunnombredefichero colgandodealgunapartedesistemadeficheros.Losdirectoriosnose puedenmanejarconfuncionesclsicas delecturaescritura.Tienensus propiasfuncionesespecficasparamanejodedirectorios.
$ ls -li 73449 dir1 59173 dir2 -> 59171 ej1 59171 ej2 59172 drwxr-xr-x lrwxrwxrwx dir1 -rw-r--r--rw-r--r-lrwxrwxrwx 2 pepe user 1024 may 18 17:28 1 pepe user 2 pepe user 2 pepe user 1 pepe user 4 may 18 17:28 10 may 18 17:30 10 may 18 17:30 3 may 18 17:28

103

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html ejs1 -> ej0

Comosepuedever'ej1'y'ej2'tienenelmismovalorde59171queensu sistemaserotrovalorcualquiera.Enestemomentodespusdeborrar 'ej0'figuranconelvalor2paraelnmerodeenlacesrgidosasociados. Vamosamoverelenlacesimblico'ejs1'a'dir1'perovamosausar'mv ejs1dir2'enlugar'mvejs1dir1'perodeberadarlomismoyaque'dir2'es unenlacesimblicoa'dir1'.


$ $ $ $ mv ejs1 dir2 # ## Comprobamos el resultado ls -li drwxr-xr-x lrwxrwxrwx dir1 -rw-r--r--rw-r--r-2 pepe user 1024 may 18 17:32 1 pepe user 2 pepe user 2 pepe user 4 may 18 17:28 10 may 18 17:30 ej1 10 may 18 17:30 ej2

73449 dir1 59173 dir2 -> 59171 59171

$ ls dir2 ejs1 $ ls -li dir1 59172 lrwxrwxrwx ejs1 -> ej0 1 pepe user 3 may 18 17:28

Hemoscomprobadoqueunenlacesimblicosehacomportadoigualque sifueraelpropiodirectorioapuntado.Enrealidadpodemosactuaratodos losefectoscomosisetrataradelverdaderoficheroenlugardeunenlace simblicosalvoenelmomentodesucreacinyenelmomentodesu destruccin.Laoperacin'rm'sobreunficherosimbliconoactasobre elficheroapuntadosinosobreelpropioenlacesimblicodestruyndolo.

104

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ahoratenemos 'dir2/ejs1>ej0'pero'ej0'nisiquieraexiste.Vamosa cambiarelnombrede'ej2'queeraunenlacergidode'ej0'por'ej0'.


$ mv ej2 ej0 $ cat dir2/ejs1 cat: dir2/ejs1: No existe el fichero o el directorio

Buenoesteerroreslgicoporqueelenlace'dir2/ejs1'apuntaa'ej0'yno importaqueestemosenelmismodirectorioque'ej0'sinoque'dir2/ejs1'y 'ej0'estnenelmismodirectorio.Losenlacessonsiemprerelativosal sitio donde se encuentra el propio enlace. En caso contrario podra resultar graciossimoperopocoprctico porquedependiendodedonde estuviramos nosotros ( ms exactamente dependiendo del directorio actualdelprocesoquelouse)apuntaraaundirectoriodistintocadavez. Detodasformascomprobmoslotrasladando'ej0'a'dir2',yobservando comohaquedadotodo.
$ mv ej0 dir2 $ cat dir2/ejs1 kkkkkkkkk $ ls -li 73449 dir1 59173 dir2 -> 59171 ej1 drwxr-xr-x lrwxrwxrwx dir1 -rw-r--r-2 pepe user 1024 may 18 17:34 1 pepe user 2 pepe user 4 may 18 17:28 10 may 18 17:30

$ ls -li dir2 59173 lrwxrwxrwx dir2 -> dir1 $ rmdir dir2 1 pepe user 4 may 18 17:28

105

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html rmdir: dir2: No es un directorio $ rm dir2 $ ls -li 73449 drwxr-xr-x dir1 59171 -rw-r--r-ej1 $ ls -li dir1 59171 -rw-r--r-ej0 59172 lrwxrwxrwx ejs1 -> ej0 2 pepe user 1 pepe user 10 may 18 17:30 3 may 18 17:28 2 pepe user 1024 may 18 17:34 2 pepe user 10 may 18 17:30

Montagededispositivos Puedenexistirvariossistemasdeficheroscadaunoenundispositivoo particindistinta,peroparahacerloaccesiblehadesermontadodentro del sistema principal de ficheros. Para ello se utilizan los comandos 'mount'y'umount'. Explicaremosestounpocoms.Supongamosquedisponedeundisquete enel que deseaguardarinformacin accesible comoparte delsistema actual. En MSDOS se accedera a la unidad que representa este dispositivomedianteelcomandoa:ob:porejemplo.EnUnixestono ocurreporqueesepatticoinventollamadounidadlgicanoexiste. PerdnporlodepatticoperoesqueenMSDOS,yenWindowscambias lascosasdesitioyterminasreinstalandotodo. Supongamosquetenemosenundispositivocdrom,cinta,disquete,olo quesealasiguienteestructuradedirectorios.
. |-- Guia-del-enROOTador-2.8

106

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html |-|-|-|-|-`-curso glup_0.6-1.1-html-1.1 lipp-1.1-html-1.1 man_instal_debian_21 novato-a-novato rhl-ig-6.0es |-- cpps `-- icons

Para poder acceder a esta informacin tendramos que realizar una operacindemontadosobrealgnpuntodenuestrosistemadeficheros actual. Por ejemplo si disponemos de un directorio '/misc/novato' podramos montar en ese punto nuestro dispositivo y en ese caso la operacinseracomoengancharunarbolenlaramadeotroarbol.Deesta formaparaelsistemaseracomosielrbolcreciera.
. `-- misc `-- novato |-- Guia-del-enROOTador-2.8 |-- curso |-- glup_0.6-1.1-html-1.1 |-- lipp-1.1-html-1.1 |-- man_instal_debian_21 |-- novato-a-novato `-- rhl-ig-6.0es |-- cpps `-- icons

Si el administrador considera que montar y un dispositivo no entraa riesgos para el sistema conceder permisos para que esto pueda ser realizadoporlosusuarios.Porejemplounadministradorpuedeconsiderar quelosusuariossolopuedanmontarlaunidaddecdrom. Enunentornomultiusuarioymultiprocesonointeresahacerefectivalas actualizaciones sobre un dispositivo de forma instantnea sino que se intentaoptimizarlosaccesosaldispositivo.Poresosiescribimosenun dispositivodelecturaescrituracomoporejemploundisqueteysacamos dicho disquete antes de desmontarlo lo ms probable es que algunas operacionesdeescriturasquedensinrealizarporqueestabansimplemente 107

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

guardadasenmemoriaalaesperadeserrealizadas.Cuandosedesmonta unsistemadeficherosseescribenlasoperacionespendientessobreese dispositivoyentoncespuedeserextradodelsistemasinpeligro. Directorio/proa Estedirectorioesundirectoriomuyespecial.Esundirectorioenelcual est montado un sistema de ficheros virtual. En realidad muestra informacinquenoresideenningndispositivosinoqueeselaboradapor elpropiokernel.Porellosetratadefalsosarchivos.Suocupacinen discoes0.Sirveparacomprobarlaconfiguracinyelfuncionamientodel kernel.Noentraremosahoraacomentarloendetalleporqueestetemaes deintersparaadministradoresdelsistema.Loquenosinteresacomentar es que aqu la presentacin en forma de sistema de ficheros es una simulacinysehaceasparaquepuedasermanejadaexactamentedela misma forma que si realmente estuviera contenida en directorios y ficheros. Algunos de estos ficheros son de solo lectura otros son de lectura y escrituray permitencambiarlaconfiguracindelkernelsindetenerlo. Evidentemente todo ello est configurado con los permisos adecuados paramantenerlaseguridaddelsistema. Simiramosdentrodeldirectorio'/proc'veremosquehayunmontnde directorioscuyonombreesunnmero.Estosdirectoriosrepresentancada uno a un proceso por su pid. Ya hemos estudiado el proceso init en captulosanterioresasquevamosaponerunejemplo. Pruebeahacerlosiguiente:
$ cat /proc/1/status

Obtendr la informacin de estado ms importante del proceso init. Ademsdecontribuiralaculturageneralsobrenuestrosistemaloque

108

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

hemos mencionado sobre '/proc' nos sirve para introducir el siguiente tema. Sistemadeficherosvirtual En Linux un sistema de ficheros puede corresponderse fsicamente y lgicamenteconcosasmuydistintas.Acabamosdeverqueeldirectorio'/ proc'aparentementeestorganizadocomosifueraunsistemadeficheros idnticoalosqueresidenendiscoduroysinembargosetratadealgo totalmentedistinto.Unsistemadeficherospuederesidir,enmemoria,en unaparticin dediscoduro,enundispositivoraidformadoporvarios discosdurosfuncionandoenparaleloyconunsistemaderedundancia,en disquetes, en cdroms, en un dispositivo remoto conectado a red, etc.. Tambin se puede implementar un sistema de ficheros dentro de un fichero. Por ejemplo umsdos es un sistema de ficheros linux implementado dentrodeunficheromsdos.Realmente es unasolucin muypocoeficienteperoponederelievelaflexibilidaddelsistemavirtual deficheros.Unsistemadeficherospuedetenerunformatointernoqueno siempreeselmismo.Linuxpuedemanejarsistemasdeficherosdeotros sistemas operativos. En resumen lo que Linux ofrece con su sistema ficheros virtual (VFS) es un sistema unificado de acceso a toda una variedadderecursosmuydistintos.Estoesposibleporquesedefinenuna seriedefuncionesparamanejarunsistemadeficherosgenrico.EnUnix cadasistemadeficherostieneasociadounsistemaplanodeficheros.Las estructuraspuedenserdiferentesparacadatipodesistemadeficheros, perolasfuncionesquelomanejanquedanunificadasporel(VFS) EstructuraestandardelsistemadeficherosdeLinux Existeundocumento'fsstnd'dondesedescribeunarecomendacinpara estandarizar la estructura del sistema de ficheros de Linux para las distintas distribuciones. Nosotros vamos a resumir brevemente la informacin ms importante. Un detalle mayor sera necesario si este cursofuerauncursodeadministracindelsistema.

109

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Esteltimocaptulonoexplicaconceptosnuevosperoservirparaque comprendaloquetieneensusistema.Puedeinvestigartodoloquequiera porsucuentasiemprequeuseunusuarionormalitosinprivilegios.Si algunavezsesienteperdidosolotienequeintroducirelcomando'cd'para volveracasita. Puedehaberdiferenciasimportantesenlaestructurageneraldelsistema deficherosentreunasdistribucionesyotrasperoenlneasgeneralesel aspectodeladisposicindelosdirectoriosmsimportantesseramso menoselsiguiente;


. |-|-|-|-|-|-|-|-| | |-| | | | | | |-|-| | | | | | | | | | | | bin sbin tmp boot dev etc home lib |-- modules `-- security home |-- ftp |-- httpd |-- luis |-- msql |-- pili `-- skeleton root usr |-- bin |-- sbin |-- X11R6 | |-- bin | |-- include | |-- lib | `-- man |-- local | |-- bin | |-- doc | |-- man | |-- lib

110

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html | | | | | | | |-`-|-- src `-- tmp doc include info src `-- linux proc var |-- cache |-- catman |-- lib |-- local |-- lock |-- log |-- run |-- spool | |-- cron | |-- lpd | |-- mail | `-- mqueue `-- tmp | | |-|-|-`--

Siobservadiferenciasconlaestructuradeficherosdesudistribucinno debepreocuparseestoessolounejemplo.Comentaremoselcometidode losdirectoriosmssignificativos. Eldirectorioraz Para arrancar el sistema, debe estar presente lo suficiente como para montar'/usr'yotraspartesnoesenciales delsistemadearchivos.Esto incluye herramientas, informacin de configuracin y del cargador de arranque(bootloader)yalgunaotrainformacinesencialalarrancar. Para habilitar la recuperacin y/o la reparacin del sistema, estar presente en el sistema de archivos raz aquellas herramientas que un administrador experimentadonecesitaraparadiagnosticaryreconstruir unsistemadaado. Los errores deldisco,quecorrompenlainformacin enelsistema de archivos '/' son un problema mayor que los errores en cualquier otra 111

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

particin.Unsistemadearchivos'/'(raiz)pequeoesmenospropensoa corrompersecomoresultadodeunfallodelsistema. La principal preocupacin que se usa para balancear las anteriores consideraciones,quefavorecenelcolocarmuchascosasenelsistemade archivos raz, es la de mantener '/' (raiz) tan pequeno como sea razonablementeposible.
/ --- El Directorio Raz bin Binarios de comandos esenciales boot Archivos estticos de cargador de arranque(boot-loader) dev Archivos de dispositivos etc Configuracin del sistema local-mquina home Directorios home de los usuarios lib Libreras compartidas mnt Punto de montaje de particiones temporales root Directorio hogar del usuario root sbin Binarios del sistema esenciales tmp Archivos temporales usr Segunda jerarqua mayor var Informacin variable

Lajerarqua/usr. '/usr' es la segunda mayor seccin del sistema de archivos. '/usr' es informacincompartible,desololectura,estosignificaque'/usr',debeser compartible entre varias maquinas que corren LINUX y no se debe escribir.Cualquierinformacinqueeslocalaunamquinaovaraconel tiempo,sealmacenaenotrolugar. Ningn paquete grande (como TeX o GNUEmacs) debe utilizar un subdirectorio directo bajo '/usr', en vez, debe haber un subdirectorio dentrode'/usr/lib'(o'/usr/local/lib'sifuinstaladocompletamentelocal) para ese propsito, con el sistema X Window se hace una excepcin

112

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

debido a un considerable precedente y a la prctica ampliamente aceptada.


/usr --- Segundo mayor punto de montaje (permanente) X11R6 Sistema X Window Version 11 release 6 X386 Sistema X Windows Version 11 release 5 en plataformas X 86 bin La mayora de los comandos de usuario dict Listas de palabras doc Documentacin miscelnea etc Configuracin del Sistema (todo el site) games Juegos y binarios educacionales include Archivos header incluidos por programas C info Directorio primario del sistema GNU Info lib Libreras local Jerarqua local (vaca justo despus de la instalacin principal) man Manuales en lnea sbin Binarios de Administracin del Sistema NoVitales share Informacin independiente de la arquitectura src Cdigo fuente

/usr/local:Jerarqualocal La jerarqua '/usr/local' estparaserutilizadaporeladministradordel sistemacuandoseinstaleelsoftwarelocalmente.Necesitaestarasalvode ser sobrescrito cuando el software del sistema se actualiza. Puede ser usadoporprogramasyporinformacinquesoncompartiblesentreun grupodemquinas,peronoseencuentranen'/usr'.
/usr/local bin doc etc games lib info man /usr/local Jerarqua local. Binarios solo-locales Documentacin local Binarios de configuracin solo-local Juegos instalados localmente Libreras para /usr/local Pginas de info local Jerarquas de pginas de manual para

113

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html sbin scr Administracin del sistema solo-local Cdigo fuente local.

Este directorio debe estar vaco al terminar de instalar LINUX por primera vez. Nodebe haberexcepciones a laregla, excepto quiz los subdirectoriosvacoslistados. LaJerarqua/var Elsistemanecesitaconfrecuenciaunazonadetrabajotemporal.Sisolo serequiereusarunespacioporuncortoperiododetiemposepuedeusar'/ tmp',peromuchasveceslainformacinconvienemanejarlayalmacenarla enunlugarmspermanente.Elsistemapuedesufrirunacadarepentinay elcontenidode'/tmp'puedeserborradoduranteelarranqueodepurado regularmente mediante alguna tarea peridica. Por el contrario '/var' contienetodotipodeinformacinalgunadeellapuedeserimportante. Por ejemplo informacin vital para el mantenimiento de la gestin de paquetes de ladistribucinomensajes pendientes deserenviados por correo, archivos y directorios en fila de ejecucin, informacin de bitcora administrativa y archivos temporales y transitorios aunque se asumequesupermanenciasermayorque'/tmp'
/var Informacin variable Pginas del manual formateadas Informacin del estado de Informacin variable del software de Archivos Archivos Archivos Archivos Archivos de bloqueo de bitcora DNS, solo red base de datos NIS almacenados despus de una

catman localmente lib aplicaciones local /usr/local lock log named nis preserve falla de ex o vi run ejecutndose spool realizarse despus

Archivos relevantes a procesos Directorios de trabajos en fila para

114

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html tmp mantener /tmp pequeo Archivos temporales, utilizado para

115

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ALGUNOSCOMANDOSTILES
Tenemos una excelente noticia parasus neuronas.Enestecaptulo no introduciremosconceptosnuevos. Le proporcionaremos una lista alfabtica de comandos que puedan resultarle de utilidad. Entre estos comandos no encontrar comandos internos de la shell, ni comandos relacionados con la programacin o administracindesusistema.Soloincluiremosloscomandosdeusuario deusomsfrecuente.Eneltemadecomunicacionessolomencionaremos unospocoscomandosbsicos. Noslimitaremosaindicarbrevementeparaqueseusan.Enalgunosde ellospondremosalgnejemploperolosdetallestalescomoformadeuso yopcionesdebenconsultarseenelmanual.Elobjetivoessimplemente que conozca la existencia de los comandos que pueden resultarle de mayorutilidadenestemomento. Recuerdequeunnmeroentreparntesisacontinuacindeuncomando indicaelnmerodeseccinenelman. Dado que no vamos a mencionar en este momento ningn comando internodelinterpretedecomandosbashloquesipodemosindicarleesla formadesabercualessonycomoobtenerinformacinsobrecualquiera de ellos. Bastarconteclear elcomando'help'.Siquiereobtener ms informacinsobrecualquieradeellosteclee'helpcomando'. Ejemplo:

$ help | less $ help cd

116

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Dijimosquenoexplicaramosningncomandointernoperoenrealidad 'help'esuncomandointernoytenemosqueaadirqueadmiteelusode metacaracteres.

$ help help $ help *alias

Nosevaaestudiarendetalleningncomandoenestecaptuloyaquese tratadetener unavisindeconjunto.Porellocuandolleguemos aun comando que merezca ser explicado con mayor profundidad nos limitaremosadecirparaquesirveyledejaremosconlamielenloslabios conunoportuno"Seestudiarmsadelante". Seleccindeloscomandosexternosdeusuariomstiles.

aproposatatqatrmawkbannerbatchbccalcatchgrp chmodchowncksumclearcpcpiocutdatedfdiffduecho egrepemacsenvexexprfalsefgrepfilefindfingerfreeftp fusergawkgrepgzipheadhostnameidinfoispellkillkillall lesslnlocatelpqlprmlsmailmanmkdirmoremvnice nohuppasswdpasteprpspstreepwdreniceresetrmrmdir rshscriptsedsleepsortsplitsttysutailtalkteetelnettest tloadtoptrtrueviwwcwhatiswhereiswhowhoamiwrite xargszcatzdiffzgrepzlesszmore Loscomandosawk,cpio,egrep,fgrep,find,gawk,grep,sed,sort,test,y viserntratadosendetalleencaptulosposteriores.

apropos(1) 117

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Yacomentamosestecomandoenelcaptulodedicadoalmanualonline de unix. Sirve para ayudar a localizar un comando que no sabemos exactamentecomoseescribe.Soloseusaparalabsquedaladescripcin corta que figura al principio de la pgina del manual y hay que usar palabrascompletasynosecuenciasdecaracteres.Porejemplosinuestro manualesteninglespodramosbuscarcompresorescon:
$ apropos compress

at(1) Se utiliza para programar un comando para que se ejecute en un determinado momento. Este comando no admite intervalos de tiempo menoresaunminuto.Lasalidadeberestarredirigidayaqueseejecutar en segundo trmino sin un terminal asociado. Una vez ejecutado este comando devuelve un nmero de tarea y el momento en el cual se activarelcomando.Ejemplos:
$ echo 'date > /tmp/salida' | at now + 1 minute $ echo 'date > /tmp/salida' | at 8:15am Saturday $ echo 'date > /tmp/salida' | at noon $ echo 'echo feliz ao nuevo > /dev/console' | at 11:59 Dec 31 $ echo 'banner a comer > /dev/console' | at 1:55pm

atq(1) Permiteverlacoladetareaspendientes.
$ atq

atrm(1) 118

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Permite cancelar una tarea programada y pendiente de ejecutarse ms tarde.


$ atrm 188

awk(1) Setratadeunprogramaqueimplementaunlenguajeparatratarficheros de texto estructurados en campos y registros. Es muy potente y se estudiarmsadelante. banner(1) Paragenerarcabecerasconletrasgrandes.Ejemplo:
$ banner hola # # # # ###### # # # # # # #### # # # # # # # # #### # # # # # ###### ## # # # # ###### # # # #

batch(1) Esuncomandomuysimilaralcomandoatperonorequierelaindicarel momento en ese caso se ejecutar en un momento con baja carga. Ejemplo:
$ echo 'date > /dev/console' | batch

119

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

bc(1) Esunacalculadoradeprecisinarbitraria.(Esdecircontodalaprecisin queunoquiera)Sepuedeusarinteractivamenteoadmitircomandosporla entrada estndar. Admite expresiones bastante complejas y sentencias condicionales y de repeticin que constituyen un potente lenguaje de programacinparaestacalculadora.PorejemplocalcularelnmeroPI con300cifrasdecimales.
$ echo "scale=300; 4*a(1)" | bc -l 3.141592653589793238462643383279502884197169399375105 820974944592307\ 81640628620899862803482534211706798214808651328230664 709384460955058\ 22317253594081284811174502841027019385211055596446229 489549303819644\ 28810975665933446128475648233786783165271201909145648 566923460348610\ 454326648213393607260249141272

cal(1) CalendarioEjempos:
$ cal $ cal 2000

cat(1) Leeunoomsficherosylossacaporlasalidaestndar.

120

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ cat fichero1 fichero2 > fichero1_mas_2

chgrp(1) Permite cambiar el atributo de grupo de uno o ms ficheros. Solo el propietariodelficheroounusuarioprivilegiadopuedeusarlo.

chmod(1) Permite el cambio de los permisos asociados a un fichero. Solo el propietariodelficheroounusuarioprivilegiadopuedeusarlo.

$ $ $ $

chmod chmod chmod chmod

+r /tmp/fich u+r /tmp/fich 770 /tmp/fich a-wx,a+r /tmp/fich

chown(1) Permitecambiarelpropietarioactualdeunfichero.Soloelpropietariodel ficheroounusuarioprivilegiadopuedeusarlo.Tambinpermitecambiar elgrupo.

$ chown usuario fichero $ chown usuario:grupo fichero

121

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

cksum(1) Obtieneuncdigo(CRC)queestdiseadoparadetectarvariacionesen lainformacinporproblemasenlagrabacinotransmisindedatos.

$ cksum fichero

clear(1) Limpiaelcontenidodelaconsola.

cp(1) Copiaficheros.Siseutilizaconunpardeargumentostomarelinicial como origen y el final como destino. Si el segundo argumento es un fichero entoncessobreescribirsucontenido.Siseusaconms deun argumentoelltimohadeserobligatoriamenteundirectorio.

$ cp fich1 fichdest $ cp fich1 dirdest $ cp fich1 fich2 fich3 dirdest

cpio(1) Admiteunalistadenombresdeficherosparaempaquetarlosenunsolo fichero.Esuncomandomuypotenteyverstil.Juntocontarseusaentre

122

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

otras cosas para hacer copias de seguridad. Suele usarse mucho en combinacinconfind.Loestudiaremosmsadelante.

cut(1) Permiteextraercolumnasocamposdesdeunoomsficheros.

$ cut -d: -f1 /etc/passwd $ cut -d: -f6 /etc/passwd

date(1) Obtiene la fecha. Las opciones permiten obtener distintos formatos de salida.
$ date dom jun 11 18:17:14 CEST 2000 $ date +"%Y/%m/%d %T" 2000/06/11 18:16:49 $ date +%s 960740283

123

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

df(1) Informadelautilizacindediscoenlasparticionesqueestnmontadas.

$ df -a

diff(1) Sirveparalocalizardiferenciasentredosficherosdetexto.
$ diff fich1 fich2

du(1) Permiteaveriguarlaocupacindeespaciodetodoaquelloquecuelgade un determinado directorio. Este comando conviene usarlo de vez en cuandoparalocalizardirectoriosdemasiadocargadosdeinformacin.

$ du -s . $ du . $ du -s * | sort -n

echo(1) Permitesacarmensajesporsalidaestndar.

124

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

egrep(1) Es una variedad del comando grepquepermite elusodeexpresiones regularesextendidas.Sirvenparabuscarcadenasdetextoosecuenciasde caracteresenficheros.Seestudiarnmsadelante.

emacs(1) Esuneditormultipropsito.

env(1) Obtienelalistadevariablesdeentornoysusvalores.

ex(1) Es un editor interactivo similar al vi. En Linux existe una versin mejoradallamadaelvis.

expr(1) Esunevaluadordeexpresiones.

$ expr \( 55 + 31 \) / 3

125

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

28

false(1) Solotienesentidousarloenprogramacinyretornauncdigoderetorno queindicaerror.Enotraspalabrasnosolonohacenadasinoqueadems siemprelohacemal.Pareceabsurdoperotienesuutilidad.Sinofueras noexistiraynoeselnicocomandodeestetipo.

fgrep(1) Esunavariedaddelcomandogrep.Sirvenparabuscarcadenasdetextoo secuenciasdecaracteresenficheros.Seestudiarnmsadelante.

file(1) Sirveparaaveriguareltipodeficheropasadocomoargumento.Distingue muchostiposdeficheros.

$ file fich $ file dir1 fich2

find(1)

126

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Permite localizar ficheros dentro de la estructura de directorios. Es tremendamenteverstilyseestudiarmsadelante.

$ find /var -name '*.log'

finger(1) Sirveparaaveriguarquienestconectadoalsistema.

$ finger $ finger -l

free(1) Proporcionaestadsticasdeusodelamemoriadelsistema.

ftp(1) Comandoparaintercambiarficherosentredistintosordenadores.

fuser(1) Indicaqueprocesoestusandounficherooundirectorio.

127

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ fuser /

gawk(1) EslaversinGNUdeawk.Setratadeunprogramaqueimplementaun lenguajeparatratarficherosdetextoestructuradosencamposyregistros. Esmuypotenteyseestudiarmsadelante.

grep(1) Junto a egrep, fgrep y rgrep sirven para buscar cadenas de texto o secuenciasdecaracteresenficheros.Seestudiarnmsadelante.

gzip(1) Compresordescompresordegnu.Sepuedeusardirectamentesobreun fichero o por el contrario puede usarse como filtro. Cuando se usa directamente sobre un fichero se modificar el nombre del fichero aadiendo.gzparaindicarqueestcomprimidooseeliminarcuandosea descomprimido.

$ $ $ $ $

ls -l / > directorio_raiz gzip directorio_raiz gzip -d directorio_raiz.gz gzip < directorio_raiz > directorio_raiz.gz gzip -d < directorio_raiz.gz > directorio_raiz

128

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

head(1) Permitesacarlasprimeraslneasdeunfichero.

hostname(1) Obtieneelnombredelamquina.

id(1) Devuelveinformacindeidentidaddeaquelqueloejecuta.

info(1) EsunlectordehipertextodeGNU.MuchosprogramasdeGNUincluyen documentacinenformatoinfo.Loshipertextossontextosqueincluyen enlaces submens, y otros elementos que facilitan una lectura no secuencial.Porejemploelhtmlesotroformatodehipertexto.

ispell(1) Es un comprobador ortogrfico que puede ser acoplado a diversos editorescomoporejemploalvi.Existendiccionariosortogrficospara distintoslenguajes.

129

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

kill(1) Envaunasealaunproceso.Sellamakillporquegeneralmenteseusa para "matar" procesos. Requiere que se conozca el identificador del procesoPID.

killall(1) Comoelanteriorperopermitepasarelnombredelcomandoy"matar"a todoslosprocesosquetenganesenombre. less(1) Esunpaginadorquepuedeusarseensustitucindelpaginadormore.

$ less fichero $ cat fichero | less

ln(1) Creaenlacesrgidosyenlacessimblicosquesoncosasqueyahemos estudiado.

locate(1) Permitelalocalizacinrpidadeficherosensusistemadeficheros.Se utiliza una base de datos que debe de ser actualizada regularmente 130

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

medianteelcomandoupdatedb.Esteltimolorealizarrootcuandolo creaoportunoomejoraunestarprogramadoenelsistemaparaquese ejecuteperidicamente.Laideaeslasiguiente.Paralocalizarunfichero se suele ejecutar elcomando find capaz deexplorar todoel rboldel sistemadeficherosperoestaoperacinesmuycostosaporquerequiere abrirycerrarcadaunodelosdirectoriosenlosquebuscainformacin.El comandoupdatedbhaceestomismoperoguardandoelresultadodetoda laexploracinenunabasededatosmuycompactadondesepuedebuscar conenormerapidez.Ladesventajaesquelainformacindebsqueda tendr cierta antigedad y que no se guardan todos los atributos del fichero por lo que resulta imposible buscar usando criterios para esos atributos.Porellousaremoslocateparaciertasbsquedasaunquealgunas vecestendremosqueusarfind.

lpq(1) Informasobreelestadodelacoladeimpresin.Muestralastareasque estnellacolasuidentificadornumrico,orden,tamaoypropietario.

lprm(1) Permite cancelar tareas de impresin usandoel identificador numrico obtenidoconlpq.

ls(1) Obtiene un listado de los ficheros de un directorio. Tiene una gran cantidaddeopciones.

131

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

mail(1) Seusaparaenviaruncorreoelectrnico.Sumanejocomparadoconotros programasdecorreoelectrniconoresultamuyamigableperonosolo sirveparausarloenmodointeractivo.Selepuedepasarporlaentrada estndar el contenido de un mensaje. Una aplicacin de esto es que podemoscoleccionarmensajescortosporejemploparasuscribirseode suscribirsedelistasdecorreo.
$ echo unsubscribe l-linux | mail majordomo@calvo.teleco.ulpgc.es $ mail -s unsubscribe debian-user-spanishrequest@lists.debian.orga < null>

man(1) Este fu el primer comando que se estudi en este curso y no nos cansaremosderecomendarlequesefamiliariceconel.Lainformacinde estaspginasdelmanualnosueleresultarmuydidctica.EnLinuxno vienenapenasejemplos.Apesardeellosueletraerinformacincompleta deopcionesyformasdeuso.

mkdir(1) Creaunoomsdirectorios.Lospermisosdependerndeelvaloractual de 'umask'.Estoyalovimosencaptulos anteriores.Paraeliminarun directorioseusar'rmdir'.

132

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ mkdir dir1 dirA/dirB/dirC/dir2 dir3

more(1) Esunpaginadormuchomssencilloqueelsofisticado'less'.

$ ls | more $ more fichero

mv(1) Seutilizapararenombrardirectoriosyficherosoparatrasladarlosdeun lugaraotro.Convieneusarloconprecaucinporqueseprestaaobtener resultados diferentes enfuncindelaexistencia onodeunfichero o directoriodedestino.Moverunficheroaotroqueyaexistesupondra sobrescribirlo asqueunerrorpuedeprovocarperdidadeinformacin. CuandoseusanmsdedosargumentosenLinuxseobligaaqueelltimo seaundirectoriodedestinolocualprevieneerrores.

$ mv fich1 fich01 $ mv dir1 dir01 $ mv fich1 fich2 dir1 dir2 fich3 fich4

dir001

nice(1) A un usuario normal le permitir bajar la prioridad de los proceso lanzados con este comando. Solo root puede usarlo para aumentar la 133

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

prioridad.Unavezqueuncomandohasidolanzadosepuedemodificar suprioridadconrenice.

$ nice comando

nohup(1) Loscomandoslanzadosconnohupnoterminanalabandonarlasesin.Se puedeusarcombinadoconlaejecucinenbackground.

$ nohup GeneraInformeMensual > informe01-05-2000.out & $ # logout $ exit

passwd(1) Permitecambiarnuestraclavedeaccesoalsistema.Convienenoolvidar la clave. Generalmente para evitar olvidos los usuarios eligen claves demasiadosencillas.Dependiendodelniveldeseguridadconfiguradoen elsistema,estepodrarechazarclavesdemasiadosencillas.Noconviene usar claves cortas ni palabras que puedan ser localizadas en un diccionarionifechasonombresrelacionadascondatosdealtosignificado personal.Palabrasescritasalrevstampocosonseguras.Intercalaralgn carcter de puntuacin alguna mayscula o algn dgito suele ser una buenaprctica.foTo;21pon.5.mar7libRosBuenosielordenadoresde usopersonalysolotienenaccesopersonasdeconfianzatampocohayque serdemasiadoparanoico.

134

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

paste(1) Seusaparacombinarcolumnasdedistintosficherosenunosolo.Vienea serlocontrariodelcomandocut.

$ who | paste - -

pr(1) Permitepaginaruntextoincorporandocabeceras.
$ ls /*/* | pr -h ejemplo-pr -o 5 -l 35 | less

ps(1) Permiteobtenerinformacindelosprocesosenejecucin.Dependiendo loquenosintereseexistendiversasopcionesparaunagranvariedadde formatosydeseleccindelainformacindesalida.

pstree(1) Muestra la jerarqua entre procesos mostrando las relaciones de parentescoentreellos.

$ pstree $ pstree -p

135

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Laopcinpesmuytilparaaveriguarelpiddeunproceso.

pwd(1) Estecomandoretornaellugardondenosencontramos.
$ pwd

Sepuedeusarporejemploparaguardarellugardondeestamosahoracon objetoderetornaralamismolugarmstarde.
$ $ $ $ AQUI=`pwd` cd /tmp ls cd $AQUI

renice(1) Esparecidoaniceperoactasobreunprocesoqueyafuearrancadocon anterioridad. Por ejemplo hemos lanzado un proceso que consume muchos recursos y lleva mucho tiempo. En lugar de pararlo podemos bajarle la prioridadparaquegastemuchos recursos.(Cuandodecimos recursosnosreferimos ausodememoria, usodeCPU,etc)Unsuper usuario como root puede incrementar la prioridad usando un nmero negativo.Unusuarionormalsolopodrdecrementarlaprioridadusando un nmero positivo. En cualquier caso se requiere conocer el pid del procesoquedeseamosmodificarysolopodremoshacerlosiesunproceso nuestro.Porejemplovamos asuponerqueelPIDdeeseprocesoque deseamosbajardeprioridadesel778.
$ renice +15 778

136

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

reset(1) Puedeocurrirqueelterminalquededesconfiguradoporalgunarazn. Esto se debe a que un terminal interpreta comandos en forma de secuenciasdecaracteres.Estopermitemostrarcoloresmanejarelcursory unaseriedecosasms.Cuandoaccidentalmenteenviamosalterminalun ficherobinarioquecontienecaracteresdetodotipoencualquierorden,es bastante normal que el terminal quede inutilizable. Muchas veces se puederecuperarintroduciendoelcomandoreset.

rm(1) Yahemosexplicadoyusadoestecomando.Sirveparaborrarficheros.

rmdir(1) Ya hemos explicado y usado este comando. Sirve para eliminar directoriosquedebendeestarvacos.

rsh(1) Permite siempre que tengamos permiso ejecutar un comando en un ordenadordistinto.Sepuedeusarparatransferirgrandescantidades de informacinatravsdelared.Porejemploimaginemosquequeremos sacarunacopiadeseguridadguardandolainformacinenunaunidadde cintaqueseencuentraenunordenadordistinto.Enesecasoselanzandos comandos simultneos comunicndolos con un pipe. Un comando se 137

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ejecutarenelordenadorremotoconrshyelotroseejecutaenlocal. Ambosprocesosquedancomunicadosporentradasalidaperoesoimplica queesacomunicacinviajaratravsdelared.


$ ### Para salvar $ tar cf - . | rsh remotehost dd of=/dev/tape $ ### Para recuperar $ rsh remotehost dd if=/dev/tape | tar xf -

La forma de combinar comandos en unix conectando entrada salida permite hacer muchas veces cosas sorprendentes como en este caso. Existenuncomandosimilarquehacelomismoperolainformacinviaja encriptadaatravsdelared.Setratade'ssh'.

script(1) Esteesuncomandorealmentecurioso.Suutilidadprincipalesgrabaruna sesin.Lanzaunasubshellqueseejecutaraenunpseudoterminal.Este palabro no deseamos explicarlo ahora pero mientras estamos en esa subshelltodosloscaracteresrecibidosporelterminalsongrabadosenun fichero.Paraterminarsetecleaexit.Estilparamemorizarsesionesde trabajo.

sed(1) Este es un editor deflujo. Dichode otraforma es uneditor queest pensadoparausarlocomoflujo.Deestaformasepuedeusarcomouna poderosaherramientaparatransformartexto.Seestudiarmsadelante.

138

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

sleep(1) Sirve para esperar sin consumir recursos. El proceso queda dormido duranteelnmerodesegundosindicado.

$ echo hola; sleep 5 ; echo que tal

sort(1) Estecomandopermiteordenarlineasdetexto.Sepuedeusarcomofiltro. Seestudiarmsadelante.

split(1) Estecomandosirveparapartirentrozosmspequeosunficherogrande. Paravolveraobtenerelficherooriginalbastarconusarelcomando'cat'

$ split --bytes=52m ficherogrande parte

Estecomando troceaunficherograndeentrozosde52Mbytesquese guardanenficherosqueempiezanconelprefijo'parte'seguidodeuna numeracinsecuencial.

stty(1)

139

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Sirve para comprobar el estado actual del terminal y para cambiar la configuracin del mismo. Se puede cambiar el significado de algunos caracteres de control, establecer el nmero de filas y columnas del terminal,lavelocidaddetransmisin,etc.Paracomprobarelestadoactual tecleelosiguiente.
$ stty -a

su(1) Permitecambiardeusuario.Loquesehaceeslanzarunasubshell.Hay dos formas de hacerlo. 'su nuevousuario' y 'su nuevousuario'. Si no usamos la segunda forma solo cambiar el usuario efectivo pero el entornodelprocesosemantiene.Siporelcontrarioseusalasegunda formaseejecutarnlosscriptsdeiniciodesesinparaelnuevousuarioy tendremosunasesinidnticaalaobtenidaconlaentradaconloginpara esenuevousuario.Paraterminaresasesinbastarhacerexit.

$ su nuevousuario $ su - nuevousuario

Paraunusuarionormalsesolicitarlapassworddelnuevousuario.

tail(1) Ascomoheadservaparaobtenerlasprimeraslneasdeunficherotail sirveparaobtenerlasltimaslneasdeunfichero

140

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ tail fichero

Tailtieneunaopcinmuytilparamostrarqueesloqueestpasandoen ficherosqueseestngenerandooquecrecencontinuamente.

$ tail -f fichero

Estecomandonoterminanuncaymuestraelfinaldelficheroquedandoa la espera de mostrarelrestodemismoamedida quesegenere.Para terminarhayquematarloconCtrlC.

talk(1) Permiteabrirunasesindecharlainteractivaconotrousuario.

tee(1) Este comando se utiliza para obtener una bifurcacin en un flujo de entradasalida.Actacomounaderivacinenformade'T'.

$ ll | tee todos-fich | tail > ultimos-fich

telnet(1) Permiteabrirunasesindetrabajoenotramquina. 141

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

$ telnet localhost

Con esto podemos probar telnet conectndonos con nuestra propia mquina.Acontinuacinsaldrlasolicituddelogin.

test(1) Seusaparaevaluarexpresiones.Seusamuchoenlaprogramacinshell script.Loqueseusaessucdigoderetorno.Tienedosformasdeuso 'testexpresin'o'[expresin]'

$ test "2" = "3" $ echo $? $ test "2" = "2" $ echo $? $ A=335 $ B=335 $ [ "$A" = "$B" ] $ echo $?

Seestudiarmsadelante.

tload(1) Convierteelterminalenunmonitorsemigrficoqueindicarelnivelde carga del sistema. Se interrumpe con CtrlC. Si el sistema no est trabajandodemasiadonovernadademasiadointeresante. 142

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

$ ls /*/* > /dev/null 2>&1 $ tload -d 2

&

top(1) Muestra informacin de cabecera con estadsticas de uso de recursos. (nmero de procesos y en que estado estn, consumo de CPU, de memoria,ydeswap).Ademsmuestrainformacinmuycompletasobre losprocesosqueestnconsumiendomsrecursos.Sielordenadorvamuy lentoporexcesodetrabajopodemoshacernosunaideamuybuenadelos motivosusandoestecomando.Enrealidadestecomandoesmuytilpara eladministradordelsistemaperolosusuariosquecompartenelusodeun sistema con otros usuarios tambin tienen que usar los recursos del sistemadeformainteligentebajandolaprioridaddetareaspocourgentes yqueconsumanmucho.Enespecialnoresultabuenaidealanzarmuchas tareas pesadas de forma simultanea aunque sean urgentes porque se perjudicaelrendimientoglobaldelsistemaquegastarexcesivotiempo enlaboresimproductivasdegestindeprocesos.

$ top

Parasalirhayquepulsar'q'.

tr(1) Seutilizaparasustituircarcter.

143

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ # Pasar a maysculas $ tr '[a-z]' '[A-Z]' < fichero > nuevofichero $ # Eliminar el carcter ':' $ tr -d : < fichero > nuevofichero

true(1) Este comando es el contrario del comando 'false'. Solo tiene sentido usarloenprogramacinyretornauncdigoderetornoqueindicaxito. Enotraspalabrasnohaceperoalmenoslohacecorrectamente.

vi(1) Esteesuneditormuypotenteypresenteentodoslossistemasdetipo Unix.Seestudiarmsadelante.

w(1) Muestra informacin de usuarios actualmente conectados mostrando momentodeiniciodesesinyelconsumodeCPUqueseharealizado.

$ w

wc(1)

144

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Estees un comando queseusabastante. Sirveparacontarcaracteres, palabrasylneasenunficherooenunflujodeentradasalida.

$ wc fichero $ cat fichero | wc

whatis(1) Sirveparamostrarlabrevedescripcindeuncomandoquefiguraenlas pginasdelmanual

$ whatis ls $ whatis whatis

who(1) Sacalainformacindequienesestnconectadosalsistema.

$ who

whoami(1) Paraaveriguarquienesustedenesemomento.Enunprogramapuedeser interesantecomprobarquienloestejecutando.

145

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ whoami

whereis(1) Sirve para localizar un comando en el sistema siempre que este est localizadoen$PATH

$ whereis ls $ whereis whereis

write(1) Siemprequesetengapermisopermiteenviarmensajesaotrousuario.

$ write root

xargs(1) Sirveparapasarargumentosauncomandomedianteentradasalida.

$ echo '-l' | xargs ls

Cosascomoestasaadenbastantepotenciaallenguajeshellscript.

146

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

z... Hayunaseriedecomandos.'zcat,zmore,zgrep,zless,zdiff'quepermiten trabajar directamente con ficheros comprimidos con gzip en la misma forma que lo haramos directamente con 'cat, more, grep, less y diff' respectivamente.

$ zless documento.txt.gz

147

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

EXPRESIONESREGULARES
Introduccin Vamosaexplicarlasexpresionesregularesporqueseutilizanamenudo desdeunagranvariedaddeaplicacionesenlosSOtipoUnixcomoLinux. Permitenreconocerunaseriedecadenasdecaracteresqueobedecena ciertopatrnquellamamosexpresinregular.Porejemplosideseamos buscarlineasquecontengalaspalabras'hola'o'adis'enlosficherosdel directorioactualharemos:
$ egrep 'hola|adis' *

Notodosloscomandosusandeformaidnticalasexpresionesregulares. Algunos de los comandos que usan expresiones regulares son 'grep', 'egrep', 'sed', 'vi', y 'lex'. Este ltimo en linux se llama 'flex' y es un analizadorsintcticomuypotenteperonoloexplicaremosporquepara usarlo hay que saber lenguaje 'C'. Actualmente algunos lenguajes modernos como el 'perl' incluyen capacidad de manejar expresiones regulareslocuallesdaunagranpotenciayparalenguajesmsantiguos comoel'C'existenlibreras parapoderusarexpresionesregulares.En resumenlasexpresionesregularesestnsinedoincorporadasendistintos sitiosyyanoestnlimitadasasuusoenSOtipoUnix.Cadacomandoo aplicacin implementalaexpresionesregularesasumaneraaunqueen general son todas bastantes parecidas. Por ejemplo 'grep' permite usar expresiones regulares sencillas mientras que 'egrep' es capaz de usar expresionesregularesmscomplejas.Otroscomandosadaptanelusode expresiones a sus particulares necesidades yporello sibien sepuede hablarengeneraldeellashayquetenerencuentalaspeculiaridadesde cadacasoquedebernserconsultadasenlaspaginasdelmanualdecada comando.Lasexpresionesregularesvienenaserunaespeciedelenguaje ycadacomandousasupropiodialecto.Enrealidadlasdiferenciasentre 148

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

losdistintosdialectossuelensermuypocas.Porejemplosiuncomando usa los parntesis y adems admite el uso de expresiones regulares extendidasseestablecerunaformadedistinguirsilosparntesisdeben serinterpretadoscomopatrndelaexpresinregularocomootracosa. Paraellosesueleusarlosparntesisprecedidosdelcarcterescape'\'. Vamos a tomar a 'egrep' y 'sed' como comandos para aprender expresiones regulares porque este curso tiene un enfoque prctico. Usaremoselcomando'egrep'condistintospatronesyveremoscuando cumpleycuandonocumpleydeesaformaseentenderperfectamente. Operadoresusadosenexpresionesregulares. * + . ? | ^ $ [...] Elelementoprecedentedebeaparecer0omsveces. Elelementoprecedentedebeaparecer1omsveces. Uncarctercualquieraexceptosaltodelinea. Operadorunario.Elelementoprecedenteesopcional Ounouotro. Comienzodelinea Findelinea Conjuntodecaracteresadmitidos.

[^...] Conjuntodecaracteresnoadmitidos. (...) \ \n \t Operadorderango Agrupacin. Escape Representacindelcarcterfindelinea. Representacindelcarcterdetabulacin.

149

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Estalistanoescompletaperoconestoessuficienteparahacercasitodo loquenormalmentesehaceconexpresionesregulares. Ejemplosparacadaoperadorcon'egrep' Empezaremos usando un ejemplo lo ms sencillo posible para ilustrar cadaunodeestosoperadores Ejemplo para el operador '*' con el $ egrep 'ab*c' <<FIN patrn'ab*c' Este patrn localizar las cadenas de caracteres que empiecen por 'a', que continencon0oms'b',yquesigan conuna'c'. La4fallaporquela'a'yla'c'novan seguidas ni existen caracteres 'b' entre ambas.La5fallapornotenerunasola 'c'.yla6tieneloscaracteresadecuados peronoenelordencorrecto.
< < < < < < < < 1 2 3 7 1 ac 2 aac 3 abbbc 4 axc 5 aaab 6 cba 7 aacaa FIN ac aac abbbc aacaa

Ejemplo para el operador '+' con el $ egrep 'ab*c' <<FIN patrn'ab+c' < 1 ac Este patrn localizar las cadenas de caracteres que empiecen por 'a', que continencon1oms'b',yquesigan conuna'c'.
< < < < < < < 2 aac 3 abbbc 4 axc 5 aaab 6 cba 7 aacaa FIN

Solo la lnea 3 cumple la expresin 3 abbbc regular.

150

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ejemplo para el operador '.' con el < a00c < axxcxx patrn'a..c' Este patrn localizar las cadenas de caracteres que empiecen por 'a', que continen con dos caracteres cualesquieradistintosdesaltodelneay a00c axxcxx quesiganconuna'c'.
aacc < < < < < aacc abc ac axxxc FIN

$ egrep 'a..c' <<FIN

Ejemplo para el operador '?' con el $ egrep 'ab?cd' <<FIN < abcd patrn'ab?cd' < acd Este patrn localizar las cadenas de caracteresqueempiecenpor'a',yque opcionalmentecontinenconuna'b'y quecontineconloscaracteres'cd'.
< cd < abbcd < FIN abcd acd $ < < < < < < egrep 'ab|cd|123' <<FIN xxxabzzz xxxcdkkk badc dbca x123z FIN

Ejemplo para el operador '|' con el patrn'ab|cd'

Este patrn localizar las cadenas de caracteres que contengan 'ab', 'cd', o xxxabzzz '123'
xxxcdkkk x123z

151

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ejemplo para el operador '^' con el < abcdefgh < abc xx patrn'^abc' Este patrn localizar las lineas que abcdefgh empiecenpor'abc'.
abc xx $ < < < < < < 00abc < FIN

$ egrep '^abc' <<FIN

Ejemplo para el operador '$' con el patrn'abc$'

Este patrn localizar las lineas que terminenpor'abc'. 000abc


abc

egrep 'abc$' <<FIN abcd 000abc xxabcx abc FIN

Ejemplo para el operador '[ ]' con el < 0abc0 < 0a0 patrn'0[abc]0' < 0b0 Este patrn localizar las cadenas que tenganun'0'seguidodeuncarcterque puedeser'a','b',o'c'yseguidodeotro '0'.
< 0c0 < xax < FIN 0a0 0b0 0c0

$ egrep '0[abc]0' <<FIN

Ejemploparaeloperador'^'(negacin) < 0abc0 dentrode'[]'conelpatrn'0[^abc]0' < 0a0 Este patrn localizar las cadenas que tenganun'0'seguidodeuncarcterque nopodrserni'a',ni'b',ni'c'yseguido 000 deotro'0'. x0x0x
< < < < 000 x0x0x 0c0 FIN

$ egrep '0[^abc]0' <<FIN

152

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ejemplo para el operador '' (rango) < 0a0 < 000 dentrode'[]'conelpatrn'0[az]0' Este patrn localizar las cadenas que tengan un '0' seguido de una letra 0a0 minscula,yseguidodeotro'0'.

$ egrep '0[a-z]0' <<FIN < 0Z0 < x0x0x < FIN x0x0x $ egrep '0(abc)?0' <<FIN

Ejemplo para el operador '()' < hh00hh < s0abc0s (agrupacin)conelpatrn'0(abc)?0' Este patrn localizar las cadenas que tenganun'0'seguidoopcionalmentede hh00hh lasecuenciaabc,yseguidodeotro'0'.
< s0ab0s < 0abc < FIN s0abc0s

Ejemplo para el operador '\' (escape) $ egrep '0\(abc\)?0' <<FIN < 0(abc)0xx conelpatrn'0\(abc\)?0' < 0(abc0xx Este patrn localizar las cadenas que tenganun'0'seguidoopcionalmentede 0(abc)0xx ')',yseguidodeotro'0'. 0(abc0xx Ampliandoconocimientossobre'egrep' Hemosaprendidocosasdeegrepparailustrarelusodelasexpresiones regularesperotantogrepcomoegreppermitenelusodeciertasopciones queannohemoscomentadoyquenovamosailustrarconejemplos porquenoestnrelacionadasconlasexpresionesregulares.Solovamosa sealarlasopcionesmstilesparaquelasconozca.
< hh00hh < FIN

iBuscaignorandodiferenciasentremaysculasyminsculas. wParaforzarquelacadenareconocidaseaunapalabracompleta. 153

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

l No muestra el contenido de la linea encontrada pero si que muestraelficheroquecontiene lacadenabuscada.Estoestil cuando deseamos buscar entre muchos ficheros de los cuales algunos son binarios porque la muestra del contenido de un ficherobinariopuededesconfigurarelterminal. nMuestraelnmerodelneadentrodelficheroparaayudarasu localizacin. vEnlugardesacarlalineasquecumplenlabsquedasacarlas quenocumplen.

Paraunmayordetalleconsultarlaspginasdelmanual.Setratadeun comandodegranutilidadylerecomendamosquepractiqueporsucuenta conel.Exstenvariasmodalidadesdeestecomando.


grepComandobsico. egrepVersingrepparausodeexpresionesregularesextendidas. fgrepVersingrepinterpretalospatronesnocomoexpresiones regularessinocomocadenasdecaracteresfijas. rgrep Permite buscar recursivamente en varios ficheros recorriendounarboldedirectorios.

Usodeexpresionesregularesen'sed' Ahoraveremosunosejemploscon'sed'.Estecomandoescapazdeeditar unflujoochorrodecaractereslocualesdeenormeutilidaddadoque muchos comandos se comunican a travs de entrada salida mediante chorrosdecaracteres.Nopodemosvertodaslasposibilidades de'sed' porqueloquenosinteresaessuusoconexpresionesregulares.Paraello usaremosunnuevooperador'&'queenlapartedesubstitucinde'sed' indicalapartequecoincideconlaexpresinregular. Para usar 'sed' se pone como primer argumento a continuacin del comandolaordenadecuada.Opcionalmentesepuedeponerunsegundo parmetro que indicara el nombre de un fichero. De no existir ese segundoparmetroesperarlaentradaporlaentradaestndar. 154

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Se intentan reconocer las secuencias ms largas posibles ^ y $ no consumencarcter'\n'si. Empezamosconunasustitucinsencillita.


$ echo "abc1234def" | sed "s/[0-9][0-9]*/NUMERO/" abcNUMEROdef

Ahorausamoseloperador'&'.Observecomosesustituyeporelpatrn reconocido.
$ echo "abc1234def" | sed "s/[0-9][0-9]*/<&>/" abc<1234>def

Despuseliminamoslasecuencianumrica.
$ echo "abc1234def" | sed "s/[0-9][0-9]*//" abcdef

Vamosacomprobarqueenlasexpresionesregularesseintentasiempre reconocerlasecuenciamslargaposible.
$ echo "000x111x222x333" | sed "s/x.*x/<&>/" 000<x111x222x>333

Vamosahoraatrabajarsobreunfichero.Comosiemprerecordamosque trabajeconunusuariosinprivilegiosydentrode/tmp.Yasabecomo hacerloasquecambieahoraa/tmpantesdecontinuar.Parasuprimirdel ficherolapalabra'Hola'enlaslineasdela3ala4.

155

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html # $ < < < < < < < $ Creamos un ficherito de prueba cat <<FIN > prueba-sed.txt Hola este es un fichero con datos de prueba Hola otra vez. Hola otra vez. Hola otra vez. Hola otra vez y otra y otra y otra y otra y otra. Fin de los datos de prueba FIN sed "3,4s/Hola//" prueba-sed.txt

Hola este es un fichero con datos de prueba Hola otra vez. otra vez. otra vez. Hola otra vez y otra y otra y otra y otra y otra. Fin de los datos de prueba

Elficheronohacambiado.Elresultadosaleporsalidaestndar.Ahora veamosquepasasiintentamossustituirlapalabra'otra'porlapalabra 'una'entodoelfichero.


$ sed "s/otra/una/" prueba-sed.txt Hola este es un fichero con datos de prueba Hola una vez. Hola una vez. Hola una vez. Hola una vez y otra y otra y otra y otra y otra. Fin de los datos de prueba

Vemosquesolosehacambiadolaprimeraocurrenciadecadalnea.Para obtenerelresultadodeseadotendramosqueusarlagalfinal.
$ sed "s/otra/una/g" prueba-sed.txt Hola Hola Hola Hola este es un fichero con datos de prueba una vez. una vez. una vez.

156

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Hola una vez y una y una y una y una y una. Fin de los datos de prueba

Ampliandoconocimientossobre'sed' Hemos aprendido cosas de sed para ilustrar el uso de las expresiones regulares pero sed tiene muchas ms posibilidades que an no hemos comentado. Comentaremos solo algo ms pero sin extendernos demasiado.Ensedsepuedenespecificarvariasinstruccionesseparando con';'cadaunadeellasousandolaopcineantesdecadainstruccin. Tambinpodemosaprovecharelsegundointroductordelashell.
$ sed "s/otra/vez/g ; s/vez/pez/g" prueba-sed.txt Hola este es un fichero con datos de prueba Hola pez pez. Hola pez pez. Hola pez pez. Hola pez pez y pez y pez y pez y pez y pez. Fin de los datos de prueba # $ # $ < < < Idntico resultado podramos haber conseguido usando sed -e "s/otra/vez/g" -e "s/vez/pez/g" prueba-sed.txt Una tercera forma para conseguir lo mismo sed " s/otra/vez/g s/vez/pez/g " prueba-sed.txt

Tambinpodemosobtenerelmismoresultadousandolaopcinfyun ficherodeinstruccionespara'sed'.
$ cat <<FIN > prueba-sed.sed < s/otra/vez/g < s/vez/pez/g FIN $ sed -f prueba-sed.sed prueba-sed.txt

157

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Existen posibilidades ms avanzadas para usar 'sed' pero con lo que hemosmencionadosepuedenhacermuchascosas. Podemoseliminar losblancosaprincipio yalfinaldelinea ascomo sustituirmsdeunblancoseguidoporunsoloblanco.
$ < < < < cat <<FIN > trim.sed s/^ *//g s/ *$//g s/ */ /g FIN

Sinecesitahaceralgunatransformacinynoencuentralaformafcilde hacerconsedpiensequequizsnecesiteusarvariastransformacionesen cadena.


#!/bin/bash ###################################################### ###### echo ; echo # Filtraremos la salida del comando cal para que el da de # hoy resalte enmarcada entre corchetes. # # Primero obtenemos el da del ms DIAMES=`date '+%d'` # Asi no vale. Hay que eliminar los posibles ceros a la # izquierda obtenidos # en la variable DIAMES. # Usamos para ello printf(1) DIAMES=`printf %d $DIAMES` # Resaltar el da del ms correspondiente al da de hoy, # Si es el ltimo da del mes (patrn ' [23][0-9]$') aadiremos # un blanco al final y as usaremos siempre como patrn de # sustitucin el da ms ($DIAMES) entre dos caracteres blancos # sin que eso provoque errores en el ltimo di del mes.

158

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html cal | head -n 1 cal | tail -n 7 | sed 's/ / +/g' | sed 's/^ /+/g' | \ sed 's/ / /g' | sed 's/+/ /g' | sed 's/$/& /' | \ sed 's/^/ /' | sed "s/ $DIAMES /\[${DIAMES}\]/" # Trazas cal | tee traza.1 | \ tail -n 7 | tee traza.2 | \ sed 's/ / +/g' | tee traza.3 | \ sed 's/^ /+/g' | tee traza.4 | \ sed 's/ / /g' | tee traza.5 | \ sed 's/+/ /g' | tee traza.6 | \ sed 's/$/& /' | tee traza.7 | \ sed 's/^/ /' | tee traza.8 | \ sed "s/ $DIAMES /\[${DIAMES}\]/" > traza.9

Lasltimaslneaslashemosaadidosimplementeparaanalizarpasoa pasocomosevatransformandolasalidaoriginaldelcomandocaldelcual enprimerlugaryahemosseparadolaprimeralnea.Lasdistintasetapas quedanregistradasentraza.1atraza.8.


traza.1 contiene la salida del comando cal. S 7 14 21 28 April 2002 M Tu W Th F S 1 2 3 4 5 6 8 9 10 11 12 13 15 16 17 18 19 20 22 23 24 25 26 27 29 30

En traza.2 se ha eliminado la primera lnea. S 7 14 21 28 M 1 8 15 22 29 Tu W Th F S 2 3 4 5 6 9 10 11 12 13 16 17 18 19 20 23 24 25 26 27 30

En traza.3 se ha sustituido toda secuencia de dos blancos por ' +' S +M Tu +W Th +F +S

159

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html + 7 14 21 28 +1 +8 15 22 29 +2 +9 16 23 30 +3 10 17 24 +4 11 18 25 +5 12 19 26 +6 13 20 27

En traza.4 sustituimos los blancos a comienzo de lnea por '+' +S ++ +7 14 21 28 +M +1 +8 15 22 29 Tu +2 +9 16 23 30 +W +3 10 17 24 Th +4 11 18 25 +F +5 12 19 26 +S +6 13 20 27

Gracias a los pasos anteriores ya tenemos una estructura de lneas formada por dos caracteres distintos de blanco separadas por un blanco y precisamente este blanco en traza.5 lo sustituimos por dos blanco para dar ensanchar toda la salida. +S ++ +7 14 21 28 +M +1 +8 15 22 29 Tu +2 +9 16 23 30 +W +3 10 17 24 Th +4 11 18 25 +F +5 12 19 26 +S +6 13 20 27

Ahora ya no son tiles los '+' y los sustituimos por blancos. En traza.6 ya tenemos la salida ensanchada. S 7 14 21 28 M 1 8 15 22 29 Tu 2 9 16 23 30 W 3 10 17 24 Th 4 11 18 25 F 5 12 19 26 S 6 13 20 27

En traza.7 no se aprecia la diferencia pero si que existe. cal termina las lneas inmmediatamente despues del nmero, y no hay razn para que lo haga de otra manera pero a nosotros nos conviene que absolutamente todos los nmeros tengan un blanco a la izquierda

160

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html y otro a la derecha para que a la hora de enmarcar el nmero solo tengamos que sustituir blancos y no se desalineen las columnas. Por ello aunque no se aprecie en traza.7 hemos aadido un blanco al final de las lneas. S 7 14 21 28 M 1 8 15 22 29 Tu 2 9 16 23 30 W 3 10 17 24 Th 4 11 18 25 F 5 12 19 26 S 6 13 20 27

Ahora en traza.8 se ve como hemos aadido un blanco a la izquierda. S 7 14 21 28 M 1 8 15 22 29 Tu 2 9 16 23 30 W 3 10 17 24 Th 4 11 18 25 F 5 12 19 26 S 6 13 20 27

Por ltimo bastar sustituir el da del ms entre blancos por el da de ms entre corchetes. S 7 14 21 28 M 1 8 15 22 29 Tu 2 9 16 23 30 W 3 10 17 24 Th 4 11 18 25 F S 5 6 12 13 19 [20] 26 27

Independientementedequeaustedseleocurraotrasolucinmejor,se tratabadepracticarconsedyconsietesedsencadenadospensamosque yahabrsaciadosuseddesed(1). Detodasformassiloquieremsbonitoycortitopruebeestootro.


ESC=`echo -e "\033"` cal | sed "s/$/& /" | sed "s/ $DIAMES / $ESC[1m$ {DIAMES}$ESC[0m /"

161

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Yanossalimosdeltemaperosiestohadespertadosucuriosidadmire console_codes(4).

162

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ELEDITORVI(Primeraparte)
Introduccin En primer lugar vamos a dedicar bastante esfuerzo a explicar porque aprender'vi'.Quizspensqueestecaptulonoeraparaustedporqueya sabeusarotroeditor.Tambinvamosexplicarlanecesidaddededicardos largoscaptulosaesteeditor. Cuandofinaliceestecaptulopodreditarsusficheroscon'vi'yhacer bastantetrabajotilperoparaelloquizasnecesitealgomsdeesfuerzo queencaptulosanterioresynoporqueseadificilsinoporquetendrque practicarbastanteporsupropiacuenta. Otracosasersacarleelmximopartidoa'vi'.Enunsegundocaptulo dedicadoa'vi'veremosopcionesmsavanzadas.Sonopcionesquequizs nonecesiteusartanfrecuentementeperocuandotengaoportunidadde usarlascomprenderlapotenciaeleditor'vi'. Muchoseditoresactualespermitenusardistintostiposdeletrasygeneran documentosconunaspectopreciosoqueademscoincideloqueseveen pantallacuandoseedita,yconloquesaldrporlaimpresora.Estclaro que 'vi' no sirve para esto. 'vi' est diseado para editar ficheros en formatodetextoestndar.Peroaunquesolosirvaparaesteformatode textolohacemuybienysiempretendremosoportunidaddeusarloporque auncompilador,oaunintrpreteledaiguallaesttica. SonmuchosloseditoresdisponiblesenLinuxperodesdeunprincipio dijimosqueestecursopodraservirengranmedidaparaaprenderotros SOtipoUnix.Eleditor'vi'estpresentedesdehacemuchotiempoenun montn de sistemas tipo Unix. Aqu explicaremos solo unos pocos aspectosde'vi'conlaideadequepuedarealizarconrazonablesolturala 163

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

edicindeuntextoen'vi'.Conmuypocoscomandosde'vi'sepueden hacermuchascosasy'vi'esuneditorqueparaciertastareasresultade unapotenciaincreble.Elqueescribeestaslineasloesthaciendocon'vi' yllevamuchosaosusandoesteeditorprcticamenteparacasitodoyle sacoungranpartido,perocadavezquemeencuentroconalguinque sabebastantede'vi'aprendoalgonuevo.'vi'esuneditormuyprcticosin tenerqueconocerloafondoperoenmanosdeunexpertoresultadeuna eficaciaespectacular. 'vi'esuneditordelineasinteractivoyhasidomuycriticado.Unadelas razonesparaelloesquetienevariosestadosoformasdefuncionamiento ysiunopasadeunestadoaotrosindarsecuentaycontinuatecleando cosas,puedeocurrirunpequeodestrozoenelficheroqueesteditando. Otroinconvenientede'vi'esquerequiereunpoquitodeaprendizaje.Hay muchsima gente que est acostumbrada a usar otros editores ms intuitivosyporquenodecirlomscmodos,yrechazana'vi'comoalgo prehistrico. Otra cosa que suele criticarse es que se usan letras del teclado para cosas tan normales como el movimiento del cursor y la paginacindeltextoperoesteesunclaroejemplodelcondicionamiento delaculturadeMicrosoftydelosPCs.'vi'fuediseadoparaquese pudierausarenunagranvariedaddesistemasyterminales.Elusodelas teclasdeflechaspuedelograrsemediantelaadecuadaconfiguracinde 'vi'.Unodelospuntosfuertesde'vi'essuadaptabilidad. Quizsunadelasmspoderosasrazonesparaaprender'vi'esque'vi' forma parte de la cultura de los SO tipo Unix. Muchas personas acostumbradas a trabajar por ejemplo con Windows asumirn como estndar cosas que no lo son y cuando se encuentran algo diferente intentanaprovecharalmximosusconocimientosanteriores. Generalmenteexisteunaexageradsimatendenciaacontinuarusandoel primereditorqueseaprendiyluegosecambiasolodeeditorobligado porcircunstanciaspoderosas.Nosotroshemosdecididoqueenposteriores leccionesasumiremosqueustedyasabeusar'vi'.Prontotendrquehacer susprimerosprogramasenshellscript.Entoncesnecesitaruneditory nadamejorque'vi'. 164

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

EnestecursoseledamuchaimportanciaalaculturaUnix.Parauna personaqueaprende'vi'surgenvariasoportunidadesparaaplicarloque sabeencomandosdistintosde'vi'.Laformadetrabajarde'vi'hatenido mucho impacto en otros programas. Puede encontrar juegos, hojas de clculoutilidades,etcqueusancosasparecidasa'vi'.Yavimos'sed'que usacomandossimilaresaalgunoscomandosde'vi'yahoravamosavera continuacin algunas nociones de otro editor ('ed') que es otro buen ejemplodeloqueestamoscomentando. 'ed'versus'vi' Dadoque'vi'estpensadoparasuusointeractivodesdeunterminalno resulta muy apropiado de usar en combinacin con otros programas mediante redireccin de entrada salida. En el captulo anterior de expresiones regulares vimos como 'sed' se poda usar como filtro de entradasalida.Existeuneditorllamado'ed'queescapazdeeditartexto en modo no interactivo. Para ello se suele recurrir a un script que proporcionara'ed'lasinstruccionesadecuadas.Somosdelaopininde quelasleccionesquenodejanverrpidamentecualessuutilidadyque nosepracticanestncondenadasalolvido.Poresoqueremosevitarque pienseentrminosde"paraquenecesitoyoconocerestodeed".Poreso ms tarde comentaremos algo de 'diff' combinado con 'ed'. As comprendermejorlautilidaddeleditor'ed'. Ahoravamosagenerarunfichero'ejemplo.txt'conunaspocaslineaspara hacerunaspocasprcticas.
$ $ > > > > cd /tmp cat <<FIN > ejemplo.txt No olvide visitar nuestra web http://www.ciberdroide.com y esto es todo. FIN

Vamosasacarunacopiaparacomprobarluegoloscambios.

165

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ cp ejemplo.txt ejemplo.txt.original

Ahorageneramosunficheroconlasinstruccionesparaeditarelfichero anterior. Deseamos que primero localice la linea que contiene 'www.ciberdroide.com' yacontinuacinaadaunalinea(comando'a') '(Tienda Virtual de Linux)'. Salimos al modo comandos (comando '.') Salvamos(comando'w')ysalimos(comando'q').
$ > > > > > > > $ cat <<FIN > ejemplo.ed /www.ciberdroide.com/ a (Tienda Virtual de Linux) . w q FIN ed ejemplo.txt < ejemplo.ed

73 http://www.ciberdroide.com 99

Veamoscomohaquedado.
$ cat ejemplo.txt No olvide visitar nuestra web http://www.ciberdroide.com (Tienda Virtual de Linux) y esto es todo.

Podemosverlasdiferenciasconeloriginalusandoelcomando'diff'.El comandodiffesuncomandoquesirveparasealardiferenciasentredos ficherosperoconlaopcineestasdiferenciasseexpresanenunaforma adecuadaparaserinterpretadaspor'ed'.Veamoscomofunciona.


$ diff -e ejemplo.txt.original ejemplo.txt

166

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

2a (Tienda Virtual de Linux) .

Vamos a partirdelfichero original ylevamos apasarporlaentrada estndarnicamentelasdiferenciasobtenidascon'diffe'


$ cp ejemplo.txt.original ejemplo2.txt $ diff -e ejemplo.txt.original ejemplo.txt > ejemplo.diff $ cat ejemplo.diff 2a (Tienda Virtual de Linux) .

Vemos que falta las instrucciones 'w' y 'q' para salvar y salir respectivamenteasquelasaadimosalfichero'ejemplo.diff'.
$ > > > $ cat <<FIN >> ejemplo.diff w q FIN cat ejemplo.diff

2a (Tienda Virtual de Linux) . w q

Ya tenemos todas las instrucciones necesarias. Vamos a aplicar los cambioscon'ed'.


$ ed ejemplo2.txt < ejemplo.diff 73 y esto es todo.

167

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 99 $ cat ejemplo2.txt No olvide visitar nuestra web http://www.ciberdroide.com (Tienda Virtual de Linux) y esto es todo.

En lugar de guardar varias versiones de un gran fichero que sufre pequeasdiferenciasdevezencuandosepodraguardarunasolaversin yunospequeosficherosconesasdiferenciasocurridasentreunaversin ylasiguiente.Deestaformapodranaplicarsesecuencialmenteparair recuperandosucesivamentelasversionesanterioresencasodenecesidad. Cuandosedesarrollaunaaplicacinsevanintroduciendosucesivamente cambios en los programas y para poder recuperar versiones antigas habraqueirsalvandoyconservandocadanuevaversin.Losprogramas que se utilizan para el mantenimiento de distintas versiones de una aplicacin suelen basarse en esta idea para ahorrar espacio de almacenamiento. 'vim'versus'vi' En Linux existe un editor 'vi' muy mejorado que se llama 'vim'. Este editor es muy similar a 'vi' pero con importantes mejoras. La ms importantesinlugaradudaseslacapacidaddedeshacerretrocediendo uno a uno en los ltimos cambios realizados. Esto permite recuperar aquellodelosdestrozosquedijimosantes.Tambinpermiteresaltarla sintaxisdeciertosficheroscomo.shellscript,html,lenguajeC,yotros muchos lenguajes. Este y otros detalles lo hacen muy adecuado para programar.Elmanejodelcursorenlosdistintosmodosdeleditorresulta muchomscmodoyunmontndecosasms. Masadelanteveremosquesepuedenusardistintasopcionesparaqueel editorfuncioneenlaformaquenosotrosqueramos.'vim'puedeejecutarse enmodocompatible'vi'(:setcompatible)peroesmejorusarelmodono 168

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

compatible que nos proporcionar las agradables ventajas sobre el 'vi' tradicionalqueantescomentamos.(:setnocompatible)Generalmenteen Linuxseinstala'vim'comosustitutode'vi'deformaqueaunqueusted teclee 'vi' en realidad puede estar ejecutando 'vim' o 'elvis' u otros similares.Salgamosdedudas:
$ vi -? | less

Solosileinvitaausarlaopcin'h'hgalo.
$ vi -h | less

Compruebeenlasprimeraslineassisetratade'vim'.Siyahaentradopor error en editor salga mediante <ESC> :q<ENTER> Continuemos averiguandocosas.


$ $ $ $ $ $ $ $ $ whereis vi whereis vim whereis elvis man vi man vim man elvis man ex man view man ed

Ahorasivamosaentraryasalireneleditor.
$ vi

Yaestdentrodeleditor.Compruebesisaleinformacinrelativaaltipo deeditorysalgatecleando':q'Parasignificarqueestamoseneleditor'vi' pondremoselfondoazuloscuroylasletrasenamarillosonlasquesalen enpantallayenblancolasqueintroducimosnosotros.

169

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ :q

VIM - Vi IMproved version 5.3 by Bram Moolenaar et al. type type type type Vim is freely distributable :help uganda<Enter> if you like Vim :q<Enter> :help<Enter> or <F1> :help version5<Enter> to exit for on-line help for version info

Cuadroresumenparaelusode'vi' Acontinuacinsedescribenunaseriedecomandosdeusofrecuenteen 'vi'. Sedestacan los queseconsideran ms importantes conunmayor numero de asteriscos. En una primera lectura le recomendamos que empieceautilizaryaaprenderaquelloscomandosmarcadoscon'***'que sonlosmsimportantes.Leaconsejamosquenopasedeleccinhasta quenoseaprendacomomnimoloscomandoscalificadoscon'***'.Al final del captulo como es costumbre pondremos un test pero solo haremos preguntassobrecomandos calificados con'***'quesernlos quepracticaremosdeformaespecialenestecaptulo. Hemosagrupadotodaestainformacinenunnicocuadroparaquesea suchuleta,parausaryaprender'vi'.Soloseincluyenloscomandosque suponemosserndelamayorutilidadparaunusuarionovatoydadoque hayvariasformasdehacerunamismacosahemoselegidoporustedy hemosclasificadodeformatotalmentesubjetivaunaseriedecomandos para que inicialmente tengaqueaprendersolounreducidonmerode ellos. Tambin se incluyen otros comandos para que pueda ser usado comouncuadrodeconsultabastantecompleto. 170

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html *** ** * --> Comando de uso imprescindible. --> Comando de uso muy frecuente. --> Comando de uso no tan frecuente.

LINEADECOMANDOS ** vi * ** vi<fichero> * * vi<fichero1> <fichero2> <fichero3>... Editarunnuevofichero Editarunfichero.(Sielficheroesdesolo lecturaloeditaraenmodosololectura. Editarvariosficherossucesivamente. Editarenmodosololectura. Editarrecuperandomodificacionesno salvadas.

** viR<fichero> ** vir<fichero>

MODOCOMANDOS Sepasadesdeelmodoentrada(insercinoreemplazo)mediante <ESC>. Movimientosdelcursor . ** h ** <ENTER> ** j ** k ** <ESPACIO> ** l * * * * L H M <CTRL+B> Carcteranterior Lineasiguiente Lineasiguiente Lineaanterior Carctersiguiente Carctersiguiente Ultimalineadelapantalla Primeralineadelapantalla Lineacentraldelapantalla Retrocesodepgina

171

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

* * * * *

<CTRL+F> + $ 0

Avancepgina Primercarcterdelalineasiguiente Primercarcterdelalineaanterior Desplazarsealfinaldelinea. Desplazarsealprincipiodelinea.

Modoentradadetexto . ** i * ** R * ** a ** o * * O Corregir ** u * ** <CTRL+R> * ** U Buscar ** / * ? Pasaramodoentradainsertando. Pasaramodoentradareemplazando. Avanzarelcursorypasaramodoentrada insertando. Insertarunalineadespusdelaactualy pasarainsertar. Insertarunalineaantesdelaactualy pasarainsertar. . Deshacerltimamodificacin.(Envim sepuedenirdeshaciendolos losltimoscambiosenotroseditoresvi solosedeshaceelltimocambio). En'vim'sirveparadeshacerelltimo comando'u' Recuperarlineacompleta. . Buscaunacadenadecaracteres,hacia delante. Buscaunacadenadecaracteres,hacia atrs.

172

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

* *

n N

Siguienteenlabsqueda. Anteriorenlabsqueda.

Copiar,Mover,yborrar . lineas ** dd * ** <n>dd * ** yy * ** <n>yy * ** p * * P Varios ** <CTRL+L> * ** <CTRL+G> ** J * ** . ** : * ** ZZ * Borrarunalinea. borrar<n>lineas. Meterunalineaenelbuffer. Meter<n>lineasenelbuffer. Copiarlalineadelbufferdespusdela lneaactual. Copiarlalineadelbufferantesdelalnea actual. . Refrescarpantalla.(tilcuandose descomponelapantalla) Visualizaelnombredelfichero,numero delineastotalesyenquelineaestamos. Unelalneaactualconlasiguiente. Repetirltimocomando. Pasaralmodoex(Modocomandos) Terminarsalvandosihubocambios.

MODOEX Sepasadesdeelmododecomandosalmodoexcon':' 173

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Sepuedeforzaraentrardirectamenteenestemodo usandolaopcin'e'oejecutandoelcomando'ex'. ** :<#linea> * :e<fichero> * :e# ** :w * ** :w! * ** :x ** :w<fichero> * ** :w!<fichero * ** :r<fichero> * ** :r!<comando ** :q * ** :q! * ** :wq * :sh * :g/<s1>/p * :g/<s1>/s//<s2>/g Iraunalinea. Pasaaeditardeformasimultaneaotro fichero. Volveralficheroanterior. Salvar.(Nopuedesobreescribirsise entrconviR) Salvarforzando(Cuandofalla:w). Salirsalvandosiesnecesario. Salvarconotronombre.(Nopuede existirelfichero) Salvarconotronombreforzando. (Permitesobreescribir) Leeunficheroylocargaenellugar indicadoporlaposicinactualdelcursor. Ejecutaenunasubshellelcomandoy guardaelresultado delmismoenlaposicinindicadaporel cursor. Salirsinohaymodificacin. Salirsinsalvarcambios. Salirsalvandocambios. Ejecutarunasubshell(seretornacon exit). Visualizarlineasquetienen<s1> Sustituirglobalmente<s1>por<s2>. 174

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

* :g/<s1>/s//<s2>/gc * :n * :args * :abmn * :unabm * :mapmn * :map!mn * :unmapm * :unmap!m * :cd ** :setnu ** :setnonu ** :setall ** :setnocompatible ** :setshowmode * ** :!<comando> *

demperopidiendoconfirmacin. Siguientedocumento. Mirarficherosaeditar. Abreviaturas.Teclear1sesustituyepor2 Desabreviar. Crearmacro(mhacen)(Verejemplos conmacros) Crearmacroenmodoinsercin(mhace n) Destruirmacrom Destruirmacrodeinsercinm. Cambiardedirectorioactual. Activarvisualizacindenmerosde lnea Activarvisualizacindenmerosde lnea Vertodaslasopcionesconsusvalores. Opcinde'vim'paranoobligaraser compatible'vi' Paravisualizarsiempreelmodoenque nosencontramos. Ejecutaruncomandoenunasubshell. (Verejemploscon!)

Muchosdeestoscomandospuedenaplicarsedentrodeunrangode lneas.Unnmerodelneapuedevenircomounnmero,unpunto, un$.

175

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Unpunto Unpunto Unpunto Unnmero Un$ Un$

. .N .+N N $ %

Lneaactual NLneasantesdelaactual NLneasdespusdelaactual LneaN Ultimalnea. Desdelaltimaalaprimeralnea (Abreviaturade1,$). Salvardesde1hastala2en<fichero> Copiardesde1hasta2en3.

** :#linea1,#linea2w * <fichero> ** ** :#linea1,#linea2co #linea3

:#linea1,#linea2mo Moverdesde1hasta2en3. #linea3 Borrardesde1hasta2. Sustituirlaprimeraocurrenciaencada lineadesde1hastala2lacadena<s1> porlacadena<s2> Sustituirlaprimeraocurrenciaencada lineadesde1hastala2lacadena<s1> porlacadena<s2>conconfirmacin. Sustituirtodaslasocurrenciasencada lineadesde1hastala2lacadena<s1> porlacadena<s2> Sustituirtodaslasocurrenciasencada lineadesde1hastala2lacadena<s1> porlacadena<s2>conconfirmacin

** :#linea1,#linea2de :#linea1,#linea2 ** s/<s1>/<s2> :#linea1,#linea2 ** s/<s1>/<s2>/c :#linea1,#linea2 ** s/<s1>/<s2>/g :#linea1,#linea2 ** s/<s1>/<s2>/gc

Sera conveniente que sacara por la impresora esta informacin para usarlaamododechuletaensusprimerasprcticascon'vi'. 176

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Existe otra forma de aplicar comandos dentro de un rango de lineas. Desdeelmododecomandospulsando'v'sepasaalmodo'vi'omodo 'visual'.Entoncesmoviendoelcursormarcamostodoelrangodelineas quequeramostratarypulsando':'pasamosalmodo'ex'paraaplicarel comandoquequeramos.Cualquiercomandoquesepuedaintroduciren 'vi'estandoenelmodode'ex'puedeserincluidoenunfichero.exrcenel $HOMEqueservirparaque'vi'ejecuteesoscomandoscadavezque arranque.Seusamuchoparadefinirmacrosyparaactivardeterminadas opcionesconsetperoesoloveremosenotrocaptulo. Practicandolomsesencialde'vi' Sinoseusaningunaopcininicialviempezarenmodocomandos.Para pasar al modo entrada hay varias formas pero recomendamos que se aprendademomentosolo.i,a,o,R.Yahemosdescritoestasfuncionesen 'chuletavi.txt'ypracticaremosconellasmsadelante. Delmodoentrada(Insertaroreemplazar)sesalecon<ESC>. Normalmentetrabajbamosen'/tmp'comodirectoriotemporalperoesta vezvamosacrearundirectorionuestrodetrabajoparapoderconservar nuestrotrabajoeltiempoquequeramos.Paraellocrearemosundirectorio 'cursolinux'ynossituaremosenlparatrabajar.

$ $ $ $

cd mkdir cursolinux cd cursolinux vi ej-vi1.txt

Dado que no exista ningn fichero 'ejvi1.txt' estaremos editando un ficheronuevoydependiendodeleditorusado(nosotrosusaremos'vim') apareceralgodeltipo.

177

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html ~ ~ ~ "ej-vi1.txt" [New File]

Est en modo comandos y va a teclear sus dos primeros comandos. Cuandovea'<ENTER>'enlosejemplos significaquedebepulsaresa tecla.
:set showmode<ENTER> :set nu<ENTER>

Acabamosdeactivarlavisualizacindelmododefuncionamientoyla visualizacin de los nmeros de lnea. Ninguna de estas cosas son necesariasparaeditarunficheroperoanosotrosnosvanaayudaraver msclaroloquehacemos. Ahorapulsaremosla'i'yaparecerenlalineainferiorelindicadordeque estamosenmodoentradaparainsercin.Desdeestemodointroduciremos lassiguienteslineasdetexto.
1 Estamos practicando con el editor vi.<ENTER> 2 No parece tan difcil de usar.<ENTER> 3 Ya voy por la tercera linea y no ha ocurrido nada grave.<ENTER> 4 <ENTER> 5 <ENTER> 6 Como he saltado un par de lneas voy por la linea seis.<ENTER> 7 De momento no escribo nada ms.<ESC> ZZ

Conlatecla<ESC>salimosalmodocomandosycon'ZZ'(maysculas) desde el modocomandos salimos salvandoel fichero.Ahoravamos a volveraeditarlo.

178

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ vi ej-vi1.txt

Volvemosaactivarlosmodos'showmode'y'nu'ynossituamosenla lnea3ylaborramoscon'dd'luegonossituamosenlaprimeralneay hacemos 'p' que copiar la linea eliminada a continuacin de la lnea primera.'dd'guardasiempreenunbufferlainformacineliminadapara poderrecuperarlacon'p'.Podramoshaberborradocincolineasdegolpe usando'5dd'ylascincolneashabransidoguardadasenelbufferparasu posiblerecuperacincon'p'.
:set showmode<ENTER> :set nu<ENTER> :3<ENTER> dd :1<ENTER> p

Peroahoralalnea2dicequeeslaterceraasqueintenteustedmismo borrarunadelaslneasvacasysituarlacomosegundalneausandode nuevo 'dd' y 'p'. Esta vez mueva de linea usando 'j' desde el modo comandosparabajaralalineasiguientey'k'parasubiralalneaanterior. Sieltecladoestconfiguradoensueditorparamanejarcorrectamentelas teclasdeflechaspodrhacerestomismousandolasteclasflechaabajoy flechaarribaensustitucindela'j'yla'k'respectivamente.Sialgosale malborreelficheroyvuelvaaempezarprocurandonovolverameterla pata.Buenoelcasoesqueelficherodeberaquedarconesteaspecto.

1 Estamos practicando con el editor vi. 2 3 Ya voy por la tercera linea y no ha ocurrido nada grave. 4 No parece tan difcil de usar. 5 6 Como he saltado un par de lneas voy por la linea seis. 7 De momento no escribo nada ms.

179

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Vamosasacarunacopiadeesteficheromodificadoconotronombre,y luegovamosaduplicarvariasveceselcontenidodelaslneascuatroy cincousando'2yy'(guardaenelbufferdoslineas)y'p'para(copiael contenido del buffer en la lnea actual). Asegurese que est en modo comandos. Pulse <ESC> si no est seguro y teclee los comandos siguientes.Adviertaquealgunoscomandosempiezanpor':'yterminan por<ENTER>mientrasqueotrosno.
:w ej-vi2.txt :4<ENTER> 2yy :3<ENTER> p :3<ENTER> p :3<ENTER> p

Estamosrepitiendovariasveceslalnea'Noparecetandifcildeusar.' Deberaquedarfinalmenteconesteaspecto.

1 Estamos practicando con el editor vi. 2 3 Ya voy por la tercera linea y no ha ocurrido nada grave. 4 No parece tan difcil de usar. 5 6 No parece tan difcil de usar. 7 8 No parece tan difcil de usar. 9 10 No parece tan difcil de usar. 11 12 Como he saltado un par de lneas voy por la linea seis. 13 De momento no escribo nada ms.

Comohemosvistocon'2yy'hemosmetidoenelbufferdoslineasenlugar deuna.Parameterunasolalineahabrabastadousar'yy'o'1yy'.Ahora 180

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

vamosasalirperosinguardarningunodeloscambiosrealizados.Primero intentaramossalirsinmscon':q'desdeelmodocomandos.
:q

Obtendremos un aviso del editor para no perder las ltimas modificaciones.

No write since last change (use ! to override)

Perorealmentedeseamossalirsinsalvarasqueintentamosdenuevocon ':q!'desdeelmodocomandos.
:q!

Vamos a comprobar que los ltimos cambios no se han guardado, y vamosaverquepermisostieneestefichero.


$ cat ej-vi1.txt Estamos practicando con el editor vi. No parece tan difcil de usar. Ya voy por la tercera linea y no ha ocurrido nada grave. Como he saltado un par de lneas voy por la linea seis. De momento no escribo nada ms. $ ls -l ej-vi1.txt -rw-r--r-1 xxxx xxxx 216 ago 12 18:24 ej-vi1.txt

Lainformacindepermisospuedeserdiferente.Recuerdequedijimos quelospermisosdeunficherocuandosecreadependendela'umask' peroahorasolonosinteresacomprobarefectivamentetenemospermisos

181

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

paraleeryescribirenestefichero.Vamosaeliminarlospermisosde escrituradelficheroyvamosaintentareditarlonuevamente.
$ chmod 444 ej-vi1.txt $ ls -l ej-vi1.txt -r--r--r-1 xxxx xxxx $ vi ej-vi1.txt

216 ago 12 18:24 ej-vi1.txt

Probablementeaparecerenlalineainferiordesueditorunaadvertencia dequeestenmodosololectura.

"ej-vi1.txt" [readonly] 7 lines, 216 characters

Buenoapesardeellovamosaintentarhacercambiosycomoestamos practicandocontinuaremosconunaseriedecomandosqueannohemos vistoyquetenamosclasificadoscon'***'.


:3 :.,$ w trozofinal :1,. w trozoinicial :1,$ de :r trozoinicial :$ :r !date :$ :r trozofinal :w tempfich :w 'readonly' option is set (use ! to override)

Permitiescribirotrosficherosperoseniegaasobrescribirelficheroque estamoseditandoconloscambiosporqueestenmodosololecturay sugierequeusemos'!'paraforzarsuescritura.


:w!

182

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Enestecasoestamosforzandolasituacinyestamosescribiendoenun fichero en el que no tenemos permisos pero puesto que somos propietarios del mismo el editor puede manejar los permisos para dar permiso de escritura, sobrescribir el fichero y volver a cambiar los permisosdejandolospermisosoriginales. Podemosejecutarcomandosdesdeeleditorasqueporquenomiramos lospermisoscon'lsl'.
:!ls -l total 6 -r--r--r-vi1.txt -r--r--r-vi1.txt~ -rw-r--r-vi2.txt -rw-r--r-tempfich -rw-r--r-trozofinal -rw-r--r-trozoinicial 1 xxxx xxxx 1 xxxx xxxx 1 xxxx xxxx 1 xxxx xxxx 1 xxxx xxxx 1 xxxx xxxx 304 ago 12 19:11 ej304 ago 12 19:11 ej216 ago 12 18:28 ej304 ago 12 19:09 147 ago 12 19:06 126 ago 12 19:06

Press RETURN or enter command to continue

Debemos pulsar <ENTER> para volver al editor Puesto que podemos ejecutar cualquier comando tambin podemos ejecutar bash como una subshell.Aprovecharemosparaverlosprocesosactivos.
:!bash bash-2.01$ ps PID TTY STAT TIME 221 2 S 0:00 893 2 S 0:00 944 2 S 0:00 951 2 R 0:00 bash-2.01$ exit COMMAND -bash vi ej-vi1.txt bash ps

183

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

exit 1 returned Press RETURN or enter command to continue

Porfinestamosdevueltaeneleditor.Vamosacontinuarpracticando algunoscomandosimportantesquenosquedan.
:3<ENTER> o Hemos pasado a insertar abriendo una linea.<ESC> J

Conla'J'maysculahemosunidodoslneasenuna.Ahoravamosapasar almodoentradaparareemplazar.
:3<ENTER> R XXXXXXXXXXXXXXXXX<ESC>sertar abriendo una linea. Ya voy por la tercera linea y no ha ocurrido nada grave. <ESC> <CTRL+G> "ej-vi1.txt" [Modified][readonly] line 4 of 10 --40%-col 44

Desde el modo comandos podemos consultar el nombre del fichero, cuantas lineas tiene entotal, enquelnea ycolumna estamos,yotras cosasconsolopulsar<CTRL+G>. Ahorautilicevariasveceselcomando'u'.Siesten'vim'vercomose deshacen retrocediendo secuencialmente en las ltimas modificaciones quehemosrealizado. Luegosiestusando'vim'use<CTRL+R>para 184

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

avanzardenuevoenlasltimasmodificacioneshastarecuperarlastodas. Paraterminarsalgacon':q!' Practiqueconlacombinacinde'yy'o'nyy'y'p'.Oconlacombinacin 'dd'o'ndd'y'p'.Seusanmuchoparacopiarotrasladarpequeosbloques deinformacin. Paramoverunalineahacer'dd',luegosituarseenlaposiciondestinoy hacer 'p'. Para mover varias lineas hacemos algo parecido. Borramos primerovariaslineasyluegodesdelaposicindestinohacemos'p'.Para copiarenlugardemoverusaramos'yy'enlugarde'dd'. Bueno utilice su propia imaginacin e investigue y practique por su cuenta. Esta leccin no le obliga a digerir conceptos nuevos pero si requiereiniciativaparapracticarconeleditor. Existe un comando que lo hemos marcado como esencial cuando en realidad se usa poqusimo pero es un comando que conviene conocer porqueenelmomentomsinesperadopuedesernecesariousarlo.Con estecomando eleditorredibujatotalmenteelcontenidodelapantalla. Estopuedesernecesarioporqueasuterminalpodrallegarleinformacin desdeotroproceso.Porejemplounmensajedeerrordelsistemaoun avisodesuadministradorparaquefinaliceantesde10minutos.Quizs suadministradoresdelosquerepiteelmensajemsdeunavezyacada mensajerecibidosupantallaquedatotalmentedestrozada.Nopasanada. Pulse<CTRL+L>ytodovolveralanormalidad.Estopuedeocurrirle cuando este usandootroprogramadistintode'vi'yquizs puedausar gualmente<CTRL+L>. Recuperarlainformacinperdidapormuerteprematuradeleditor Otracosaquedebesaberesquecuando'vi'recibeunasealparafinalizar ordenadamente guardar el contenido de lo que est editando en un ficherodeseguridad.Pararecuperarestainformacinnecesitarusar'vir fichero'. Como ejercicio libre le proponemos que empiece a editar un ficheroquellamaremos'pruebakill.txt'.Escribaunascuantascosasysin 185

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

salvarnada,paseaotroterminalyenveunkillconelvalorpordefecto (15 = SIGTERM). Para eso primero tendr que averiguar el pid del procesovi.Porejemplouse'ps|grepvi'.Supongamosqueaveriguaque su pid es 445. Bastara hacer 'kill 445'. Esto finalizar la edicion del fichero 'pruebakill.txt'. No edite este fichero con 'vi pruebakill.txt' porqueperdertodosloscambios.Encambiosieditacon'virprueba kill.txt'silosrecuperar.Enestepuntosalveycontinueeditandocosasy antesdesalvarlosnuevoscambiosvuelvaaaveriguarelpiddesdeotro terminal.Supongamosqueelnuevopidfuera448.Enveestavezlaseal SIGKILLnoenmascarablemediante'kill9448'.Comprobarqueesta vez el editor no ser capaz de recuperar los cambios. Por ejemplo si ocurre un apagado normal (shutdown) del sistema mientras est usted editando o mientras usted est ausente del terminal con la sesin de edicinabierta,tampocoocurrirnada.Larazndeesto,esqueelsistema primeroenvaatodoslosprocesosactivosunasealdeSIGTERMpara quefinalicenordenadamente.Despusdeestoypasadosunossegundos se supone que la mayora de los procesos habrn terminado. (A los restantes procesos les enviar un SIGKILL para matarlos incondicionalmente).Cuandoleocurraestotendrquevolveraentraren sesin con login y seguramente recibir una notificacin ensu correo advirtiendo delaexistenciadeunficheroquedebesereditadoconla opcin 'r' para recuperar informacin volcada durante la finalizacin prematurade'vi'.

186

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ELEDITORVI(SegundaParte)
Objetivosdeestaleccin Estaleccinmencionaalgunasposibilidadesavanzadasdeleditor'vi'.Se supone que el alumno ha estudiado las lecciones precedentes y en particularelcaptuloanteriordedicadoaleditor'vi'.Esosignificaqueya sabeeditar.Vamosasuponerqueinclusohapracticadounpocoporsu cuenta.Porelloloquevamosaexplicarenestecaptuloserdeescasa utilidadsinohaasimiladolaleccinanterior. Pocoapocovamosairasumiendounmayordominiodelalumno.Yano vamos a detallar tan a menudo paso por paso cosas que ya se han explicadoypracticadomsdeunavez.Esoleobligaraponerunpoco msdeiniciativaporsuparte. Los ejemplos de las lecciones anteriores eran prcticas totalmente guiadas,comandoacomando,peroapartirdeahoratendrqueprobar cosasnonecesariamenteidnticasalosejemplosquenosotrosutilicemos. Nosepreocupe.Seguroqueloharmuybien.Sihallegadohastaaques sealdehaberconseguidounavancesignificativoensusconocimientos, ycomoLinuxeroseencuentra quizsamediocaminoentreelnovato brutoyextremadamentetorpeyelrepugnantelistilloinformtico. Confiamosplenamenteensucapacidad perorecuerdequenosotrosno somos responsables deloquepuedapasarleasuordenador.Contine practicando con un usuario distinto de root y un directorio que no contengainformacinvaliosa. Seguramente en esta leccin aprenda cosas que algunas personas que llevan usando 'vi' durante varios aos an no conocen, pero tambin 187

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

contiene cosas que pueden ser muy importantes para usted. No todos usamoslasmismascosas.Lamayoradelosdocumentosqueexplicanel usode'vi'lohacendeformamuyincompleta.Nosotrosnovamosahacer un tratado completo de este editor porque necesitaramos muchas lecciones y nos saldramos de los objetivos del curso pero si procuraremos mostrarle un amplio abanico de posibilidades para que tengadondeelegir.Enlaprimeraleccinsobre'vi'lemostramosunjuego reducidodecomandosperosuficienteparadefenderse.Enestaleccinle damoslaposibilidaddeconvertirseenunvirtuosodeesteeditor. Bsquedas Desde el modo comandos se puede usar '/' para buscar. Admite expresiones regulares. Por ejemplo si introduce '/debian.com' podra localizarunacadena'debiancom'o'debian:com'ynosolo'debian.com'. Recuerdequealgunoscaracterescomoelpuntoelasterisco,etctienenun significadoespecialyparausarlasen'vi'hayqueprecederlasde'\'que actuarcomocarcterdeescape.Tambinhayqueescaparloscaracteres comoporejemplo'/'y'&'porquesintenersignificadocomooperadorde expresinregularsitieneunsignificadoespecialpara'vi'queveremos cuandoexpliquemoslassustituciones.Novamosavolveraexplicarlas expresionesregularesporqueyadedicamosunaleccin.Practiqueloque va aprendiendoyrecuerdequelas expresiones regulares nofuncionan igualentodaslasaplicaciones.Vamosaponervariosejemplosparasu usoenbsquedasdesde'vi'.Parabuscar'</TABLE>'habraqueusar'/<\/ TABLE>'. Es decir que algunos caracteres no los podemos usar tal cual para buscarlos sino que hay que es caparlos. En el caso anterior hemos escapado'/'.Tengaencuentaestocuandointenteporejemplobuscarun carcter'$'enuntexto. Con'n'buscarlaocurrenciasiguientedelacadenaenelfichero.Con'N' buscar la ocurrencia anterior. Una vez llegado al final comienza de nuevolabsquedaporelprincipio. 188

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Tambin se puede empezar la bsqueda desde el primer momento en sentidoascendenteusando'?'enlugarde'/'.Enestecasoloscomandos'n' y'N'tambinfuncionaranensentidocontrarioqueconelcomando'/'. Si usamos '/' o '?' sin nada ms a continuacin, se repetir la ltima bsqueda. Lasexpresionesregularesofrecengrandesposibilidadescomoyahemos vistoperoparticularmenteinteresantespara'vi'puedenserlasbsquedas aprincipiooafinaldeunalnea.Enelejemplobuscaremo'El'aprincipio deunalneayluego'as'alfinealdelnea.
'/^El' '/as$'

Sustituciones Ya dispone de un resumen de todos los comandos de 'vi' que proporcionamosenelcaptuloanteriorasquelomejorespresentaruna seriedeejemplosexplicandoparaquesirven. Vamosaponertresformasdistintasdesustituir'encarnado'por'colorado' enlastresprimeraslneasdeuntexto,ysolodeseamosqueocurrala sustitucinenlaprimeraocurrenciadecadalneacaso.Esdecirsiuna lneacontienevariasveceslapalabra'encarnado'solodeseamossustituir laprimera.
:1,3 s/encarnado/colorado/ :1,3 s:encarnado:colorado: :1,3 sencarnadocolorado

Ahora de dos formas distintas vamos a sustituir en todo el texto 'encarnado'por'colorado'.Esdecirsiunalineacontienevariasvecesla palabra'encarnado'deseamosquelasutitucinserealiceentodasellas. Paraesoutilizaremosuncomandosimilaralanteriorperofinalizadoen 189

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

'/g'.Losejememplossolovaranenlaformadeindicarcon'1,$'ocon'%' labsquedaentodoeltexto.
:1,$ s/encarnado/colorado/g :% s/encarnado/colorado/g

Ahora si sustituimos en todo el texto 'encarnado' por 'colorado' pero confirmando cada cambio manualmente. Para eso utilizaremos un comandosimilaralanteriorperofinalizadoen'/gc'.La'g'tieneelmismo significadoqueenelcasoanterioryla'c'significa'confirmacin'.
:1,$ s/encarnado/colorado/gc

Vamosausarahoralassustitucionesconexpresionesregulares. 1)Poneradoblelneatodountexto.
:%s/$/\ /g

2)Eliminarblancosytabuladoresafinaldelinea.
:%s/[space tab]*$//

3)Eliminarblancosytabuladoresalprincipiodelnea.
:%s/^[space tab]*//

4)Sustituir cualquiersecuenciadeblancosytabuladores porunnico blanco.


:%s/[space tab][space tab]*/ /

190

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

5)Ponerentreparntesistodoslosnmerosenterosdeuntexto.
:%s/[0-9][0-9]*/\(&\)/g

Enesteltimohemosusadoeloperador'&'enlamismaformaquevimos con 'sed' unas lecciones atrs. Se pueden hacer en poco tiempo cosas bastantecomplejas.Porejemplovamosahacerunshellscriptquegenere otroshellscript.Paraelloprimeroloqueharemosesescribirelprograma quedeseamosgenerar.
echo 'kkkk' echo 'kkkk'\''hhhh'

Paragenerarlobastartratarcadalneaponiendoun"echo'"alcomienzo decadalneayunacomillasimplealfinal"'"decadalnea,peroantes escaparemoscualquierposiblecomillasimplequepudieraexistir.Para elloeditamoseltextoanterioryhacemoslosiguiente:


:% s/\'/\'\\\'\'/g :% s/^/echo \'/ :% s/$/\'/

Deberquedarnosdeestaforma.
echo 'echo '\''kkkk'\''' echo 'echo '\''kkkk'\''\'\'''\''hhhh'\'''

Bueno lo hemos realizado con 'vi' y a pesar de lo complicado del resultadosolohemosrealizadotresoperacionessencillas.Ahoraejecute esteficheroyvercomoobtieneelprimero. BuenosinoconoceCnoleentusiasmaresteotroejemploperoesode hacer programas que generan programas nos sirve para practicar las sustituciones usando 'vi'. Podemos escribir el programa en C que deseamosgeneraryluegotratarlosustituyendotodaslas'\'por'\\'ytodas las '"' por '\"'. Es decir escapamos esos dos caracteres que daran 191

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

problemasmstarde.Luegoaadimosaprincipiodecadalnea'printf(y finalizamoscadalneacon"\n"). Lassustitucionesqueacabamosdemencionarserandeestaforma.


:% :% :% :% s/\\/\\\\/g s/"/\\"/g s/^/printf("/ s/$/\\n");/

Edicindevariosficherossecuencialmente Aleditor'vi'selepuedepasarcomoargumentonosolounficherosino variosparasereditadosensecuencia.Porejemplo:


$ vi fich1 fich2 fich2

Buenoestopuedesermstildeloquepareceasimplevista.Vamosa suponerquetenemosquemodificarunagrancantidaddeficherospara sustituirenmuchosdeelloslacadena'acastro'porlacadena'A.Castro' perotampocolopodemoshacerdeformaautomticaporquenosconviene vercasoacaso.Poresopasamosa'vi'elresultadodeunabsquedacon 'grep'.


$ vi `grep -il acastro *.txt`

Unavezdentrodeleditorhacemoslosiguiente.
:args

Elcomando':args'nosinformardelnombredelosficherosquevamosa editarsecuencialmente.Intenteprobarestocreandosuspropiosficheros deprueba.Yasabecomohacerlo.Convienequetodosellostenganuna cadenaidnticaparaserlocalizadacongrep.Unavezqueeleditor'vi' 192

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

este preparado para editar secuencialmente varios ficheros busque la cadenaconeloperador'/'yaunquepasemosaeditarelsiguientefichero seconservaralmacenadalacadenadebsqueda.Estaformadetrabajar facilitamucholamodificacindevariosficheros. Paraeditarficherossecuencialmenteleconvienetenerencuentalos siguientescomandos.Algunosnoloshabamoscomentadotodava.
:args Obtiene la lista de los ficheros :next Pasa al fichero siguiente :prev Vuelve al fichero anterior :rewind Vuelve al primero :rewind! Vuelve al primero abandonando los cambios en el fichero actual :w Salva los cambios del fichero anterior :q Sale del editor. (Solo si ya se han editados todos) :q! Sale del editor incondicionalmente.

Edicinsimultaneadeficheros Podemospasardelaedicindeunficheroalaedicindeotrousando':e fichero'peroantesdeberemos salvarelcontenidodelaedicinactual. Tambinpodemosforzarelpasoaeditarotroficherocon':e!fichero'pero en ese caso se perdern las modificaciones realizadas. Usando ':e#' volvemosaretomarlaedicindelficheroanteriorsituadosenlamisma lnea donde lo dejamos. Intente practicar lo siguiente editando unos ficheritosdeprueba.
:e fich1 :w :e fich2 :e! fich3 :e#

Visualizacindecaracteresdecontrol En'vi'loscaracteresdecontrolsevisualizancomounacentocircunflejoy unaletra.Porejemplo<CTRL+K>sevisualizarcomo'^K'ylamanera 193

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

dedistinguiruncarctercircunflejorealseguidodeuna'K'esmoviendo elcursorparaversidedesplazaunoodoscaracterescuandopasamospor elcarctercircunflejo.Tambinseusaconsimilarsignificadoelcarcter tilde'~'peroparacaracteresde8bits. Introduciendocaracteresdecontroleneltexto Imaginemosquedeseamosintroduciruncarcterdecontrolparaprovocar unsalto depginaenlaimpresora.Paraellodeberemos introducirun <CTRL+L>queservisualizadocomo'^L'.Laformadehacerloespulsar desde el modo insercin el carcter <CTRL+V> y a continuacin el carcter <CTRL+L>. Es decir el carcter <CTRL+V> acta como carcter de escape. Podemos pulsar <CTRL+V> y luego una tecla de funcin,uotrasteclasespeciales. Tambinsepuedenbuscarcaracteresdecontrol.Paraellotambenhay queintroducirlosusando<CTRL+V>. Editeunficherodepruebayprocedaaponervariossaltosdepginaen distintos lugares. Luego busque con '/' y con '?' los saltos de pgina. Pruebeainsertarloscdigosdelasteclas<ENTER>y<ESC>,mediante <CTRL+V><ENTER> y <CTRL+V><ESC> respectivamente. Debern aparecercomo'^M'ycomo'^['. Elcomandotilde Elcomando'~'sustituyeelcarctersituadobajoelcursordemaysculaa minsculayviceversaavanzandoluegoelcursor. Operacionesconbloques Sepuedenmarcarhasta26posiciones('a'..'z')paraunconjuntodeunoo mas ficheros editados simultneamente. Permite trabajar marcando principioyfindebloquesparamover,copiaroborrarenvariosficheros. Sepuedenusarlasmarcasencualquiercomandoensustitucinde'.','$',o 194

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

losnmerosdelneacomoyahemosvisto.Laventajaesquesiestamos insertando o borrando lneas tendramos que volver a comprobar los nmerosdelneas.Porelcontrariosihemoscolocadounamarcaenuna lneacontinuarenesalneamientrasnolaeliminemos.Paracolocaruna marcapodemossituarnosconelcursorenlalneadeseadayluegohacer ':k<letraminscula>'':ma<letraminscula>'':ma<letraminscula>'o directamentesinpasaralmodoexmediante'm<letraminscula>'.Para practicarconelloediteunficherodepruebaycoloquevariasmarcasen distintaslneas.Luegorealicedistintasoperacionescomoporejemploel borradodebloques.Compruebecomodesapareceunamarcacuandose borralalneaquelacontiene.Lasmarcasnosevenperosiintentausar unamarcaquenoexisteobtendrunerror.Compruebecomoreaparecela marcacuandodeshacelaoperacincon'u'(undo).Algunasformasde utilizacindemarcassonlassiguientes.
:'a,'b de :'b,'b+1 de :'a,. de :'a,'b co 'c :'a,'b mo 'c

Tambin podemos posicionarnos en el lugar de una marca pulsando comillasimpley<letraminscula>desdeelmodocomandos.Undetalle interesante es que siempre podemos volver a la lnea donde nos encontrbamos,laltimavezquedimosunsaltodeposicineneltexto. Paraellopulsamos''(comillasimpledosveces). Repeticindelltimocomando Cuandohayquehacervariasveceslamismacosaresultatremendamente tilpoderrepetirelltimocomando.Imaginemosquedesdeelmodode comandos hacemos en una lnea 'RLnea <ESC>' para sustituir 6 caracteresporlacadena'Lnea'Inmediatamentedespusdeelloyantes dehacerningunaotracosapodramossituarnosenotralneaypulsar'.' (punto)pararepetiresemismocomandoyluegocambiaraotrayotra lneayvolverapulsar'.'puntoacadavezparaefectuarelmismocambio 195

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

en varios sitios. Tamben mencionamos la posibilidad de ejecutar un comando del sistema operativo lanzando una subshell. Pues bien este tipodecomandos':<comando>'puedeserrepetidousando':!!' Tabulacin Elcarcterconlatecla<TAB>oconelcarcter<CTRL+I>insertarun carcterdetabulacin.Elanchodelatabulacinserpordefectoiguala8 espacios.Estopuedeservariadoporejemploa5con':settabstop=5'.Si deseamos aadir untabulador alprincipio delnea enlassiguientes 7 lineasalaposicindelcursorpodemoshacer.'7>>'.Tambensepodra haber hecho lo mismo con ':.,.+7 >>'. Para insertar un tabulador a principiodecadalneadeltextosera':%>>'Cuandoseusaeleditorpara editar fuentes de programas puede resultar til usar la indentacin automtica.'setai'paraeliminarlaindentacinautomticausaremos'set noai'. Sien alguna ocasinnecesitasustituir todoslostabuladores por caracteresenblancouseelcomando'expand'.Noesuncomandode'vi' sinodelSO.Consulteconelmansusintaxisylasdistintasopciones.Para hacer una prueba edite un fichero insertando tabuladores y luego conviertalodelasiguienteforma.
expand fichero > ficheroexpandido.

Abreviaturas En 'vi' hay muchos detalles pensdos a ahorrar pulsaciones de declas. Vamosaverelcomando':ab'Siestacostumbradoalusodeabreviaturas leresultarmuyprctico.Puededefinirlasabreviaturasquequierayuna veztecleadasenmodoentradadedados(insercionosobrescritura)sern sustituidasporlacadenaquedesee.Vamosausardosabreviaturasuna'ci' para 'Ciberdroide Informtica' y otra 'INMHO' para 'en mi humilde opinin'.Tambinvamosalistarlasabreviaturasdefinidas.
:ab ci Ciberdroide Informtica

196

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html :ab INMHO en mi humilde opinin :ab

Usesuspropiasabreviaturasenuntextoyobservecomolaabreviaturano serinterpretadasilasecuenciadecaracteresformapartedeunapalabra. Macros Esposibleprogramarmacros.Porejemplovamosahacerunamacroque mueva4lneasalfinaldelfichero


:map xxx 4dd:$^Mp :map

Con esta macro ocurrir algo. En primer lugar si teclea las tres 'x' seguidas se ejecutarn los comando '4dd' (borrar cuatro lineas), ': $<ENTER>'(iralaltimalnea)y'p'(recuperarelcontenidodelbuffer) Sipulsamosunasola'x'notaremosquenopasanadainmediatamentepero luegoseeliminaruncarctertalycomoocurrenormalmente.Esdecirla macrotieneuntiempoparasertecleadacompletamenteencasocontrario noacta.Paravertodaslasmacrosdefinidasusaremos':map' Podemoseliminarlamacroqueacabamosdecrearcon'unmap'
:unmap xxx

Muchas veces se usan las macros para definir comandos asociados a teclasespeciales.Paraellohayqueconocerlasecuenciadecaracteresque envan esas teclas. Si en modo insercin usamos <CTRL+V><F2> obtendremos '^[[[B'. Pero tambin podemos usar '<F2>' para definir macros.Vamosaponeralgunosejemplosprcticos. F2(FiltroPGP)Firmar.

197

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html :map [[B 1G!Gpgp -satf 2>/dev/tty

Seralomismosiusaramos'<F2>'enlugarde'^[[[B'.
:map <F2> 1G!Gpgp -satf 2>/dev/tty

F3(FiltroPGP)Encriptar
:map [[C 1G!Gpgp -eatf 2>/dev/tty

F4(FiltroPGP)Desencriptarycomprobarfirma
:map [[D 1G!Gpgp 2>/dev/tty; sleep 7

F5(Filtroispell)Correctorortogrfico.
:map [[E :w :!ispell % :e!

Opcionesdevi Sera absurdo pretender explicar en una leccin todo el editor 'vi'. Tampocohaynecesidaddeello.Haymontonesdeopcionesyyahemos visto algunas. Si el editor es 'vim' en lugar de 'vi' el nmero de posibilidades es aun mayor. Puede ver las opciones disponibles y sus valoresactualesusandoelcomando':setall'desdeelmododecomandos. Noseasuste.Nohaqueconocerlastodas.Hayopcionesqueseguramente la persona que las implement ya ha olvidado para que sirven. Una opcin se puede indicar muchas veces de dos formas. Una en forma completayotraenformaabreviada.Porejemplo':setnu'enlugarde':set number' y para desactivar la opcin se suele usar la misma opcin 198

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

precedidade'no'.Porejemplo':setnonu'o':setnonumber'.Lasopciones quedebentomarunvalornumricoseestablecenconelnombredela opcinseguidade'='yelvalor.Porejemplo':settabstop=5' Configuracindeleditor Elficheromsestndarparaconfigurar'vi'encualquierSOdetipoUnix es'~/.exrc'.Comoalternativasepuedeusarficherosmsespecficospara eleditorconcretoqueestemosusando.Porejemploenelcasode'vim' tenemos '~/.vimrc'. Compruebe si existe un ejemplo '/etc/vimrc' en su Linuxymiresucontenido.Setratadeunficherodeejemploparacopiarlo en'~/.vimrc'Contienealgunasconfiguracionesquepuedenresultartiles. Elcarctercomilladoble'"'seusaparaconsiderarelrestodelalnea comouncomentario.Siconsideraqueeleditortieneuncomportamiento queustedconsideraincmodoquizssedebaalaexistenciadealgunas opcionesquenoseadaptanalusoqueusteddaasueditor.Porejemplo paraeditarprogramasCpuederesultarcmodolaautoindentacinpero nolegustarquepartalaslneas automticamentecuandoexcedanun determinado ancho. Tambin es buena idea incluir en su fichero de configuracin lasabreviaturas ylasmacrosquedeseeusar.Yahemos visto algunas yseguramente yasehapreguntadocomohacer parano tenerqueintroducirlascadavez.Esbuenoperderunpocodetiempoen personalizareleditor. Tag ParaeditarfuentesCporejemploresultamuypractico.Supongamosque tenemos un fuentellamado pingpong.c.Crearemos enprimerlugar un fichero tags ejecutando "ctags pingpong.c" (ver ctags(C)). Se crea un ficherotagsquecontendrporejemplolosiguiente:
plot salir pingpong.c pingpong.c ?^plot(x, y, ch)$? ?^salir(s)$?

Con ello se referencian las funciones. Para editar el fichero podemos hacer vi tplot. Aparecera el cursor en la posicin de esa funcin. Si 199

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

introducimos:tasalirdesdeelmododecomandosnossituaremosenesa funcin. Se pueden crear tags para varios ficheros simultneamente mediantectags*/*.[cfg](verctags(C)).Deestaformapodramoseditar cmodamentevariosfuentes.

200

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

PROGRAMACIONSHELLSCRIPT(PrimeraParte)
Queesunshellscript Ya vimos hace algunas lecciones una introduccin al interprete de comandos de Linux (shell). Vamos a ampliar nuestros conocimientos sobrelashellysibienantesconsideramosalashellcomouninterpretede comandosenestaleccinveremosqueesmuchomsqueeso.Lashellde Linux que vamos a usar es la Bash que como ya dijimos es un superconjunto de la BourneShell. Sin lugar a dudas esta leccin le permitirdarunsaltoenormeenelaprovechamientodesuSOLinux. Conestaleccinylassiguientesnosacercamosalmomentoenqueusted podr presumir ante algunos de sus amigos de haber realizado en su flamanteSOcosasqueellosnosabenhacerconGindos,aunqueellos podran presumir de su habilidad cerrando las ventanas del General FailiureydelDoctorGuasn. Ellenguajeshellscriptesmuyverstilaunquehayqueadvertirquees bastanteineficiente.Sonmuchomseficienteslosprogramasescritosen lenguajeC.EsteesellenguajeenelqueseescribielkerneldeLinuxy otrosmuchosSO.ElBashnoestaneficientecomoelC.Elvalordel lenguaje shellscriptes que permite hacer cosas complicadas con muy poco esfuerzo en perfecta combinacin con una serie de comandos tambin muy potentes disponibles en Linux . Verdad que suena interesante?AlgunaspartesdelSOquenopertenecenalkernelestn escritas en shellscript. Por ejemplo muchos comandos que se van ejecutando en secuencia mientras el sistema arranca son programas realizadosenshellscriptasquelaineficiencianoesningnobstculo paraciertastareas.Porelcontrarioparaunadministradortenerciertos programasdelsistemaenshellscriptlepermiteretocarlosasugustocon granfacilidad. 201

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Despus de hacer login en el sistema obtendremos una sesin con el intrprete de comandos asociado a nuestro usuario. (Esta asociacin figuraenelfichero'/etc/passwd'juntoquizsconlaclaveencriptaday otrascosas).Decimosquizsporquelaclavenosiempreesguardadaen estefichero.Laraznesquepeseaestarencriptada/etc/passwdesun fichero que cualquiera puede leer y resulta ms seguro otro sistema llamadoshadow.Que/etc/passwdsealegiblenospermiteconsultarentre otrascosascualesnuestrashelleneliniciodeunasesin.Desdeesta sesinpodemosirintroduciendoordenesdesdeeltecladoperonuestro interpretedecomandosnodejadeserasuvezunprogramanormalcomo cualquierotro,asquesituviramosqueteclearvariascosaspodramos guardarestasordenesenunficheroyredirigirlaentradaestndardela shellparaquetomelaentradadesdeelficheroenlugardehacerlodesde elteclado. Vamos a ver unejemplo paramostrarfechayhoraenletras grandes. Tecleeelcomandosiguiente:
$ banner `date '+%D %T'`

Ahoravamosapracticarrepasandounpocolasnocionesqueyavimosen el primer captulo dedicado al shell script porque son conceptos que convieneasentar.Paraellovamosaguardarestecomandoenunfichero parapoderejecutarlocuandonosapetezca.Previamentenossituamosen el directorio '/tmp' como es costumbre y nos aseguramos de no estar usandoelusuariorootniningnotrousuarioconprivilegiosespeciales.
$ $ $ $ $ $ # Nos situamos en /tmp cd /tmp # Generamos el fichero con el comando echo "banner `date '+%D %T'`" > fichero_ordenes # Comprobamos el contenido del fichero cat fichero_ordenes

banner 08/02/00 20:26:30

202

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

!! Vaya !! Estonoesloquequeramos hacer.Estecomando siempre mostrara la misma fecha y hora y seguramente no pretendamos eso. Dadoquehemosusadolasdoblescomillassehaproducidolaexpansin delalneaderdenesconcretamenteeloperadorgrave.Sienlugardelas doblescomillasusramoslascomillassimplesnosehabraproducidoese errorperoexistenyacomillassimplesdentrodelpropiocomandoyla shelltomaraelcierredelacomillasimpleenunlugarquenoeselque nosotros desebamos. Todo esto lo comentamos a modo de repaso. Entoncescomotendramosquehabergeneradoestecomando?Aques donde el listillo dice que usando un editor de texto. Bueno al fin de cuentasyasabemosusarel'vi'no?Buenopuesvamosprimeroahacerlo sineditor.Recuerdaquemencionamoslaposibilidaddeescaparunsolo carcterconelcarcter'\'?Intentemosdenuevo.
$ $ $ $ # Generamos el fichero con el comando echo "banner \`date '+%D %T'\`" > fichero_ordenes # Comprobamos el contenido del fichero cat fichero_ordenes

banner `date '+%D %T'`

Ahorasi.Vamosausarlashelldelamismaformaqueharamosconun programanormalredirigiendolaentradaestndardesdeestefichero.Por lotantoelficherotienetratamientodedatosysoloserequierepermisode lecturaparaejecutarlodeestaforma.


$ $ $ $ # Ejecutamos bash < fichero_ordenes # Tambin podemos ejecutarlo de otra forma cat fichero_ordenes | bash

Para ejecutarlo sin redirigir entrada salida podemos pasar como argumentoelnombredelfichero.Nuevamentesoloharfaltapermisode lectura.

203

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ # Ejecutar pasando el nombre del fichero como argumento $ sh fichero_ordenes $FIN

Ejecucindeunshellscriptdirectamentecomouncomando Para ejecutarlo directamente como un comando necesitamos darle permisodeejecucin.


$ # Ejecutar pasando el nombre del fichero como argumento $ chmod +x fichero_ordenes $ ./fichero_ordenes $FIN

Lodel'./'antesdelejecutableresultarnecesariosieldirectoriodondese encuentra el ejecutable no figura en la variable '$PATH' En realidad ocurrealgomuysimilaralcasoanteriorporquetambinsearrancauna subshellquetomacomoentradaelfichero. Estoocurrecuandolashelldetectaqueelejecutableestenformatode texto.Sisetrataradecdigobinarioloejecutarasinarrancarunasub shell. Para averiguar que tipo de fichero se trata, la shell mirar los primeroscrteresquecontiene.Losficherosejecutablessuelentenerun pardebytesinicialesqueservirnparaidentificareltipodefichero.En casocontrarioseasumequeesunshellsrcip. Aestosdoscaracteresinicialesjuntosformanloquesedenominanmero mgico. Es solounacuestin denomenclatura. El SO lo vecomo un nmeroenterodedosbytesynosotrosdesdeuneditorlovemoscomodos caracteres. Existeunprogramallamado'file'queutilizaestainformacinascomola presenciadeciertospatronesparaidentificareltipodeunfichero.

204

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Seusaeltrminoscriptparaficherosquesonlegiblesyejecutables.Es decirelpropiofuentedelprogramaesejecutable.Fuentedeunprograma esloqueescribeelprogramador.EllenguajeCnoesunlenguajetipo scriptyaqueelfuentenoesejecutable.Hacefaltauncompiladorque traduceelcdigofuenteacdigopropiodelamquina.LosScriptnose ejecutandirectamenteenlamquinasinodentrodeunprogramaqueva interpretandolasinstrucciones.Buenoengeneralestoesmsomenosas. Haymuchostiposdescripts.Lashelltienesupropiolenguaje.Existeun lenguajedistintollamado'perl'quetambinseejecutacomounscript. 'perl' es un lenguaje inspirado en el uso combinado del interprete de comandosyalgunoscomandosclsicosdelosSOtipoUnix,yadems incorporacosasdeotroslenguajescomoel'C'yotrascosastotalmente originales.'perl'noesfcildeaprenderperoesunlenguajedescriptmuy potente.Unscriptde'perl'sepuedeejecutarmedianteelcomando'perl prueba.pl'. El fichero 'prueba.pl' deber estar en lenguaje 'perl'. Si ejecutramos directamente './prueba.pl' desde bash, el interprete de comandos intentar ejecutarlo como si fuera un script de bash dando erroresdesintaxis.Paraevitarestosepuedeponertotalmentealprincipio del fichero los caracteres '#!' Estos caracteres sern vistos como un nmeromgicoqueavisaqueacontinuacinvieneelprogramaausar con ese script. Para el script de perl debera haber empezado con '#!/usr/bin/perl'parapoderloejecutardirectamentesinproblema.Paraun scriptdebashnoesnecesarioponernadaperopodramoshaberpuesto '#!/bin/bash',o'#!/bin/sh'.Deestaformatambinsepuedeindicarcuales la shell que deseamos usar ya que podramos desear usar otras shells como'#!/usr/bin/csh'paralaCshello'#!/usr/bin/ksh'paralaKornshell. Anosotrosconelbashnosbastaysobra. Ejecucinconlashellactual Hastaestemomentosiemprehemosarrancadounasubshellquelealas ordenesdelfichero,lasejecutabaydespusterminabaymoracediendo elcontrolnuevamentealashelloriginalquearranclasubshell.

205

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Existeunaformadedecirlealashellactualqueleayejecuteunaseriede rdenes por si misma sin arrancar una subshell. Para ello hay que anteponerunpuntoyunblancoalnombredelcomando.Nuevamentesolo harfaltapermisodelectura.
$ # Ejecutar ordenes de un fichero desde la shell actual $ . ./fichero_ordenes

Enestecasonosehaejecutadomedianteunasubshellperonoseaprecia ningunadiferencia.Estonosiempreesas.Veamosunejemploenelque seaprecieladiferencia.$$tomarelvalordelpiddelashellenejecucin y$PPIDtomarelvalordelpiddelprocesopadre.


$echo echo \$PPID \$$ > fichero_ordenes $ bash fichero_ordenes 213 2396 $ . ./fichero_ordenes 1 213

Evidentementecuandopruebeesteejemploobtendrunpiddistintode 213 pero lo interesante es ver como ambas ejecuciones establecen claramentequelaprimerafueefectuadaporunprocesohijodelashell queseejecutaensegundolugarusandoelpunto,seguidodelespacioy del'fichero_ordenes'. Losprocesoshijosheredanelentorno(variablesyotrascosas)desdeel procesopadreporlocualunpadresipuedecomunicarseconsuhijode esaforma.Porelcontrariounprocesohijo(subshellennuestrocaso) jamspuedecomunicarsedeesaformaconsupadre.Resultaimposible que un proceso hijo comunique valores de variables del entorno a su padre.Sideseamosmodificarvariablesdelentornoejecutandounshell scriptnopodremoshacerlonuncasilaejecutamosdesdedentrodeuna 206

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

subshell. Por el contrario deberemos usar algo del tipo '. ./fichero_ordenes'comoacabamosdever. Existeunficheroeneldirectorioinicialdecadausuarioqueconsisteen unaseriedeordenesinicialesparashell.EnelcasodelaBashestefichero es '~/.bash_profile'. Podemos ejecutarlo si queremos pero este tipo de ficherosincluyenordenesparainicializarvariablesentreotrascosas,as queloadecuadoseraejecutarlodesdelashellactual.Hagalosiguiente:
$ cd $ . ./.bash_profile

Observequehaytrespuntosenelltimocomandocontressignificados distintos.Elprimeroesparaejecutarconlashellactual,elsegundoes paraindicareldirectorioactual,yelltimoformapartedelnombreyse usaparaquenoseatanvisibledadoqueunpuntoalprincipiodelnombre deunficheronoserexpandidoporlashellcuandousemos'*'. Vamosacomprobarlaaccindelnmeromgico.Paseaundirectorio parapracticarsusejercicios,yediteunnuevoficheroquedebellamarse 'aviso'.


echo "Error este shell-script debi arrancarse con . / comando"

Ahoraediteotronuevoficheroquellamaremos'comando'.
#!/bin/bash /tmp/aviso echo "COMANDO"

Vamos a ejecutar nuestro shellscript de dos formas distintas y observamos que el resultado no es el mismo. En el segundo caso se ejecuta el script 'aviso'. Este ltimo ejemplo no es completo ya que

207

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

'/bin/bash /tmp/aviso' no actuar interpretando sino de una forma independientedeltextoymostrarsiempreunmensajedeaviso.


$ $ $ $ $ # (1) Se ejecuta usando una sub-shell pero en este # caso se pasa un argumento a la sub-shell y por ello # no se ejecuta el cdigo del fichero comando. chmod +x aviso ./comando

Error este shell-script debi arrancarse con . /comando $ # (2) Ahora ejecutamos con la shell actual $ . ./comando COMANDO

Laexplicacineslasiguiente.Elnmeromgicoindicaconqueshellse ejecutar el script. Nosotros hemos puesto en lugar una shell sin argumetosqueejecutaraesetextounashellquerecibeunargumento.Eso hace que se ejecute el comando pasado como argumento en lugar de tomar el texto del fichero que contiene el nmero mgico. Cuando ejecutamosconlashellactuallainformacinsiguientealnmeromgico nosertenidaencuentaporquesupondraarrancarunasubshell. Esunejemplorebuscadoperohayqueintentarcomprenderloquesucede endistintassituacionesporqueellenguajeshellscripttienesusrarezas. Ejecutarenunasubshellusandoparntesis Ya que estamos con el tema de la subshell vamos a comentar como funciona el uso de los parntesis desde la linea de rdenes. No es necesario realizar un script para ejecutar algo en una subshell (lista) Ejecutaunalistadeordenesenunasubshell.
$ var1=888 $ ( var1=111; echo $var1 )

208

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 111 $ echo $var1 888

Estamos avanzando muy deprisa, y por eso tenemos que practicar bastante para consolidar los conocimientos. No siempre resulta trivial averiguarcomofuncionanlascosas.Observeelsiguienteejemplo:
$ echo $$ ; ( echo $$ ; ( echo $$ ) ) 218 218 218

Nuevamente el resultado puede ser distinto en su ordenador pero lo importanteesque'echo$$'pareceobtenerelmismopidpeseaocurriren distintas subshells. Cuando parece ocurrir algo distinto de lo que nosotros esperbamos resultamuytil usarelmodotraza con'setx'. Repetimoselejemplomisteriosodeantes.
$ set -x $ echo $$ ; ( echo $$ ; ( echo $$ ) ) + echo 218 218 + echo 218 218 + echo 218 218 $ set +x

Misterioaclarado.Realmentenoejecutamosningn'echo$$'sinoqueya seejecutadirectamente'echo218'porquelashellloprimeroquehizo antesdeejecutarlasordenesfuexpandircada'$$'presenteenlalneade ordenes.

209

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ahora que ya sabemos que es un shellscript vamos a ir aprendiendo cosasperonosepretendeunadescripcinexhaustivadelaBash.Puede consultarconmanbashlasdudasquetenga.Recuerdequeelmannoes unaherramientadeestudiosinodeconsulta.Cuandoconsulte'manbash' vercantidaddeinformacinrelativaacosasquenohemosexplicadoy mannoexplicacasinada.Porellomuchascosasde'manbash'nolas entederaunquesiemprequedaelrecursodeprobarlascosasquenose comprendenparavercomofuncionan. Se irn proponiendo ejemplos que ilustren unos cuantos conceptos bsicos. Una vez que haya practicado con estos ejemplos habremos conseguidodarlosprimerospasosenlaprogramacindeshellscriptque son los que ms cuestan. Despus un buen mtodo para continuar aprendiendoaprogramarenshellscriptesintentarcomprenderlasshell script que encontremos enelsistemaconayudadelmanual onlinede unix. Ellenguajeshellscriptesunpocoespecialconrelacinaotroslenguajes yaquelosblancosylossaltosdelneatienenunsignificadoquehayque respetar y la expansin de ordenes es algo que puede resultar desconcertante.Esolohaceunpocoantipticoalprincipio.Esimportante tener una buena base de conocimientos que en estos momentos ya tenemos,ycontinuarpracticando. Pasodeparmetrosaunshellscript ImaginemosqueustedtienedificultadparapasardePtasaEuros,yquiere hacerunprogramitaparapasardeunamonedaaotracmodamente.Edite elcomandosiguiente,yluegoejecuteloenlaforma'pta2eu35':
#pta2eu echo $1 '/ 166.386' | bc -l

Enestecaso$1actacomounavariablequetomarelvalordelprimer parmetro.$0tomaelvalordelpropiocomandoejecutadoy$2,$3etcel 210

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

valordelosparmetrossegundoytercerorespectivamente.Lavariable$# tomarelvalordelnmerodeparmetrosqueusemos.Lavariable$* tomaelvalordetodoslosparmetrosconcatenados.Vamosaponerun ejemploquellamaremos'pru_parametros'.Debeeditarlo,darlepermisos deejecucinconchmod+xporejemployejecutarlopasandodistintos parmetros.'./pru_parametros','./pru_parametroshola','./pru_parametros pararm1param2param3'.


# pru_parametros echo "Numero de parmetros = $#" echo '$0=' $0 echo '$1=' $1 echo '$2=' $2 echo '$3=' $3 echo '$*=' $*

Laejecucindeestapruebaquedaracomosigue.
$ ./pru_parametros Numero de parmetros = 0 $0= ./pru_parametros $1= $2= $3= $*= $ ./pru_parametros hola Numero de parmetros = 1 $0= ./pru_parametros $1= hola $2= $3= $*= hola $ ./pru_parametros pararm1 param2 param3 Numero de parmetros = 3 $0= ./pru_parametros $1= pararm1 $2= param2 $3= param3

211

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $*= pararm1 param2 param3 $

Noexistelaposibilidaddeusar$10paraaccederalparmetrodcimo.En lugar de acceder de esta forma habra que usar un comando interno llamado'shift'.Elefectodeestecomandoesdesplazarlosargumentosuna posicin.Deestaforma$1sepierdey$2pasaraser$1,$3pasaraser $2,etc.Siexistanmsde10parmetrosahoraeldcimoqueantesera inaccesible pasar a ser $9. $0 no vara. Se pueden desplazar varios parametros de un golpe pasando un nmero a la funcin 'shift' por ejemplo'shift5'desplazaraa5parmetros. Vamosaeditarunficherodeejemploquellamaremos'pru_shift':Debe editarlo, darle permisos de ejecucin con 'chmod +x pru_shift' y ejecutarlo pasando distintos parametros. './pru_shift pararm1 param2 param3'.Observequeesunapruebaparecidaalaanterior.Intenteutilizar susconocimientosdeviparanotenerquetecleartanto.Recuerdeque puede leer un fichero desde dentro del editor y que puede duplicar bloquesdeinformacindevariasformas.
# pru_shift echo "Numero de parmetros = $#" echo '$0=' $0 echo '$1=' $1 echo '$2=' $2 echo '$3=' $3 echo '$*=' $* shift echo "Numero de parmetros = $#" echo '$0=' $0 echo '$1=' $1 echo '$2=' $2 echo '$3=' $3 echo '$*=' $*

Laejecucindeestapruebaquedaracomosigue.

212

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ ./pru_shift pararm1 param2 param3

Numero de parmetros = 3 $0= ./pru_shift $1= pararm1 $2= param2 $3= param3 $*= pararm1 param2 param3 Numero de parmetros = 2 $0= ./pru_shift $1= param2 $2= param3 $3= $*= param2 param3

213

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

PROGRAMACIONSHELLSCRIPT(SegundaParte)
Funciones Se pueden definir funciones que podrn ser llamadas por su nombre permitiendo el paso de parmetros de la misma forma que cuando se llama a una shell. Tambin puede devolver cdigos de retorno. Las variablesalteradasdentrodeunafuncintienenefectovisiblefueradela funcinyaqueunafuncinnoseejecutainvocandoaunasubshell.Una funcin se puede definir en un shellscript o en la propia linea de comandos.Sisehaceestoltimosercomosiaadiramosuncomando interno.
$ fff() { echo "---------------------------" ; } $ fff ---------------------------

Sitecleamos'set'despusdeestoveremostodaslasvariablesdefinidasy tambinaparecerestafuncinqueacabamosdecrear.
$ set

Ahoravamosaeditarunshellscriptqueuseunafuncin.Editeunfichero quellamaremos'pru_funcion1'quetengalosiguiente.
# pru_funcion1 # Funcion que muestra dos parametros de entrada y modifica una variable funcion1() { echo '<'$1'>'

214

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html echo '('$2')' var=1234

} ## main ## funcion1 111 222 echo $var

Ahoradamospermisosdeejecucinyejecutamossimplementemediante './pru_funcion1'.
$ ./pru_funcion1 <111> (222) 33 1234

Editeypruebeelsiguientecdigo.
# Visualizar los parametros del 6 al 14 function() { shift 5 echo $1 $2 $3 $4 $5 $6 $7 $8 $9 } ## main ## funcion 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Paradefinirlasintaxisdeunafuncinenshellscriptpodramosusarlo siguiente:
_nombre_funcion_ () { _lista_de_ordenes_ }

Una lista de ordenes sera una o ms ordenes separadas por algn operadorcomoporejemplo';','||','&&','&'o.Recuerdequeelshell scripttieneunsignificadosimilara';'ysideseasuprimirestesignificado deberprecederinmediatamentecon'\'paraescaparelcarcteryqueno sea interpretado por la shell. En una cadena delimitada por comillas

215

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

simplesodoblesnotieneestesignificadoperopuedeusarse'\'paraevitar queelcarcterquedeinsertadoenlacadena.
$ echo \ > kkk\ > xxx kkkxxx

Cdigosderetorno La palabra reservada 'return' interrumpe la ejecucin de una funcin asignandounvaloralcdigoderetornodeesafuncin.Suusonoes necesario al final de la funcin. La palabra reservada 'exit' termina la ejecucindeunshellscriptliberandorecursosydevolviendouncdigo deretornoelintrpretedecomandos.'exit0'terminarretornandocero.Si soloponemos'exit'elcdigoretornadosercomosihiciramos'exit$?'. Esdecirretornaelvalordelltimocomando. Ahora edite un fichero que llamaremos 'pru_funcion2' que tenga lo siguiente.
# pru_funcion2 # Funcion que devuelve un cdigo de retorno. Y shell que devuelve otro funcion2() { var=1234 return 33 var=4567 } ## main ## funcion2 echo $? echo $var exit 888

Ejecutaremosesteejemplo 216

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $./pru_funcion2 33 1234

Comandostrueyfalse Los comandos que finalizan correctamente suelen retornar 0. Los que finalizanconalgnerrorsuelenretornarunvalordistintode0ydeesa formadistintoscdigosderetornopuedenindicardistintascausasdeerror onoxito. Enunaexpresinlgicadondeloqueinteresaessimplementedistinguir entrealgoquesecumpleoquenosecumplesetomar0comovalor lgicoTRUE(oseacierto)ydistintode0setomarcomoFALSE(falso). 'true'y'false'soncomandosquenohacennada.Simplementeretornanel valorlgicoTRUEoFALSErespectivamente.Elvalorde$?siempre devuelveelltimocdigoderetornoobtenidoporlashelldespusde ejecutarelltimocomando. Ejemplos:
$ true ; echo $? 0 $ false ; echo $? 1

Esperamosqueejemplostancomplicadoscomoestosdosltimosnole desanimenparacontinuarconelcurso. Comandotest

217

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Como ya dijimos el lenguaje shellscript utiliza muy frecuentemente comandosexternosdelsistemaoperativo.Queremosexplicarelcomando 'test'antesdeexplicarlassentenciascondicionalesdebashporquedeesta formapodremosusarejemplosmscompletos. 'test'esuncomandoexternoquedevolveruncdigoderetorno0o1 dependiendodelresultadodelaexpresinquesigaacontinuacin. Seusamuchsimoytienedosformatos.'test<expr>'o'[<expr>]'.ambas formassonequivalentes. LasexpresionesdeestetipoquesolopuedenvalerTRUEoFALSEse denominanexpresioneslgicas. Comprobacinsobreficheros
r<fichero> w<fichero> x<fichero> f<fichero> d<fichero> c<fichero>

TRUEsielficheroexisteyeslegible. TRUEsielficheroexisteysepuedeescribir. TRUEsielficheroexisteyesejecutable. TRUEsielficheroexisteyesdetiporegular (normal). TRUEsiexisteyesundirectorio. TRUEsiexisteyesundispositivoespecialde caracteres. TRUEsiexisteyesundispositivoespecialde bloques. TRUEsiexisteyesunpipe(fifo).

b<fichero> p<fichero>

218

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

u<fichero> s<fichero>

TRUEsiexisteytieneelbitsetuserID. TRUEsiexisteytienetamaomayorque0. Comparacindecadenas

z<cadena> n<cadena> <cadena1> <cadena2> <cadena1> <cadena2> =

TRUEsiesunacadenavaca. TRUEsiesunacadenanovaca. TRUEsiambascadenassonidnticas.OJOhay dejarespaciosaunladoyotrodelsignoigual paranoconfundirlaordenconunaasignacin. TRUEsisondistintas. TRUEsinoescadenanula.(Unavariableque no existe devuelvecadenanula). Comparacindenmeros

!=

<cadena>

<num1> <num2> <num1> <num2> <num1> <num2> <num1> <num2> <num1>

eq ne gt ge

TRUEsiambosnmerossoniguales. TRUEsiambosnmerossondistintos. TRUEsi<num1>mayorque<num2>. TRUEsi<num1>mayoroigualque<num2>.

lt TRUEsi<num1>menorque<num2>.

219

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

<num2> <num1> <num2> le

TRUEsi<num1>menoroigualque<num2>. Operadoreslgicos

! <expresin_logi ca>
<ExprLogi1>a <ExprLogi2>

OperadorlgicoNOTretornaTRUEsi <expresin_logica>es FALSEyretornaFALSEsi <expresin_logica>esTRUE. Operador lgico AND retorna TRUE si <ExprLogi1>y<ExprLogi2>sonambasTRUE yFALSEencasocontrario. Operador lgico OR retorna TRUE si <ExprLogi1> o <ExprLogi2> son alguna de ellasTRUEyFALSEencasocontrario. Agrupacindeexpresiones

<ExprLogi1>o <ExprLogi2>

(<expr>)

Se pueden usar parntesis para agrupar expresioneslgicas.EsdecirquevalganTRUE oFALSE

Ejemplos:
$ test -r /etc/passwd ; echo $? 0 $ test -w /etc/passwd ; echo $? 1 $ test -x /etc/passwd ; echo $? 1

220

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ test -c /dev/null ; echo $?

0 $ test -r /etc/passwd -a -c /dev/null ; echo $? 0 $ test -w /etc/passwd -a -c /dev/null ; echo $? 1 $ test -r /etc/passwd -a -f /dev/null ; echo $? 1 $ [ -s /dev/null ] ; echo $? 1 $ [ ! -s /dev/null ] ; echo $? 0 $ [ "$$" = "zzzzzzzzzzzz" ] ; echo $? 1 $ [ 0 -lt $$ 0 $ [ 0 -lt $$ ] ; echo $? -a true ] ; echo $?

Comandoexpr Estecomandoadmitecomoparmetrosloselementosdeunaexpresin aritmtica pero hay que recordar que algunos operadores deben ser escapadoscon'\'.Porejemplo.
$ expr 11 \* 2

Adiferenciade'bc'nopodemosusarvaloresdemasiadoaltosporqueel resultado no sera correcto. Recuerde que 'bc' trabaja con precisin arbitraria.

221

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Elcomando'expr'estilperonodejadeseruncomandoexternoyporlo tanto su uso resulta ineficiente. Afortunadamente la propia shell tiene capacidaddeevaluarexpresionesaritmticas. ExpresionesaritmticasdentrodeBash Lashellpordefectoasumequetodaslasvariablessondetipocadenade caracteres.Paradefinirunavariabledetiponumricoseusa'typeseti'. Esto aade un atributo a esa variable para que la shell realice una expansin distinta sobre esta variable. Para evaluar una expresin aritmticaasignndolaaunavariableusaremos'let'. + */% + <=>=<> ==!= MenosunrioyMsunrio Multiplicacin,Divisin,yResto Suma,yResta ComparacionesMenoroigual, Mayoroigual,Menor,Mayor Igualdad,desigualdad Asignacinsimple, Asignacinconoperador (multiplicacin,divisin,resto,suma,yresta)

=*=/=%=+==

Ejemplos:
$ $ $ $ typeset -i j=7 typeset -i k typeset -i m echo $j

7 $ let j=j+3 $ echo $j

222

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 10 $ let j+=3 $ echo $j 13 $ let k=j%3 $ let m=j/3 $ echo '(' $m '* 3 ) +' $k '=' $j +AMA ( 4 * 3 ) + 1 = 13

Puede que el operador'%' noleresulte familiar. Es eloperador resto tambinsellamamduloyesloquesobradespusdeladivisin.Lo ciertoesqueespreferiblecontinuarexplicandootrascosasymsadelante tendremos oportunidad de poner algunos ejemplos con expresiones aritmticas. Hayunaseriedeoperadoresquetrabajananiveldebitsperonovamosa explicarlosdemomento. Operadores'&&'y'||' SonoperadoresANDyORaniveldeshellyposeencircuitode evaluacincorto.Notienenqueverconlosoperadoresayoyaque estoseraninterpretadosporelcomando'test'.Estosoperadores'&&'y'||' serncolocadosseparandocomandosquelgicamenteretornansiempre algnvalor. '<comando1> && <comando2> && <comando3>' significa que debe cumplirse <comando1> y <comando2> y <comando3> para que se cumpla la expresin y '<comando1> || <comando2> || <comando3>' significaquedebecumplirse<comando1>o<comando2>o<comando3> paraquesecumplalaexpresin. Si el resultado de '<comando1> && <comando2> && <comando3>' fuera 0 (TRUE) significara que los tres comandos han retornado 0 (TRUE).Siporelcontrarioelresultadohubierasidodistinto(FALSE) solosabramosqueporlomenosunodeloscomandosretornFALSE. 223

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Supongamos que el primer comando retorn TRUE. La shell deber continuarejecutandoelsegundocomando.Supongamosqueelsegundo comando retorna FALSE. En este momento la shell no continua ejecutandoeltercercomandoporquedaigualloqueretorneelresultado ser FALSE. La razn es que se necesitaban todos TRUE para un resultadoTRUE.Elhechodenoejecutarlaspartessiguientesunavezse sabeelresultadoesloquesellamacircuitodeevaluacincortoysuuso principaleseldeahorrarejecucionesdeordenesinnecesariasaunquese puedeusartambienparaejecutarcosassolobajociertascondiciones. Con el operador '||' (OR) pasa algo similar. Si el resultado de '<comando1>||<comando2>||<comando3>'fuera1(FASE)significara quelostrescomandoshanretornado1(FALSE).Siporelcontrarioel resultadohubierasidodistinto0(TRUE)solosabramosqueporlomenos unodeloscomandosretornTRUE.Supongamosqueelprimercomando retorn FALSE. La shell deber continuar ejecutando el segundo comando.SupongamosqueelsegundocomandoretornaTRUE.Eneste momentolashellnocontinuaejecutandoeltercercomandoporqueda igualloqueretorneelresultadoserTRUE.SenecesitabantodosFALSE paraunresultadoFALSE. Uncomandonormalcomoporejemplo'grep'o'echo'queterminabien devuelveTRUE.Sihubiramosredirigidolasalidade'grep'ode'echo'a unficherosinpermisodeescrituraoaunficheroconunpathinexistente elretornode'grep'ode'echo'habrasidoFALSEindicandolaexistencia de error. En otras ocasiones FALSE no indicar error sino que el comando no tuvo xito. Esto ltimo sera aplicable a 'grep' (patrn localizadoonolocalizado)peronoseraaplicableauncomandocomo 'echo'. Veamosunejemplocon'grep'.
$ echo hola | grep hola ; echo $? hola 0

224

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ echo hola | grep hola > /hh/hh/hh ; echo $? bash: /hh/hh/hh: No existe el fichero o el directorio 1 $ echo xxx | grep hola ; echo $? 1

Cuandoejecutamoscomandosconunpipe('|')elcdigoderetornoesel delltimocomandoejecutado.Ennuestrocasoelprimercdigo1sedebe alaimposibilidaddegenerarlasalida.Elsegundocdigo1sedebeaque la cadena no fue encontrada. En los tres casos $? recoge el cdigo retornadopor'grep'. Ahora vamos aprobarejemplos queilustren elcircuito deevaluacin corto.PrimeroparaOR
$ # Como un OR queda evaluado cuando se encuentra el primer resultado TRUE $ # solo se evaluaran los comandos hasta obtener el primero que devuelva $ # 0 (TRUE) $ echo "hola" || echo "adis" hola $ # El resultado sera 0 $ echo $? 0

AhoraparaAND.
$ # Como un AND no queda hasta que se evala el primer resultado FALSE $ # se evaluaran los dos comandos y devolver igualmente TRUE. $ echo "hola" && echo "adis" hola

225

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html adis $ # El resultado sera 0 $ echo $? 0

Elcircuitodeevaluacincortohadeusarsecorrectamente.Sisabemos que un comando dar casi siempre un resultado que puede hacer innecesario la ejecucin de otros comandos lo colocaremos en primer lugar. Los comandos lentos se colocan en ltimo lugar porque de esa formapuedenosernecesarioejecutarlos.Algunasvecesnonosinteresa unresultadosinosoloqueseejecuteunaordendependiendodelresultado de otra orden. Es decir queremos ejecutar solo si se cumple una condicin.
$ test ! -w fichero && echo "Cuidado fichero sin permiso de escritura" $ test -w fichero || echo "Cuidado fichero sin permiso de escritura"

PROGRAMACIONSHELLSCRIPT(TerceraParte) Sentenciacondicional'if' Yahemosvistounaformadehacerlousandolosoperadore'||'o'&&'dela shell, pero existen formas que pueden resultar ms versatiles y ms legibles.
if _condicin_ then _lista_de_ordenes_ [ elif _condicin_ then _lista_de_ordenes_ ] ... [ else _condicin_ ]

fi

Enlugarde_condicin_podramoshaberpuesto_lista_de_ordenes_pero queremosresaltarqueelcdigoderetornovaaserevaluado. 226

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Laspartesentrecorchetessonopcionalesysivanseguidasdetrespuntos '...' indica que puede presentarse varias veces. Todas las sentencias condicionales'if'empiezanconlapalabrareservada'if'yterminanconla palabrareservada'fi'. Mejor vamos a ilustrar con algunos ejemplos. Deber editarlos y ejecutarlos.
# Esto siempre mostrara '123' if true then echo '123' fi

Acabamosdeutilizarunacondicinquesiempresecumplir.Vamosa veralgounpocomsutil.
# Si la variable CMPRT01 est definida y contiene el nombre de un fichero # con permiso de lectura se mandar a la impresora con 'lp' if test -r $CMPRT01 then lp $CMPRT01 fi

Tambin podemos programar una accin para cuando se cumpla una condicinyotraparacuandonosecumpla.
# Si La variable 'modo' contiene el valor 'lp' imprimir el fichero $FICH # en caso contrario sacarlo por pantalla. if [ "$modo" = "lp" ] then lp $FICH else cat $FICH fi

Elsiguienteejemploediteloconelnombre'tipofichero'.Nosservirpara ilustrarelusode'elif'ypararepasaralgunasdelasopcionesde'test'. 227

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html # tipofichero FILE=$1 if test -b $FILE then echo $FILE 'Es un dispositivo de bloques' elif test -c $FILE then echo $FILE 'Es un dispositivo especial de caracteres' elif test -d $FILE then echo $FILE 'Es un directorio' elif test -f $FILE then echo $FILE 'Es un fichero regular (ordinario)' elif test -L $FILE then echo $FILE 'Es un Link simblico' elif test -p $FILE then echo $FILE 'Es un pipe con nombre' elif test -S $FILE then echo $FILE 'Es un Socket (dispositivo de comunicaciones)' elif test -e $FILE then echo $FILE 'Existe pero no sabemos que tipo de fichero es' else echo $FILE 'No existe o no es accesible' fi

Para usar este ltimo ejemplo ejectute './tipofichero ..' o './tipofichero tipofichero' Tengaencuentaquesibienla'bash'admiteelusode'elif'quizasotras shellnoloadmitan. Setenciacondicional'case' Ya hemos visto que con 'elif' podemos evaluar distintas condiciones programandounaaccinparacadacaso. Existeuncasoespecial.Imaginemosquedeseamosevaluarunavariabley enfuncindeloquecontengahacerunacosauotra.Podramosusaruna sentenciacondicionalconabundantes'elif'perohayquetenerencuenta unacosa.Con'elif'tenemosqueirevaluandoacadapasohastaquese 228

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

cumplaunavezyentoncesseejecutalaaccinyyanoseejecutaninguna otra porque habremos finalizado. En el caso anterior si hubieramos introducidoelnombredeunpipeconnombresehabranejecutadovarios testantesdedeterminarqueeraunpipeconnombre,yesoresultalento. Si lo que deseamos hacer est en funcin de unvalor utilizaremos la sentencia condicional 'case' que es mucho ms eficiente porque no requiereejecutarvariasordenesounaordenvariasvecescomoenelcaso anterior. Lasintaxisparalasentenciacondicional'case'seradelasiguienteforma:
case valor in [_lista_de_patrones_)_lista_de_ordenes_;;]... esac

Porvalorqueremosindicarelresultadodecualquierexpansinproducida porlashell.La_lista_de_patrones_sonunoomspatronesseparadospor elcaracter'|'ycadapatrnesdelmismotipoquelospatronesutilizados paralaexpansindenombresdeficheros.Elordenesimportanteporque sevancomprobandoporordenyenelmomentoqueunodelospatrones corresponda con el valor se ejecutar la _lista_de_ordenes_ que le correspondayyanoseejecutarnadams.Esfrecuenteutilizarenltimo lugar un patrn '*)' para que en caso de no encontrar ninguna correspondenciaconlospatronesanterioresseejecutesiempreunaaccin por defecto. Edite el siguiente ejemplo y salvelo con nombre 'prueba_case'.
# prueba_case case $1 in 1) echo Uno ;; 2) echo Dos ;; [3-7]) echo "Entre tres y siete ambos incluidos" ;; 8|9|0) echo Ocho; echo Nueve; echo Cero ;; [a-zA-Z]) echo Una Letra ;; start|begin) echo Comienzo ;; stop|end) echo Fin ;; *) echo 'Fallo'

229

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html esac

Ahoraledamospermisodeejecucinyprobamoscomofunciona.
$ ./prueba_case 1 Uno $ ./prueba_case 2 Dos $ ./prueba_case 7 Entre tres y siete ambos incluidos $ ./prueba_case h Una Letra $ ./prueba_case start Comienzo $ ./prueba_case begin Comienzo $ ./prueba_case aa Fallo $ ./prueba_case 12 Fallo $ ./prueba_case 9 Ocho Nueve Cero $ ./prueba_case stop Fin

Recuerdequelaejecucindeunaordenexternaenunshellsrciptesuna operacin costosa. Hacer un script ineficiente puede no tener ninguna importancia dependiendo del uso que le demos y de lo sobrada de recursosqueestlamquina,peroenotroscasosisermsimportante

230

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

asquehaciendolascosaslomejorposibleestaremospreparadosenun futuroparatrabajosmsexigentes. Entradadedatosconread La instruccin 'read' permite capturar datos desde la entrada estandar. Paraelloquedaalaesperadeunfindelinea.Editeelficherosiguientey llamel'pru_read'.
echo -e "Introduzca su nombre : \c" read NOMBRE banner Hola $NOMBRE

Ejecute'./pru_read'.Observequelosdatosintroducidossonguardadosen lavariableNOMBRE.Sipulsadirectamentelavariabletomarvalor"". Cuando se usa la instruccin 'read' sin una variable el contenido se guardar en la variable REPLY pero si lo que desea es guardar el contenido queda ms claro guardarlo en una variable concreta. Ms adelanteveremosejemplosqueusanestainstruccin. Bucles'while'y'until'
while _condicin_ do _lista_de_ordenes_ done

Enlugarde_condicin_podramoshaberpuesto_lista_de_ordenes_pero queremosresaltarqueelcdigoderetornovaaserevaluado. Mientrassecumplalacondicinseejecutar_lista_de_ordenes_.Resulta evidentequesidentrodela _lista_de_ordenes_ nohaynadacapazde alterar la condicin, resultar un blucle que se ejecutar de forma ininterrumpida.(Bucleinfinito).Siestoocurrehabrquematarelproceso enviandoalgunaseal. 231

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Existeunbuclemuysimilaryquesolosediferenciaenquenoparanunca hastaquesecumplalacondicin.Esdecirjustoalrevsqueantes.
until _condicin_ do _lista_de_ordenes_ done

Editecomo'pru_while1'elsiguienteejemplo.
# pru_while1 # Hacer un bucle de captura por consola (terminara cuando se pulse # solo <INTRO> ) y mostrar el resultado de cada captura entre parentesis. # Inicializamos primero la variable LINEA con un valor cualquiera # pero distinto de "" LINEA="x" while test $LINEA do read LINEA echo '('$LINEA')' done

Cuandopulsemos<INTRO>directamentesinnadamsLINEAvaldr"" y'test$LINEA'devolverFALSEyelbuclefinalizar. Vamosaejecutarelejemploparacomprobarsufuncionamiento.


$ ./pru_while1 aaaaa (aaaaa) bbbbb (bbbbb) ()

232

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

VemosqueenlaltimaejecucinLINEAvala"". Bucle'for' Seproporcionaunalistadeelementosyseejecutaunalistaderdenes haciendoqueunavariablevayatomandoelvalordecadaunodeestos elementos.Entreestasordenessepuedeutilizarunnuevobucle'for'. ElsiguienteejemplofuncionaperoesunamalaideayaquesuponeVarias ejecucionesdeuncomandocuandosepodahaberhechoconunosolo. Habrasidomejorhacer'chmod+x*'.


for i in $* do chmod +x done

$i

Elsiguienteejemplonofuncionarsinopreparaunpocounaseriede cosasquesenecesitan.Concretamentedeberdeexistirunfichero'lista' con varios elementos. Varios ficheros con nombre que empiecen por SCAN.Variosficheros'*.doc'deloscualesalgunosdeberancontenerla palabra'CODIGO'.Estudieelcontenidodelejemploquesigue.Editeloy ejecutelopasandovariosargumentos.Suobjetivoeshacerlofuncionary entendercomofunciona.
# Para ver distintos modos de manejar listas vamos a generar todos los # nombres posibles formados por combinacion de las partes siguientes: # Como parte 1 los nombres de ficheros de directorio actual que # empiezan por 'SCAN'. # Como parte 2 los nombres contenidos en el fichero 'lista'. # Como parte 3 los identificadores 'cxx0 cxx2 bxx5' # Como parte 4 la lista de parametros $1 $2 $3 .. etc, # Como parte 5 los ficheros '*.doc' que contienen la palabra 'CODIGO'.

233

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html ### for i in `ls SCAN*` do for j in `cat lista` do for k in cxx0 cxx2 bxx5 do for l in $* do for m in `grep -l "CODIGO" *.doc` do echo $i.$j.$k.$l.$m done done done done done

Cuandotengamosbuclesunosdentrodeotrosdecimosquesonbucles anidados.Elniveldeanidamientodeunbucleeselnmerodebuclesque hayunosdentrodeotros. 'break'y'continue' Existeunaformadecontrolarunblucledesdeelinteriordelmismo.Para esopodemosusar'break',o'continue'.Sepuedenusarencualquieradelos buclesqueacabamosdever(while,until,yfor). Lapalabrareservada'break'provocalasalidadeunbucleporelfinal.Si vieneseguidodeunnumero'n'saldrde'n'niveles.Noponernmero equivaleaponerelnmero1. Lapalabrareservada'continue'provocaunsaltoalcomienzodelbucle paracontinuarconlasiguienteiteracin.Sivieneseguidadeunnumero 'n'saldrde'n'niveles.
# pru_break_continue # Definir la variable j como una variable de tipo entero e

234

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html # inicializarla a cero. Luego la incrementamos a cada iteracin # del bucle y si j es menor que diez mostramos el doble de su valor. # y en caso contrario salimos del bucle typeset -i j=0 while true do let j=j+1 if [ $j -et 3 ] then continue fi if [ $j -et 4 ] then continue fi if [ $j -lt 10 ] then expr $j \* 2 else break fi done

Probamosahoraaejecutarloyobtendremos
$ ./pru_break_continue 2 4 10 12 14 16 18

Ahora edite y pruebe el siguiente ejemplo que llamaremos 'pru_break_continue2'


# ./pru_break_continue2 for i in uno dos tres do for j in a b c do

235

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html for k in 1 2 3 4 5 do echo $i $j $k if [ "$j" = "b" ] then break fi if [ "$k" = "2" ] then continue 2 fi done done done

Elresultadodelaejecucinseracomosigue.
$ ./pru_break_continue2 uno a 1 uno a 2 uno b 1 uno c 1 uno c 2 dos a 1 dos a 2 dos b 1 dos c 1 dos c 2 tres a 1 tres a 2 tres b 1 tres c 1 tres c 2

Arreglos Vamosaestudiarahorauntipodevariablesquesecaracterizanporque permiten guardar valores asociados a una posicin. Los llamamos 'arreglos' (en ingles array) tambin se pueden llamar tablas. En el siguienteejemplousaremosunavarirable'tab[]'quesecomportacomosi estuvieraformadaporvariasvariables.tab[1],tab[2],tab[3],etc...Vamos

236

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ailustrarloconunejemploquetieneunpocodetodo.Setratadeun programaquedebeestudiardetenidamente.
# Desarrollar una funcin que admita un parametro de entrada. Si el # parametro de entrada contiene una cadena que ya esta almacenada en # la tabla 'tabnom' retornar sin mas, pero si no esta aadir esa # palabra a la tabla. GuardaNombre(){ # Si numero de parametros distindo de 1 salir con error. if [ $# -ne 1 ] then echo "Numero de parametros invalido en GuardaNombre()" return 2 fi typeset -i j=1 for var in ${tab[*]} do if [ $var = $1 ] then ind=$j return 1 fi let j=j+1 done ind=$j tab[$ind]=$1 return 0 } ########################## main ################## while true do echo -e "Introduzca algo o puse <INTRO> directamente para finalizar : \c" read DATO if [ ! "$DATO" ] then break fi GuardaNombre $DATO done echo "Ahora visualizamos los datos introducidos"

237

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html for l in ${tab[*]} do echo $l done echo 2 ${tab[2]} echo 1 ${tab[1]}

Elresultadodeejecutarestointroduciendounaseriededatosseracomo sigue:
Introduzca algo o puse finalizar : hhhhh Introduzca algo o puse finalizar : jjjj Introduzca algo o puse finalizar : jjjj Introduzca algo o puse finalizar : jjjj Introduzca algo o puse finalizar : ooooooooo Introduzca algo o puse finalizar : kk Introduzca algo o puse finalizar : Ahora visualizamos los hhhhh jjjj ooooooooo kk 2 jjjj 1 hhhhh <INTRO> directamente para <INTRO> directamente para <INTRO> directamente para <INTRO> directamente para <INTRO> directamente para <INTRO> directamente para <INTRO> directamente para datos introducidos

Conestocomprobamosquepodemosaccedernosoloalalistacompleta de los datos introducidos sino a uno solo de ellos proporcionando un nmeroconlaposicindondeeldatohasidoalmacenado. Tambincomprobamosqueelvalor'jjjj'sehaindroducidovariasveces pero nuestro programa solo lo guarda una vez gracias a que antes de guardarcadavalorsecompruebasidichovaloryafeguardadoantes.

238

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Unejemposencillo:Construccindeunmen

###################################################### ################### muestraopcionesmenuprin() { clear echo '1) Fecha y hora' echo '2) Calendario del ms actual' echo '3) Calendario del ao actual' echo '4) Calculadora de precisin arbitraria' echo '5) Lista de usuarios conectados' echo '6) Memoria libre del sistema' echo '7) Carga del sistema' echo '8) Ocupacion de todo el sistema de ficheros' echo '0) Terminar' echo echo -e "Introduzca la opcin deseada : \c" } ###################################################### ################### pausa () { echo echo -e "Pulse para continuar" read } ###################################################### ################### ############################### MAIN ################################### ###################################################### ################### while true do muestraopcionesmenuprin read OPT clear case $OPT in 3|7) echo "Para salir deber pulsar 'q'" ; pausa ;; 4) echo "Para salir deber introducir 'quit'" ; pausa ;;

239

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html esac echo ; echo case $OPT in 0) exit ;; 1) date ; pausa ;; 2) cal ; pausa ;; 3) cal `date +%Y` | less ;; 4) bc ;; 5) who -iTH ; pausa ;; 6) cat /proc/meminfo ; pausa ;; # Podra usarse el comando free 7) top -s ;; 8) df ; pausa ;; *) echo -e "Opcion erronea.\a" ; pausa ;; esac done echo echo

Vamos a comentar algunos aspectos de este programa. Comienza con 'while true' (Antes de esto lo que hay es la declaracin de un par de funciones).Unprogramaasseejecutaraenunbuclesinfinperoexiste unainstruccin'exit'enmediodelprogramaparafinalizarcuandoseelija laopcinadecuada. Primero sellama aunafuncin'muestraopciones'quenosmuestralas opcionesdisponiblesynosinvitaaintroducirunadeellasquegraciasala instruccinreadseralmacenadaenlavariableOPT.Elcontenidodeesta variableseusaenunpardesentencias'case'.Laprimerasoloconsiderasi es alguna de las opciones '3,7, o 4' y en funcin de ello muestra un mensaje adicional. El segundo 'case' sirve para desencadenar la funcionalidadelegida.Existeun'*)'quesirveparaadvertirquelaopcin introducidanoescorrecta.Quizsyahanotadoqueenocasionesusamos laopcineconecho.Estosehacecuandousamosuncaracterespecial quedebeserinterpretadocomoenelcasode'\a'(emiteunpitido),ocomo '\c' (evita el salto decarro). Elcomando 'clear' seusapara limpiar la pantalla.

240

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Elcostedeloscomandosexternos Estamosacostumbradosausarcomandosexternoscomoforamadeapoyo alaprogramacinenshellscript.EstoesmuynormalyelSOtieneuna grancantidaddecomandosqueestandiseadosparapoderloscombinar unosconotrosmedianteentradasalida. Apesardeestoelusodecomandosexternostieneuncostemuyelevado encomparacinconeldeloscomandosinternos,implementadosenla propiashell.Porestoconvienesiemprequeseaposibleusarestosltimos. Encasocontrariotampocosenotarmuchadiferenciacuandolosusemos enmediodeunprocesointeractivo.Enestoslalentitudderespuestadel usuario no permite apreciar la ventaja de una programacin eficiente. Dondesiseapreciarestadiferenciaescuandousemoscomandosdentro de bucles. Para ilustrar lo que decimos usaremos un programita de ejemploquesimplementeutiliceuncontadordebucleincrementadouna variable.

# Bucle con let (comando interno) typeset -i N=0 time while [ $N -le 20000 ] do let N+=1 done real user sys 0m1.413s 0m1.070s 0m0.030s

# Bucle con expr (comando externo) typeset -i N=0 time while [ $N -le 100 ] do N=`expr $N + 1` done real user sys 0m1.311s 0m0.230s 0m0.060s

241

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ambaspruebastardanaproximadamentelomismoperoelprimerbucle ejecuta20000iteracionesyelsegundosolo100.Esdecirqueelusodel comando externo hace el comando unas 200 veces ms lento. Quizs piense que es culpa de expr y en parte es cierto pero lo realmente importanteesquehayquearrancarunasubshelllacualarrancarexpr paraluegotomarlasalidaestandaryexpandirlotodocorrectamente.Esto comporta abrir los respectivos ficheros de esos ejecutables y abrir un fichero es algo que requiere un trabajo que no tiene lugar cuando ejecutamoscomandosinternosdelashell. Recomendacionesfinales Acabamosdeexplicarunprogramamuysencillo.Compliquelounpoco aadiendounaopcin9quemuestreunsubmenqueentreotrascosas contengaunaopcinquevuelvaalmenprincipal.Usesuimaginaciny practiqueparaintentarmejorarlo. Enestosmomentosyadisponedetodalabasedeconocimientosquele permitirpersonalizarsuentornodetrabajooconstruirsencillosscripts queleayudenarealizarunagranvariedaddetareas,otambinpuede investigaralgunosdelosprogramasdelsistemaescritosenshellscript.Si seconformaconloestudiadoynointentaponerloenprcticaprontolo olvidartodo.Practiquelaprogramacinenshellscriptyamismoantes dequeolvidelateora.Empieceporlascosasquehemosexplicadopero nosequedeeneso.Intentellegarunpocomslejos. Enlasleccionesquesiguencontinuaremostratandotemasqueabrirn nuevaspuertasasuconocimiento.Enningncasopodemosdetenernos excesivamenteenningunadeellas.Alaprogramacinenshellscriptla hemosdedicadovariasleccionesyanteriormentededicamosalgunosms alashellcomointerpretedecomandos,perohallegadoelmomentode decirquedebedeponermuchodesuparteyqueexisteel'manbash'para buscarlascosasquenopudimosexplicaraqu. NOCIONESDEPROGRAMACINENAWK 242

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Queesawkyparaqueseusa Lapalabra'awk'seusatantoparareferirseaunlenguajedemanipulacin deficherosdedatoscomoparareferirseasuinterprete. Dado que los SO tipo Unix incluido Linux acostumbran con mucha frecuenciaausarficherosdeconfiguracindelsistemaenformatosdede textoperfectamentelegiblesyeditablessediseounlenguajeparapoder procesarestetipodeficherosdedatosenformatodetexto. Cuandounprogramanecesitaunavelocidadmuyaltaparaaccederaunos datosoparamodificarlosseutilizanestructurasdedatosmssofisticadas. En muchos otros casos un fichero de configuracin ser accedido de formamuyocasional,yresultamsinteresanteusarunformatodetexto sencillo. Por ejemplo hay ficheros de configuracin que solo se usan durante la carga de un programa. Algunos de estos programas suelen cargarseunasolavezmientrasarrancaelsistemayluegoencondiciones normalespermanecenarrancadostodoeltiempo. 'awk' naci en 1978 como un lenguaje pequeo y sencillo perodesde entonceshaevolucionadomuchoyenlaactualidadsepuedeafirmarque esunlenguajemuypotenteyverstil.Imposibletratarloenprofundidad enuncursocomoeste. 'awk'esuncomplementomuybuenoparasuusoconshellscript.Esta leccinnovaacondicionarlaasimilacindeleccionesposteriorespero recomendamos que como mnimo le de un breve repaso ya que 'awk' puederesultarextremadamentetilendeterminadascircunstancias. Nosvamosaconformarconexplicarunaspocascosasporqueconello conseguiremos dos objetivos. El primero que pueda usarlo para un limitadotipodetareasbastantefrecuentes,yelsegundoqueconozcasu existenciayparaqueseusa.Deestaformapuedeampliarconocimientos porsucuentacuandolonecesite. 243

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Nosvamosacentrarenelprocesamientodedatosenloscualescadalnea estarestructuradaencampos.Estoscamposestarndelimitadosentresi por algn carcter o por alguna secuencia especial de caracteres especialmentereservadoparaello.Estasecuenciasereldelimitadorde camposynodebeaparecerenelinteriordeningncampo.Cadalnea equivaleaunregistro. Lamayoradelasbasesdedatos,yhojasdeclculopermitenvolcarlos datosenformatodetextoparapoderserexportadosentredistintasbases de datos. Estas salidas se pueden procesar fcilmente mediante 'awk'. Tambinsepuedeusar'awk'conlasalidadediversosprogramas.Esto permite entre otras cosas usar 'awk' para acoplar una salida de un programaconlaentradadeotroquenecesiteunformatomuydistinto.En definitiva vamos a explicar solo una pequea parte de este potente lenguajeperocomprobarsugranutilidadmuypronto. Formadeuso 'awk'sueleestarinstaladoenlamayoradelossistemasyaquesuuso suelesernecesario.PoresoenLinuxsueleencontrarseentrelospaquetes bsicosdelsistemaentodaslasdistribuciones. Sepuedeusardevariasformas.Tenemosquepasara'awk'eltextodel programa,ylosdatos.Elprimerosepuedepasarbiencomoargumentoo indicandofnombredelficheroquecontieneeltextodelprograma.La entrada se puede pasar dando el nombre del fichero de entrada como ltimoargumentooencasocontrariolotomarporlaentradaestndar.
$ ## Generamos en /tmp un par de ficheros $ echo -e "\n" > /tmp/echo.out $ echo '{ print "Hola mundo" }' > /tmp/ejemplo1.awk $ ## Ejecutaremos el mismo programa de 4 formas distintas $ echo -e "\n" | awk '{ print "Hola mundo" }' Hola mundo Hola mundo $ awk '{ print "Hola mundo" }' /tmp/echo.out

244

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Hola mundo Hola mundo $ echo -e "\n" | awk -f /tmp/ejemplo1.awk Hola mundo Hola mundo $ awk -f /tmp/ejemplo1.awk /tmp/echo.out Hola mundo Hola mundo

Elprogramaqueacabamosdeutilizarimprimirelliteral"Holamundo"a cadalneadedatosqueprocese.Enestecasousamossolounpardelneas vacascomoentradadedatos. Vamosalocalizarelbinariode'awk'


$ whereis awk /usr/bin/awk

Vamosasuponerqueensusistemaseencuentretambinen'/usr/bin'. Puestoqueawkesunlenguajeinterpretadoperfectamentelegibletambin podemosdecirquelosprogramasdeawksonscript.Parapoderusarlos directamente podemos aadiruna primera lnea connmero mgico y ponerpermisodeejecucin.
$ echo '#!/usr/bin/awk -f' > /tmp/ejemplo2.awk $ echo '{ print "Hola mundo" }' >> /tmp/ejemplo2.awk $ chmod +x /tmp/ejemplo2.awk $ echo -e "\n" | /tmp/ejemplo2.awk Hola mundo Hola mundo

Estructuradeunprogramaawk Unprograma'awk'puedetenertresseccionesdistintas.

Puede incluir una primera parte para que se ejecute antes de procesar ninguna de las lneas de entrada. Se usa para ello la 245

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

palabra reservada BEGIN seguida de una o mas instrucciones todasellasenglobadasdentrodeunpardecorchetes.'{','}'. Puedeincluirunapartecentralqueseprocesarenteraparacada lineadeentradadedatosyquepuedetenervariosbloques'{','}'. Si uno de estos bloques contiene una expresin regular se procesarsolocuandolalneadeentradaseajustealpatrndela expresinregular. Puedeincluirunapartefinalqueseprocesarenltimolugaruna vezterminelalecturayprocesadodetodaslaslneasdeentrada. SeusaparaellolapalabrareservadaENDseguidadeunaoms instruccionestodasellasenglobadasdentrodeunpardecorchetes. '{','}'.

Elprimerejemploquevimosanteriormente("Holamundo")solotena una de las tres partes. Concretamente era la parte central ya que no pusimosningunadelaspalabrasreservadasBEGINoEND. Vamosaponerahoraunejemploconlastrespartes.Editeunficherocon nombre'/tmp/3partes.awk'
BEGIN { print "Erase una vez..." } { print "...y entonces bla, bla, bla ..." } END { print "...y colorn colorado este cuento se ha acabado." }

Ejectelocon:
$ echo -e "\n\n\n" | awk -f /tmp/3partes.awk Ama Erase una vez... ...y entonces bla, bla, bla ... ...y entonces bla, bla, bla ... ...y entonces bla, bla, bla ... ...y entonces bla, bla, bla ... ...y colorn colorado este cuento se ha acabado.

246

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Es importante que comprenda que la parte central se ejecutar tantas vecescomolneasdedatosexistan.Ennuestroejemplosoncuatrolneas generadaspor'echoe"\n\n\n"'.Encambiolaspartes'BEGIN{...}'y 'END{...}'seejecutanunasolavez.Laprimeraantesdeprocesarla primeralneaylaltimadespusdeprocesarlaltimalnea. Loscomentariosen'awk'comienzanconun'#'yterminanalfinaldela lnea. Expresionesregulares Algunasveceslosdatospuedenvenirconalgunaslineasquenointeresa procesaroquesedebenprocesardeformadistinta.Podemosusaruna expresinregulardelimitadaporelcarcter'/'paraseleccionarunaaccin especial.Vamosaeditarotroejemploquellamaremos'/tmp/expreg.awk':
BEGIN { print "Erase una vez..." } /^$/ { print "Linea vaca" } /[0-9]+/ { print "Tiene un nmero" } /\.$/ { print "Termina con punto" } # Esto es un comentario { print "--------------------------------------" } END { print "...y colorn colorado este cuento se ha acabado." }

Ahoraeditamosunsegundofichero'/tmp/expreg.dat':
Lnea nmero 1. Lnea nmero 2 .... Fin de los datos

Ahoraejecutelosiguiente:
$ awk -f /tmp/expreg.awk /tmp/expreg.dat

247

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Erase una vez... Tiene un nmero Termina con punto -------------------------------------Tiene un nmero -------------------------------------Linea vaca -------------------------------------Termina con punto --------------------------------------------------------------------------...y colorn colorado este cuento se ha acabado.

Vemosquecadalneadedatospuedecumplirmsdeunareglayque cuandonoponemosunaexpresinregularsiempreseejecutarlaaccin. Enestecasotodaslaslneasprovocanlaescrituradeunalneadeguiones ''. Elusodeexpresionesregularespuedeayudarnosaeliminarcabeceras, lneasvacasoincompletasocosasasquenodeseamosprocesar. Delimitadoresdecampos No hemos tratado aun los campos de una lnea. Una lnea que tenga distintoscamposdebeusaralgunasecuenciaparadelimitarloscampos entresi. Lomismoparadefinirundelimitadorqueencualquierotrocasodondese usencadenasdecaracteres podemosencontrarnoslanecesidaddeusar caracteresespecialesquenopuedenserintroducidosdirectamente.Para elloexistendeterminadassecuenciasqueempiezanporelcarcter'\'yque tienensignificadoespecial. Caracteresdeescape \a \b Produceunpitidoenelterminal Retroceso

248

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

\f \n \r \t \v \ddd \c

Saltodepgina Saltodelnea Retornodecarro Tabuladorhorizontal Tabuladorvertical Carcterrepresentadoenoctalpor'ddd' Carcter'c'

\xhex Carcterrepresentadoenhexadecimalpor'hex'

Elltimocasoseusaparaeliminarelsignificadoespecialdeuncarcter endeterminadascircunstancias.Porejemploparausarun'+'oun''en unaexpresinregularusaramos'\+'o'\' Podemoselegirunsolocarcterparasepararcampos.Hayficherosde configuracin como /etc/passwd, /etc/group, que usan un solo carcter paradelimitarloscampos.Porejemplolosdospuntos':',elblanco'\',la coma','eltabulador'\t'etc... 'awk' permite usar como delimitador ms de un carcter. Para ello se asignar a la variable 'FS' unacadenadecaracteres quecontengauna expresinregular.Porejemploparausarcomodelimitadorelcarcter':' habraqueincluir'BEGIN{FS=":"}' Sinoseespecificaningndelimitadorseasumirqueloscamposestarn delimitadosporunoomsblancosotabuladoresconsecutivoslocualse expresacomo"[\\t]+".Lasexpresionesregularesyafueronestudiadasen un captulo especial. El carcter '\' debe usarse para escapar cualquier carcter con significado especial en una expresin regular y algunos caracteresnormalesprecedidosde'\'seusanpararepresentarcaracteres especiales.'\t'eseltabulador. En'awk'seusa$1parareferenciarelcampo1,$2parareferenciarel campo2,etc...yparareferenciarelregistrocompletousaremos$0. 249

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Editeelsiguientefichero'/tmp/delim1.awk'
{ print "+", $1, "+", $2, "+", $3, "+", $4, "+" }

$1,$2,$3,y$4representanaloscampos1,2,3,y4respectivamente. Editeelsiguienteficherodedatos'/tmp/delim1.dat'
aaa bbb ccc 111 222 333 444 ddd eee

Enlaprimeralneadebeintroducirunblancoparasepararlosprimeros blancosyunasecuencienciade',,,'parasepararlosdosltimoscampos. Es importante que lo edite de esta forma porque el resultado de los ejemplospodravariar. Ahoraejecutelosiguiente:
$ awk -f /tmp/delim1.awk /tmp/delim1.dat + aaa + bbb + ccc + ddd + + 111 + 222 + 333 + 444 +

Editeelsiguientefichero'/tmp/delim0.awk'
{ print "+", $3, "+", $4, "+", $1, "+", $2, "+" }

Ahoraejecutelosiguiente:
$ awk -f /tmp/delim0.awk /tmp/delim1.dat + ccc + ddd + aaa + bbb + + 333 + 444 + 111 + 222 +

Conellohemosconseguidovariarelordendeaparicindeloscampos, perotodavanohemosespecificadoningndelimitador.Porellohemos asumidoeldelimitadorpordefecto.(unoomsblancosytabuladores). 250

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Paraespecificarundelimitadordistintotenemosqueasignarsuvalorala variable FS y adems tenemos que hacerlo antes de leer el primero registro por lo cual se incluir la instruccin en la seccin inicial precedidadeBEGIN. Editeelsiguientefichero'/tmp/delim2.awk'
BEGIN { FS = "\ " } { print "+", $1, "+", $2, "+", $3, "+", $4, "+" }

Estamos definiendo un nico carcter blanco como separador. Ahora ejecutelosiguiente:


$ awk -f /tmp/delim2.awk /tmp/delim1.dat + aaa + bbb + ccc + + + 111 + 222 + 333 + 444 +

Vamos a cambiar de delimitador. Edite el siguiente fichero '/tmp/delim3.awk'


BEGIN { FS = "\t" } { print "+", $1, "+", $2, "+", $3, "+", $4, "+" }

Estamosdefiniendounnicocarctertabuladorcomoseparador.Ahora ejecutelosiguiente:
$ awk -f /tmp/delim3.awk /tmp/delim1.dat + aaa bbb ccc + + ddd + + + 111 222 333 444 + + + +

Seleccinderegistrosporcampo Vamosaeditarunficheroquesimularlasalidadedatosobtenidadesde unabasededatosrelacional.Usaremosestosdatosenvariosejemplos. 251

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Puede corresponder a una contabilidad de un alquiler de un piso. Lo llamaremos'contabil.dat'.


fecha|concepto|importe ----------+--------+------01-01-1999|| 96 16-12-1999|AGUA | -14650 05-01-2000|LUZ | -15797 24-01-2000|GAS | -34175 27-01-2000|INGRESO | 141200 01-02-2000|MENS | -96092 25-02-2000|LUZ | -12475 01-03-2000|MENS | -96092 06-03-2000|INGRESO | 101300 01-04-2000|MENS | -96092 06-04-2000|AGUA | -15859 07-04-2000|INGRESO | 134000 01-05-2000|MENS | -98975 02-05-2000|LUZ | -11449 09-05-2000|INGRESO | 95000 23-05-2000|GAS | -21428 25-05-2000|GAS | -16452 01-06-2000|MENS | -98975 07-06-2000|INGRESO | 130000 01-07-2000|MENS | -98975 04-07-2000|LUZ | -12403 07-07-2000|AGUA | -5561 10-07-2000|INGRESO | 99000 24-07-2000|GAS | -11948 01-08-2000|MENS | -98975 10-08-2000|INGRESO | 122355 04-09-2000|LUZ | -12168 10-09-2000|INGRESO | 129000 19-09-2000|AGUA | -10529 28-09-2000|GAS | -2620 01-10-2000|MENS | -98975 10-10-2000|INGRESO | 112000 (32 rows)

Loprimeroquevemosesquetieneunacabeceradedoslneasintilesy unfinaltambinintil.Podemosasegurarquelaslneasquedeseamos procesarcumplirnunpatrndedosnmerosguindosnmerosguin

252

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

cuatro nmeros y lnea vertical. Vamos a editar un programa que llamaremos'contabil1.awk'


BEGIN { FS="\|" } /[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ print NR, ", ", $1, ", ", $2, ", ", $3 }

Vamosaejecutaresteejemployvamosaversusalida $awkfcontabil1.awk<contabil.dat
3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 01-01-1999 , 16-12-1999 , 05-01-2000 , 24-01-2000 , 27-01-2000 , 01-02-2000 , 25-02-2000 , 01-03-2000 , 06-03-2000 , 01-04-2000 , 06-04-2000 , 07-04-2000 , 01-05-2000 , 02-05-2000 , 09-05-2000 , 23-05-2000 , 25-05-2000 , 01-06-2000 , 07-06-2000 , 01-07-2000 , 04-07-2000 , 07-07-2000 , 10-07-2000 , 24-07-2000 , 01-08-2000 , 10-08-2000 , 04-09-2000 , 10-09-2000 , 19-09-2000 , 28-09-2000 , 01-10-2000 , AGUA LUZ GAS INGRESO MENS LUZ MENS INGRESO MENS AGUA INGRESO MENS LUZ INGRESO GAS GAS MENS INGRESO MENS LUZ AGUA INGRESO GAS MENS INGRESO LUZ INGRESO AGUA GAS MENS , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

96 -14650 -15797 -34175 141200 -96092 -12475 -96092 101300 -96092 -15859 134000 -98975 -11449 95000 -21428 -16452 -98975 130000 -98975 -12403 -5561 99000 -11948 -98975 122355 -12168 129000 -10529 -2620 -98975

253

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 34 , 10-10-2000 , INGRESO , 112000

Podemosapreciarvariascosas.NResunavariabledelsistemaquetoma elvalordelnmeroderegistroqueseestprocesando.Podemosverque lasdosprimeraslneasylaltimahansidodescartadas.Tambinvemos quelasprimeraslneasusanunsolodgitoparaelnmeroderegistroy luegousandosdgitos.Estoquelascolumnasnoquedenalineadas. Vamosamodificarelprogramaparaquemuestrelosregistroscompletos ($0)cuandonosecumplalacondicinanterior.Paraelloeditaremosun ficheroquellamaremos'contabdescarte.awk'.


BEGIN { FS="\|" } ! /[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ print NR, $0 }

Vamosaejecutaresteejemployvamosaversusalida $awkfcontabdescarte.awk<contabil.dat
1 fecha|concepto|importe 2 ----------+--------+------35 (32 rows)

Formatodesalidaconprintf Paraimprimirconformatousaremos'printf'enlugarde'print'.printfse usaenvarioslenguajes.Elprimerargumentodeestafuncindebedeser unacadenadecaracteresquecontengaelformatodesalidadeseadopara lasalida.Losformatosdecadadatoseexpresanmedianteunasdirectivas queempiezanconelcarcter'%'ydebedeexistirendichacadenatantas directivascomodatosseparadosporcomaacontinuacindelacadenade formato.

254

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Hayquetenerencuentaqueen'awk'laconcatenacindecadenasseusa poniendounacadenaacontinuacindeotraseparadaporblancos.Por ejemplo: #cad="(unodos)"cad="uno""dos";cad="("cad")" Especificacindeformatodedatospara'printf' %c CarcterASCII %d Enterorepresentadoendecimal %e Comaflotante(exponente=e[+]dd) %E Comaflotante(exponente=E[+]dd) %f Comaflotantesinexponente %g Equivalealmscortodelosformatos'e'o'f' %G Equivalealmscortodelosformatos'E'o'F' %o Enterorepresentadoenoctal %s Cadenadecaracteres %x Enterorepresentadoenhexadecimalconminsculas %X Enterorepresentadoenhexadecimalconmaysculas %% Carcter'%' Enestosformatossepuedeintercalarinmediatamenteacontinuacindel '%' primero un signo '+' o un '' que son opcionales y significan respectivamentealineacinaladerechaoalaizquierda.Ensegundolugar y de forma igualmente opcional se puede intercalar un nmero para indicarunanchomnimo.(Sieldatoocupamsqueeldatoespecificado se muestra el dato completo haciendo caso omiso de la indicacin de anchura).Enelcasodecomaflotantesepuedeindicarelanchototaldel campoylaprecisin(anchura)delapartedecimal. Veamosunospocosejemplos.

255

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ echo | awk '{ print "Hola mundo" }' printf "Hola %s\n", "mundo" }' printf "#%d#%s#\n", 77, "mundo" }' printf "#%10d#%10s#\n", 77,

Hola mundo $ echo | awk '{ Hola mundo $ echo | awk '{ #77#mundo# $ echo | awk '{ "mundo" }'

# 77# mundo# $ echo | awk '{ printf "#%-10d#%-10s#\n", 77, "mundo" }' #77 #mundo # $ echo | awk '{ printf "#%+4d#%+4s#\n", 77, "mundo" }' # +77#mundo# $ echo | awk '{ "mundo" }' printf "#%04d#%+4s#\n", 77,

#0077#mundo# $ echo | awk '{ printf "#%010.5f#%E#%g\n", 21.43527923, 21.43527923, 21.43527923 }' #0021.43528#2.143528E+01#21.4353 $ echo | awk '{ printf "#%10.5f#%E#%g\n", 2140000, 2140000, 2140000 }' #2140000.00000#2.140000E+06#2.14e+06

Practique un poco investigando con ms detalle el funcionamiento de estosformatos. Usodevariablesoperadoresyexpresiones En'awk'podemosusartodaclasedeexpresionespresentesencualquier lenguaje. Cualquier identificador que no corresponda con una palabra

256

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

reservadaseasumirqueesunavariable.Paraasignarunvalorseusael operador'=' Vamosaeditarunficheroquellamaremos'ejemplexpr.awk'conalgunas expresionesaritmticas.


{ contador = 0; # Pone a cero la variable contador contador ++; # Incrementa en 1 la variable contador contador +=10; # Incrementa en 10 la variable contador. contador *=2 # Multiplica por 2 la variable contador print contador contador = ( 10 + 20 ) / 2 ; print contador contador = sqrt ( 25 ) ; # Raiz cuadrada de 25 print contador }

Loejecutamosyobservamoselresultado.
$ echo | awk -f ejemplexpr.awk 22 15 5

Nopodemosexplicarendetalletodoellenguaje'awk'.Setratadeque comprendasuutilidadydequeseacapazdeutilizarloparadeterminadas tareasenlascualesresultaextremadamentetil. AlgunasexpresionespareceninspiradasenellenguajeC.Otrasparece quehanservidodeinspiracinparaellenguajePerl.Enrealidadmuchos lenguajesusanexpresionesparecidas. Porellovamosaresumirenformadetablaunaseriedeelementosque intervienen enlasexpresionesque'awk'escapazdemanejar.Perono vamos a explicar en detalle cada cosa. En lugar de eso daremos una

257

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

descripcinresumidayprocuraremosquelosejemplosposteriorestengan unpocodetodo. Operadoresaritmticos


+ * / % ^ var=expr var++ var var+= expr_aritm var= expr_aritm var*= expr_aritm var/= expr_aritm var%= expr_aritm var^= expr_aritm expr_aritm== expr_aritm expr_aritm!=

Suma Resta Multiplicacin Divisin Mdulo(resto) Potenciacin Operadoresdeasignacin. Asignacin Incrementalavariableenunaunidad Decrementalavariableenunaunidad Incrementalavariableenciertacantidad Decrementalavariableenciertacantidad Multiplicalavariableporciertacantidad Dividelavariableporciertacantidad Guardaenlavariableelrestodesudivisinpor ciertacantidad Elevaelvalordelavariableenciertacantidad Operadoreslgicosyderelacin. Comparacindeigualdad Comparacindedesigualdad 258

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

expr_aritm expr_aritm< expr_aritm expr_aritm> expr_aritm expr_aritm<= expr_aritm expr_aritm>= expr_aritm expr_cad~ expr_regular expr_cad!~ expr_regular expr_logica|| expr_logica

Comparacinmenorque Comparacinmayorque Comparacinmenorigualque Comparacinmayorigualque Seajustaalpatrn Noseajustaalpatrn OperadorlgicoAND(Y)

expr_logica&& OperadorlgicoOR(O) expr_logica !expr_logica atan2(y,x) cos(x) exp(x) int(x) log(x) rand() sin(x) sqrt(x) srand(x)

OperadorlgicoNOT(NO) Funcionesaritmticas. Retornaelarcotangentedey/xenradianes Retornaelcosenodexenradianes Retornaelexponencialdex(e^x) Retornaelvalorenterodextruncadolaparte decimal Retornaellogaritmoneperianodex Retornaunvalorseudoaleatoriocomprendidoentre 0y1 Retornaelsenodexenradianes Retornalaraizcuadradadex Inicializalasemillaparagenerarnmeros pseudoaleatorios 259

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Funcionesparausarconcadenasdecaracteres
gsub(r,s,t)

Sustituye's'globalmenteentodo't'cadavezquese encuentreunpatrnajustadoalaexpresinregular 'r'.Sinoseproporciona't'setoma$0pordefecto. Devuelveelnmerodesustitucionesrealizado. Retorna la posicin de la 'subcadena' en 'cadena' (Primeraposicin=1) Devuelvelalongituddela'cadena'.Tomar$0por defectosinoseproporciona'cadena' Parte'cadena'enelementosde'array'utilizando'sep' comoseparador.Sinoseproporciona'sep'seusar FS.Devuelveelnmerodeelementosdelarray Sustituye's'en't'laprimeravezqueseencuentreun patrnajustadoalaexpresinregular'r'.Sinose proporciona't'setoma$0pordefecto.Devuelve1si tienexitoy0sifalla Devuelveunasubcadenade'cadena'queempiezaen 'beg' con una longitud 'len'. Si no se proporciona longituddevuelvehastaelfinaldelacadenadesde 'beg'

index(cadena, subcadena) length(cadena) split(cadena, array,sep)

sub(r,s,t)

substr(cadena, beg,len)

tolower(cadena) Pasaaminsculas toupper(cadena) Pasaamaysculas

Algunasotrasfunciones
match(cadena, expr_reg) system(comand o) sprintf(formato Paraobtenersalidaconformato. [,exprlist])

Indicasi'cadena'seajustaonoalaexpresinregular 'expr_reg'

Computoconregistros 260

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Vamos a modificar el programa 'contabil1.awk' para procesar solo los registrosdeconsumodeluz,vamosamejorarelformatodesalida,vamos aincluiruncontadorderegistrosseleccionados,uncontadordeconsumo deluz,yalfinalobtendremoselconsumototalyelconsumopromediode luz.Lollamaremos'contabil2.awk'
BEGIN { FS="\|" ; cont_reg_luz=0; cont_importe_luz=0; } $2 ~ /LUZ/ { cont_reg_luz = cont_reg_luz + 1 ; cont_importe_luz = cont_importe_luz + $3 ; printf ("%3d, %3d, %s, %s, %s, %10d\n", NR, cont_reg_luz, $1, $2, $3, cont_importe_luz); } END { printf ("Consumo promedio = %d\n", cont_importe_luz / cont_reg_luz) ; }

Vamosaejecutaresteejemployvamosaversusalida $awkfcontabil2.awk<contabil.dat
5, 1, 05-01-2000, LUZ 9, 2, 25-02-2000, LUZ 16, 3, 02-05-2000, LUZ 23, 4, 04-07-2000, LUZ 29, 5, 04-09-2000, LUZ Consumo promedio = -12858

, , , , ,

-15797, -12475, -11449, -12403, -12168,

-15797 -28272 -39721 -52124 -64292

Los datos que estamos usando para el ejemplo estn ordenados por fechas.Vamosaobteneruninformeconuncampomsqueserelsaldo de la cuenta. Para ello editamos un fichero que llamaremos 'contabil3.awk'.

261

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html BEGIN { FS="\|" ; cont_importe=0; } /[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ { cont_importe = cont_importe + $3 ; printf ("%3d, %s, %s, %s, %10d\n", NR, $1, $2, $3, cont_importe); }

Vamosaejecutaresteejemployvamosaversusalida $awkfcontabil3.awk<contabil.dat
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 01-01-1999, 16-12-1999, 05-01-2000, 24-01-2000, 27-01-2000, 01-02-2000, 25-02-2000, 01-03-2000, 06-03-2000, 01-04-2000, 06-04-2000, 07-04-2000, 01-05-2000, 02-05-2000, 09-05-2000, 23-05-2000, 25-05-2000, 01-06-2000, 07-06-2000, 01-07-2000, 04-07-2000, 07-07-2000, 10-07-2000, 24-07-2000, 01-08-2000, 10-08-2000, 04-09-2000, 10-09-2000, AGUA LUZ GAS INGRESO MENS LUZ MENS INGRESO MENS AGUA INGRESO MENS LUZ INGRESO GAS GAS MENS INGRESO MENS LUZ AGUA INGRESO GAS MENS INGRESO LUZ INGRESO , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

96, -14650, -15797, -34175, 141200, -96092, -12475, -96092, 101300, -96092, -15859, 134000, -98975, -11449, 95000, -21428, -16452, -98975, 130000, -98975, -12403, -5561, 99000, -11948, -98975, 122355, -12168, 129000,

96 -14554 -30351 -64526 76674 -19418 -31893 -127985 -26685 -122777 -138636 -4636 -103611 -115060 -20060 -41488 -57940 -156915 -26915 -125890 -138293 -143854 -44854 -56802 -155777 -33422 -45590 83410

262

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 31, 32, 33, 34, 19-09-2000, 28-09-2000, 01-10-2000, 10-10-2000, AGUA GAS MENS INGRESO , , , , -10529, -2620, -98975, 112000, 72881 70261 -28714 83286

Sentenciascondicionalesybucles 'awk'esunlenguajemuycompletoynopodafaltarlassentencias de ejecucincondicionalydeejecucinenbucle. Algunos de los conceptos que vamos a comentar ya los hemos visto cuandohablamosdelaprogramacinenbashynovamosaexplicarcon demasiadodetallecadatipodesentencia.Lasintaxisqueusaawknose parecealasintaxisqueyahemosvistoparabash.Separecemsala sintaxisdellenguajeC.Detodasformaslosconceptosyanosresultan familiaresyusaremosalgunosejemplosparailustrarlos. Empezaremos describiendo la sintaxis de cada tipo de sentencia. Denominaremos accin a una sentencia simple o a una sentencia compuestadelaforma'{sentencia1;sentencia2;...}'
Sentencia condicional 'if' if ( expresin_lgica ) accion1 [ else accion2 ] Sentencia condicional con los operadores '?' y ':' expresion_lgica ? accion1 :accion2 Bucle 'while' while(expresin_lgica) accion

263

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Bucle 'do' 'while' do accion while ( expresin_lgica ) Bucle 'for' for ( inicializar_contador ; comprobar_contador ; modificar_contador ) accion

Dentrodelosbuclespodemosusarbreakparaforzarlasalidadeunbucle ocontinueparasaltaralasiguienteiteracin. Veremosdemomentotansolounejemploparalasentenciacondicional 'if'. Editeelsiguienteficheroquellamaremos'contabil4.awk'


BEGIN { FS="\|" ; } /[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ { if ( $3 >= 0) { printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3); } }

Vamosaejecutaresteejemployvamosaversusalida $awkfcontabil4.awk<contabil.dat
3, 7, 11, 14, 17, 01-01-1999, 27-01-2000, 06-03-2000, 07-04-2000, 09-05-2000, INGRESO INGRESO INGRESO INGRESO , , , , ,

96 141200 101300 134000 95000

264

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 21, 25, 28, 30, 34, 07-06-2000, 10-07-2000, 10-08-2000, 10-09-2000, 10-10-2000, INGRESO INGRESO INGRESO INGRESO INGRESO , , , , , 130000 99000 122355 129000 112000

Pasarvaloresalscriptawk Enocasionespuederesultarinteresantepoderpasaralgnvaloralscript awk. Vamos a modificar el programa anterior para que muestre los registros con un importe superior a un valor que pasaremos por parmetro. Editeelsiguienteficheroquellamaremos'contabil5.awk'
BEGIN { FS="\|" ; } /[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ { if ( $3 >= minimo && $3 <= maximo ) { printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3); } }

Vamosaejecutaresteejemplopasandoyvamosaversusalida $awkfcontabil5.awkminimo=100000maximo=120000< contabil.dat


11, 06-03-2000, INGRESO , 34, 10-10-2000, INGRESO , 101300 112000

Hayqueadvertirqueelpasodeparmetrosequivaleadefinirunavariable yaasignarunvalorperoestovalornoseraccesiblehastadespusdeleer el primer registro. Si el valor pasado como parmetro tuviera que ser accesibleenlaseccinBEGINhabraqueusarlaopcinvprevioalpaso delparmetro.

265

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Repetiremoselejemplopasandoeldelimitadordelregistroqueusaremos enlaseccinBEGIN. Editeelsiguienteficheroquellamaremos'contabil6.awk'


BEGIN { FS = delimitador ; } /[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ { if ( $3 >= minimo && $3 <= maximo ) { printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3); } }

Vamosaejecutaresteejemplopasandovaloresyvamosaversusalida
$ awk -f contabil6.awk minimo=100000 maximo=120000 deliminador='|' < contabil.dat

Vemosquenohemosobtenidoelresultadoesperado. Vamosavolveraejecutaresteejemplopasandoelvalordeldelimitador conlaopcinvyvamosaversunuevasalida $awkvdelimitador='|'fcontabil6.awkminimo=100000 maximo=120000<contabil.dat


11, 06-03-2000, INGRESO , 34, 10-10-2000, INGRESO , 101300 112000

Declaracindefunciones Comoeslgico'awk'permiteladeclaracindefunciones.Normalmente se recurre a implementar una funcin cuando necesitamos una funcionalidad que el lenguaje no proporciona de forma predefinida o cuando queremos estructurar el cdigo de un programa grande en fragmentosmspequeosyportantomsmanejables. 266

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Lasintaxisesmuysencilla.
function nombre_de_la_funcin ( lista_de_parmetros ) { sentencias }

Porejemploparadeclararunafuncinqueretorneunnmeroaleatorio entre1y6. Editeunficheroconnombre'dado.awk'.


function aleatorio ( minimo, maximo ){ return ( ( ( maximo - minimo + 1 ) * rand () ) + minimo ) ; } END{ for (i=0; i<20; i++){ printf ("%3d) Entre 1 y 6 = %3d Entre 5 y 15 =%3d\n", i, aleatorio (1, 6), aleatorio(5, 15)); } }

Ahoraloejecutamos $echo|awkfdado.awk
0) 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) 12) Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre 1 1 1 1 1 1 1 1 1 1 1 1 1 y y y y y y y y y y y y y 6 6 6 6 6 6 6 6 6 6 6 6 6 = = = = = = = = = = = = =

5 6 6 5 3 3 4 6 5 3 6 5 6

Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre

5 5 5 5 5 5 5 5 5 5 5 5 5

y y y y y y y y y y y y y

15 15 15 15 15 15 15 15 15 15 15 15 15

= = = = = = = = = = = = =

12 7 7 13 8 6 7 7 6 10 14 10 11

267

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 13) 14) 15) 16) 17) 18) 19) Entre Entre Entre Entre Entre Entre Entre 1 1 1 1 1 1 1 y y y y y y y 6 6 6 6 6 6 6 = = = = = = = 4 5 2 1 3 2 2 Entre Entre Entre Entre Entre Entre Entre 5 5 5 5 5 5 5 y y y y y y y 15 15 15 15 15 15 15 = = = = = = = 12 15 9 9 14 14 7

Funcinsystem Estaesunafuncinfcildeusarquenospermiteejecutaruncomandodel sistemaoperativo.Encasodexitoretorna0,yencasodeerrorretornar unvalordistintodecero.


$ awk ' BEGIN { if (system("ls") !=0) printf ("Error de ejecucin\n"); }'

Por ejemplo si quisiramos verificar la existencia de un fichero almacenadoenlavariable'nombre_fich'tendramosquehacer


if (system("test -r " nombre_fich)) { fprintf ("%s no encontrado\n", nombre_fich); }

Lafuncingetlineyotrasfuncionesavanzadas Esteesesunapartadoenelquemsqueexplicarcosasnosvamosa limitaramencionarciertasposibilidades.Nopodemosdedicardemasiado espacioaestetipodecuestionesavanzadasperosiconloqueeneste apartadocontemosconseguimosponerlelosdienteslargosnosdaremos porsatisfechosaunquenoentiendaunapalabra. En primer lugar hay que advertir que 'getline' que al igual que otras funcionesdevuelveunvalorperosusintaxisnoesunatpicasintaxisde funcin.Noseusacomo'getline()'sinocomounasentencia.

268

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Estafuncinretorna1sileeunalnea,0sialcanzaelfindelaentradade datosy1siseproduceunerror. Usadasimplementecomo'getline'sinnadamsleelasiguientelineadela entradaasignando$0ydesglosandoloscamposen$1,$2,$3,etc.. Sepuedeasignarelvalorcompletodelalnealedaaunavariablecon 'getlinevariable'evitandodeestaformaalterarelvalorde$0. Sepuedeleer deunficherousandoeloperadorredireccin. 'getline < "fichero"'.Sepuedesimbolizarlaentradaestndarcomo"" Sepuedeleerdesdeunpipe.'"whoami"|getlineusuario'. Editeunficherollamado'tipo_usuario.awk'.
BEGIN { "whoami" | getline usuario if ( usuario ~ /root/ ) { printf ("Soy superusuario\n"); } else{ printf ("Soy usuario normal\n"); } }

Ejecutelocon
$ awk -f tipo_usuario.awk

Nopretendemos conestesencilloejemploqueseacapazdeusarestas funciones.Elmanejodeestasredireccionesescomplicadoyenocasiones sehacenecesarioforzarelcierredeunaentradaodeunpipe.Paraeso existe la funcin 'close'. Se usa haciendo 'close ("fichero")' o 'close ("whoami")'.

269

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Porelmomentonosconformamosconloexplicadoyveremosunpoco msadelanteelusodegetlinetomandolaentradadeunficherocuando expliquemoslosarraysasociativos. Arrays Los array permiten el almacenamiento de una serie de elementos que puedenseraccedidosmedianteunndice.Enrealidadlosarraysdeawk son ms potentes que los arrays que vimos cuando estudiamos la programacin de la bourneshell donde los ndices de un array eran siemprenmerosenteros.Vamosausarenprimerlugarlosarraysdeesta forma. Es decir nos vamos a limitar en los primeros ejemplos a usar nmerosenteroscomondices. Vamos a usar awk para procesar la salida obtenida con 'ps'. Primero vamosasuponerqueobtenemosunlistadocompletodelosprocesosdel sistema en formato largo. Si intenta realizar este ejemplo obtendr un resultadonecesariamentediferente. $psaxl>psaxl.out;catpsaxl.out
FLAGS UID PID PPID PRI STA TTY TIME COMMAND 100 0 1 0 0 ? 0:03 (init) 40 0 2 1 0 ? 0:18 (kflushd) 40 0 3 1 0 ? 0:18 (kupdate) 840 0 4 1 0 ? 0:00 (kpiod) 840 0 5 1 0 ? 0:15 (kswapd) 140 0 186 1 0 ? 0:00 /sbin/sys 140 0 188 1 0 ? 0:00 (klogd) 140 1 193 1 0 ? 0:00 (portmap) 140 0 195 1 0 ? 0:00 (inetd) NI 0 0 0 0 0 0 0 0 0 SIZE 756 0 0 0 0 900 1016 780 860 RSS WCHAN 0 do_select 0 bdflush 0 kupdate 0 kpiod 0 kswapd 200 do_select 0 do_syslog 0 do_select 0 do_select SW SW SW SW SW S SW SW SW

270

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
140 0 200 0:00 /usr/sbin 140 0 210 0:00 (lpd) 40 31 226 0:00 (postmast 140 0 237 0:00 sendmail: 140 0 241 0:01 /usr/sbin 40 0 244 0:00 /usr/bin/ 40 1 254 0:00 /usr/sbin 40 0 257 0:00 /usr/sbin 140 0 262 0:07 /usr/sbin 100 0 268 0:00 -bash 100 0 269 0:00 (getty) 100 1001 270 0:00 -bash 100 0 271 0:00 (getty) 100 0 272 0:00 (getty) 100 1001 273 0:00 -bash 140 33 274 0:00 (apache) 140 33 275 0:00 (apache) 140 33 276 0:00 (apache) 140 33 277 0:00 (apache) 140 33 278 0:00 (apache) 0 1001 916 0:00 vi awk1.d 0 1001 1029 0:00 xinit /ho 100 0 1034 0:02 X :0 -bpp 0 1001 1037 0:01 mwm 40 1001 1042 0:00 bash /hom 40 1001 1045 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 262 262 262 262 262 270 273 1029 1029 1037 1037 0 0 0 5 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 764 908 3784 1728 1292 1544 840 860 1780 1964 836 2096 836 836 2088 1792 1792 1792 1792 1792 3536 1916 8824 4620 1728 1728 108 nanosleep 0 do_select 0 do_select 316 do_select 184 do_select 56 do_select 96 nanosleep 164 nanosleep 60 do_select 616 read_chan 0 read_chan 724 wait4 0 read_chan 0 read_chan 1408 wait4 S SW SW S S S S S S S SW S SW SW S

? ? ? ? ? ? ? ? ? 1 2 3 4 5 6 ? ? ? ? ? 3 6 ? 6 6

0 wait_for_co SW 0 flock_lock_ SW 0 flock_lock_ SW 0 flock_lock_ SW 0 flock_lock_ SW 1640 do_select 668 wait4 3280 do_select 2748 do_select 924 wait4 924 wait4 S S S S S S

271

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
6 0:00 bash /hom 0 0 1050 6 0:00 xterm -ls 0 1001 1058 6 0:00 xclock -d 100 1001 1051 p0 0:00 -bash 100000 1001 1074 p0 0:00 ps axl

1042 1045 1050 1051

0 0 14 17

0 0 0 0

2976 2320 2080 1068

1872 do_select 1220 do_select 1400 wait4 528

S S S R

Para dar una idea de la situacin de parentescos entre los distintos procesosmostramoslasalidaobtenidaconelcomando'pstree'ejecutado desdelamismasesindextermqueenelcasoanterior. $pstreep>pstreep.out;catpstreep.out

init(1)-+-apache(262)-+-apache(274) | |-apache(275) | |-apache(276) | |-apache(277) | `-apache(278) |-atd(254) |-bash(268) |-bash(270)---vi(916) |-bash(273)---xinit(1029)-+-XF86_S3V(1034) | `-mwm(1037)+-.xinitrc(1042)---xterm(1050)---bash(1051)--pstree(1068) | `-.xinitrc(1045)---xclock(1058) |-cron(257) |-getty(269) |-getty(271) |-getty(272) |-gpm(200) |-inetd(195) |-kflushd(2) |-klogd(188) |-kpiod(4) |-kswapd(5) |-kupdate(3) |-lpd(210) |-portmap(193) |-postmaster(226) |-sendmail(237)

272

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html |-sshd(241) |-syslogd(186) `-xfs(244)

SolovamosaprocesarloscamposPIDyPPID.$3y$4respectivamente. Losmeteremosenunpardearraysllamadospidyppid.
BEGIN { ind=0; }

function padre(p){ for (i=0; i <ind; i++){ if (pid[i]== p) return ppid[i]; } } ! /FLAGS/ { pid[ind]=$3 ; ppid[ind]=$4 ; ind++ ; } END { do { printf ("%d->", proc); proc= padre(proc); } while ( proc >= 1 ) printf ("\n\n"); }

Ahoraejecutamospasandoelpiddelprocesodelcualdeseamosaveriguar sudescendencia.
$ awk -f ancestros.awk proc=1051 < ps-axl.out 1051->1050->1042->1037->1029->273->1->

Con un nmero realmente reducido de lneas de cdigo acabamos de procesarlasalidadeuncomandoquenoestabaespecialmentediseado paraserprocesadosinoparaentregarunresultadolegible. No se emocione todava porque solo hemos utilizado los arrays con indicesnumricos.Lociertoesquelosarraysde'awk'adiferenciadelos 273

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

arrays de otros lenguajes son arrays asociativos. Eso significa que podemos usar como ndice una cadena de caracteres. Por ejemplo podemos hacer lo siguiente: nombre_cli["5143287H"]="Luis, Garca Toledano" Noesnecesariodaruntamaoalarray.Unarrayasociativonoestablece unordenentresuselementos.Hayqueaclararqueelmanejodeunarray conndicesnumricoscorrespondeaunmecanismomuysimpleyaquese usan porciones consecutivas de memoria del ordenador y se accede directamente por posicin. Por el contrario un array asociativo de las caractersticasde'awk'sevacreandodinmicamente.Internamente'awk' gestionaelaccesomedianteunatcnicadehashqueusatablasauxiliares amododetablasdendicesyfuncionesauxiliaresqueobtienevalores numricosapartirdevaloresdeunacadena.Todoellopermiteunacceso muyrpidoenestetipodeestructurashacindolasadecuadasparasuuso enbasesdedatos.
FTLSUSE |CURSOS |FTLinuxCourse para SuSE | 11800 FTLREDH |CURSOS |FTLinuxCourse para RedHat | 11800 ASUSCOM |HARDWARE|Asuscom ISDNLink 128k Adapter (PCI) | 6865 RAILROAD|JUEGOCOM|Railroad Tycoon (Gold Edition) | 7700 CIVILIZ |JUEGOCOM|Civilization: Call to power | 7700 MYTHII |JUEGOCOM|Myth II | 7700 LIAPPDEV|LIBROS |Linux Application Development (537 Pginas) | 11000 CONECT01|LIBROS |Gua del Usuario de Linux (413 Pginas) | 5300 CONECT03|LIBROS |Gua del Servidor (Conectiva Linux 437 Pginas) | 5300 CONECT02|LIBROS |Gua del Administrador de redes (465 Pginas) | 5300 LIUSRESU|LIBROS |Linux User's Resource (795 Pginas) | 12000 RH70DLUX|LINUXCOM|RedHat Linux 7.0 Deluxe en espaol | 9600

274

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html RH70PROF|LINUXCOM|RedHat Linux 7.0 Profesional en Espaol | 20000 SUSE70 |LINUXCOM|Suse Linux 7.0 (6CDs)(Version espaola) | 6850 RTIME22 |LINUXCOM|RealTime 2.2 (1CD) | 13000 CONCT50E|LINUXCOM|Conectiva Linux 5.0 Versin Econmica Espaol (6CDs) | 5200 CITIUS22|LINUXCOM|Linux Citius 2.2 | 7750 TRBLIW60|LINUXCOM|Turbolinux Workstation 6.0 | 6500 MOTIF |LINUXCOM|Motif Complete | 22000 CONCTSRV|LINUXCOM|Conectiva Linux Ed.Servidor (Espaol 3CDs + 4 Manua | 27500 RHORA8I |LINUXCOM|RedHat Linux Enterprise Edition optimized for Oracle8i |270000 MANDRA72|LINUXCOM|Mandrake 7.2 (7CDs) PowerPack Deluxe (versin espaola| 8300 PINGUINO|SUSEPROM|Pingino de peluche | 6000

BEGIN { FS="[\ \t]*\|[\ \t]*" ; while ( getline < "articulos.dat" > 0) { artic[$1]= "(" $4 " Ptas + Iva) " $3; printf ("%s ", $1); } for (;;){ printf ("\n\nIntroduzca un cdigo de artculo o solo para terminar: "); getline codigo ; if (codigo == "" ) break; printf ("\n<%s>\n%s", codigo, artic[codigo]); } } $ awk -f articulos.awk FTLSUSE FTLREDH ASUSCOM RAILROAD CIVILIZ MYTHII LIAPPDEV CONECT01 CONECT03 CONECT02 LIUSRESU RH70DLUX RH70PROF SUSE70 RTIME22

275

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html CONCT50E CITIUS22 TRBLIW60 MOTIF CONCTSRV RHORA8I MANDRA72 PINGUINO Introduzca un cdigo de artculo o solo terminar: RH70PROF para

(20000 Ptas + Iva) RedHat Linux 7.0 Profesional en Espaol Introduzca un cdigo de artculo o solo terminar: CITIUS22 (7750 Ptas + Iva) Linux Citius 2.2 Introduzca un cdigo de artculo o solo terminar: $ para para

Elprogramaqueacabamosderealizarilustralapotenciade'awk'parael tratamientodeficherosdedatos.Sinuestroficherodedatosdeejemplo 'articulos.dat' tuviera un nmero de registros mucho mayor habramos notadoqueinicialmentesetardaunciertotiempoenleertodoelfichero dedatosperounavezalmacenadoslosdatosenelarraysuaccesoalos mismosesrapidsimo.Estarpidezsedebenosoloaquelosdatosyahan sidoledosdesdeeldiscoduroyyaestnenmemoriasinoporquetodala informacin est indexada de forma que la localizacion de cualquier elementodelarrayesmuyrpida. Faltanmuchascosasporcontarsobre'awk'.Sidisponedealgnfichero de datos de interes personal saque una copia e intente realizar alguna utilidaden'awk'.

276

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

EJERCICIOSRESUELTOSDESHELLSCRIPT
Buenoeshoradequepruebesusconocimientos.Nosepreocupesino consigueresolverlostodos.Paraalgoestnlassolucionesaunqueesosi, tendrquedescargarelarchivo ejerc1.tar.gz.Disculpelamolestiapero conestoevitamosquesusojossedesvenalasolucinantesdetiempo.
---- ## donde_esta.txt ## ---Hacer un shell-script que busque la presencia del comando pasado como argumento en alguno de los directorios referenciados en la variable $PATH, sealando su localizacin y una breve descripcin del comando caso de existir su pgina man. ---- ## estadisticas_dir.txt ## ---Programe un script llamado 'estadistica_dir.sh' que realice un estudio de todo el arbol de directorios y ficheros partiendo del directorio pasado como parmetro de forma que obtengamos la siguiente informacin: Nmero de lectura Nmero de escritura Nmero de ejecucin Nmero de lectura Nmero de escritura Nmero de ejecucin ficheros = ficheros = ficheros = ficheros = ficheros = ficheros = en los cuales disponemos de permiso de en los cuales disponemos de permiso de en los cuales disponemos de permiso de en los cuales en los cuales en los cuales carecemos de permiso de carecemos de permiso de carecemos de permiso de

Nmero de ficheros regulares encontrados = Nmero de directorios encontrados =

277

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Nmero de dispositivos de bloques encontrados = Nmero de dispositivos de carateres encontrados = Nmero de fifos encontrados = ---- ## gen_menu2.txt ## ---Programar un shell-script que admita como argumentos parejas formadas por 'comando' y 'descripcion' y que construya con todo ello un menu de opciones donde cualquiera de los comandos pueda ser ejecutado seleccionando la descripcion correspondiente. Es decir si dicha shell-script se llamara 'gen_menu2.sh' un ejemplo de uso sera: ./gen_menu2.sh \ Listar ls \ 'Quien est conectado' who \ 'Fecha actual' date \ Ocupacion du \ 'Quien soy' whoami \ 'Memoria libre' free \ 'Calendario' cal \ 'Nombre mquina' hostname Con ello se obtendra un menu de la forma: 0 1 2 3 4 5 6 7 8 Terminar Listar Quien est conectado Fecha actual Ocupacion Quien soy Memoria libre Calendario Nombre mquina

Elija opcin. ---- ## grafica.txt ## ----

278

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Realizar un shell-script que reciba como argumentos numeros comprendidos entre 1 y 75. Dara error en caso de que algun argumento no este dentro del rango y terminar sin hacer nada. En caso contrario generar una linea por cada argumento con tantos asteriscos como indique su argumento. ---- ## incr.txt ## ---Hacer un shell-scritp que utilice dos funciones 'incr1()' e 'incr2()' las cuales ejecutaran un simple bucle iterando 1000 veces. La funcin 'incr1()' solo usara un contador IND1 que sera incrementado de uno en uno usando un comando de tipo 'let' y la funcion 'incr2()' solo usara un contador IND2 que se incrementar de uno en uno calculando su siguiente valor mediante el uso del comando expr. Hacer una tercera funcin 'PruebaDiezSegundos()' que aceptar como argumento el nombre de la funcin de prueba (incr1 o incr2). Primero informara del tiempo real, de cpu de usuario y de cpu del sistema que consume dicha funcin y luego deber ejecutar dicha funcin tantas veces sea posible en el transcurso de 10 segundos (aproximadamente, basta usar date '+%s') obteniendose el nmero de veces que se ejecuto en esos diez segundos. Compare los resultados obtenidos con ambas funciones y explique los resultados. ---- ## lista_fich.txt ## ----

279

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Hacer un shell-script que acepte como argumentos nombres de ficheros y muestre el contenido de cada uno de ellos precedido de una cabecera con el nombre del fichero ---- ## media.txt ## ---Hacer un shell-script que calcule la media aritmtica de todos los argumentos pasados como parmetros con una precisin de 40 digitos decimales despues de la coma. ---- ## mi_banner.txt ## ---Localice en su sistema la utilidad 'banner' para consola. Puede haber mas de una utilidad para esto y algunas estn pensadas para su uso con impresora. Nos interesa la utilidad 'banner' para terminal de forma que el comando 'banner hola' genere la siguiente salida:

# # # # ###### # # # # # #

#### # # # # # # # # ####

# # # # # ######

## # # # # ###### # # # #

Partiendo de esta utilidad realice un shell-script 'mi_banner.sh' que admita hasta tres argumentos de tamao mximo de cuatro caracteres tal que el comando './mi_banner.sh hola jose luis' obtenga:
ooooooooo oooooooo _/ _/ _/_/_/_/ _/ ooooooo _/ _/ _/ _/ _/ oooooo _/_/_/_/_/_/ _/ _/ _/ ooooo _/ _/ _/ _/ _/ oooo _/ _/ _/ _/ _/ ooo _/ _/ _/_/_/_/ _/_/_/_/_/_/ _/_/ _/ _/ _/ _/_/_/_/_/_/ _/ _/ _/ _/ _/

280

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
oo ooooooooo oooooooo _/ _/_/_/_/ _/_/_/_/ _/_/_/_/_/_/ ooooooo _/ _/ _/ _/ _/ oooooo _/ _/ _/ _/_/_/_/ _/_/_/_/_/ ooooo _/ _/ _/ _/ _/ oooo _/ _/ _/ _/ _/ _/ _/ ooo _/_/_/_/ _/_/_/_/ _/_/_/_/ _/_/_/_/_/_/ oo ooooooooo oooooooo _/ _/ _/ _/ _/_/_/_/ ooooooo _/ _/ _/ _/ _/ oooooo _/ _/ _/ _/ _/_/_/_/ ooooo _/ _/ _/ _/ _/ oooo _/ _/ _/ _/ _/ _/ ooo _/_/_/_/_/_/ _/_/_/_/ _/ _/_/_/_/ oo

---- ## mi_cal1.txt ## ---Realizar un shell-script 'mi_cal1.sh' que utitilzando la salida del comando 'cal' filtre su salida para resaltar entre corchetes el da actual. Ponga atencin a los das a principio de lnea, los das a final de lnea. La salida para el da siguiente: ./mi_cal1.sh S [5] 12 19 26 May 2002 M Tu 6 13 20 27 7 14 21 28 W 1 8 15 22 29 Th 2 9 16 23 30 F 3 10 17 24 31 S 4 11 18 25 5 de Mayo de 2002 debera ser la

No es un ejercicio trivial. Necesitar hacer un filtrado en varios pasos. Utilice alguna combinacin de filtros sed encadenados con pipe.

281

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Para poder comprobar que el programa funciona correctamente para los distintos das hacer que en caso de pasar un argumento este ser considerado el da del mes. ./mi_cal1.sh 1 S 5 12 19 26 May 2002 M Tu 6 13 20 27 7 14 21 28 W [1] 8 15 22 29 Th 2 9 16 23 30 F 3 10 17 24 31 S 4 11 18 25

---- ## mi_cal2.txt ## ---Basandose en el ejercicio anterior realizar una modificacin de 'mi_cal1.sh' que llamaremos 'mi_cal2.sh' que en lugar de encadenar varios comandos sed con pipes crear un fichero temporal '/tmp/$0.$$.sed' para ser usar mediande la opcin -f de sed. Ambos scrits debern producir idntico resultado. ---- ## mi_logrotate.txt ## ---Asumiremos que tenemos en un directorio una serie de ficheros de log que van creciendo de forma ilimitada con el uso regular de ciertos programas. Realizar un shell-script que actue sobre los ficheros con nombre tipo '*.log' del directorio actual de forma tal, que si alguno de ellos supera en tamao las 2000 lineas, dejar solo las ltimas 1000 lneas del fichero y las restantes sern guardadas en un

282

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html directorio old_rot en formato comprimido. En dicho directorio habr que conservar en formato comprimido no solo la ltima porcin eliminada del original, sino las cuatro ltimas porciones eliminadas. Para ello ser necesario ir rotando los nombres de estos ficheros comprimidos incorporando en los mismos un digito de secuencia. (parte eliminada) --> *.log.rot1.gz --> *.log.rot2.gz --> *.log.rot3.gz --> *.log.rot4.gz --> eliminado El programa durante su ejecucin ir mostrando los ficheros encontrados y sealar aquellos que por su tamao sea necesario rotar. ---- ## ocupa_tmp_log.txt ## ---Obtiene la ocupacion de los directorios presentes en el sistema cuyo nombre sea de la forma '*tmp' o '*log', ordenados por orden de ocupacion. Debera mostrar el numero de errores provocados por 'find'. Si se decide usar algzn fichero temporal debera usar el directorio '/tmp' para ello y usar un nombre que contenga el nombre del proceso que lo origino y su pid. ---- ## palabras.txt ## ---Realice un shell-script que admita tres palabras como argumentos y que muestre un mensaje informando de las relaciones de igualdad y desigualdad entre esas palabras. "Las tres son iguales" "Son iguales primera y segunda" "Son iguales primera y tercera"

283

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html "Son iguales segunda y tercera" "Son las tres distintas" ---- ## piramide.txt ## ---Realice un shell-scrip 'piramide.sh' que admita como argumento un nmero 'N' y que optenga a la salida una serie de 'N' filas de forma triangular. Para ./piramide.sh 12 la salida sera. 01 02 03 04 05 06 07 08 09 10 11 12 02 03 04 05 06 07 08 09 10 11 12

03 04 05 06 07 08 09 10 11 12

04 05 06 07 08 09 10 11 12

05 06 07 08 09 10 11 12

06 07 08 09 10 11 12

07 08 09 10 11 12

08 09 10 11 12

09 10 10 11 11 11 12 12 12 12

---- ## proceso.txt ## ---Hacer un shell-script llamado 'proceso.sh' para ser lanzado en background que como maximo permanecera vivo 30 segundos. Podra ser lanzado varias veces en background y cada vez generara un shell-script distinto 'stop_proceso.sh.' que al ser ejecutado matara el proceso lo origino y despues se borrara a si mismo. ---- ## vigila.txt ## ---Realizar un shell-script que escriba en el fichero '/tmp/usuarios'

284

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html una linea con la fecha y otra con el nmero de usuarios distintos que estn conectados en ese momento cada dos minutos.

285

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

PARTE(II)USUARIOAVANZADODELINUX
INTRODUCCINALASEGUNDAPARTEDEL CURSO
Llevamos ya algunos captulos enlos cuales estamos tocando muchos temasquepodranconsiderarsepropiosdeuncursodeadministracino de un curso avanzado de Linux. Ya no hacemos tantas bromas y suponemosqueyahaperdidosuinseguridadinicial. Consideramos que ya a estas alturas del curso tampoco es necesario recordarle a cada momento las precauciones de trabajo. Tambin asumimosqueconlaconfianzaquedaelsaberdelporquedelascosasya habrpracticadoporsucuentaalgunasotrascosasqueespecficamentele interesaban. Paralosqueusenordenadorpersonalyquetenganaccesoaunacuentade rooteselmomentodedaralgnconsejoporqueesprobablequecadavez tenganmasganasdeprobarcosasdistintasparaaprenderporsucuenta. Paraelloslesdiremosqueexisteunamximaparatodoadministrador. Nomodifiquesnadaquenopuedasvolveradejarcomoestaba. En otras palabras. Siempre, siempre, antes de hacer algo asegurate la posibilidaddepoderretrocederfcilmentealasituacininicial. Porejemplosivasatocarunficherodeconfiguracindelsistemasaca antesunacopiadeesefichero.Oquizslasimpleprecaucindeanotaren unpapelunpardecosillasantesdecambiarlaspuedaevitarundisgusto. Muyimportante.Hazregularmentecopiasdeseguridad.Nomantengas tuscopiasenelmismodiscoquelainformacinoriginal.Comomnimo

286

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

usatrescopiasdeseguridadestableciendounsistemaderotacinentre ellas. Usaremoselusuariorootlomenosposiblenoparaevitarerroressinopara evitarqueloserroresseconviertanenHorrores. LinuxesunSOquenoimponerestriccionesarbitrariasalosusuarios.Si una cosa no puede ser realizada por un usuario normal es porque no suponeunaamenazaalaseguridaddelsistemaysiemprequesepuedaes mejornousarroot. AdmitimosqueunusuariodeLinuxqueloinstaleensupropiosistema necesita realizar tareas deadministracin, perorootes unusuario que debeusarselomenosposible.Errareshumanoperoeldesastretotales cosaderoot.Porellovamosaapurarlasposibilidadesdeapreenderdesde unacuentadeusuarionormalita Tambin hay que advertir que no todos los sistemas son igual de permisivos dependiendo de las necesidades reales de seguridad del sistema o del grado de paranoia del administrador. Por ejemplo una mquinaquedispongadeunelevadonmerodecuentasparaestudiantes deberseradministradaconmanofirmeporquesiemprehabrmsdeun estudiantejuguetnconganasderersedeladministrador,ybastaunode estosparatenerunproblemaseriosinosetomanprecauciones. Si est realizando este curso en una mquina de esas caractersticas posiblemente no pueda hacer muchos de los ejercicios propuesto simplemente por limitaciones impuestas desde root. El aumento de la seguridaddeunsistemasueleresultarenunaumentodelaincomodidad paralosusuarios. Elpreciodelaseguridadeslaincomodidad.Elpreciodelacomodidades lainseguridad. Enparticularelaccesoadistintosdispositivoshardwarepuedeestarms omenoslimitado.Nosotrosparaestasegundapartevamosasuponerque 287

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

lasrestriccionesdelsistemadondeustedvaapracticarnosonexcesivas enestesentido.Encualquiercasoyahabrnotadoqueenlasprcticas mostramosycomentamoslosresultadosdelasmismas.Porellonose desanimesinopuederealizarahoraalgunasdelasprcticaspropuestas, pero tambin sealamos que Si esta usando un ordenador personal o disponedeunacuentaenunsistemadondelaconfianzaenlosusuarios porpartedeladministradoreselevadapodrseguramentesacarlemayor provechoaestasegundapartedelcurso. COPIASDESEGURIDAD Porquededicamosuncaptulocompletoaesto. Este captulo trata de las Copias de Seguridad, tambin llamados respaldosoeningls Backupsyvamosenprimerlugarajustificar la razndededicarunampliocaptuloaestetemaquepodraparecerms apropiadoparauncursodeadministracin. Evidentementegarantizarlaintegridaddelainformacindeunsistemaes untemaqueesderesponsabilidaddeladministradordelsistemapero, comoyahemosmencionadoanteriormente,elobjetivodeestasegunda partedelcursoincluyelasnocionesmsnecesariasparaadministrarsu propio ordenador personal con Linux. El objetivo es que sea autosuficiente. Laseguridadfrenteaataquesintencionadosquedafueradelospropsitos deestecursoperonohaydaoquenopuedaserreparadositenemosuna copiadeseguridaddetodalainformacinquenosinteresa. Un buen sistema de respaldo es la mejor forma de evitar perdidas de informacin. Estas deben ser prevenidas dentro de lo posible pero dependiendodelascausasnosiempreresultaposiblehacerlo. Lasposiblescausasparaunaperdidadeinformacinson:

Deteriorooborradoaccidentalporpartedeunusuarioautorizado. 288

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ataqueintencionadoporpartedepersonasnoautorizadas. Fallodelsoftware. Fallodelhardware. Virus. Incendio,robos,ydesastresnaturales,etc.

La peor de todas es el borrado accidental por parte de un usuario autorizado,porqueestotalmenteimposibledeprevenir. Algopuedehacerse.PorejemploenLinuxhaysustitutosparaelcomando 'rm' que dejarn los ficheros borrados en una papelera. Tambin se puedenseguirciertasrecomendacionesdeprudenciaqueminimicenlos riesgosmediantedeterminadasprcticasperosiemprecabrlaposibilidad deunfallohumano.Eltemaesamplsimoynosvamosalimitaratratar solodeRespaldosoCopiasdeseguridad.

/===============/
Borradoaccidentaldeficheros Debe saber que la operacin normal de borrado no destruye toda la informacindelosficheros.Sialgunavezborraalgomuyimportanteen unsistemadeficherosynotienecopiadeseguridad.Deberevitarvolver atrabajarsobreesesistemadeficherosenmodolecturaescritura.Porel contrariodebermontaresesistemadeficherosenmodosololecturay confiarenquequedealgorecuperableenalgnlado.Hayprogramasque puedenayudarenestassituacionessiemprequelainformacinnoest machacadaconposterioresoperacionesdeescriturasobreesaparticin.Si nosabequehacernohaganadaypregunteantesdeintentarcosasque podran destruir definitivamente toda la informacin. Este tipo de recuperacionessonsolounltimorecursoylasposibilidadesdexitono sonmuygrandes. Unacosaquesepuedeintentarenmodoreadonly(sololectura)esleer directamente del dispositivo intentando filtrar cadenas de ficheros 289

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

presentes en los ficheros borrados. Por ejemplo usando grep. Si las cadenasaparecenessealdequenosehadestruidotodalainformacin.

/===============/
Caractersticasdeunbuensistemaderespaldo Un sistema de respaldo debe de estar perfectamente planificado. Su planificacin deformaautomticanosiempreesposibledebidoaque requierenconfrecuenciaintervencinhumana.Especialmentelacopias quenocabenenunasolacinta(multivolumen).Loidealesorganizarsu propiosistemaderespaldoenfuncindelasnecesidadesdesusistema. En un sistema es conveniente clasificar las diferentes partes de la informacinatendiendoasuimportancia.Loidealserahacerrespaldode todoregularmentemanteniendodistintascopiasenrotacin.Esdecirsi tenemostrescintasparaalmacenarrespaldos(CintaA,CintaB,yCinta C)deberemosirgrabandosiguiendounasecuenciacircularA,B,C,A,B, C,... La frecuencia de los respaldos se determina en funcin de lo importantequeseanlosdatos.Generalmenteesbuenohacerunacopia diariaalmenosdelapartedelsistemaquesupongamayorperdidade horasdetrabajoencasodeincidente.Detodasformashayqueteneren cuentaqueestesistemasolonospermitemantenercopiadelosltimos tresocuatrodas.Estonoessuficienteporquemuchasvecesnosinteresa recuperarunainformacindehaceunasemana,unmes,oinclusoms tiempo.Porelloalgunasvecesseusanrotacionesdesietecintas(unapara cadadadelasemana)yunavezalmessesacaotracopiaenunacinta distinta que se conserva por un espacio de tiempo ms largo segn convenga. Una prctica comn es guardar regularmente copias en otro edifico distinto para protegerse de esa forma de incendios, inundaciones, terremotos,robos.Sidespusdeundesastreconservamoslosdatosvitales de nuestro negocio quizs podamos resurgir de nuestras cenizas ms tarde.

290

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Algunasvecesnoesposiblehacerdemasiadascopiasdetodoelsistema condemasiadafrecuencia.Porellosepuedendelimitarareascondistinto gradodenecesidadderespaldo.Elsistemaoperativoylasaplicacionesno suelen variar y pueden ser recuperadas desde CDs de instalacin. Es importantesiempremantenercopiasdetodoelsistema.Encualquiercaso siemprehadeusarserotacindecintasporqueusarunasolacopiaesmuy arriesgado. Lascintassonrazonablementesegurasperosepuedenromperconeluso. De todas formas es importante que la planificacin de respaldo del sistema no resulte complicada. Trabajar con demasiados conjuntos de cintasdistintosnoesbueno. Enlacopiageneraldetodoelsistemaseguramenteseguardarncosas quevaranpocoperoquequizscostaronmuchotrabajoconfigurar.Por tantoesunacopiaquenonecesitahacerseconfrecuenciaperodeberemos disponersiempredealgunascopiasenbuenestadoaunquenoseanmuy recientes. Todaslascopiasdebensersometidasdeformaautomticaaunproceso deverificacin queenelcasomssencilloconsisteenleerlalistade ficherosquecontiene.Noesmuyfiableperoalmenosdetectaremoslos fallosmsimportantes.Enelmejordeloscasoslacomprobacinsehace sobreelcontenidocompletocomparndoloconeloriginal.Enestecaso cuandolacopiaterminaeloriginalpuedehabercambiadoyporellola deteccindediferenciasentreoriginalycopiapuededeberseauncambio eneloriginalenlugardeunerrorenlacopia. Una cosa que se usa mucho son las copias globales combinadas con posteriorescopiasincrementales.Esunsistemacuyaprincipalventajaes lacomodidad. Copiaincrementalsignificaquesolosalvamosloltimoquehacambiado desdelaltimacopiaglobal.Poresocadanuevacopiaincrementalresulta generalmentedemayortamaoquelaanterior. 291

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Si la copia global ocupa varias cintas. Podemos hacer copias incrementaleshastaquedebidoasuprogresivoaumentodeocupacinno quepanenunasolacintaporejemplo,momentoenelquesepuedehacer una nueva copia global. En general podemos hacer una nueva copia globalcuandolaincrementalempiecearesultarincomodadebidoasu progresivoaumentodetamao. Estesistemadecopiahacerecaerdemasiadaresponsabilidadenunasola cinta.Laltimacopiaglobalsuelesermuyvoluminosaypuedecontener informacinquenoseencuentreenningunaotracinta. Hay actividades que pueden generar enormes ficheros de datos y eso incrementarmucholaocupacindenuestrasiguientecopiaincremental. Porejemplosiestamosgenerandounaimagenanimadadegrantamaoo siestamosdescargadodeInternetimgenesdeCDsenterasdeberamos guardaresosdatosenunsistemadeficherosespecialmentededicadoa ello.Deestaformacuandohagamosrespaldopodemosdesmontarantes esa particin para poder realizar respaldos independientes con la frecuenciaqueconvengaencadacaso. Siemprequeseaadanpaquetes,aplicaciones,seconfigurealgoconviene volverasacarunanuevacopiaglobaldetodoelsistema.

/===============/
Lossoportesdelainformacin Elsoportemsadecuadosonlascintas. Esunsistema quesuponeun fuertedesembolsoinicialperoalalargaresultamsrentableymsseguro que los dems. Adems cuando cambiemos de ordenador podremos conservarlo. En cualquier caso cada cinta debe de estar perfectamente etiquetada (Identificador clave de la cinta, Tipo de copia, mquina, contenido, formato,periodicidad,etc...) 292

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Despus en un papel habr que registrar cada copia realizada con identificadordelacintayfechadelacopiaquecontiene. Es muy importante tenerunsistema bienpensadoparaqueofrezca el mximodeseguridadconelmximodecomodidad.Hayqueestablecer unbuenplanquedeberconvertirseenunarutinadetrabajo.Considerela incomodidad como un gravsimo peligro porque puede derivar en incumplimientodeesaimportanteobligacin. Eldaquenocumplamosnuestraobligacindehacercopiaderespaldo sereldaqueelsistemaelijaparadarleundisgusto(leydeMurphy). Pararesultarcmododebemosautomatizarconscriptsnuestrosistemade respaldoylascopiasnodebentardarmsdelonecesario. Los discos duros extraibles son una buena alternativa para sistemas caseros.Loquenotieneningnsentidoeshacercopiasdeseguridadenel mismodiscoduroquecontienelosdatosaunqueseutiliceunaparticin diferente. Recuerde que los discos duros pueden perder toda su informacindeformarepentina. Para guardar datos de inters histrico que deban conservarse durante aossuelesermuyinteresanteusarCDs. Losdisquetessonunmediomuypocofiableycabepocacosa.

/===============/
Respaldoporpartes Antesquenadadebeplantearsesirealmentenecesitahacerrespaldopor partes.Recuerdequenoconvienecomplicarmuchoelplanderespaldoy nohaynadamssencilloquehacerrespaldodetododeunavezsiempre queeltamaodelosdatoslopermitan.

293

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Para determinar la necesidad de respaldo de las partes del sistema convienequerepaselaleccinde'SistemadeFicherosIII'Concretamente elprrafodedicadoala'Estructuraestndardelsistemadeficherosde Linux'.Estoleayudaracomprenderlanaturalezadelosdatosenlas distintaspartesdelsistema. Recuerdequepuedenexistirvariaciones,enfuncindecadadistribucin. Cadasistemadependiendodelaactividadalaqueseadedicadotendr unasnecesidadestotalmenteespecialesderespaldo. Laspartesdemayorintersconvistasarespaldosfrecuentessuelenser /home/,/root/,y/usr/local/Enalgunoscasos/var/logoundirectorioque contenga unabasededatospuedensermuyimportantes peroesoson cosasquecadacualdebedeterminar.Siloimportanteocupamsdel50% delsistemalomssencilloseraporcopiasglobaleseincrementalesde todoelsistema,peroenunordenadordeusopersonalcongrancantidad depaquetesinstaladoslaparteimportantealahoradehacerrespaldono suelesertangrande. La parte ms variable del sistema est en /var/ y concretamente en /var/logesdondeseregistranloslogsdelsistemaquesonficherosque informan de todo tipo de cosas que van sucediendo en el mismo. En algunossistemasestoslogstienenunaimportanciamayorqueenotros. Porejemplosiexistealgunaaplicacinquetomaestoslogsparaelaborar estadsticas. En otros sistemas no resultar demasiado crtico que la ltimacopiade/var/noseamuyrecienteperoqueexistaalmenosuna copiasiesfundamental. Hacerlascosasenunsolopasonoessiemprebuenaidea.Loprincipales darpasosquepuedandeshacersesinosequivocamos enalgo,poreso siempre que sea posible conviene recuperar en un lugar distinto al original. Luego si todo ha ido bien podemos trasladar las cosas a su destinodefinitivo.Losquesepreguntanparaquetantasprecaucionesson losquemstardesepreguntarnasmismocosasbastantelamentables. 294

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Cuando se pierde toda la informacin de un sistema tendremos que recuperarlotodopartiendodelosdiscosdeinstalacinydelacopia.

/===============/
Programasdeutilidadpararealizarrespaldos Pararealizar copiasdeseguridadpodemosusaraplicacionescompletas pensadasparaelloofabricarnosalgoamedidacombinandounaseriede utilidadesdelascualeslamayorayahansidomencionadasalgunavezen captulosanteriores.Estoltimoesloquevamosahacernosotrosporque as podr disear algo personalizado y tambin porque resulta ms didctico. Nosotros solo vamos describir todas estas utilidades de forma muy enfocadaalusoquevamosahacerdeellas.Puedeusarelmanualpara consultarloquenonecesite. Losprogramasmstilessonaquellosquesirvenparaempaquetardentro deunsoloficherounagrancantidaddeficherosydirectorios,comopor ejemplo 'tar', 'cpio', y 'afio' pero de ellos hablaremos en el siguiente captulo. Antesvamosacomentarotraseriedeprogramasquepueden combinarconestosempaquetadoresoquesuusopuedeserinteresanteen tareasrelacionadasconelrespaldo. find(1)Seusarparaelaborarunalistadeficherosquedeseamossalvar. Suversatilidadesenorme.Laopcinnewerresultardeespecialinters enelcasodedesearhacercopiasincrementales.Observequenosotrosnos situaremos previamente en un directorio adecuado y luego usaremos 'find.'parapasarafindnombresqueempiezancon'.'.Esdecirusaremos caminos relativos en lugar de caminos absolutos. Esto tiene su importancia porque de ese modo luego podremos recuperar la informacinsitundolaenotrolugardistintoaloriginalsifueranecesario.

295

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

egrep(1) Seusaparaintercalarloentrelasalidade'find'ylaentradade 'cpio'deesaformaseaumentalaflexibilidaddeuso.Sepuedeusarpara incluirdeterminadosficherosquecumplandeterminadaexpresinregular y/o para excluir determinados ficheros que cumplan determinada expresinregular.Paraexcluirseusalaopcinv. gzip(1) Es el compresor de uso ms frecuente en Linux. Esta muy probadoyesmuyfiable.Cuandosecolocauncompresorcomogzipo bzip2alasalidade'cpio'ode'tar'sepierdelaposibilidaddehacercopia multivolumen porque el compresor es el que est escribiendo en el dispositivo en lugar de hacerlo 'cpio' o 'tar'. Afortunadamente 'afio' si puedehacerlo. bzip2(1)Esmseficienteenelsentidodequepuedecomprimiralgoms peroacostadetardarmuchoms. diff(1)Detectadiferenciasdecontenidoentredosficheros.Especialmente adecuadoparaficherosdetexto. md5sum(1)Permiteasociaruncdigodecomprobacinalcontenidode unficheroodispositivo,etc.. dircomp(1) Permite comparar dos directorios analizando su contenido recursivamente. dirdiff(1) Permite comparar dos directorios analizando su contenido recursivamente.Esmselaboradoqueelanterior. mt(1) Es la utilidad que se usa para controlar las cintas magnticas. Permiteoperacionesderebobinado,retension,lecturadeestado,etc. dd(1) Sirveparacopiaroleerdispositivosusandoeltamaodebloque quesedesee.Tambinpermiterealizarciertasconversiones. Porejemploparacopiarundisquete: 296

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ dd if=/dev/fd0 of=fichero $ dd of=/dev/fd0 if=fichero

touch(1) Sirve para actualizar la ficha de modificacin de un fichero crendolo en caso de que no exista y se puede usar para guardar el instanteenqueserealizaunacopiaparaluegotomaresemomentocomo referenciaencopiasincrementales. Por ejemplo para modificar la fecha de modificacin de un fichero ajustndolaconlahorayfechaactualharamoslosiguiente:
$ touch fichero

Paramodificarlafechademodificacindeunficheroajustndolaconla fechadeayerharamos:
$ touch -t yesterday fichero

Paramodificarlafechademodificacindeunficheroajustndolaconla mismafechaqueladeunficherodereferenciaharamos:
$ touch -r fich_ref fichero

Entodosloscasossielficheronoexistesecrearcontamaoiguala cero. tee(1)Permitebifurcarunasalidaendos.Deesaformapodemosguardar lalistadeficherosqueestamosentregandoa'cpio'oa'afio'conobjetode podercompararlasluegoporejemplo. mount(1)Montaunsistemadeficheros. umount(1)Desmontaunsistemadeficheros. 297

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

/===============/
Programasparaempaquetarficheros'tar','cpio',y'afio' Vamosaverahoraunaseriedeprogramascapacesdeempaquetarvarios ficherosenunosolo. tar(1)Essimilaracpioenelsentidodequesirvetantoparasalvarcomo pararecuperarficheros.Lasalidapuedeseradispositivo,ficherooaun procesoigualquecpio,peronoaceptaporsuentradaestndarunalistade ficheros.Hayquepasarloscomoargumentos. 'tar' admite nombres de ficheros y directorios como argumentos. Los directoriosserntratadosrecursivamente.salvandoyrecuperandotodosu contenido. En Linux 'tar' tiene opciones para obtener una salida ya comprimida.Paraespecificarelficherooeldispositivodondeseguardar lacopiaseusafarchivo. Enlugardearchivosepuedeespecificarundispositivo(/dev/dispositivo) otambinsepuedeusarentradasalidamediante'f'. Paracrearlacopiaseusac,paraleerlalistadeficheroseusat,ypara extraerlosficheroseusax.Sepuedeusarcompresinconlaopcinz. Veamosalgunosejemplos:
$ # Salvar el directorio actual completo en 'fichero.tar' $ tar -cf fichero.tar . $ # Lista abreviada (solo nombres de ficheros) del contenido $ # de la copia 'fichero.tar' $ tar -tf fichero.tar $ # Lista detallada del contenido de la copia 'fichero.tar'

298

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ tar -tvf fichero.tar $ # Extraccin completa del contenido 'fichero.tar' $ tar -xf fichero.tar de la copia

cpio(1) Sepuedeusarparasalvarorecuperarunaseriedeficheros.Su salidapuedeserenviadaaundispositivoaunficherooauncompresor. Lalistadeficherosdeunpaquetecpiopuedeobtenerseconlaopcint. Estalistadeficherossoloincluyelosnombresdelosmismos.Guardando esta lista en un fichero, editndolo despus de forma que eliminemos todos menos aquellos que queramos recuperar podremos usarlo para recuperarconlaopcini.Laopcintcombinadaconvobtienenosolo losnombressinotambinpermisos,fechastamaosdeficheros,etc..Es decir'cpiot'actacomoun'ls'y'cpiotv'actacomo'lsl'.Laopcind combinada con 'i' permite la creacin de directorios'. La opcin 'm' conserva la fecha de modificacin de los ficheros. La fecha de modificacin de los directorios no siempre se conserva pero no suele considerarseimportante.Seguramenteelpropio'cpio'alcopiarficheros dentrodeldirectoriocreadoseprovocalaalteracindeestafechayla nicaformaderespetarlafechademodificacindelosdirectoriossera hacer una segunda pasada una vez que todos los ficheros estuvieran creados.Puedequealgunautilidadoalgunaversindecpiosilohaga.Si tienedudascompruebelo.Laopcin'p'decpiopermitecopiarestructuras enterasdesdeunlugaraotro.Larecuperacindeficherosconcpioadmite uso de patrones. Es interesante comprobar que aqu el operador '*' tambin expandir caracteres '/' cosa que por ejemplo el bash y otros programasnohacen. Algunosejemplossencillos:
$ #Salvar un fichero $ echo fichero | cpio -o > fich.cpio $ #Salvar varios ficheros

299

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ cpio -o > fich.cpio < cat lista_ficheros' $ #Lista detallada de los ficheros contenidos en la copia $ cpio -itvc < fich.cpio $ #Recuperacion de los ficheros creando directorios cuando sea $ #necesario (-d) y conservando la fecha de modificacin los ficheros cpio -ivcdm < fich.cpio

Parausarundispositivoenlugardeunficherobastaraconsustituirenel ejemplo'fich.cpio'por'/dev/dispositivo'. Para evitar conflictos en sistemas de ficheros con nmero de inodos elevadoseusalaopcin(Hnewc).Recomendamosquelausesiempre. LaopcionBusarbloquesde5120bytesenlugardebloquesde512 bytes. Vamosausarestaopcinenlossiguientesejemplosyademsusaremos entradasalidaacintaconcompresindedatos.
$ # Salvar todo el rabol de directorios desde el directorio actual $ # en formato comprimido. $ find . | cpio -ovBH newc | gzip > /dev/st0 $ # Listado detallado del contenido de la copia $ gzip -d < /dev/st0 | cpio -itvBH newc $ # Guardar listado sencillo (solo nombres de ficheros) en $ # el fichero 'contenido.txt' $ gzip -d < /dev/st0 | cpio -itBH newc > contenido.txt $ # Suponemos que editamos el fichero anterior 'contenido.txt'

300

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ # y dejamos solo aquellos ficheros que deseamos recuperar en $ # el fichero 'seleccin'. $ # Recuperamos de la siguiente forma: $ gzip -d < /dev/st0 | cpio -ivudmBH newc `cat seleccion`

Conlaopcionppodemoscopiartodoelcontenidodeundirectorioaotro directamentesinpasarporunasalidaintermediaempaquetadaenformato 'cpio'.Estoesmuyutilparatrasladardirectoriosenteros.


$ cd $DIR_ORIGEN $ find . | cpio -pdm $DIR_DESTINO

afio(1)Esunainteresantsimavariacindecpio.Tieneentreotrascosasla posibilidaddecomprimirlosficherosdeunoenuno.Estoleproporciona mayorseguridad,yaqueunacopiadecpioodetarcomprimidatieneel graveproblemadequeencasodeunpequeoerrorenlacopia,todala copiaquedainutilizada.Conafiosoloquedardaadoelficherodonde ocurraenerror.Ademscon'afio'esposiblehacercopiasmultivolumen comprimidas.'afio'reconocelasextensionesdeaquellosficherosqueno interesacomprimirporqueyaloestn:(.Z.z.gz.bz2.tgz.arc.zip.rar .lzh.lha.uc2.tpz.taz.tgz.rpm.zoo.deb.gif.jpeg.jpg.tif.tiffy.png). Unaventajamsde'afio'esquepermiteverificarlacopiaconeloriginal. (Opcinr) Parahacerpruebascon'afio'situeseeneldirectorio/tmp.Generealgunos ficherosgrandesparapoderhacerluegopruebasdecopiasdeseguridad usando disquetes.Porejemplo paragenerarunficherode2Mbytes de perfectabasurapuedeusarlosiguiente:
$ $ $ $ cd /tmp mkdir pruebafio cd pruebafio echo 1 > fich1

301

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html $ $ $ $ $ $ gzip --fast < /dev/zero | head --bytes=2m echo 3 > fich3 mkdir dir1 echo 4 > dir1/file4 cp fich2 fich5.gz ls -lR > fich2

.: total 4116 drwxr-xr-x 2 13:06 dir1 -rw-r--r-1 13:05 fich1 -rw-r--r-1 13:05 fich2 -rw-r--r-1 13:06 fich3 -rw-r--r-1 13:33 fich5.gz ./dir1: total 4 -rw-r--r-13:06 file4

root root root root root

root root root root root

4096 abr 2 abr 2097152 abr 2 abr 2097152 abr

8 8 8 8 8

1 root

root

2 abr

Buenoconestotenemosunaestructuradeficherosparahacerpruebas. Vamosahacerpruebasdecopiasmultivolumencomprimidasquesonlas msinteresantesyusaremosdisquetesde1.44Mbytes.Yahemosdicho quelosdisquetesnosonfiablesperosupequeotamaolohaceideal parahacerpruebasdecopiasmultivolumen.Parausardisquetesconviene usarelparmetroF. Entreotras cosasadvierta quetenemos dosficheros idnticos 'fich2'y 'fich5.gz' que admiten una compresin mejor que la realizada con la opcinfastdegzip.Perounodeellosserreconocido comofichero comprimidoyseguardartalcualestyelotrosercomprimido.(Por ciertodeformaespectacular). Formateeunpardedisquetesde1.44MBytescon'mformata:'

302

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Compruebequeseencuentraen/tmp/pruebafioyejecuteloscomandos siguientes:

$ # Para salvar a disquete multivolumen comprimido $ find . | afio -o -v -s 1440k -F -Z /dev/fd0 . -- okay fich1 -- okay fich5.gz -- okay fich3 -- okay dir1 -- okay dir1/file4 -- okay fich2.z -- (00%) afio: "/dev/fd0" [offset 2m+7k+0]: Next disk needed afio: Ready for disk 2 on /dev/fd0 afio: "quit" to abort,"f" to format, anything else to proceed. > afio: "/dev/fd0" [offset 2m+7k+0]: Continuing $ # Alteramos el original de fich3 en disco $ echo jjjjj > fich3 $ # $ # Volver a colocar el primer disquete de la copia $ # Para comprobar con el original una copia comprimida en varios disquetes $ afio -r -v -s 1440k -F -Z /dev/fd0 drwxr-xr-x 1 root root Apr 8 13:33:23 2001 . -rw-r--r-- 1 root root 2 Apr 8 13:05:24 2001 fich1 -rw-r--r-- 1 root root 2097152 Apr 8 13:33:11 2001 fich5.gz afio: "/dev/fd0" [offset 1m+416k+0]: Input limit reached afio: Ready for disk 2 on /dev/fd0 afio: "quit" to abort,"f" to format, anything else to proceed. > afio: "/dev/fd0" [offset 1m+416k+0]: Continuing -rw-r--r-- 1 root root 2 Apr 8 13:06:00 2001 fich3 afio: "fich3": Corrupt archive data drwxr-xr-x 1 root root Apr 8

303

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 13:06:18 2001 -rw-r--r-- 1 13:06:18 2001 -rw-r--r-- 1 13:05:48 2001 dir1 root root dir1/file4 root root fich2 -- compressed

2 Apr 4939 Apr

8 8

$ # Volver a colocar el primer disquete de la copia $ # Para obtener la lista de ficheros de una copia comprimida en disquete $ afio -t -v -s 1440k -F -Z /dev/fd0 drwxr-xr-x 1 root root Apr 8 13:33:23 2001 . -rw-r--r-- 1 root root 2 Apr 8 13:05:24 2001 fich1 -rw-r--r-- 1 root root 2097152 Apr 8 13:33:11 2001 fich5.gz afio: "/dev/fd0" [offset 1m+416k+0]: Input limit reached afio: Ready for disk 2 on /dev/fd0 afio: "quit" to abort,"f" to format, anything else to proceed. > afio: "/dev/fd0" [offset 1m+416k+0]: Continuing -rw-r--r-- 1 root root 2 Apr 8 13:06:00 2001 fich3 drwxr-xr-x 1 root root Apr 8 13:06:18 2001 dir1 -rw-r--r-- 1 root root 2 Apr 8 13:06:18 2001 dir1/file4 -rw-r--r-- 1 root root 4939 Apr 8 13:05:48 2001 fich2 -- compressed $ # Creamos un segundo directorio y nos situamos en el $ mkdir ../pruebafio2 $ cd ../pruebafio2 $ # $ # Para recuperar una copia comprimida en disquete $ # Volver a colocar el primer disquete de la copia $ afio -i -v -s 1440k -F -Z /dev/fd0 . -- okay fich1 -- okay afio: "/dev/fd0" [offset 1m+416k+0]: Input limit reached

304

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html afio: Ready for disk 2 on /dev/fd0 afio: "quit" to abort,"f" to format, anything else to proceed. > afio: "/dev/fd0" [offset 1m+416k+0]: Continuing fich5.gz -- okay fich3 -- okay dir1 -- okay dir1/file4 -- okay fich2 -- uncompressed $ # Vamos a comparar los dos directorios $ cd .. $ dircomp pruebafio pruebafio2 < 3241346245 6 ./fich3 > 4164007125 2 ./fich3 $ # $ # Un anlisis ms detallado de las diferencias de ambos directorios $ # Se puede hacer con dirdiff $ dirdiff pruebafio pruebafio2 2 d d - > = 2 d d - > = dir1 = r r = = = dir1/file4 = r r = = = fich1 = r r = = = fich2 1 r r X < = fich3 = r r = = = fich5.gz ^ ^ ^ ^ ^ ^ | | | | | \__ POG | | | | \____ DAT | | | \______ CKS | | \________ FI2 | \__________ FI1 \____________ FI2 $ # Para comprobar dos ficheros podemos usar md5sum $ md5sum pruebafio/fich1 pruebafio2/fich1 pruebafio/fich3 pruebafio2/fich3 md5sum pruebafio/fich1 pruebafio2/fich1 pruebafio/fich3 pruebafio2/fich3 b026324c6904b2a9cb4b88d6d61c81d1 pruebafio/fich1 b026324c6904b2a9cb4b88d6d61c81d1 pruebafio2/fich1

305

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 75894c2b3d5c3b78372af63694cdc659 6d7fce9fee471194aa8b5b6e47267f03 pruebafio/fich3 pruebafio2/fich3

Laspginasmande'afio'contienenalgunosejemplosinteresantes.Por ejemplovienecomohacerunacopiasobreunaunidaddecdrom. find.|afioob2048s325000xv'!cdrecord..' Sindudaalgunaafioesunexcelenteprogramaparasusrespaldosyle recomendamosquelopongaapruebaysefamiliariceconl. Resumiendo Conviene conocer tanto 'cpio' como 'tar' porque son dos clsicosdelossistemasoperativostipoUnixyambossonmuyutilizados. Cadaunotienesusventajasysusinconvenientes.Porotraparte'afio'es mucho ms reciente yporlotantosuusonoestanamplio, peroeso podracambiar enunfuturogracias asusindudables mejorastcnicas respectoalosdosclsicosantesmencionados. Elnicomotivoquesemeocurreporelcualsepodradesaconsejarel usode'afio'esportemasdeportabilidadentredistintasmquinas,con distintosSO.Enesecasoparagarantizarquelacopiatengaunformatolo ms universal posible,lorecomendable serausar'tar'sincompresin, pero eso no justifica dejar de usar 'afio' para las copias de seguridad rutinariasrenunciandoasusindudablesventajas. Observequelasalidadeinformacinsiemprequeresultaposiblesehace a salida estandar. En caso que se generen dos salida se usa la salida estandar como salida principal. La salida estandar de errores se usar comosalidasecundariamezcladaconposiblesmensajesdeerror. Concretamentelaopcinten'tar'y'cpio'entreganasalidaestandarel resultadoperolaopcionoylaopcinvde'cpio'juntashacenquela salidadelacopiasedirijaasalidaestandarylalistadelosficherosse dirijirentoncesalasalidaestandardeerrores. 306

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Encualquiercasolasposibilidadesdecualquieradeestostresprogramas sonmuyvariadas.Esimprescindibleacudirvalaspginasmandecada unodeellosparatenerunavisincompletadesusposibilidades.Nosotros nos hemos limitado explicar con ayuda de ejemplos algunas de sus posibilidades.

/===============/
Unprogramacompletokbackup(1) Es un programa muy completo para hacer backups. Es 100% libre (LicenciaArtistic)yestescritoenlenguajeshellscript.Lainterfazde usuario a base de un completo sistema de mens est programado haciendo uso de 'dialog'. Permite usar encriptacin pgp. Compresin mediante doble buffering para para optimizar la escritura en cintas y como herramienta de empaquetado de ficheros usa 'afio' o 'tar' segn convenga. Esaltamenteconfigurableyverstil Permitealmacenardistintasconfiguracionesparadistintostiposdecopias. Sinoquiererealizarunsistemaasumedida,puedeusar'kbackup'para suscopias.

/===============/
Recuperacintotaldesdecero Muchas veces tener un disquete o CDROM de rescate con las herramientas necesarias simplifica mucho las cosas. Realmente todo podraresultartansencillocomoarrancarconesesistemaderescatey recuperarlacintasobreelsistemadeficherosadecuadamentemontado.

307

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Siusaprogramasespecficoscomo'kbacup'deberinvestigarlaformade recuperarunacopiade'kbacup'sinusar'kbacup'.Ensudefectodebera tener un disquete o cdrom de rescate (autoarrancable) que contenga 'kbackup'. Lascopiasdekbacuppuedensermanejadaspor'afio'o'tar'.Porejemplo encasodeperdidadetodoelsistemaquizsnotengamosformadehacer funcionar'kbackup'perosi'tar'o'cpio'.Enestecasoesimportantesaber quelascopiasde'kbacup'escribenenprimerlugarunficherodecabecera queincluyeinformacinsobreelformatoqueseusoparaesacopia. Encualquiercasodebedetenerclarocualserlarecuperacindeuna cintadeseguridaddetodoelsistemadesdecero,ysitieneposibilidades de hacer pruebas sin comprometer datos importantes hagalo. Use por ejemplounsegundoordenadorsininformacinimportante.

/===============/
CopiausandodispositivodecintaSCSI Elusodetodoslosdispositivos decintaSCSIesbastante similar.Lo usaremos como para nuestro ejemplo. Estos dispositivos tienen varios controladoresynosfijaremosahoraendosdeellos. /dev/st0DispositivodecintaSCSIConautorebobinado. /dev/nst0DispositivodecintaSCSISinautorebobinado. El autorebobinado significa que el cierre del dispositivo provoca el rebobinadoautomticoalprincipiodelacinta.Nosotrosusaremosparala copia de seguridad /dev/st0 (Con auto rebobinado) Solo usaremos /dev/nst0pararebobinadoyretensiondelacinta.Elretensionadodela cinta es una operacin muy necesaria y en principio el programa de ejemploprovocarsiempreunretensionadodelacinta.Lascintasqueno sonretensionadasdevezencuandopuedellegararomperseoatascarse.

308

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Loscontrolesquevamosausarsobrelacintason: mtf/dev/nst0rewind mtf/dev/nst0retension mtf/dev/st0status Los dos primeros ya han sido mencionados y el ltimo proporciona informacinsobreelestadodelacinta. Vamosaproporcionarunscriptparahacerrespaldosbasadoenelusode afio.Deberestudiarloparaadaptarloasusnecesidades. Estpensadoparausarcintasscsi.Sepuedeadaptarfcilmenteparaotros dispositivosoparacopiasobrefichero.Siestonolegustasiemprepuede usarunprogramacompletodebackupcomo'kbackup'ysilegustapero lo encuentra incompleto puede encontrar solucin a sus necesidades concretasinspeccionandoelcdigode'kbackup'queestescritoenshell script. Unprogramadebackupmsqueverstilhadesercmodo.Yalodijimos antes.Elbackupesunatarearutinariaymuyimportante.Interesatenerun sistemaquepermitameterlacinta,dardosotresteclazosydejarqueel restolohagaelordenador.Deesaformaeldaqueestemoscansadosno tendremosexcusaparanohacerlacopia. Loquevieneacontinuacinesunejemploylosejemploshandeser sencillos,peroestamossegurosqueleresultarmuyfciladaptarloasus necesidades. Enesteejemplonosotrosexcluimos/mntporqueesundirectoriodonde suponemosquehaymontadosdispositivosquenodebenserrespaldados. Parahacerunrespaldosobreunficheroconvieneusarundiscodistinto montadoenunlugarquequedeexcluidodelacopia.Ennuestroejemplo podramossituarelficheroderespaldodentrode/mnt.

309

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Analiceelscriptaconciencia.Acudaalmanualonlineparacadaunode loscomandosquerepresentenalgunadudaysiapesardeeso,algosale malinsistimosenrecordarlequetodalaresponsabilidadenelusodeesto odecualquierotromaterialdelcursoessolosuya.

#!/bin/bash ##################################################### ################ testTape(){ echo "## Inserte la cinta ${DATOS} ##" echo ".... pulse <Intro> para continuar" read echo mt -f /dev/nst0 rewind mt -f /dev/st0 status echo afio -rvZ -b ${BLOCK} -s ${CAPCINTA} < /dev/st0 | more } ##################################################### ################ preparar(){ REF_INCR="" if [ "$TIPO" = "I" ] then REF_INCR=T_${DATOS} fi if [ "$TIPO" = "i" ] then REF_INCR=I_${DATOS} fi T_DATOS=${TIPO}_${DATOS} FECHA=`date +%y%b%d` PREOUT="${BACKUP}/history/${FECHA}${T_DATOS}" PRELAST="${BACKUP}/last/${T_DATOS}" T_REF_INCR="${BACKUP}/last/${REF_INCR}.time" FIFO3=/tmp/FIFO_salva_lst.$$ FIFO3OUT=${PREOUT}.lst echo

310

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html echo '############ ' ${FECHA} ${T_DATOS} ' ############' echo '-------------------------------------------------------------' df echo '-------------------------------------------------------------' if [ "$TIPO" = "i" ] || [ "$TIPO" = "I" ] then echo "Se recuperar informacin posterior a ..." ls -ld $T_REF_INCR | cut -c 42fi echo echo "desde=$DESDE, incluir=$INCLUIR, excluir=$EXCLUIR, datos=$DATOS" echo "!! Compruebe que los dispositivos montados coinciden para $DATOS !!" echo ".... pulse <Intro> para continuar" read echo "## Inserte la cinta. Asegurese que est desprotegida ##" echo "....Espere a que est lista y pulse <Intro> para continuar" read echo mt -f /dev/nst0 rewind mt -f /dev/st0 status echo "Espere. Realizando prueba de escritura ...." if ! echo "____ Prueba de grabacion OK ____" | blockout > /dev/st0 then echo " !!! Imposible escribir !!!" exit else blockout < /dev/st0 fi mt -f /dev/nst0 rewind echo echo -e '\7\c' sleep 1 echo -e '\7\c' sleep 1 echo -e '\7\c' sleep 1 echo "## Compruebe estado de la cinta ##" echo ".... pulse <Intro> para continuar"

311

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html read } ##################################################### ################ salva(){ RETENS="S" clear echo "############ !! Backup en marcha !! ############## $T_DATOS" COMIENZO=`date` if [ "$RETENS" = "S" ] then echo "Retension de la cinta ............." mt -f /dev/nst0 retension sleep 5 fi cd $DESDE touch ${PRELAST}.time chmod 400 ${PRELAST}.time echo "Salidas en ${PREOUT}." INI=`date "+%d %b %Y %r"` echo "Grabando en cinta la copia de seguridad ............" mknod --mode=600 $FIFO3 p cut -b 3- < $FIFO3 | egrep -v '^$' | sort $FIFO3OUT & rm ${PRELAST}.lst 2> /dev/null ln -s $FIFO3OUT ${PRELAST}.lst >

### Comienza realmente la copia ## if [ "$TIPO" = "T" ] then nice find . -print | egrep -v $EXCLUIR | egrep $INCLUIR | \ tee $FIFO3 | afio -ovZ -b ${BLOCK} -s $ {CAPCINTA} /dev/st0 else nice find . -newer $T_REF_INCR -print | egrep -v $EXCLUIR | \ egrep $INCLUIR | tee $FIFO3 | afio -ovZ -b $ {BLOCK} \ -s ${CAPCINTA} /dev/st0

312

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html fi ### Fin ### FIN=`date "+%r"` echo "$INI ======> $FIN" mt -f /dev/st0 status echo "Copia en cinta terminada ......." echo "Iniciando comprobacin ........." afio -tZ -b ${BLOCK} -s ${CAPCINTA} /dev/st0 | sort > ${PREOUT}.tape diff $FIFO3OUT ${PREOUT}.tape > ${PREOUT}.diff echo "**************************************************** **************" echo "******************* F I N B A C K U P *************************" echo > ${PREOUT}.log echo "******* ${PREOUT}.log " >> ${PREOUT}.log echo "******* Comenz $COMIENZO" >> ${PREOUT}.log echo "******* Finaliz `date`" >> ${PREOUT}.log echo "******* Diferencias `cat ${PREOUT}.diff | wc -l` " >> ${PREOUT}.log echo "******* DiferenciasHead `head -n 8 $ {PREOUT}.diff` " >> ${PREOUT}.log echo " ...." >> ${PREOUT}.log echo "******* DiferenciasTail `tail -n 8 $ {PREOUT}.diff` " >> ${PREOUT}.log echo "bzip2 $FIFO3OUT ${PREOUT}.tape ${PREOUT}.diff" bzip2 $FIFO3OUT ${PREOUT}.tape ${PREOUT}.diff echo "rm $FIFO3" rm $FIFO3 echo "**************************************************** **************" cat ${PREOUT}.log echo "**************************************************** **************" } ##(1)####################################### salva_tmp(){

313

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html DESDE='/tmp' INCLUIR=$INCLUIR_TODOS EXCLUIR=$EXCLUIR_NINGUNO DATOS="tmp" preparar salva } ##(2)####################################### salva_root(){ DESDE='/' INCLUIR=$INCLUIR_TODOS EXCLUIR="\.netscape/cache/|\/core$|^./tmp|^./proc|^./ mnt|^./mount" DATOS="root" preparar salva } ##(3)####################################### salva_home(){ DESDE='/home' INCLUIR=$INCLUIR_TODOS EXCLUIR=$EXCLUIR_NINGUNO DATOS="home" preparar salva } ##################################################### ################### ################################ MAIN ################################## ##################################################### ################### CAPCINTA=3700m BLOCK=10k INCLUIR_TODOS="^." EXCLUIR_NINGUNO="^./tmp|^./proc" BACKUP="/backup" mkdir $BACKUP 2> /dev/null mkdir ${BACKUP}/history 2> /dev/null mkdir ${BACKUP}/last 2> /dev/null cd ${BACKUP}/history clear echo "################ BACKUP `date` ###############"

314

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html echo ls -rt *.log echo sleep 2 RETRY=TRUE while [ "$RETRY" != "FALSE" ] do echo echo '0) Comprobar contenido de una cinta' echo '1) salva_tmp (/tmp) para pruebas)' echo '2) salva_root (menos /mnt y /mount)' echo '3) salva_home (/home)' echo echo 'Introduzca la opcion deseada.' read OPT1 case "$OPT1" in [0123]) RETRY=FALSE ;; *) echo "Opcion invalida. Reintentar" ;; esac done if [ "$OPT1" != "0" ] then RETRY=TRUE while [ "$RETRY" != "FALSE" ] do echo 'Introduzca en primer lugar el tipo de copia deseado' echo echo 'T) TOTAL' echo 'I) INCREMENTAL DESDE ULTIMO TOTAL' echo read TIPO case "$TIPO" in [TI]) RETRY=FALSE ;; *) echo "Opcion invalida. Reintentar" ;; esac done fi case "$OPT1" in 0) testTape ;;

315

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 1) salva_tmp ;; 2) salva_root ;; 3) salva_home ;; esac echo Copia finalizada.

Los mens de esta aplicacin pueden hacerse ms vistosos usando dialog(1), tambin puede intentar opciones para salvar y recuperar configuraciones. Ambas cosas estn resueltas el 'kbackup' que est realizadoigualmenteenshellscript.

/===============/
Ejemplosderecuperacindecopias Enelejemploanteriornohemosincluidoningunaopcinderecuperacin porquecadacasoesdistintodependiendodeloquesequierarecuperar. Un error en la recuperacin puede suponer perdida de informacin. Siempre que sea posible conviene recuperar en un lugar distinto al originalysolosedebenrecuperarlosficherosnecesarios. Generalmente los programas de propsito general permiten la recuperacin de todoel contenido obiensacan unalista detodos los ficherosparasealaraquellosquedeseamosrecuperar. Alcontrarioqueelrespaldolarecuperacinnoesunatarearutinaria.Por esaraznyporquecadarecuperacinhadehacersebajounossupuestos distintoslosprogramasdepropsitogeneralnosiempreproporcionanla flexibilidadnecesaria. Conociendobienlasherramientassencillastipo'find','cpio','tar','afio', etc y combinndolas para recuperar solo lo que deseamos lograremos muchaflexibilidad.

316

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Lasdistintasposibilidadessonimposiblesdecomentaryyavimosalguna cosaalexplicar'cpio'yenrealidadbastaconsabercomosacarlalistade ficherosdeunacintaycomopoderusaresalistapararecuperarloque queramos. Ahoranosvamosaverejemplosconcretoscentrndonosexclusivamente enlarecuperacindecopiasrealizadascon'afio'enformatocomprimido, para nocambiar porquedealgunamaneravenimosmostrandonuestro favoritismopor'afio'entodaestaleccin. Sepuedeconfeccionarunalistadelosficheroscontenidosenlacopia haciendolosiguiente.
$ afio -tZ /dev/st0 > listafich

Supongamosqueennuestralistadeficherosaparecenlossiguientes.
./var/lib/postgres/data/pg_variable ./var/log/apache/access.log ./var/log/apache/error.log ./var/log/auth.log

Sihacepruebassitueseen/tmp.Paraunarecuperacindeinformacin realtampococonvienerecuperardirectamentesobreeloriginalasque /tmp puede ser igualmente un buen lugar si hay espacio para ello. Recuerdequealgunossistemaslimpian/tmpalarrancaroregularmente cadaciertotiempo. Continuandoconnuestroejemplo,pararecuperarporejemplo'auth.log' haramoslosiguiente.
$ afio -iZ -y '*auth.log' /dev/st0

317

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Para recuperar los que ficheros que contengan 'log/apache' pero no 'access'haramoslosiguiente.
$ afio -iZ -y '*log/apache*' -Y '*access*' /dev/st0

Enestecasohabramosrecuperadosolo'./var/log/apache/error.log'. ParacasosmscomplejosseusarlasopcioneswoWconficherosque contendrnunnombredefichero,ounpatrnporcadalnea,ydonde cada una de ellas serconsiderada como sifueraunaopcin yoY respectivamentepara'wfichero'opara'Wfichero'.

318

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

LAMEMORIAVIRTUALENLINUX
Introduccin Estecursonotratadelaadministracindelsistemaperoenestecaptulo sevanaexplicaralgunascosasquesonmateriadeadministracindel sistemaperoqueunusuariotambindebeconocer. Muchas veces un administrador tiene dificultades para gestionar los escasosrecursosdeunamquinaporquelosusuariosnolosutilizandel modomsracional. Enunsistemaconmuchosusuariosestosdebencompartirlosrecursosde modoracional,perogeneralmenteocurrelocontrario.Elnocomprender como funcionan las cosas y la avaricia de recursos puede conducir a conductasabsurdas. Porejemplounusuarioquetienequecompilar500programassabeque tendrqueesperarmucho.Siesteusuarioessuficientementeignorantey egosta puede pensar que lanzando las 500 compilaciones simultneamentecausarunretrasoalosdemsperoelterminarantes. Lo cierto es que los recursos del sistema se desperdician en trabajos internos totalmente intiles para el usuario cuando el sistema est sobrecargado. Tantosisepersiguecompartirlosrecursosdeformarazonableconlos demsusuarios,comosiloquesepretendeesusarlosrecursosdetodoel sistemaparasacarelmayorbeneficiopersonal,senecesitacomprender comofuncionanalgunascosas. Estaleccin sertotalmenteterica porqueparaunusuarionormalno resulta prudente cierto tipo de experimentos que podran provocar 319

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

incomodidades o incluso algunos problemas en el sistema. De todas formassielsistemaempiezaatenerproblemas,siqueesbuenotenerlos conocimientossuficientesparaaveriguarsiesotienequeverconalgoque estemos haciendo nosotros. Quizs podamos incluso advertir a algn compaeroquetrabajeenelmismoequipoqueelproblemaenelsistema tienequeverconloqueelhace. Limitarelusoderecursos Enunsistemasesuelellamarrecursosaciertoselementosquenopueden serutilizadosdeformailimitada.Porejemplo.'yes'esunprogramaque genera una salida infinita y no es buena idea redirigir su salida a un ficheroporquellenaremosnuestroespaciodedisco.Enalgunossistemas eladministradorestableceunlimitedeespacioparacadausuario.Sino fueraelcasollenaramoseldisco.Silasalidade'yes'laredirigimosa /dev/null no pasar nada. El nmero de ficheros que podemos tener abiertos simultneamente tambin tiene un lmite. Lo mismo puede decirsedeotrasmuchascosas. La cantidad de memoria es limitada peroexisten distintos limites que afectanalusodelamemoria.Paralimitarelusodeciertosrecursosexiste uncomandointernodelashellllamado'ulimit'. Porejemplo'ulimitc'seusaparalimitareltamaodelosficheroscore producidoscuandounprocesomuerebajodeterminadascircunstancias. Unusuarionormalitonoutilizarparanadaestosficherosasquepodra usarse'ulimit0'paraevitarlaaparicindeficheroscore. TambinsepuedenlimitarotrasmuchascosascomolacantidaddeCPU porsegundo,tamaomximodeunfichero,mximonmerodeprocesos, mximo numero de ficheros abiertos, cantidad mxima de memoria virtual,etc... Para ver las limitaciones con las que estamos trabajando haremos lo siguiente: 320

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

$ulimita

core file size (blocks) data seg size (kbytes) file size (blocks) max locked memory (kbytes) max memory size (kbytes) open files pipe size (512 bytes) stack size (kbytes) cpu time (seconds) max user processes virtual memory (kbytes)

0 unlimited unlimited unlimited unlimited 1024 8 8192 unlimited 256 unlimited

Buenoenesteejemplovemosqueestamosenunasesinconmuypocas limitaciones.Esoessealdequeeladministradorconfaennosotrosy nosconcedemuchalibertad. 'ulimit'permiteestablecerdosclasesdelmites.Lmitesduros(solose puedenponerunavezygeneralmenteestolohaceroot)ylmitesblandos quesepuedencambiarvariasvecesperonosepermitesobrepasarlos valoresestablecidosenellmiteduro.rootestableceestoslmitesenalgn fichero de configuracin y los usuarios pueden tener en su $HOME/.bashrc alterar los limites blandos. Para ms informacin consultelapginamande'ulimit'. Multitarea Yahemoshabladoalgodeellacuandoestudiamoslosprocesos.Queda claroqueenunsistemaenelqueseestnejecutandoenaparienciavarios procesossimultneamenteloqueocurrerealmenteesqueeltiempodela CPU se va repartiendo entre los distintos procesos concediendo rpidamente sucesivas rodajas detiempoacadaunoenfuncindesu prioridadydelapolticaderepartodeesetiempo.Estapolticanonos interesa ahora. Se supone que las cosas estn pensadas para que el funcionamientoglobaldetodoelsistemaseaelmsadecuado.

321

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Volvamosalcasodelusuarioignoranteyegostadelcaptuloanterior.El delas500compilacionessimultneas.Elsistemanecesitapararcadauno delosprocesosqueusanlaCPUunavezquehanconsumidosurodajade tiempoparatomarelsiguienteprocesoenesperadeCPU. Cuandounprocesonecesitausaralgoyeneseinstantenoestdisponible pasaaunestadodeinactividad.Sedicequequedadormido. Estecambiodeunprocesoaotronoesgratuitoporqueunavezparadoel proceso hay que anotar la situacin en la cual ese proceso ha sido detenidoparaluegopodervolveracontinuarexactamenteenelmismo puntocuandolevuelvaatocaryquizspartedelcdigoodelosdatosdel proceso ya no estn en memoria RAM (tambin la llamaremos indistintamentememoriafsica.Vermsadelantepaginacin).Todoesto consumemuchosrecursosysepuedealcanzarlasituacinenlacualel SO consume la mayor parte del tiempo en esta gestin de procesos intercambiando datosentre memoria ydiscoconstantemente porquela memoriafsicanopuedecontodoporelcontrariolosprocesosquesonla parterealmentetilapenasdispondrnderecursos.Enestasituacinel sistemasevuelvemuylentoylosdiscosdelsistematienenunaactividad altsima.Enrealidadesunasituacindeautnticoagobioparaelsistema ysucomportamientosevuelvetorpe.Escomosielsistemaactuaraala desesperada. Poresarazndecimosqueelusuariodelcaptuloanteriorademsdeser egostaesignoranteporqueestprovocandounenormeretrasonosoloa losdemsusuarios(cosaqueyasabe)sinotambinasimismo. Sialgunaveznotamosqueelsistemavamuylentoysospechamos la causa tendremos que parar en primer lugar el proceso que est provocando la sobrecarga. Si no sabemos cual es o si se trata de un proceso que no es nuestro podemos investigar con el comando 'top'. Tengaencuentaquedeestecomandosesalecon'q'.

322

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Estecomandosacaencabeceraunresumendelasituacingeneraldel sistema y luego saca solo la informacin de los procesos que mayor consumoderecursosestnprovocandoenelsistema. Tengaencuentaque'top'sirveparadiagnosticar elusoderecursosy permiteidentificarprocesosqueconsumendemasiadoperoensimismo 'top' tambin consume bastantes recursos. Por eso en situaciones de sobrecargadelsistemaconvienenoabusardesuuso.'top'refrescacada ciertotiempolainformacindelapantalla.Pordefectolohacecada5 segundos.Podemosaumentara15segundos.Paraellousaremos'topd 15'. Esto consumir menos recursos y nos permitir mirar con ms tranquilidadlainformacindetop. Vamosaverunejemplodelusode'top'quecorrespondeaunsistemacon muy poca actividad. Solo 5 usuarios. La CPU est ociosa 99.6% del tiempo,lacantidaddememoriadisponibleesaltaynoseestusandola swap. $top

12:17pm up 2:06, 5 users, load average: 0.00, 0.00, 0.00 55 processes: 54 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 0.0% user, 0.3% system, 0.0% nice, 99.6% idle Mem: 258100K av, 93320K used, 164780K free, 66800K shrd, 7652K buff Swap: 393552K av, 0K used, 393552K free 40744K cached PID %MEM 1002 0.5 1 0.1 2 0.0 3 0.0 USER PRI NI TIME COMMAND root 11 0 0:00 top root 0 0 0:05 init root 0 0 0:00 kflushd root 0 0 0:00 kupdate SIZE RSS SHARE STAT 700 R 404 S 0 SW 0 SW LIB %CPU 0 0 0 0 0.3 0.0 0.0 0.0

1312 1312 464 0 0 464 0 0

323

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html .... ..... .. ... .:.. ...... .... ..... .. ... .:.. ...... .... ..... .. ... .:.. ...... .. .. .. ... ... ... ... ... ... ... .. ... .. ... .. .. .. .. ... ... ...

USEResesusuarioquearrancelproceso,%CPUeselporcentajede tiempo deCPUusadoporelproceso.%MEM Porcentaje dememoria fsicausadaporelproceso.Podrainclusosuperarel100%.Unvaloralto puede delatar a un proceso como el causante de los problemas de paginacin(swaping)enelsistema. Otro comando que nos da informacin sobre la carga del sistema es 'uptime'
$ uptime 12:27pm up 0.00, 0.00 2:16, 5 users, load average: 0.00,

Coincideconlaprimeralineade'top'.Losdatossonhoraactualtiempo transcurridodesdeelarranquedelsistema,nmerodeusuariosylastres ltimas cifras se corresponden con promedios de carga en el ltimo minuto,5ltimosminutosy15ltimosminutosrespectivamente. Memoriavirtual Vamosaexplicarenprimerlugarquesignificaesodememoriavirtual. EnmuchossistemasoperativoselSOofrecealosprogramasunespacio de memoria superior al que realmente existe. La memoria fsica es la memoriaRAM.LaCPUnopuedehacernadaconlosdatossiantesno pasan ala RAM.Apesardeestounsistema con64Mbytes deRAM puedeejecutar porejemplounprogramausevariablesconeldoblede tamaoqueeldelamemoriaRAMdisponible.Sielprogramaaccediera muchoydeformaaleatoriadentrodeestaenormevariable,seproducira 324

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

una fuerte sobrecarga en el sistema. Si alguien se pregunta si una barbaridadcomoesta,puedehacerlaunusuarionormalitosinprivilegios especiales,larespuestaes,usuarionormalsi,peroautorizado. Esonosignificaqueestemosburlandolaseguridaddelsistemanique seamosmslistosqueeladministrador. Sieladministradorconfiguraelsistemadeformaparanoicaparaevitar cualquier posible riesgo, los usuarios se vern sometidos a unas restriccionesbastanteincmodasparatrabajar. Por eso lo normal es que el administrador asuma que los usuarios autorizadosutilizaranlosrecursosdeformarazonable. Paragestionarlamemoriavirtualloquesehaceesrecurriralespaciode discoparaampliaresteespacio.LamemoriaRAMtieneunavelocidadde accesomuchomsrpidaqueundiscoduroyparaconseguirquetodo funcione de forma transparente y de forma eficiente se utilizan unas tcnicasdesegmentacinypaginacinquedescribiremosacontinuacin. Segmentacindelamemoria Lamemoriadeunordenadoresunaespeciedeenormecasillero.Cada casillacontendrciertainformacinperounprocesonopuedeaccedera todalainformacindelsistema.Cadacasillatieneunadireccinycada procesopuedeusarciertasdireccionesparaalmacenarinformacin.De esta forma se evita que un proceso interfiera accidentalmente o intencionadamentealainformacindeotroprocesodistinto. Lascasillassonlasposicionesdememoriayapesardelodichoexisten posiciones de memoria compartidas. Por ejemplo el cdigo de un programaqueseestejecutandoenvariosprocesossercompartidoen modo exclusivo de lectura por los procesos que estn ejecutando ese programa.Esdecirquesiporejemplohayvariaspersonasejecutandoel editor'vim'elcdigodeeseprogramanoestarrepetidoenmemoria. Seraundesperdicioporqueelcdigoeselmismo,nosepuedealterary 325

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

laCPUselimitaaleerlainformacinconsistenteeninstruccionesparala CPU. Todoestetipodeinformacinesloquesedenominasegmentodetexto. Losprocesomanejanotrostiposdeinformacindistintasyparaellose organizaensegmentosdedistintotipo.Porejemplohaysegmentosde datosdesololectura,segmentosdedatosdelecturaescritura,segmentos dedatosdepila,segmentosdatosdememoriacompartida,segmentosde memoriadinmica.Novamosaexplicarestascosasporqueexcedeen mucholospropsitosdeestecaptuloperosiqueremosdejarunaidea. Losprocesostienenlamemoriaorganizadaensegmentosdedistintotipo. Gracias a esto se consigue utilizar la memoria RAM de forma muy eficiente. PeseaqueelcdigodeunprogramapuededesaparecerdelaRAMpara dejarespacioaotrosprogramas,nosernecesariosalvarlainformacina disco. Si fuera necesario volver a cargarlo en RAM bastar acudir al ficheroquecontienesucdigoejecutable. Esto hace que los ficheros que contienen programas que se estn ejecutandonopuedanserborradosnimodificadospornadie,nisiquiera porroot. Copie el ejecutable 'top' en el directorio /tmp (Seguramente estar en 'bin/top'ysinodeberisercapazdeencontrarlo).Ejecutelocomo/tmp/top ydesdeotrasesinintenteborrarelfichero.Sencillamenteleresultar imposiblepeseaqueesustedesdueodeesacopia. Cuidado.Estonoesaplicablealosscriptsdebashoaotrosscriptsporque en realidad estos programas son datos que se ejecutan dentro de un programaquelosinterpretaenlugardehacerloenlaCPU. Paginacin

326

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

LainformacinseorganizaenbloquesylosbloquesquelaCPUusase mantienen el mayor tiempo posible en RAM. A estos bloques de informacinselesllamapginas. Seintentareducirelnmerodelecturasyescriturasadisco.Paraellose acta en base a suposiciones de uso de la memoria. Las pginas recientementeutilizadastienenmayorprobabilidaddevolveraserusadas pronto que aquellas que ya hace tiempo que no han sido accedidas. Intentaremosexplicarporque. Los programas se comportan generalmente usando pequeas partes de cdigodurantelamayorpartedeltiempomientrasqueotraspartesse ejecutarndeformamuyocasional. Ademslosprogramasusanpartescomunesdecdigoquepertenecena libreras compartidas. El aprovechamiento de la RAM se consigue manteniendounasolacopiadeesecdigocompartidoenmemoriaRAM. Losaccesosaestas pginasdememoria quecontienencdigopueden sern para leer informacin. En el caso de datos de lectura escritura tambinpodrnseraccedidasparasumodificacin.Cuandounapgina hasidomodificasemarcaparaescribirsucontenidoendiscoenelcaso dequesenecesiteelespacioqueocupaparaotrapginadistinta. El area de disco que se utiliza para ello se llama swap (tambin se denomina memoria de intercambio) y un usuario normal no puede modificarlaaunquerootsipuedehacerloparaaumentarlaodisminuirlade tamaoporejemplo. Lamemoriavirtualeslasumadelamemoriafsica(RAM)mselswap (areadeintercambio)menosalgunaspginasdereserva.Laspaginasde reserva estn limpias de informacin para poder cargar en ellas informacinnuevadesdelaswapcuandosenecesita. Alprocesodetraerunapginadelaswapamemoriafsicaselellama (swap in). Esto necesita un tiempo y normalmente el proceso espera 327

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

dormido.Alprocesodevolcarunapginadememoriafsicaaswapsele llama(swapout)ygeneralmenteelprocesoyaestdormidocuandoesto ocurre. Cuandoseagotalamemoriafsica(RAM)seempezarausarlaswap. Cuandolamemoriavirtualseagotaelkernelempezaramatarprocesos. Dichodeotromodounprocesoqueintentausarmemoriavirtualcuando estagotadaterminarrecibiendounasealdelkernelqueprovocarsu muerte. Utilidadesparamonitorizarelusodememoriavirtual Yavimoselusode'top'.Nossirviparaintroducireltema.Setratadeun comando realmente buenoparalocalizar losprocesos responsables del mayorconsumodeCPUymemoria. Lainformacindelestadodencleodelsistemaseencuentraen/proc/Ya comentamos en captulos anteriores parte de su cometido y tambin resultamuytilparaobtenerinformacinsobreelusodelamemoriaen elsistema. $cat/proc/meminfo

total: used: free: shared: buffers: cached: Mem: 264294400 103956480 160337920 58118144 10465280 53153792 Swap: 402997248 0 402997248 MemTotal: 258100 kB MemFree: 156580 kB MemShared: 56756 kB Buffers: 10220 kB Cached: 51908 kB SwapTotal: 393552 kB SwapFree: 393552 kB

Tambin'psv'puededarnosinformacinsobreelconsumodememoria virtualdeprocesos.Contopsolosalalainformacindelosprocesosque 328

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ms consumen pero quizs necesitemos informacin de determinados procesos.Porejemploparasacarlainformacindelosprocesosasociados al nuestro terminal bastar usar 'ps v'. Si necesita precisar otras condicionesconsultelasopcionesdepsensupginaman. $psv

PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 301 tty3 S 0:00 600 420 1743 1300 0.5 -bash 1640 tty3 S 0:00 326 518 1829 1568 0.6 vi recursyst.dat 1665 tty3 S 0:00 194 420 1451 832 0.3 /bin/bash -c (ps v) >/tmp/vok2gkuv 2>&1 1666 tty3 R 0:00 240 55 2844 1176 0.4 ps v

Sisolodeseamossabercuantamemoriaquedalibrepodemosusar'free'. Estecomandotambinindicasiseestusandolaswap. $free

total buffers cached Mem: 258100 10248 51988 -/+ buffers/cache: Swap: 393552

used 101668 39432 0

free 156432 218668 393552

shared 56800

Con'vmstat'podemostenerinformacindelusodememoriavirtual,cpu, ydelconsumodeentradasalida. $vmstat

procs memory io system cpu r b w swpd free buff cache bo in cs us sy id 0 0 0 0 156404 10252 52000 1 141 132 1 0 98

swap si 0 so 0 bi 2

329

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Con'memstat'podemosverelusodememoriavirtualdelosprocesosy delaslibrerascompartidas. $memstat

44k: PID 1 (/sbin/init) 60k: PID 98 (/sbin/portmap) 80k: PID 156 (/sbin/syslogd) 468k: PID 158 (/sbin/klogd) 40k: PID 165 (/sbin/kerneld) 52k: PID 170 (/sbin/rpc.statd) 140k: /lib/libreadline.so.4.1 228 24k: /lib/libwrap.so.0.7.6 98 271 72k: /lib/ld-2.1.3.so 1 98 156 158 165 170 178 179 180 181 182 188 193 ... 864k: /lib/libc-2.1.3.so 1 98 156 158 165 170 178 179 180 181 182 188 19... 20k: /lib/libcrypt-2.1.3.so 228 292 295 306 307 308 309 310 311 461 966... ...: ......................... ...: ......................... ...: ......................... -------3768092k

Para mostrar solo la informacion del proceso 271(en nuestro caso es sendmail)haramoslosiguiente: $memstat|grep271

306 295 292 271

264k: PID 271 (/usr/sbin/sendmail) 24k: /lib/libwrap.so.0.7.6 98 271 232k: /lib/libdb-2.1.3.so 156 193 206 271 292 295 307 308 309 310 31... 76k: /lib/libnsl-2.1.3.so 98 228 271 284 287 292 299 300 301 303 30... 40k: /lib/libnss_compat-2.1.3.so 228 271 284 287 295 299 300 301 30... 20k: /lib/libnss_db-2.1.3.so 156 193 206 271 32k: /lib/libnss_files-2.1.3.so 156 170 193 206 292 295 306 307 308... 48k: /lib/libresolv-2.1.3.so 271 308k: /usr/sbin/sendmail 271

330

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Conestovemoslobienaprovechadoqueestelsistemayaquemuchas delaslibrerasaparecencompartidasconunmontndeprocesosquese estnejecutando. Hemosconseguidoverlaslibrerascompartidasqueestausandoycuanto ocupanenmemoriaperolautilidadparasaberusaousarunejecutable es'ldd'.Estecomandononecesitaqueelprogramaseestejecutando porquesacalainformacinanalizandoelcdigodelejecutable. $ldd/usr/sbin/sendmail

libdb.so.3 => /lib/libdb.so.3 (0x40019000) libwrap.so.0 => /lib/libwrap.so.0 (0x40054000) libnsl.so.1 => /lib/libnsl.so.1 (0x4005b000) libresolv.so.2 => /lib/libresolv.so.2 (0x40071000) libc.so.6 => /lib/libc.so.6 (0x40081000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Actuacinconprocesosconflictivos Llegados a este punto conviene explicar que se puede hacer con un procesoconflictivo.Evidentementelasolucinmsdrsticaesmatarlo. Paraelloseusarprimeroun'kill15PID'.Laseal15esunSIGTERM quepermitealprocesopararordenadamenteperosielprocesoignoraesta sealhabrquematarloconun'kill9PID'.Laseal9esunSIGKILL quenopuedeserignorado. Detodasformaspuedeocurrirquenosdepenamataraunprocesoquese haba comportado razonablemente durante bastante tiempo y que est llevandoacabounastareasquenosinteresan. Lomssuavequesepuedehaceresbajarlelaprioridadcon'renice'por ejemplo'renice20PID'.Bajarlaprioridaddeunprocesonoperjudicaen nadaal procesocuandolaCPUest ociosaporfaltadetrabajo. Siel procesocontinuaconsumiendodemasiadosrecursosynopodemosbajar 331

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ms su prioridad podemos pararlo sin matarlo. Para ello se enva al procesounasealSIGSTOPmediante'kill19'Paravolveraarrancarlo podemoshacerlomandandounasealSIGCONT'kill18'

332

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

LAPRIMERAINSTALACIONDELINUX
Introduccin NotodoslosusuariosqueempiezanconLinuxpartendelmismopunto. UnosyatienenconocimientosdeUnix,otrosnotienenconocimientosde Unixperosideinformticaengeneral,otrosdisponendealgnamigo quelespuedeayudar,yotroshanledocosaspreviamente.Nosotrosno asumiremos nada de eso. Solo asumiremos que ya ha estudiado las leccionesanteriores. Quizassepregunteporqueestaleccinnoseexplicantes.Laraznes que durante la instalacin de Linux se manejan una gran cantidad de conocimientosyenestemomentoyadisponemosdeunoscuantos. Lainstalacinesunprocesoquesehasimplificadobastanteylasguasde instalacinpuedenserdegranayuda.Apesardeestocuandosepresenta unadificultad,muchasvecesserequieretenerunabasedeconocimientos ampliaparapodersuperardichasdificultades. He conocido a bastantes personas que deseosas de probar Linux me confesabanquenodeseabanrealmenteperdernadadetiempoenaprender cosas sobre Linux. Se conformaban con aprender a instalar Linux y configurarlascuatrocosasquenecesitanusar. Siempre asumimos que ha leido las lecciones anteriores y por ello tambinasumiremosqueestenoessucaso. Nosotros antes de llegar a este captulo hemos realizado un amplio recorrido formativo. Conceptos como sistema de ficheros, ncleo del sistema, proceso,memoria virtual, etc..ya hansidotratados. Tambin sabeusaryaeleditorvi,yyatieneprcticaconelinterpretedecomandos. 333

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

La principal utilidad de todo ello es que nunca se sentir totalmente perdido. DetodasformashaymuchascosasinteresantesdecaraainstalarLinuxy quenohansidotratadasnivamosatratarenprofundidad.Noloharemos porque desbordara los propsitos de este curso. Por ejemplo unos conocimientos sobre hardware de PC's vendran muy bien pero nos apartaramosdemasiadodelospropsitosdeestecurso. LafacilidadodificultaddelainstalacindeLinuxpuedevariardesdeser algotrivial,oporelcontrariopuederesultarmuydifcildependiendode las circunstancias. Debe tener esto muy presente y conformarse con objetivossencilloslaprimeravezqueintenteinstalarLinux. Sielprimerdaconsigueinstalarunsistemacapazdearrancarydeabrir unasesinaunqueseaenmodoconsolatendrunabuenabaseparair aadiendo mejoras a su sistema poco a poco. No decimos que no se puedanhacermscosaslaprimeravezperonohayqueobsesionarsecon ello. Cuandoinstaledeberteneramanotodaladocumentacindesuequipoy desusperifricos.Quizsnuncaleyesospapeles,peropuedequeahora silosnecesite. Nodebeintentaravanzardemasiadodeprisa.DebedeirasimilandoLinux poco a poco. Cuanto menores son los conocimientos tcnicos ms despaciohayqueempezarporquecuestams. Sisolodisponedeunordenadorlomejorseradejarunapartedeldisco duroparaWindowsyotraparaLinux.Deesamaneraalarrancarpodr elegirconqueSOquieretrabajarynoseverforzadoahacerlotodoen unSOqueinicialmenteleresultarextraoyquizasinclusohostil. ConfiamosenqueconelpasodeltiempoWindowsleresulteanms extraoymuchsimomshostilqueLinux.

334

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

/===============/
Consideracioneshardware Linuxadmiteunaamplsimavariedaddehardwareperolaautodeteccin de hardware est disponible principalmente en algunas distribuciones comerciales como SuSE, Mandrake y RedHat. La autodeteccin de hardware nunca es tan completa como enWindows. Ellos juegan con ventajaenesto. Es importante comprobar que la tarjeta grfica est soportada por la distribucinquevaausar,encasocontrarioesprobablequesoloconsiga unaresolucinVGA.EnlascajasdeSuSE,RedHatoMandrakeviene unarelacinbastanteampliadetarjetasgrficassoportadas. Paraempezarresultamssencillousarunordenadorbaratosinelementos degrandesprestacionesyaserposiblenodemasiadonuevo. LosprocesadorescompatiblesconIntel386oPentiumestnsoportados aunqueseandeotrasmarcas.Lasplacasprincipalesyeltipodememoria tampocosoncrticos.Encuantoalosdiscosdurosycontroladorasque funcionenbajobajoMSDOSsuelenfuncionarensumayoraconLinux. Algunas controladoras SCSI no estn soportadas y otras controladoras SCSI que si estn soportadas pueden suponer una dificultad para una primerainstalacindebidoaquepuedennoestarincluidasenelncleo (kernel)dearranquedelainstalacin.

/===============/
Eleccindesudistribucin Puedequeaunnotengadecididoquedistribucinusar.Siustedquierela mximafacilidaddeinstalacinquizsdeberausarMandrake,SuSE,o RedHatperodadoqueestoformapartedeuncursodeLinuxnosotrosle recomendamosDebian.Debianeslaquetienemayorinterseducativo. 335

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Quizs le cueste algo ms empezar con ella pero tambin aprender muchoms. Evidentemente hay otras consideraciones para le eleccin de su distribucin de Linux. Compararlas en trminos de mejor o peor no resultaadecuado.Nosotrosnovamosabasarelcursoenningunadeellas enparticular.PerovamosahacerunpocodepropagandadeDebian. Alser100%libreeslamsadecuadaparaaprender.Tcnicamenteesla distribucin ms robusta que existe. La actualizacin de los distintos componentesatravesdelaredesmuchomscmodayeficazqueen ningunaotradistribucin.LacomunidaddeusuariosdeDebianestmuy bienorganizadaydanmuybuensoporte. Debian no es para comodones. Hay que leer bastante y hay que molestarseenbuscarlascosas.GnomeyDebiansellevanmuybieny Debianestevolucionandoenelsentidodequecadavezresultarms intuitivayfacildeusar.

/===============/
UtilidadesMSDOS EnmuchasdistribucionesencontrarunosprogramitasensuCDdeLinux que son herramientas para usar desde MSDOS. Son software libre y puedenvenirmuybienparadeterminadascircunstancias. fips20.zip Se usa para dividir una particin en dos sin perder los los datos.Seusamuchoparacrearunhuecoenundiscoparapoderinstalar enelLinux.EstaversinpuedetrabajarconFAT32. gzip124.exeSetratadeunaversindelpopularcompresor'gzip'deLinux paramsdos

336

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

lodlin16.zip PermitearrancarLinuxdesdemsdos.Sepuedeusardesde disqueteodesdediscoduro. rawrite1.zipyrawrite2.zip.Secorrespondenconrawriteversin1.3y conrawrite2.0.Permitencrearundisquetedesdemsdosapartirdeun ficheroquecontengalaimagendeesedisquete.Algunasdistribuciones incluyenunavariedaddeimgenesdedisquetesdearranquescadauno pensado para poder arrancar en distintos tipos de mquinas pero lgicamenteparacreareldisquetedearranqueenunamquinadondeno conseguamos arrancar Linux necesitamos que este programa funcione bajomsdos.Seproporcionanamenudoestasdosversionesporsibienla versin2.0esmsrpidapuedebloquearseenalgunosequipos. unz512x3.exe Estamos poniendo ficheros con extensin .zip. Son ficheroscomprimidosenunformatomuyutilizadoenmsdos.

/===============/
ProgramasdeutilidadparainstalarLinux Lasdistribucionessuelenusarunsistemademensyunosasistentesque leayudanainstalaryconfigurarelsistema.Muchosdeestosprocesos podranrealizarsemanualmentedesdeelinterpretedecomandosyaque selimitanausarunosprogramasqueestninstaladosencualquierLinux. Ahoranoslimitaremosasealarsuexistenciaycomentarparaquesirven. Convienequeconsultelaspginasdelmanualdecadaunodeellos. fdisk(1): Se usa para particionar. Advierta que en msdos existe un programa que tambin se llama fdisk y que sirve igualmente para particionareldisco. mkswap(1):Paraformatearunaparticindeswap swapon(1):Paraactivarlaparticindeswap 337

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

mke2fs(1):ParaformatearunaparticinLinux mount(1):ParamontarelsistemadeficherosElconceptodemontajede ficheroslovimosmuydepasadaeneltercercaptulodedicadoalsistema deficherosyhemospracticadopococonlporquerequerausodela cuenta de root en un momento que no pareca prudente. Repase este captulo si ya no se acuerda. Puede consultar en las pginas man los comandosmount(1),umount(1). Tambinesmuyinteresantequemireelcontenidodesu/etc/fstab.Esun fichero que indica al kernel que es lo que debe montar durante el arranque.Consultelapginamancorrespondientefstab(5).Sieditaeste ficheropuedeespecificarnuevospuntosdemontajeperounerrorpodra hacerqueelsistemanovuelvaaarrancar. Siemprequemodifiquealgodelsistema,dejeunacopiadelficherosin modificarenalgnlado. Porejemplopuededejarcopiasoriginalesficherosterminadasen'.seg'. De esa forma si algo deja de funcionar luego puede recuperar exactamente la situacin original. Lo hemos dicho muchas veces. Asegureseentodomomentolaposibilidaddedeshacercualquiercambio. Conociendotodosestosprogramastendrunaideabastantebuenadelas cosasquevansucediendoduranteelprocesodeinstalacinaunquelos asistentes de instalacin demuchas distribuciones los usarn demodo transparente(demodonoperceptible)mientrasinstalan.

/===============/
Discoderescate Se llaman as a los CDs o disquetes que pueden arrancar Linux directamenteydejanunsistemafuncionandoconunaseriedeutilidades parapodersubsanarproblemasenequiposqueporejemplohanperdidola 338

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

capacidad de arrancar o que no deseamos que arranquen sin subsanar antesalgnproblema. Muchos de los primeros CDs o disquetes de instalacin de muchas distribucionespuedenserusadoscomodiscosderescateenlugardedisco deinstalacin. LosdiscosderescatesonensimismosunSOLinuxenminiaturaycomo es lgico arrancan un kernel predeterminado y montan un sistema de ficherosraz. Dado que se necesita permiso deescritura ynopodemos usarningn discoduroparaelloporquepodranoexistirespacioadecuadoparaello, loquesehaceesmontarelsistemadeficherosrazenundispositivo RAM.DeestaformatenemosunsistemaminiaturaLinuxconmnimos requisitosdehardware. Loquehadehacersemuchasvecesparaarreglarproblemasesmontarlas particionesdeldiscodurodondeseencuentraelficheroquedeseamos modificarygeneralmenteconunsimpleeditorsecorrigeelproblema.Por ejemplo si se olvida uno de la password de root se edita el fichero /etc/passwd eliminando el campo de la password, y de esa forma no pedir password.Essolounaformadehacerlo ylocomentamos solo comoejemplodeusodeunsistemaderescate. Tambin comentamos antesqueuncambio desafortunadoen/etc/fstab podahacerqueelsistemanovolvieraaarrancar.Sugeriamosentonces que dejara una copia del fichero original en algn lado. En este caso despusdemontarlaparticin raizdelsistemaquenoarrancadeber sobreescribir elficheromodificado conlacopia original deseguridad. Despus de cada cambio hay que acordarse siempre de desmontar el sistemadeficheros. Sinodisponetodavadeundisquetederescateytampocodisponedeun CDderescate,deberacrearunocuantoantes.Nuncasesabecuandovaa sernecesariorecurrirael. 339

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ParaellolocalizeenlosCDsdesudistribucinlaimagendeunodeellos quesellamarseguramente'rescue.img','rescue.bin','rescue.raw',oalgo parecido. Puede hacerlo desde MSDOS usando rawrite, o desde linux usandodd. Antesdebermontarlaunidaddecdrom.Generalmentesesuelemontar en'/cdrom/',en'/mnt/cdrom/' oen'/mount/cdrom/'.Vienedeterminado en/etc/fstab.Porelloparamontarlobastarhacer:
$ mount /dev/cdrom $ df

ParaRedhatsera:
$ dd if=/mnt/cdrom/images/rescue.img of=/dev/fd0 bs=1440k

ParaDebianpotatosera:
$ if=/mnt/cdrom/dists/potato/main/disksi386/2.2.16-2000-07-14/images-2.88/rescue.bin of=/dev/ fd0 bs=1440k

/===============/
Lilo Liloesuncargadorquepuedeserinstaladoendisqueteoendiscoduro. En disco duro puede ser instalado en una particin o en en el MBR (Master Boot Record). El MBR es una zona especial del disco muy pequeareservadaparaelarranque. Se puede especificar arranques alternativos para distintos SO como Windows98,Linux,etc...ParaLinuxpodemosespecificararranquescon distintosncleos,yarranquesquemontenelsistemadeficherosrazen 340

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

distintasparticionessiemprequeefectivamenteobtenganunsistemade ficherosrazvlido.Porellosepodraespecificararranquesparadistintas distribucionesdeLinuxinstaladasendistintossitios. Durante el arranque se espera un tiempo para que el usuario pueda especificarelarranquedeseadoypasadoesetiemposearrancalaopcin dearranquequefigurepordefecto. Lilo ofrece muchas posibilidades. Los asistentes de instalacin lo que hacenescrearunficherodeconfiguracindeLilo/etc/lilo.confyluego ejecutanLilo. Si decide intentar alguna modificacin manual de este fichero de configuracindeberejecutardespusLilo.Siolvidahacerlolaprxima vezelsistemanoarrancar.Lomismopasarsitocacualquieradelos elementosqueintervienenenelarranque. PiensequeLiloseinstalaenunlugarmuypequeoenelcualsesitan apuntadoresaunaseriedeficheroscomoelkernel,el/etc/lilo.conf,etc. Sialgunodeestosficherossemuevedesitioosemodificasucontenido, losapuntadoresdeLiloquedarnsealandounlugarequivocadodonde yanoexistelainformacintil. Ejecutando Lilo se vuelve a reconstruir todo y se actualizan esos apuntadores. Esos apuntadores o punteros son datos numricos que expresan posiciones fsicas en el disco en forma de cilindro, sector, cabeza,ydispositivo. PrecisamenteestosapuntadorestienenlimitacionesenmuchasBIOSysi laparticindearranquedeLinuxnoestcontenidantegramentedentro de los primeros 1023 cilindros de su disco duro el sistema puede no arrancar. LinuxsepuedeinstalarenelMBR.Sideseavolveradejarelarranque originaldemsdosqueestabasituadoenelMBRpuedearrancarmsdosy hacer'FDISK/MBR'. 341

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Linuxtambinsepuedeinstalarenunaparticindeldiscoduro.Sipor errorinstalaLiloenunaparticindondetenanWindowsposiblementese pierdalainformacindelosficherosdelsistemadeWindowsydeber transferirelsistemanuevamentearrancandodesdeundisquetemsdosy tecleando'SYSC:'siendoC:launidadquedesearecuperar.

/===============/
Loadlin LoadlinesunejecutableMSDOScapazdecargarLinux. Convieneconocerestaotraformadearrancar.Esunaalternativaalusode Lilo. Para ilustrar su uso pondremos como ejemplo la creacin de un disquetedearranqueconLoadlin. 1. Formatee un disquete desde msdos o Windows incluyendo los ficherosdelsistema.(FORMAT/S). 2. CopieelejecutableLOADLIN.EXEyunkernelenestedisquete. Porejemplovamosasuponerquedichokernellometemosenun ficherollamado'kr3'. 3. Supongamosquenuestrosistemadeficherosrazestsituadoen'/ dev/hda9'. 4. IncluyaunficheroAUTOEXEC.BATquecontengalosiguiente: loadlinkr3root=/dev/hda9rovga=3 Buenosimplementeconestotieneundisquetedearranquequenousar LilosinoLoadlin.Susistemadeficherospodrestarencualquierparte deldiscodurosinlalimitacindelos1023cilindros.

/===============/
LaSwap

342

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Unadelascosasquetendrquedeterminareslacantidaddeswap.Ya hemos vistoenlaleccin anteriorelconceptodememoria virtual.La swapeslapartedeldiscodestinadaalintercambiodepginasdememoria deRAM. Generalmentesesueledimensionarlaswapconeldobledetamaoquela cantidad de RAM disponible. De esta forma la memoria virtual funcionar sin detrimento de velocidad. En el casode que el total de memoriaresultanteRAM+SWAPnoalcanceparapoderejecutaralguna de las aplicaciones necesarias sepodrsobredimensionar la SWAP a costadereducirunpocosurendimiento. Enelcasodetenervariosdiscos,convienerepartirapartesigualesla swapentreellosparaquetodoslosdiscoscolaborenporigualalproceso depaginacin.Estonoesimprescindibleperoesteprocesoesunodelos quemsrepercuteenlacapacidaddetrabajodetodosusistema. Laparticindeswapserlapartedesusistemaquetengamayornmero deaccesosyporellotampococonvieneponerlaenunextremodeldisco alejada de los sistemas de ficheros en uso. Esdto obligara a hacer desplazamientosmayoresalascabezasdeldiscoyseperderavelocidad. Enrealidadtodoestosoncosasquenotienenexcesivaimportanciaenun ordenadorquenovaatenerdemasiadacarga.Ensuprimerainstalacin no debe preocuparle demasiado estas cosas. Ya dijimos que no pretendemos hacer un curso de administracin sino un curso de autosuficienciaparausuariosdeestacionesdetrabajo.Paraequiposcon muchosusuariosograndesservidoressiserconvenienteafinarloquese puedaalahoradeestablecerlacantidadylalocalizacindelaswap.

/===============/
Particionado

343

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Esposiblequesudistribucinlefacilitelalabordeparticionadodeldisco duroperonoestdemsunpocodeinformacinsobreesto. Cadatipodedispositivousauncontroladorqueenelcasodelosdiscos durosson'/dev/hda'paraelprimerdiscoIDE'/dev/hdb'paraelsegundo discoIDE,'/dev/sda'paraelprimerdiscoSCSI,etc.. ConcretamentelosdiscosIDEserndelaforma'/dev/hd[ah]',losdiscos SCSIsern'/dev/sd[ap]',losESDIsern'/dev/ed[ad]',paralosXTsern '/dev/xd[ab]'. Lasparticionesseusanaadiendoelnmerodelaparticinaldispositivo. Porejemplo'/dev/hda1/'serlaprimeraparticindelprimerdiscoIDE. Comomximosepodrntenercuatroparticionesprimariasenunmismo disco. Si fueran necesarias ms,habra queusarunaparticin detipo extendida.Sobreestasepuedenestablecervariasparticioneslgicas. Laprimeraparticinlgicaserlanmero5porqueloscuatroprimeros nmeros de particin se reservan para su posible uso en particiones primarias.Tampocosepuedeusarmsdeunaparticinprimariadetipo extendidoaunquepuedesercualquieradela1ala4. Porejemplopodramostenerenunaprimeraparticinprimariaunsistema operativoWindowsyunasegundaparticinprimariadetipoextendido, particionadaasuvezen5partes.Deellasunadeberserparamontarel sistemadeficherosraz(root,'/')queconvieneseadetipoLinuxyotra paraelreadeintercambio(swap). Elrestodelasparticionessepuedenusarparaloqueguste.Porejemplo para montar '/usr', '/var', '/boot', '/tmp' o '/home', etc. Estos cinco directorios son buenos candidatos para ser separados en particiones distintas,perodarunasindicacionesgeneralesparadeterminarelespacio necesarioresultacomplicadoyaquedependedeltipodeusoquetengael sistema.

344

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Por el contrario tambin se puede optar por montar todo en una sola particin queserlaparticinraz.Porsusencillezdeberaconsiderar hacerloasensuprimerainstalacin.Noesloidealperotampocohayque serambiciososlaprimeravez. Por otra parte con una sola particin se aprovecha mejor el espacio cuandotenemospocodisco.Laprincipaldesventajaesquelaparticin razquedarmuygrandeyesoaumentaelriesgodeproblemasenuna particinqueconvienesealomsseguraposible. Paraminimizaresteefectoesparaloqueseusaeldirectorio/bootquese destinaacontenernicamentealgunosdeloselementosmsimportantes que intervienen durante el arranque como por ejemplo el kernel. Idealmente sera una particin muy pequea con unos 20MB que no crecernuncayqueharmenosprobablequequeunerrorenelsistema deficherosrazafectealarranquedelsistema,locualsupondraunmayor esfuerzopararecuperarelsistema. El tema del particionado se puede dejar en manos de los distintos asistentes que usan algunas distribuciones los cuales ya sugieren las particionesylostamaosmsomenosadecuadosenfuncindeltipode instalacin, pero es mejor tener las ideas claras y partir ya con una situacinadecuadaantesdemeterundisqueteoCDdeinstalacinde Linux.Nosreferimos adejarlibrelosespaciosadecuados ensudisco duro,yrepartidosenlasparticionesquepensemosusarantesdeempezar ainstalarLinux. Vamosaresumirloscasosmsfrecuentessimplementeparaquetenga unaideageneral.

InstalarLinuxenunPCconunsolodiscoduroenteropara Linux.Eslomssencillo.Puedeempezarcontodoeldiscolibrey sinparticionar.

345

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

InstalarLinuxenunsegundodiscoduroenteroparaLinux dejandoelprimerdiscoparaWindows.Estansencillocomoel casoanterioraunquedeberidentificarlosdispositivos. Lanomencaturadelosdiscoseslassiguiente:


o o o o

hdaprimercanalmaestro. hdbprimercanalesclavo. hdcsegundocanalmaestro. hddsegundocanalesclavo.

Sinosabecomoestconfiguradosuhardware.Puedearrancarun discoderescateLinuxydesdeunaconsolateclear'fdiskl'Con ello obtendr un listado completo de los discos y particiones presentesensusistema.

Instalar Linux en un disco duro que ya tiene instalado Windows. Entre en Windows. Desactive cualquier tipo de antivirusporquesueleninstalarsealfinaldeldiscoynosepuede mover compactando. Compacte el sistema de ficheros con la opcindemximacompresin.Estodejartodoslosficherosenla primerapartedeldiscoduroyelrestoquedalibre.Obtengael programafipsparaWindowsdesdealgnCDdeLinux.Esuna utilidadquedivideunaparticinexistentepordondeindiquemos. Antesdeusarloconvienesalvarelcontenidodeldiscoporsilas moscas.Useunaversinmodernadefips.Leaconatencinlas indicaciones.CuandoterminetendrunaparticinconWindows deltamaoqueustedindiqueyotraparaLinux.Entreenelfdisk deWindowsyborrelaparticindondedeseeinstalarLinuxyya puedeprocederainstalarLinux. Instalar Windows y Linux en un PC que no tiene nada instalado. Haga una particin para Windows dejando espacio libre para Linux. Instale primero Windows y luego contine instalandoLinux.

346

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

/===============/
CompatibilidaddelhardwareconLinux Generalmenteparainstalartodaslasdistribucionesincluyenunooms ncleos para arrancargeneralmente bastante grandesymuycompletos para poder soportar una variedad de hardware suficientemente amplia parasoportar unagranvariedaddedispositivos hardwareyasnodar problemasenlainstalacin. Noobstantelaextraordinariavariabilidaddecomponenteshardwarepara PC disponibles en el mercado hacen imposible contemplar todas las situacionesposibles.Elsoportedeestosdriversporelmomentonosuele serfacilitadoporlosfabricantestalcomoocurreenWindowssinoquees producto del trabajo desinteresado de mucha gente que colabora desarrollando estos drivers para Linux muchas veces con la gran dificultaddenodisponerinformacindelfabricante. Prcticamentesevenobligadosaunalabordeinvestigacinmuycostosa. Todo eso explica que los dispositivos ms sofisticados y los ms modernosseanlosquetienenpeorsoporteenLinux.Estasituacinest cambiando y ya hay algunos fabricantes que empiezan a dar la informacin necesaria para desarrollo de drivers no desarrollados por ellosgeneralmenteparaWindows. SialgnelementodesuhardwarenofuncionaconLinuxpuededebersea queestmalconfiguradoycambiardedistribucinpodranoservirde grancosa.Cuandoalgoasocurrapiensequeestoleofrecelaoportunidad deaprendercosasnuevas. Tendr que investigar el tema y cuando consiga dar con la solucin posiblementehabraprendidounaseriedecosasdegranintersparauna variedaddesituacionesdistintas.Losprimerospasossonsiemprelosms costosos.

347

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Linuxnoestsiendousadoexclusivamenteporgursyhackers.Linux est siendo usado por una cantidad enorme de personas que han compensado su carencia de conocimientos tcnicos con tan solo un poquitodepaciencia.AdiferenciadeWindowsnohaysecretos.Todala informacinqueustedpuedallegaranecesitarestasualcance.Cada distribucinvieneconsumanualdeinstalacin. EnelcasodeDebianyotrasesemanualvieneenformatoelectrnico pero conviene sacarlo a papel y dedicar algo de tiempo a su estudio. Tambinsuelevenirenesemanualoenlamismacajadeladistribucin una relacin del hardware soportado. Piense que el soporte para el hardwareescasisiempreindependientedeladistribucinysolodepende delaversindelkernelqueseestusando.EnelcasodeDebianlos primeros captulos son de inters general con independencia de la distribucinqueuseytambinestdisponiblegratuitamente. 1. 2. 3. 4. QueesDebian(yqueesGNU/Linux) Requerimientosdelsistema Antesdeempezar Particionadodeldiscoduro

TambinpuedeconsultarelmanualdeLinuxPrimerospasos.Quepuede obtenerdesdeLuCAS,lugarqueanteriormenterecomendamos.

/===============/
ElKernel ParaqueLinuxreconozcatodoslosdispositivosdelsistemadeberestar compiladoconlasopcionesadecuadas.EnelcasodeLinuxelkerneles ungranprogramayloquellamamosdriverssolosontrozosdecdigode estegranprograma.Estediseosedicequeesunkernelmonoltico. Linux permite que partes de este gran programa no estn permanentementeenmemoriaRAM.Estaspartessonlosmdulosyse 348

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

corresponden con drivers que se cargan en el momento que el kernel necesita su uso. Esta carga y descarga es muy rpida y por ello dispositivosquenoseusancontinuamentecomo,impresoras,lectorasde CDs,disqueterasetc..convienenestnconfiguradascomomdulos. ParaconfigurartodohadecompilarseelncleoenunsistemaLinuxque ya est funcionando y nosotros no vamos a tratarlo ahora. Si un dispositivonofuncionahabrquecomprobarenprimerlugarsihasido correctamentereconocidoporelkernel.Estoocurreduranteelarranquey elkernelvamostrandolainformacindetodoslosdispositivospresentes en el sistema que es capaz dereconocer. Paravolver aconsultar esta informacindespusdearrancarsepuedeusarelcomando'dmesg|less'. Nosocuparemosdelacompilacindelkernelenotrocaptulo.

/===============/
Consejosfinales No resulta razonable empezar instalando una gran cantidad de cosas distintas.Empieceinstalandolospaquetesimprescindibles.Luegopodr iraadiendootrascosas,pocoapocoysacandocopiasdeseguridadantes deaadiroquitarpaquetes.Piensequeunospaquetespuedendependerde otrosoentrarenconflictosconotrosyquizsnosedecuentadequeest modificandoalgoquenecesita. Una vez obtenida una primera instalacin que funcione aunque falten cosas por configurar deber avanzar despacio pero seguro. Es decir recurra a las copias de seguridad estableciendo puntos a partir de los cualespodrrecuperarlasituacinparanotenerqueempezarcadavez desdecero. Tambin es bueno ir apuntando las cosas que se van instalando y configurandolaresolucindeproblemas,etc..Todoelloparafacilitarlas cosasencasodetenerquevolveraempezar,delocontrarioelesfuerzo enconfigurarsusistemasepuedeperder. 349

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

LaprimeravezqueinstaleLinuxnodebepensarenellocomounmero trmiteparaempezarahacercosas.Piensequeesunprocesofraccionado endistintasetapasyquecadaetapatienecomopremioelpoderdisfrutar deunsistemacapazdehacercadavezmsymscosas.

/===============/
Documentacinadicional Este documento fu pensado para ayudar a los usuarios con menos conocimientos y menos recursos tcnicos a tener xito en su primera instalacindeLinux.Eltemaesamplsimoyhaymuchadocumentacin alrespecto. Porellonos hemos limitado ahacerunasconsideraciones generales.Noobstantehayunagrancantidaddedocumentacindegran utilidadparatemasdeinstalacinyconfiguracindeLinux. Paraobtenerdichainformacinlerecomendamosquevisite.Laspginas deLuCAScongrancantidaddedocumentacinenespaololaspginas de LDP (LinuxDocumentatinProject)destinadasacentralizartodala documentacindeLinuxentodoelmundo. Enelcasodequetengaunadificultadespecficaconalgndispositivoo conalgunaconfiguracinconcretadealgnsusbsitemapuedeencontrar granayudaenunaseriededocumentoscortosmonogrficosdeenfoque prcticodenominados"Howtos"o"Comos"quepodrencontrarenlos lugaresqueacabamosdeindicarle. Paraalgunoscasosconflictivosrelativosalhardwaredesuequipopuede consultarladocumentacindesukernel.'/usr/src/linux/Documentation/'

/===============/
Asistenciagratuitaenlistasdeusuarios

350

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Existen listas de correo en las cuales podr obtener respuesta a sus preguntas sobre Linux. Realmente funciona en la prctica como un serviciodeasistenciagratuitodegrancalidad. Nodebetenerreparoapreguntarsiemprequecomprendaquehayque respetarlasnormasdelalistayqueeltiempodelosdemsesvalioso.Por ellonodeberanuncapreguntarcosassinconsultaranteslaspginasdel manualyotradocumentacinadicionalqueacabamosdemencionar. Seasumequenovaapreguntarporsimplecomodidad,sinoporqueha buscadoynoaencontradolarespuesta. EnEspaalalistadeconsultastcnicassobreLinuxengeneralesllinux. Parasuscribirseodesuscribirseseenviaruncorreoelectrnicoconun comandoqueserrecibidoporunservidorperonoserledoporninguna persona sino interpretado por un programa que en este caso se llama Majordomo.
$ # Para suscribirse $ echo subscribe l-linux | mail majordomo@calvo.teleco.ulpgc.es $ # $ # Para borrarse $ echo unsubscribe l-linux | mail majordomo@calvo.teleco.ulpgc.es FIM

Recibir una contestacin automtica y con ello recibir todo el correo de la lista. Cada vez que alguien enva un correo a la lista

351

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

todos los miembros recibirn una copia del mensaje. La lista l-linux se modific hace poco y desde entonces hay que estar suscrito para poder enviar mensajes. Esto se hizo para combatir en lo posible el uso de SPAM y el envo de mensajes annimos molestos.

Desde entonces la calidad de la lista ha mejorado bastante. Otras listas pueden tener un funcionamiento ms abierto admitiendo cualquier mensaje, y otras por el contrario pueden tener un comportamiento ms restrictivo.

Concretamente algunas se llaman listas moderadas y solo se admite un mensaje si una persona llamada moderador considera que es un mensaje oportuno.

352

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Conviene leer atentamente las normas de uso de la lista y atenerse a ello. Hay gente que no respetan las normas. Incluso hay algunos que envan un mensaje admitiendo que est fuera de la temtica de la lista en tono de disculpa anticipada, pero estas cosas se suelen considerar abusos y pueden provocar fuertes discusiones en la lista. Concretamente l-linux es una lista que recibe y enva muchos mensajes.

Hay otras listas especficas para otras distribuciones o para temas mucho ms especializados.

353

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

TERMINALES
Queesunterminal En Linux y otros SO similares se considera la posibilidad de que un ordenadortengavariosusuariostrabajandosimultneamente. Cadadispositivoquepermiteaunusuariointeractuarconunamquinase lellamaterminal.Hayterminalesdeentradacomoporejemplounlector de cdigo de barras, los ya obsoletos lectores de tarjetas perforadas, terminales salida como por ejemplo una impresora, y terminales de entradasalidacomolosclsicosterminalesdepantalla. Hayotrasmuchasclasesdeterminales.Porejemplohayterminalespara personasciegas,peroeltipomsutilizadoeselformadoporpantallay teclado. Dentrodeestacategora haycientos demodelos distintos.En LinuxyenotrosSOtipoUnixsecontemplalaposibilidaddetrabajarcasi concualquiertipodeterminal. La palabra tty usada para designar los dispositivos que controlan los terminales viene de TeleTYpe (teletipo). Los primeros terminales no tenanmonitor.Eransimplesyprimitivosteletipos. EnunPClapantallayeltecladosonperifricosqueseconectandeforma independientealordenador,peroenordenadoresgrandeslosterminales depantallaytecladosonuntodoquesecomunicaconelordenadorpor unnicocable.Porejemploatravsdeunpuertoserie.Porestoscables lo que circulan bytes correspondientes a los caracteres intercambiados entreelterminalyelordenador.Antesdequesurgieranlosordenadores personaleslonormaleraqueelordenadorestuvieraenuncuartocercano alasaladeterminalesdondelosusuariossesentabanatrabajar.

354

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Podemosverenla figuraunconjunto formado por oordenador centralyunaserie de ordenadores conectadosal. Estos terminales que acabamos de mencionar aun se usanhoyenday no son simples conjuntos de tecladoymonitor. Tienen cierto gradodeautonomalocualpermiteliberaralordenador centraldeunapartedeltrabajoyaqueenlugardeatenderlasentradas tecla a tecla, lo har lnea a lnea. La pantalla de un terminal no es simplementeunmonitoryaquesuelectrnicaesmscompleja.Entresus circuitos electrnicos dispone de una memoria. Esta guarda la informacinhastatenerlalneacompletaqueademspuedesereditada sinqueenesointervengaelordenador.Lapantallaencambiomuestralos caracterestecleadosamedidaquesevanintroduciendo.Poresoloque vemosenelterminalquizsnohasidotransmitidoanalordenador.En realidadlamemoriadelterminalcontendrnosoloelbufferdelteclado sinotodoelcontenidodelapantalladelterminal.Estoesnecesariopor variasrazones.Unadeellaseslaposibilidaddehacerscrollverticalyotra pararecuperarlainformacindetodalapantallaencasonecesario. Terminalesvirtuales Sihapasadoloanteriorporaltopensandoquenotienequeverconsu casoportrabajarconPCs,vuelvaaleerlosprrafosanterioresporqueen unPCqueuseLinuxunasesindeconsolacomolasqueestamosusando

355

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

enestecurso,funcionardeformamuysimilarporserunasimulacinde estetipodeterminales. En Linux existe una emulacin de varios terminales sobre un nico monitor.Sedenominanfrecuentementeterminalesvirtuales.Paracambiar de un terminal virtual a otro pulsaremos <Alt><F1>, <Alt><F2>, <Alt><F3>,etc.Conellotendremos accesoalosterminales /dev/tty1, /dev/tty2,/dev/tty3,etcrespectivamente.Encadaunodeestosterminales puedemantenerseunasesindetrabajodistinta. Escomosituviramosvariosterminalesfsicosdistintosformadospor monitor, teclado, altavoz, memoria, ycable deconexin al ordenador, pero solo pudiramos usar uno de ellos en un momento dado. La informacin de cada terminal virtual se encuentra almacenada en dispositivos/dev/vcsperonoesaccesibleparausuariosnormalitos. Dispositivoscontroladoresdeterminales Cadaterminalvirtualestgestionadoporuncontroladordedispositivo.Si ejecuta el comando 'tty' obtendr el nombre del controlador que est usando.
$ tty /dev/tty3

Bueno/dev/tty3seraelnombredelterminal.Ustedpuedeobtenerotra cosaperovamosasuponerquesuterminalfueraeste.
$ echo "hola" > /dev/tty3

Sacarelmensaje"hola"enlapantalladesuterminal.Siintentahacer estomismosobreotrodispositivo,porejemplo/dev/tty2deberaaparecer elmensajeenlapantalladeotroterminal.Normalmenteestonosucedea

356

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

noserque/dev/tty2tambinestfuncionandoconsuusuario.Conestose evitaqueunusuariopuedamolestaraotro. Losterminalesvirtualesestnnumeradosdel0al63.Paravercualesel nmerodelterminalactualtambinsepuedeusar'fgconsole' Hayotrostiposdeterminales.Sondispositivosdetipocarcteryhayun montndeellosdisponibles.


$ ls /dev/*tty*

Existeundispositivoespecialqueparacadausuariosecomportacomosi fuerasupropiocontrolador.
$ echo "hola" > /dev/tty

Estosacaunmensajeenlapantalladesupropioterminalexactamente igualqueelelcasoanterior.Estopuedesertilparausarloporejemplo en scripts que pueden tener ambas salidas (estndar y de errores) redirigidas a ficheros pero deseamos que determinado mensaje salga siempreporlapantalla. Existe otro dispositivo especial llamado consola /dev/console. Este dispositivo suele encontrarse prximo alamquina yporelsalen los mensajesdelsistema.Seasumequeestepuestodetrabajoesusadoporel administradordelsistema. Laconsolaestasociadaa/dev/tty0quealigualque/dev/ttyesunalias determinalvirtualactualperopuedentenerpermisosdistintos. Vamos a hacer algunas pruebas y vamos a suponer que su sesin de trabajo con bash utiliza el tty3. Compruebe cual es su caso con el comando'tty'yencasodeserdistintatngaloencuentacadavezque hagamos referencia al tty3 o a <Alt><F3>. Usted deber usar lo que 357

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

correspondaensucaso.Tambinpuedepasarsealtty3paracontinuarla leccin. Primerovamosacomprobarladisponibilidadylospermisosdeunttyque casisiemprequedalibre.Eltty12.


$ ls -l /dev/tty12 crw-rw-rw- 1 root /dev/tty12

tty

4, 12 ago 29

2000

Aquloimportanteescomprobarquepodemosusareseterminalyque tienepermisosdelecturaescritura. Siesto no esashabraquemodificarlospermisos oinclusocrearel dispositivoparapoderhacerlaprcticaperoesorequiereprivilegiosde rootynossaldramosdelospropsitosdeestecurso. Vamosaprobarsipodemosescribireneltty12. Siustedhace'echoxxxxx>/dev/tty12'yluegopasaalterminaltty12con <Alt><F12>verquenopuedehacernadaenlperolas'xxxxx'aparecen enlapantalla. Vamosaprobarsipodemosleerdeltty12. Haga'cat</dev/tty12'desdesusesindetrabajoyluegopasealterminal tty12con<Alt><F12>eintroduzcaunacadenasinusarlatecla<Intro>. Porejemplo'yyyyyyyyyyyy'. Sivuelvealtty3con<Alt><F3>comprobarqueelcomandocatcontinua esperandorecibirdatosperoaunnoharecibidoningncarcter.Larazn esquelacadena'yyyyyyyyyyyy'seencuentratodavaenlamemoriadel terminaltty12ytodavanosehaenviadounsolocarcteralordenador. Elmodonormaldefuncionamientodelosterminalesdetextoeseste.En lugardeenviarcaracteresaisladosenvanchorrosdecaracteres. 358

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Vuelaaltty12con<Alt><F12>ypulse<Intro>.Inmediatamentevuelvaa tty3con<Alt><F3>ycomprobarquecatacabaderecibirlacadenade caracteres.Parafinalizarcatinterrmpalocon<Ctrl+C>. Sialgunadeestasdospruebasdelecturaoescrituranohafuncionado posiblemente se deba a unos permisos demasiado restrictivos o a una diferenteconfiguracinensuequipoyesosuponequetendrdificultades parapracticarestaleccinperonosotrosvamosairexplicandotodolo quesucedeencadaprctica. Sesindetrabajoenunterminal(getty) Repasemosunpococosasqueyacomentamos enleccionesanteriores. Hay un fichero de configuracin '/etc/inittab' que durante el arranque activar un programa llamado 'getty'. Este mandar un mensaje a la consola en espera de que alguien introduzca su nombre de usuario. Cuandoestosucede'getty'haceunexecalprograma'login'conelnombre de usuario obtenido y login solicitar la password. Si la password es correctaloginharunexecalashell. Estoyalovimoscuandohablamosdelosprocesosysirecuerda'exec'es unallamadaalsistemaquecambiaelcdigodelprogramaqueseest ejecutandosincambiarsuPID.Cuandolashelltermine,elproceso'init' detectarlamuertedesuprocesohijoyarrancarunnuevo'getty'porque en'/etc/inittab'estosprocesosfiguranenmodorespawn.Tambinfigura elnombredeldispositivoylavelocidaddecomunicacin. Los terminales que no tengan entrada en este fichero /etc/inittab no estarndisponiblesparaunasesindetrabajoenmodoconsolaperoeso no quiere decir que sean intiles. Por ejemplo si en /etc/inittab solo aparecenlosterminalesquevandesdetty1atty6solopodrabrirestos seisterminalesvirtualesperosisearrancanlasXwindowsloharnenel primerterminaldisponiblequeenestecasosereltty7. Esteesuncursodeusuarioyapesardequeaestasalturasdelcursose explicancosasalgoavanzadasnopretendemosensearleaadministrarel 359

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

sistema. En particular le advertimos que no debe intentar modificar /etc/inittabaunquedispongadecuentaderootsinosabeexactamentelo queesthaciendo,porquesusistemapodranovolveraarrancar. 'getty'esunprogramanormalquenorequiereprivilegiosespecialespara serejecutado. Laprcticaqueponemosahorasoloserposiblesisupuestodetrabajoes unPCconLinux.Siesttrabajandoen unterminal independiente del ordenador central no podr hacerlo. Si la prueba de enviar 'xxxxx' al terminaltty12nofuesatisfactoriatampocopodrhacerestaotraprueba. Localicegettyconelcomandolocateporejemplo.Supongamosquelo encuentraen'/sbin/getty'. Mireen/etc/inittablapartedondeaparecegetty.
$ cat /etc/inittab # <id>:<runlevels>:<action>:<process> 1:2345:respawn:/sbin/getty 38400 tty1 2:23:respawn:/sbin/getty 38400 tty2 3:23:respawn:/sbin/getty 38400 tty3 4:23:respawn:/sbin/getty 38400 tty4 5:23:respawn:/sbin/getty 38400 tty5 6:23:respawn:/sbin/getty 38400 tty6

Supongamosquefiguraloqueacabamosdeponer.respawneslaaccin realizadaporinit.Significaenestecasoejecutaryvolveraejecutarcada vez que termine. /sbin/getty es el programa que abrir el terminal. El primerparmetrodespusdegettyeslavelocidaddetransmisin(eneste caso38400),yelltimoparmetroeselterminal. Nosbasamosenestainformacinparalanzargettysobreeltty12:
/sbin/getty 38400 tty12

360

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Comprobarqueaparentementeelprogramanotermina.Paseahoraal terminaltty12con<Alt><F12> Ver que 'getty' ha abierto una sesin en ese terminal. 'getty' esta funcionando sin ningn problema. Introduzca su nombre de usuario y ver que login no es tan permisivo. Dar un mensaje de error no reconociendo a su padre como un padre legtimo. Para evitar usos extraosdeloginseterminasuejecucin.Volviendoalasesindonde arrancogettyverqueestetambintermin. Esteintentofracasadonoquieredecirquenosepuedaabrirunasesinde trabajoenunaconsolaquenoestcontroladapor'getty'.Solosignifica que'login'esunvigilantecelosodelaseguridaddelsistema,yhemos intentadousarlodeunamaneranoconvencional. Nosolosepuedeabrirunasesindetrabajoenunaconsolaquenoest controlada por 'getty' sino que adems es muy fcil y no requiere permisos especiales. Para abrir una sesin en el /dev/tty12 basta con ejecutar 'openvt c 12 bash' y esto lo comentamos simplemente como curiosidadparaquelopruebesiquiereperonomerecemsexplicacin enestemomento. Todaestaprcticaunpocorarapretendequecomprendacomofuncionan lascosas.Eltemadelosterminalesesbastanteamplio. Lalibrerancurses Novamosaaprenderausarestaslibrerasporqueestenoesuncursode programacinperoesunalibreramuyimportanteyencontrarmontones de referencias en el manual de Linux a estas pginas. Resulta imprescindible comentar algo de ncurses para comprender el comportamientodealgunasaplicaciones. Yahemosdichoquehaymuchasclasesdeterminalesyqueinclusoun determinadotipodeterminalfsicopuedefuncionardeformasdistintas, emulandounosterminalesaotros.Cadaterminaltienesupropiolenguaje 361

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

decomandosquenosonotracosasdesecuenciasdecaracteresasociadas adeterminadasacciones.Porellounaaplicacindebeconocerconque terminalesttratando. Las aplicaciones hacen esto usando una librera intermedia que se encargardetraducircadaaccinalasecuenciadecaracteresadecuada. Estalibrerasellama'curses'osuversinmodernallamada'ncurses'.La aplicacindebedeserinformadadeeltipodelterminalconelcualest trabajandoyesosehaceatravsdelavariableTERM. Siustedconsulta(hgalo)elvalordeestavariableseguramenteobtendr 'linux' que es el nombre del terminal que linux usa por defecto. Hay muchostiposdeterminalesycadaunotienesunombre.Porejemplosi ustedejecutaTERM='vt100';exportTERM;Laaplicacinqueseejecute acontinuacinpuedepensarquetienequedialogarconunterminaltipo 'vt100'. Bueno algunas aplicaciones no hacen esto. Directamente asumen que funcionarnenundeterminadotipodeterminalyporellonousannila variableTERMnilalibreracurses.Porejemplolscolor=autoasumir siemprequeelterminalesunterminal'linux'yenviardirectamentelas secuenciasdecaracteresapropiadasparaunterminal'linux'aunqueexiste unficherodeconfiguracinmsquenadaparapoderponerelcolorque uno quiera a cada cosa. Puede probar a cambiar la variable TERM y comprobarqueloscoloressalenperfectamente. Porelcontrariolautilidad'less'siusa'ncurses'selaponiendolavariable TERM=att4424ycomprobarquelaaplicacinsecomportadeunmodo extrao.EncambiosiusalavariableTERM=vt100.Secomportarde formacasinormalporqueelterminal'vt100'yelterminal'linux'tienen algunassimilitudes.Enrealidadvt100(DEC)esuntipodeterminalmuy conocido,yelterminaldelinuxderivadel. Hemoselegido'ls'y'less'porquenosuponenunpeligroencasodeuso incorrectoperosiintentahacerestoconotroprogramacomoporejemplo 362

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

uneditorpodradestruirunficherodebidoaldesconciertoorganizadoen supantalla. Lalibreracursesaccedeaunabasededatosdeterminales (terminfo) dondeseestablecenlacapacidadesdecadaterminal. Siustedesttrabajandoconlinuxenunterminalquenoesdetipo'linux' notarquealgunasaplicacionesnovanbien.Laformadearreglarloes cambiarlavariableTERMconelvalorapropiadoasuterminalyaspor lo menos las aplicaciones que usen curses volvern a funcionar perfectamente. ElterminaldeLinux Las capacidades del terminal de linux son muy variadas. Manejo del cursor,borradodepartesodelatotalidaddelapantalla,coloresyotros atributos, pitido del terminal, configuracin de la pantalla en filas y columnas, guardar posicin del cursor, etc.. Las pginas del manual anteriormente mencionadas tratan de todo esto y la cantidad de posibilidades es tan grande que nos limitaremos a poner algunos ejemplos. Paraconocereljuegodecaracterescompletoycaracteresdecontrolque tieneunterminallinuxconsulteenlaseccin7delmanuallaspginasde ascii(7)eiso_8859_1(7).Paraunarelacindelassecuenciasdecontrol consultelapginaconsole_codes(4). Antesquenadaconvienesaberqueelterminalpuedequedarenunestado que resulte muy difcil de usar. Si eso llega a ocurrir teclee '<Intro>reset<Intro>' y con un poco de suerte todo volver a la normalidad.Pruebeahoraestecomandoparaasegurarsedequedispone deelantesdehacerlapruebasiguiente.
$ reset

363

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html Erase is delete. Kill is control-U (^U). Interrupt is control-C (^C).

Semuestralaconfiguracinpordefectodealgunosparmetrosqueluego explicaremoscuandohablemosdestty. Vamosahacerunapruebaalgodelicada.Vamosaenviaruncarcterde controlalterminalquelodejarenunestadobastantelamentablepara trabajarconl,paravercomosepuederecuperarunasituacindeeste tipo. Vamosaenviarun<Ctrl+N>peroparaellohayqueusarunasecuencia de escape idntica a la que se vio en el captulo del editor 'vim'. Concretamente la secuencia para introducir el <Ctrl+N>, ser <Ctrl+V><Ctrl+N>.Estoaparecercomo^N.Antesquenadacmbiese aldirectorio'/tmp'dondenopodremoshacermuchosdestrozos.Despus deenviar el'^N'alterminal nopodremos verloquehacemos porque saldrncaracteressemigrficosenlugardeletras.
$ cd /tmp $ echo '^N'' $FIN

Ahoraolvidesedelmonitorporunmomentoyhaga<Intro>reset<Intro>. Sesuponequehabrfuncionadobien.Encasocontrarionoseaceptan reclamaciones.Disponeusteddeotrosterminalesvirtualesenotrosttys as que si un terminal noserecuperapuedeusarotros.Convieneque aprendaarecuperarestassituaciones. Vamos a hacer un programita que usa las secuencias de escape del terminaldelinux.Laexplicacinlapuedeconsultarenconsole_codes(4). Editeunficheroquellamaremos'pru_console_codes.bash'.

364

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html function muestra(){ # echo -e "\033[${POSY};${POSX}H" # Manda el cursor a $POSY $POSX let POSY=POSY+1 ; echo -e "\033[${POSY};$ {POSX}H\c" echo -e '\033[30mNegro\c' let POSY=POSY+1 ; echo -e "\033[${POSY};$ {POSX}H\c" echo -e '\033[31mRojo\c' let POSY=POSY+1 ; echo -e "\033[${POSY};$ {POSX}H\c" echo -e '\033[32mVerde\c' let POSY=POSY+1 ; echo -e "\033[${POSY};$ {POSX}H\c" echo -e '\033[33mMarron\c' let POSY=POSY+1 ; echo -e "\033[${POSY};$ {POSX}H\c" echo -e '\033[34mAzul\c' let POSY=POSY+1 ; echo -e "\033[${POSY};$ {POSX}H\c" echo -e '\033[35mRosa\c' let POSY=POSY+1 ; echo -e "\033[${POSY};$ {POSX}H\c" echo -e '\033[36mCeleste\c' let POSY=POSY+1 ; echo -e "\033[${POSY};$ {POSX}H\c" echo -e '\033[37mBlanco\c' } typeset -i POSY ; typeset -i POSX echo -e '\033[2J\c' # Borrar pantalla echo -e '\033[1m\c' # Atributo Brillo POSY=1 ; POSX=16 ; echo -e "\033[${POSY};${POSX}H\c" echo -e '*Brillo*\c'; muestra echo -e '\033[2m\c' # Atributo Semi brillo POSY=1 ; POSX=31 ; echo -e "\033[${POSY};${POSX}H\c" echo -e '*Semi Brillo*\c'; muestra echo -e '\033[0m\c' # Atributo normal echo -e '\033[5m\c' # Atributo Intermitente POSY=1 ; POSX=46 ; echo -e "\033[${POSY};${POSX}H\c" echo -e '*Intermitente*\c'; muestra echo -e '\033[0m\c' # Atributo normal

365

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html echo -e '\033[7m\c' # Atributo Inverso POSY=1 ; POSX=61 ; echo -e "\033[${POSY};${POSX}H\c" echo -e '*Inverso\c'; muestra echo -e '\033[0m\c' # Atributo normal POSY=1 ; POSX=1 ; echo -e "\033[${POSY};${POSX}H\c" echo -e '*Normal*\c'; muestra echo -e echo -e POSY=12 echo -e echo -e echo -e echo -e POSY=12 echo -e '\033[5m\c' # Atributo intermitente '\033[7m\c' # Atributo Inverso ; POSX=1 ; echo -e "\033[${POSY};${POSX}H\c" '*Inverso+Intermitente\c'; muestra '\033[0m\c' # Atributo normal '\033[5m\c' # Atributo intermitente '\033[1m\c' # Atributo brillo ; POSX=26 ; echo -e "\033[${POSY};${POSX}H\c" '*Brillo+Intermitente\c'; muestra

echo -e '\033[0m\c' # Atributo normal echo -e "\033[25;1H\c"

Elprogramaterminaponiendoelatributonormalperorecuerdequesi algosalemalyelterminalquedaenunestadopocooperativodeber recuperarloconelcomandoreset.Unavezdichoestopongapermisode ejecucinaesteficheroyejecutelo. Podr comprobar como sale la informacin con distintos colores y atributos.Paraellohemosusadosecuenciasdecaracteresespecificasde losterminaleslinuxyquepodrannofuncionarenotrosterminales. Controldeunterminal(setterm) Paracambiarlosatributosdeunterminalcualquieraseusasetterm(1)que utilizar la variable TERM para identificar el terminal y usar las secuenciasdecaracteresadecuadas. setterm admite el nombre de un terminal para enviar los cdigos de controlaeseterminalenlugardeenviarlosalterminalactual.

366

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Vamosacambiarelsonidodelpitidodenuestroterminal.
$ setterm -bfreq 100 -blength 500

Ahoratendremosunpitidomsgravedelonormaldemediosegundo. Antes de volverlo a su situacin normal cambie a otro terminal y compruebe que el cambio de sonido no ha tenido efecto sobre ese terminal.Nopiensequesuordenadortieneunnicoaltavozporquees como si existiera un altavoz para cada terminal solo que no puede funcionarmasqueunodeellosenunmomentodado.Enesoconsistela emulacindelosterminalesvirtuales.Esunsoloterminalfsicoperose comportacomovarios. Paradejarelsonidocomoalprincipioharemoslosiguiente:
$ setterm -reset

Ahoravamoshacerunprogramaquesacardistintossonidos.
sound(){ setterm -bfreq $1 -blength $2 echo -e '\a\c' > /dev/console } sound 2000 900 sleep 1 sound 700 400 sleep 1 sound 150 300 sleep 1 sound 70 200 sleep 1 sound 40 1000 sleep 1 setterm -reset # Volver a la situacin normal echo -e '\a\c' > /dev/console

367

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

settermcursoroffsettermcursoronsettermrepeaton Configuracindeunterminal(stty) El programa stty(1) sirve para comprobar o alterar el estado de un terminal.
$ stty speed 38400 baud; line = 0; -brkint ixoff -imaxbel -iexten

Esto solo muestra los parmetros ms importantes. Para mostrar la totalidaddelosparmetrosquecontrolannuestroterminalharemos


$ stty -a speed 38400 baud; rows 25; columns 80; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <no definido>; eol2 = <no definido>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon -iexten echo echoe echok -echonl -noflsh xcase -tostop -echoprt echoctl echoke

Cuandoejecutamosresetnosmuestralaconfiguracindelossiguientes tres parmetros. ( erase = ^? , kill = ^U , intr = ^C ) que son respectivamenteelcaracterqueelterminalinterpretarcomoelcaracter 368

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

para borrar el ltimocaractertecleado,elcaracterparaborrarlalnea actual,yelcaracterparamandarunasealdeinterrupcin. Enlapginamanstty(1)vienelainterpretacindetodoslosparmetros usadosparaconfigurarunterminal,Lonormalesquesuvalorpermitaun usonormaldelterminalyporellotocarlospodraafectaralaoperatividad delterminal. sttytambinpermiteguardarlaconfiguracinactualdeunterminalenun ficheroconlaopcingenunformatoquepermitiralpropiosttyajustar todos los parmetros de un terminal usando uno de estos ficheros generadosconlaopcing. Enlaprticaquesiguedeberecordardeparaintroduciruncaracterde controldebervenirprecedidode<Ctrl+V>
$ # Guardamos la configuracin $ stty -g > /tmp/stty.out $ cat /tmp/stty.out 1500:5:4bf:a3b:3:1c:7f:15:4:0:1:0:11:13:1a: 0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 $ stty werase ^A # Ojo usar <Ctrl+V> <Ctrl+A> $ stty -a $ # Comprobamos que ahora werase = ^A; speed 38400 baud; rows 25; columns 80; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^A; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon -iexten echo echoe echok -echonl -noflsh xcase -tostop -echoprt echoctl echoke $ stty `cat /tmp/stty.out` # Recuperamos la

369

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html configuracin anterior

Losresultadosdeestaprcticapuedenvariardeunsistemaaotro.Lo importanteesquecompruebecomohemossalvadolaconfiguracinaun ficheroantesdealterarlaconfiguracindelterminalycomopodemos recuperaresaconfiguracindesdeesefichero.Usamossolowerasepara elloynovamosaproponermsejerciciossobreesto.Losterminalesen Linuxnoemulansiemprealaperfeccinalosterminalestradicionales. Loexplicamosenelsiguienteapartado(verreadline). Lalibrerareadline Nuevamente tenemos que comentar la existencia y propsito de una libreraespecialnoparaaprenderamanejarlasinoparacomprenderuna situacin bastante especial de los terminales en Linux. Los terminales virtualesenLinuxnosecomportancomolosterminalesotrossistemas tipoUnix.Porejemplopodemoscambiarelcaracterdecontrolde'erase' consttyyparecerquenotieneningnefecto,cosaquesecontradice totalmente con lo que dijimos antes. Esto se debe a que muchos programas de linux usan la librera 'readline' que tiene sus propias funcionesdeedicindelineaetc..yactansobreescribiendolasfunciones delterminal.Estodeterminadostiposdeusosdistintosdelterminalydos comportamientosdistintos.

Elbashymuchos delosprogramasdeGNUusarnlalibrera readline. Los programas que usen readline usaran $HOME/.inputrc para la configuracin de ciertos caracteres de edicin de lnea. En caso de no existir este fichero se usa /etc/inputrc.Porelloelcaracterdeborradodeultimocaractery otrosnorespondernalomostradoporsttysinoalficheroinputrc. Por el contrario un programa C que use gets() para leer directamentedeltecladonousarlalibrerareadlineyporellolo quefuncionarserloquedeterminenlosparmetrosdestty.

370

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Escomosiexistierandosclasesdedispositivos.Unoserattyyelotrolo podramosllamartty>readline. Noescuestindeprofundizarenestostemasquesonmsadecuadospara un curso de administracin o de programacin. Con esto se pretende simplementedarunaexplicacinlgicaaestetipodecomportamiento muyespecficodelosterminalesLinux. Terminalesypseudoterminales Yahemosvistocomopuededirigirseentradasalidaaunterminalperoun procesopuedetenerprevistodoscomportamientosdistintosparaelcaso quesusalidaestconectadaaunterminaloaunfichero.Porejemplola opcin'color=auto'para'ls'resultamuytilyaqueproducirdostipos desalidasdistintosdependiendodequeestconectadabienaunterminal bienaotracosatipoficheropipeetc...Enelcasodeestarconectadoaun terminal,sacarlainformacinencolor,perosidetectaotracosasacarla informacin sin color para evitar volcar un montn de caracteres de extraos. En otras palabras 'ls' y muchos otros programas pueden averiguarsisusdescriptoresdeentradasalidaestndarestnconectadoo noaunterminal.Lasalidaaunterminaldeterminaunusointeractivocon unapersonayporellolosprogramasseadaptanaello.Algunasveces queremosqueelcomportamientodeunprogramaseacomosiestuviera conectadoaunterminalpeseaquenoseaciertoyporvelloalgunasveces hayqueusarunterminalficticioopseudoterminal. Un pseudoterminal esuncomponente softwaredestinadoasimularun terminal.Seimplementanusandounaparejadedispositivosespecialesy distintos denominados esclavo y maestro. Un proceso que use un pseudoterminalpensarqueestconectadoaunterminalautnticoyno notardiferenciaalguna. Porejemplounaventanade'xterm'enwindowsfuncionadeesamanera. Unejemplodepseudoterminal(script) 371

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Scrip es un comando que funciona creando un pseudoterminal y arrancando unasubshell que nonotarque laentrada salida noes un autentico terminal. Script se usa para grabar una sesin completa de trabajoconbashenunficherosiseterminaalfinalizarlaejecucindela shellconexit. Pruebelosiguiente:
$ script /tmp/script.out $ ls --color=auto / $ ls --color=auto / > /tmp/ls.out $ exit

Elprimer'lscolor=auto/'mostrarelcontenidodeldirectoriorazen colores.Elsegundo'lscolor=auto/>/tmp/ls.out'guardarlasalidaen un fichero '/tmp/ls.out'.La sesindescriptsefinaliza abandonando la shellconexit.Cuandomiremoselcontenidode'/tmp/ls.out'coneleditor 'vi'comprobaremosquenohaycoloresnicaracteresextraos.Simiramos lasesincompletagrabadaconscriptenelfichero'/tmp/script.out'con'vi comprobaremos que est llena de caracteres extraos. Los retornos de carroaparecencomo'^M'(representa<Ctrl+M>yloscdigosdecolores con secuencias del tipo '^[[0m...' o similares que responden a las secuencias de controlparamodificar atributos ycolores enlapantalla segnsedescribeenlapginaconsole_codes(4).Sienvaelcontenidode esteficheroapantallaporejemplousando'cat/tmp/script.out'aparecern loscolores. scriptcapturaabsolutamentetodoyporellograbarunasesinconscript enunficheropuederequeriruntratamientodefiltrarciertascosasantes de darle determinado uso a esa salida, pero resulta muy til si solo deseamosregistrarunasesindetrabajoparanotenerqueirapuntandolo quevamoshaciendooloquevamosobteniendo.

372

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

PROGRAMACIONDETAREASENELTIEMPO
Introduccin Enestepuntodelcursopodemosasumirqueyasabeprogramaralgunos scriptsparahacercosasqueleinteresan.Silepreguntramoscomohacer paraqueunprogramaseejecutedentrodetreshorasusaraelcomando 'sleep 10800'. Y efectivamente eso sera una solucin sencilla que funcionaramuybienyaquesleepnoconsumenadadecpuytreshoras son10800segundos,peroprobablementesehabrpreguntadocomohacer paraqueunatareaseejecuteenundeterminadomomentoocomohacer paraqueunatareaseejecuteperidicamente. Paraesodisponemosdeloscomandos'at','batch'y'cron'.A'batch',ya 'at'hayquepasarleselcomandoporlaentradaestndar,ycon'batch','at', ya'cron'lasalidadelcomandoserdirigidaalacuentadecorreodel usuario.Poresoconvieneredirigirlassalidasconvenientementeyresulta evidentequedeestaformanosepuedenejecutarprogramasinteractivos. procmeter3unaherramientaparamonitorizarelsistema Esteesunprogramaquenosresultardegranutilidadparacontrolarla carga del sistema y en general para vigilar cualquier aspecto de la actividadenelsistema.Lamayorpartedeestainformacinesobtenidaa partirde/procyesaltamenteconfigurable. ParaestaprcticadeberactivarloselementosparaCPUyparaLOADen modogrficorepresentadoporunalneaquebrada.Adviertaqueestetipo degrficaposeenunasrayashorizontalesyunnumeritoentreparntesis enlaparteinferior.Esenumeritoindicalaunidadcorrespondiente.Por ejemplo para CPU aparece (20%) y para LOAD aparece (1). Esto significaqueenlaprimeragrficacadarallahorizontalsuponeun20%de 373

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

usodeCPU.EnLOADcadarallasignificaunacargade1.Estosvalores sonlosestablecidospordefectoyaunqueestoyotrascosaspuedenser configuradasdeformadistintanosotroslousaremosas. Lasutilidadesat,atqyatr. Permite programar una tarea para que se ejecute en un determinado momento.'at'usaunajerarquadecolasycadaunadeellasserefiereaun nivel'nice'queeselvalorqueotorgalacantidadderecursodecpuque puedeocuparelprocesoendetrimentodeotrosqueseestnejecutando simultneamente.Losnivelessenombranconunnicocarcterquevade la'a'ala'z'odela'A'ala'Z'.Lasprimerasletrasdelalfabetoestn asociadas con alta capacidad para usar CPU y las ltimas todo lo contrario.Pordefectoelcomando'at'ejecutarconelnivel'a'. Existeuncomandollamado'batch'quesirveparaejecutarcomandosde formano inmediata perosinespecificar elmomento. Loexplicaremos msadelanteyvieneaserloequivalentea"ejecutaestocuandonoests muyocupado".Locomentaremosluegoperoresultaqueelcomando'at' tambinpuedefuncionardeestaforma. Siseusa'at'especificandoelniveldeejecucinconunamaysculael programanoseejecutarobligatoriamenteenelmomentoindicadosino queesperaraquelacargadelsistemaseainferioralvalorestablecido paralosprocesosbatch. echo'echoHola>/dev/console'|atnow+2minutes Podrcomprobarqueelsistemadevuelveinformacinrelativaalatarea. jobat Paracomprobarlastareasplanificadasejecute'atq'paraeliminarunatarea planificadaqueaunnosehaejecutado'atrm'

374

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Por ejemplo si su usuario fuera pepe y quiere enviarse asi mismo un mensajederecordatorioparaelmediodadelSbadopuedehacerqueel sistemaaesahoraleenveuncorreoelectrnico. echo"mails'Recordatorio.LlamaraJaime'pepe"|atNOONMON Lasespecificacionesdetiempoutilizanunasintaxisespecialperoquizs resultemsintuitivoymsprcticoponeramododechuletaunaspocas reglassiguiendounanotacinarbitrariaqueponerlagramticacompleta enformatoyaccoenformatoBNF.Estonosllevaraatenerqueexplicar cosasquesesalendelpropsitodeestecursoyqueseranmsapropiadas parauncursodeprogramacin. Porelloybasandonosenunresumen arbitrariodeesagramticaincluimoselsiguientecuadroresumen.
timespec = time | time date | time increment | time date increment | time decrement | time date decrement | nowspec = NOW | NOW increment | NOW decrement = hr24clock | NOON | MIDNIGHT | = month_name day_number | month_name day_number ',' | day_of_week | TODAY | TOMORROW | year_number '-' month_number '-' = '+' inc_number inc_period = '-' inc_number inc_period = INT 'h' INT = MINUTE | HOUR | DAY | WEEK | MONTH | = SUN | MON | TUE | WED | THU | FRI |

nowspec time TEATIME date year_number day_number increment decrement hr24clock inc_period YEAR day_of_week SAT

375

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

month_name JUL

= JAN | FEB | MAR | APR | MAY | JUN | | AUG | SEP | OCT | NOV | DEC

Lo que sigue es una regla prctica para el uso de esta chuleta sin demasiadovalortcnico.Esperamosqueseautil: Para saber si una especificacin se ajusta o no, se parte siempre de 'timespec'.Lasreglaslasrepresentamoscomounaseriedeposibilidades separadaspor'|'.Cuandounadeestasposibilidadesapareceenminculas significaqueasuvezesaposibilidadtieneunasreglas.Porejemplopara comprobarque'NOONMON'cumplelaespecificacinnosfijamosen que 'timespec' entre otras cosas se corresponde con 'time' seguido de 'date'.NOON(medioda)esunaformavlidade'time'yMON(Lunes)es unaformavlidade'day_of_week'queasuvezesunaformavlidade 'date'.
timespec time date day_of_week = = = = time date NOON day_of_week MON | | | | ..... ..... .... .....

Ejemplos: at9amTUE atnow+2minutes at9amFeb18 at4pm+3days at10amJul31 at1amtomorrow EnDebianlaespecificacindetiempoenformatoyaccseencuentraenel fichero '/usr/doc/at/timespec' que nose corresponde conlo que hemos puestoporquehemospretendidosimplificarestainformacin.

376

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

'atq'solodainformacindelnmerodetareaydelmomentoenqueseva aejecutarperolatareaensimismano.EnDebianlastareaseguardanen '/var/spool/cron/atjobs/' y resulta interesante como se guardan. Son simplementeunscripquelanzaelcomandoindicadoperoantesdeello recuperatodoelentornodesdeelcualselanzysesituaeneldirectorio desde el cual se lanz. En el fichero '/var/spool/cron/atjobs/.SEQ' se guardauncontadordesecuenciaparalostrabajosperoenhexadecimal. Si existe el fichero '/etc/at.allow' solo los usuarios contenidos estarn autorizados a lanzar trabajos con 'at'. Si no existiera '/etc/at.allow' se permitir el acceso a todos los usuarios salvo que exista un fichero '/etc/at.deny'encuyocasolosusuarioscontenidosenelnopodrnusar 'at'. Lautilidadbatch Yahemoscomentadoquesirveparainstruiralsistemaqueejecuteun comandocuandolacargadelsistemanoseaaltayademsloharconuna prioridadbaja.Silacarganodesciendepordebajodelvalorestablecido paralastareasbatch,elprogramanoseejecutarnunca. Amododeorientacinpodemosdecirqueparasistemasmonoprocesador sueleusarsevaloresde0.7a1.5yparasistemasmultiprocesadorser superioryestarenfuncindelnmerodeCPUs. VamosaprogramarunshellscriptqueconsumamuchaCPUyquedeje unatrazaquenospermitasabercuandoarrancaycuandopara.
# piloop if [ $# -ne 1 ] then echo "Uso piloop10 " else for i in 0 1 2 3 4 5 6 7 8 9 do echo "$$ $i `date`" >> /tmp/piloop.out echo "scale=$1; 4*a(1)" | bc -l >> /tmp/piloop.bc

377

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html done

fi

Elvalordelaescalasepasacomoparmetroydeberprobarprimerocon valoresbajoshastaqueconsumaunoodosminutosparapoderhacerla prcticaconcomodidad.Ennuestroequipoelclculodelnmeropicon 1000cifrasdecimalesresultaunvaloradecuado. 1. 2. 3. 4. procmeter3 nice19piloop1000& Esperaraquesubalacarga echopiloop1000|batch

Los procesos planificados con 'at' y 'batch' son gestionados por 'atd'. Muchos de los procesos de este tipo que estn permanentemente funcionando terminan en 'd' de 'daemon'. En ingles daemon significa duende.Siporcualquieranomalaatddejaradefuncionarnosepodra usar 'at' ni 'batch'. Curiosamente hay un proceso que se encarga de gestionar tareas peridicas y que igualmente est permanentente funcionandoperonosellamacrondsino'cron'. Usodecronycrontab Elcomando'cron'permitenejecutarperidicamenteunaseriedetareas queestarnprogramadasenunosficherosespeciales. La planificacin de tareas para usuarios no se hace directamente sino pasandounficheroa'crontab'oeditndolodirectamentecon'crontabe'. Esto generar un fichero en /var/spool/cron/crontabs/ Para verificar el contenidodelficherocrontabdeunusuariobastaconusar'crontabl'y paraeliminarlo'crontabr'. Ponersiemprecomomnimo2minutosmsalactualparaprobaryaque encasocontrariopuedenofuncionar.

378

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Elformatoconsisteenunaseriedelineasconelformatosiguiente: minutohorada_del_mesmesda_de_la_semana Campo minuto hora da_del_mes mes da_de_la_semana ValoresPermitidos 059 023 131 112onombres 07onombres 0o7esDomingo

Losnombresdemesesydasdelasemanadependendelidiomaquese use(variableLC_TIME).Puedeprobarconelcomando'date'paraver cualesseestnusandoensusistema. Dos valores con un guin en medio indica un rango de valores que incluiran los valores extremos indicados. Un asterisco (*) equivale al rango de valores que van desde el primero al ltimo. Y se pueden especificarunalistadeelementosoderangosseparndolosporcomas. Porejemplo"2023,03"equivalea"20,21,22,23,0,1,2,3" Comoveremosacontinuacinhayunaformadeagruparlasaccionesque sehandeejecutarenelmismoperiodo. A parte de las tareas peridicas que cada usuario pueda programarse usando'crontabe'parasuspropiasnecesidades,elsistematendruna seriedetareasprogramadasyestasseespecificanen/etc/crontab.

379

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

EnelcasodeDebiancronincluyenosololastareasde/etc/crontabsino cadaunadelastareas queseincluyaenlosficheroscontenidosenel directorio/etc/cron.d Lautilidadrunparts Enmuchasdistribuciones(yDebianesunadeellas)lastareasquesehan deejecutarenunmismomomentoseagrupanenunnicodirectoriopara ser procesadas. En Debian estos directorios son /etc/cron.daily, cron.weekly,ycron.monthly. De esta forma en crontab podemos indicar como accin runparts directorio. La accinexpresadadeesaformaejecutara todosaquellos scriptscontenidosenesedirectorio.Todosestosscriptsdeberncomenzar forzosamentepor#!/bin/interprete_de_comandos. Deestaformaaadirunanuevaaccinresultamuysencilloynorequiere tocarelficherodeconfiguracindecron/etc/crontabquenormalmentese limita a contener la programacin de tareas genricas para ciertos periodos.Severmsclaroconunejemplo.Elejemploquesigueest tomadodeunaDebian:
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file. # This file also has a username field, that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb in:/usr/bin # (mon = 3,6 = Miercoles,Sabado) # m h dom mon dow user command 25 6 * * * root test -e /usr/sbin/anacron || run-parts --report /etc/cron.daily 50 6 * * 7 root test -e /usr/sbin/anacron || run-parts --report /etc/cron.weekly

380

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 55 6 1 * * root test -e /usr/sbin/anacron || run-parts --report /etc/cron.monthly #

Cadaaccinconsisteenunacomprobacin.Sinoexisteanacronquees un programa que explicaremos seguidamente se ejecutarn los scripts contenidosenlosrespectivosdirectorios.Encasocontrarionosehace nadayaqueseasumequeanacronseencargardeello. Mejorarelcomportamientodecronconanacron. Elcomandocronfuncionamuybienenunsistemaquefuncionedemodo ininterrumpido. Si un sistema permanece un mes apagado y lo encendemos,cronactivarsimultneamentetodaslastareaspendientes. Estasseguramenteconsistirnentareasdiarias,semanales,ymensuales entreotras.Elcomando'anacron'permitecorregirlosproblemasclsicos quepresentaelusode'cron'ensistemasquenoestnfuncionandode forma continua. Para ello se establece en el fichero /etc/anacrontab el periodoyelretrasoparaactivarlastareasperidicas. PorejemploenDebiantenemospordefectolosiguienteenelfichero/etc/ anacrontab:
# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb in:/usr/bin # These replace cron's entries 1 5 cron.daily nice run-parts --report /etc/cron.daily 7 10 cron.weekly nice run-parts --report /etc/cron.weekly 30 15 cron.monthly nice run-parts --report / etc/cron.monthly

381

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Quesucederusandotodoestoenunsistemaquearranquedespusde unlargoperiododeestarapagado?Puesquealos5minutosarrancarlas tareasdiarias,alos10lassemanalescasodeestarpendientes,yalos15 minutoslasmensuales,casodeestarpendientes.Deesaformaelsistema reparteeneltiempolacargadetrabajodeformaescalonada. Uncasoprctico.Tareasdosvecesporsemana Enelcasoanteriorpodemosincluirunatareaparaqueseejecuteunavez cadasietedasounavezaldaperonodisponemosdeunaprogramacin intermedia.Vamosasuponerelsiguientecontenidoenlosdirectoriosde tareasperidicos.
# ll /etc/cron.daily/ -rwxr-xr-x 1 root 1999 man-db -rwxr-xr-x 1 root 1999 logrotate -rwxr-xr-x 1 root 2000 suidmanager -rwxr-xr-x 1 root 2000 standard -rwxr-xr-x 1 root 2000 apache -rwxr-xr-x 1 root 2000 exim -rwxr-xr-x 1 root 2000 tetex-bin -rwxr-xr-x 1 root 2000 0anacron -rwxr-xr-x 1 root 2000 sendmail -rwxr-xr-x 1 root 2000 calendar -rwxr-xr-x 1 root 2001 sysklogd -rwxr-xr-x 1 root 2001 netbase -rwxr-xr-x 1 root 2001 modutils -rwxr-xr-x 1 root root root root root root root root root root root root root root root 238 mar 15 51 sep 13 592 feb 27 2259 mar 30 3030 abr 29 427 abr 30 157 may 19 311 may 25 1065 jun 8

450 jul 18 660 ene 485 ene 41 ene 9 9 9

57 feb 29

382

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html 2000 htdig -rwxr-xr-x 2001 find

1 root

root

277 ene

# ll /etc/cron.weekly/ -rwxr-xr-x 1 1998 man-db -rwxr-xr-x 1 1999 isdnutils -rwxr-xr-x 1 2000 lpr -rwxr-xr-x 1 2000 man2html -rwxr-xr-x 1 2000 cvs -rwxr-xr-x 1 2000 dhelp -rwxr-xr-x 1 2000 0anacron -rwxr-xr-x 1 2001 sysklogd root root root root root root root root root root root root root root root root 210 nov 28 540 nov 217 ene 2 9

116 feb 28 1302 mar 22 653 mar 23 312 may 25 781 ene 9

# ll /etc/cron.monthly/ -rwxr-xr-x 1 root 2000 standard -rwxr-xr-x 1 root 2000 0anacron root root 129 mar 30 313 may 25

Imaginemos que 'htdig' y 'find' resultan para nosotros tareas excesivamente pesadas para realizarlas diariamente pero tampoco deseamosdejarpasartodaunasemanasinejecutarlas. Lasolucinseraincluirunanuevacategoradetareasqueseejecutaran porejemplounpardevecesporsemana. Paraello: 1. Crearemos un directorio que llamaremos por ejemplo /etc/cron.2_weekly/. 383

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

2. Moveremoslosscripts'htdig'y'find'aesedirectorio. 3. Incluiremosen/etc/crontabunanuevaentradaparalastareasque handeejecutarsedosvecesporsemanaypuestoquelastareas semanales estn programadas para activarse los Domingos usaremoslosMircolesylosSbadosafindequenocoincidany quedenmejorrepartidaseneltiempo.
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file. # This file also has a username field, that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb in:/usr/bin # (mon = 3,6 = Miercoles,Sabado) # m h dom mon dow user command 25 6 * * * root test -e /usr/sbin/anacron || run-parts --report /etc/cron.daily 40 6 * * 3,6 root test -e /usr/sbin/anacron || run-parts --report /etc/cron.2_weekly 50 6 * * 7 root test -e /usr/sbin/anacron || run-parts --report /etc/cron.weekly 55 6 1 * * root test -e /usr/sbin/anacron || run-parts --report /etc/cron.monthly #

4. Incluiremosen/etc/anacrontabunanuevaentrada
# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb in:/usr/bin # These replace cron's entries 1 5 cron.daily nice -19 run-parts

384

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html --report /etc/cron.daily 3 10 cron.2_weekly nice -19 run-parts --report /etc/cron.2_weekly 7 10 cron.weekly nice -19 run-parts --report /etc/cron.weekly 30 15 cron.monthly nice -19 run-parts --report /etc/cron.monthly

Yconelloyatendramosmodificadalaplanificacintalycomolahemos descrito.Amododecomprobacinpodemosincluiralgnscriptenlos directoriosdetareasperidicasparavercuandoseejecutan. En/etc/cron.daily/trazapondremos:


#!/bin/sh echo "daily `date`" >> /var/log/traza_cron.log

En/etc/cron.weekly/trazapondremos:
#!/bin/sh echo "weekly `date`" >> /var/log/traza_cron.log

En/etc/cron.2_weekly/trazapondremos:
#!/bin/sh echo "2_weekly `date`" >> /var/log/traza_cron.log

En/etc/cron.monthly/trazapondremos:
#!/bin/sh echo "monthly `date`" >> /var/log/traza_cron.log

Pasados unos das comprobaremos /var/log/traza_cron.log que deber mostrar la ejecucin de cada parte en los momentos adecuados. Se

385

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

muestralatrazaenunordenadorquesueleencenderseunosminutosantes delas8delamaanatodoslosdas.
daily Wed Nov 28 08:00:24 CET 2001 2_weekly Wed Nov 28 08:19:09 CET 2001 daily Thu Nov 29 07:45:38 CET 2001 daily Fri Nov 30 07:48:29 CET 2001 daily Sat Dec 1 08:30:52 CET 2001 2_weekly Sat Dec 1 08:49:23 CET 2001 daily Sun Dec 2 07:37:13 CET 2001 daily Mon Dec 3 07:46:48 CET 2001 weekly Mon Dec 3 07:50:28 CET 2001 daily Tue Dec 4 07:53:11 CET 2001 2_weekly Tue Dec 4 08:12:19 CET 2001 daily Wed Dec 5 07:45:44 CET 2001 daily Thu Dec 6 08:21:58 CET 2001

386

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

INTRODUCCIONAREDES
Introduccin Estedocumentopretendeaclararlosconceptosbsicosrelativosaredes en general y a redes Linux en particular. De todos los protocolos existentesnoscentraremosenelTCP/IP. ElTCP/IPeslafamiliadeprotocolosmsampliamenteusadaentodoel mundo.ElloesdebidoaqueeselprotocolousadoporInternet(laredde redes)yporquesuusoestamuyextendidodesdehacemuchotiempo entrelossistemasdetipoUnix.ElxitodeInternethacontribuidode formadecisivaensuampliousoentodotipodesistemasyredes. Estecaptuloleayudaracomprenderlosaspectosbsicosderedes.Sin estos conocimientos instalar y configurar una red aunque sea pequea resultara complicado porque existe mucha terminologa tcgnica necesaria porque no siempre se pueden explicar todo con pocas y sencillaspalabras. Historia En 1969, el departamento de Defensa de los Estados Unidos se vi obligado a dar solucin a los problemas de comunicacin electrnica internaqueusabansistemasinformticosvariados.Porelloseencargal ARPA(AvancedResearchProjectsAgency)quedesarrollara,juntocon las principales universidades yfabricantes deequipos informticos, un protocoloestandardecomunicaciones.Estodilugaradosredes.Unade usoexclusivamentemilitarMILNETyotraconfinesexperimentalesde investigacinARPANETqueen1970incorporalosprotocolosTCP/IP. MILNetseescindicomotalenlosaos80.

387

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Topologa Latopologadeunaredvieneaserelaspectofsicoquepresentanlos nodosdeunaredysuinterconexinentreellos.Porejemplosilosnodos seconectanaunalargalneaqueconstituyenelmediodecomunicacin quetodoslosnodoscompartenporigualdiremosqueesunaredenbus. Silosnodosseorganizanconectandoseexclusivamenteatravsdeun gran nodo central y con total independecia entre los restantes nodos diremosqueesunaredenestrella.Silosnodosseconectanorganizando un crculo donde cada nodo solo tiene relacin directa con un nodo predecesoryunosucesordentrodelcrculo,diremosqueesuna reden anillo.Enlaprcticacualquierredsepuedeconectaraotraoriginando modelosmixtos.

Protocolosdeaccesoared

388

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Abajonivelsonnecesariasunaseriedereglaspreestablecidasparapoder intercambiar paquetes de informacin. El uso de la palabra protocolo tambinseusarcuandohablemosdeotrosnivelesdecomunicaciny ellonodebeconfundirnos.(Elnivelqueestamostratandoeseldeacceso aredenterminologaTCP/IP,yagrupalosnivelesfsicoydeenlacede datosenterminologaOSI.) Cuandonosreferimos atopologanosreferimos aunniveltotalmente fsicoycuandonosreferimosaprotocolosdetransmisindedatosnos referinos a un nivel totalmente lgico que establece las reglas de comunicacin. En teora la Topologa de una red no determina su protocolo de transmisin de datos y efectivamente son posibles casi cualquier combinacin de topologa y de protocolo, pero en la prctica cada topologisueleusarsepreferentementeconunosdeterminadosprotocolos porquenacendeundiseoconjunto.Pondremosunospocosejemplosde protocolosdetransmisindedatosysealaremosenquetopologasuelen usarseconmayorfrecuencia:

Csma(CarrierSenseMultipleAccess)

Las estaciones comparten un mismo canal y quedan a la escucha respondiendounicamentecuandounmensajevadirijidoaellos.Esto sedetectagraciasaunadireccinnicaqueconsisteennmerosde6 bytes asociados a cada tarjeta de red grabado generalmente por el fabricante.Esdecirunacolisinseproducecuandolaidentificacin MACdelreceptorquevaenlatramadeunmensaje,coincideconla direccinfsicadeladaptadorderedunicaparacadatarjeta.Enel casodequedospuestosintentenusarsimultaneamenteelcanalpara transmitirlosmensajestransmitidosenformadeimpulsoselectricos sufrirn distorsionesylainformacindelasealsepierde.Aeste fenmeno se le llama colisin. En la practica ser necesario retransmitirlospaquetescolisionados. (Generalmenteestemtodoseasociaatopologaenbus). 389

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Csma/CD(CarrierSenseMultipleAccesColisionDetect

Es una variacin de la anterior que minimiza la probabilidad de colisindetectandoantesdeemitirsielbusestenuso,peroestono impidetotalmentequeseproduzcancolisiones.Hayotrasvariaciones basadasenCsmasiempreintentandominimizarlascolisiones. (Generalmenteseasociaatopologaenbus).

Polling(Llamadaselectiva) Existeunnodocentralqueestableceelturnodecadanodo.Para ellohaceunallamadaselectivaquesoloserrecibidaporelnodo pertinente.

(Generalmenteseasociaatopologaenestrella).

TokenPassing(Pasodetestigo)

Estatecnologaconsisteenquecadapuestovapasandounmensaje quehaceelmismopapelqueuntestigoenunacarreraderelevos. Unicamenteelnodoquetieneeltestigopuedeenviarelmensajey generalmentelosmensajespasanalnodosiguientesiguiendotodos ellosunasecuenciacircularaunquehayvariacionesdeestemodelo. Cuando el mensaje original vuelve al nodo que lo origin este lo elimina de la circulacin del anillo. Se trata de un modelo muy estricto que ofrece un altsimo grado de control. No existe posibilidadesaleatoriascomoenelcasodelascolisionesdelmodelo Csma.Elpasodetestigo,permideconocercontotalseguridadcuales eltiempoqueseinvertirenhacerqueunmensajealcancesudestino ypermitequeelusointensivodelarednoafecteasufuncionamiento. (Generalmenteseasociaatopologaenanillo). Ethernet

390

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Es una de las arquitecturas de red local ms conocidas y populares. Cuandosehabladeethernetnosreferimosaunatecnologadeenlacede datos. EthernetfudesarrolladaporXeroxenloslaboratoriosdePaloAltoen California. Utilizaron el protocolo CSMA/CD y los nodos de la red conectadosmediandecablecoaxial,usabandireccionesde48bits.Estas caractersticapermitanreorganizarlaredsintenerqueefectuarcambios en el SO, lo cual tiene mucho que ver con su enrme xito en la actualidad. ConsiderandolasdesventajasdeCSMA/CDsecomprendequeestaforma defuncionarofrezcadificultadescuandoenelcanaldecomunicacinse produceunusointensivo.Lasinevitablescolisionessetraducenenuna perdida de rendimiento ensituaciones desobrecargadelared.Enla prctica la mayora de los nodos de una gran red intercambian informacin entre ellos de forma ocasional y las redes se dividen en subredes para minimizar colisiones de mensajes. El modelo de la arquitecturaEthernetesantetodomuyflexibleyfacilitalacreaciny gestinderedesderedesmuygrandessingrandesproblemas. En la actualidad hay una amplia variedad de formas de interconectar mquinas en una LAN. Incluso se pueden utilizar los puertos serie o paraleloparaelloperolomsfrecuenteesusarEthernet.Unatarjetaa10 Mb/s(10Megabitsporsegundo)cuestasolounas5000Ptas(30Euros)y elcablecuestaunas300Ptas/metro(2Euros/metro).Porlotantomontar una pequea red casera no supone mucho gasto. Se puede usar cable coaxial generalmente negroqueseterminan enlosextremosmediante terminadoresespecialesyadmitenenlacesenformadeTparaconectar tantospuestoscomoseanecesariosintenerqueadquirirun'hub'. Un 'hub' esundispositivoconcentradorquedisponedevariasbocasde conexin.Resultarimprescindiblesuusocuandoseusaenunaredde msdedosordenadoresconcable10base2.Estecabletieneconectoresde plsticoRJ45similaresalosconectoresdelostelfonos. 391

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Con este cable se puede prescindir de 'hub' solo en el caso de interconectardosordenadores,yparaelloelcablehadeserespecial,ya que la posicin dealgunos delos 8pines quetiene elconector RJ45 debarnircruzados.Concretamenteelpin1(cableblanconaranja)seha decruzarconelpin3(cableblancoverde)yelpin2(cablenaranja)seha decruzarconelpin6(cableverde). Lastarjetasa100Mb/stampocosonmuycarasysondiezvecesms rpidas. Cuestan unas 12.000 Ptas (72 Euros).Hay tarjetas quepuede funcionar tanto a 100 como a 10 Mb/s pero en una red no pueden mezclarsetarjetasfuncionandoadistintasvelocidades. ModeloOSIyTCP/IP Los protocolos TCP/IP se crearon y normalizaron en los 80, es decir muchoantesdequesedefinieraelmodelodereferenciaOSIdelaISO cuyaarquitecturaseimpusoenlos90.Losgobiernosapoyarondesdeun principiolosestandaresOSIquerepresentaunmodelobiendefinidoy estructurado.Portodoellosepensqueestemodelotriunfarasobreel modeloTCP/IPqueenrealidadnisiquierarepresentaunmodelonico sinounafamiliadeprotocolosquesehanidodefiniendoanarquicamente yqueaposteriorisehanestructuradoencapas.Alfinalloquerealmente ha triunfado ha sido Internet que usa TCP/IP. En el modelo OSI se describen perfectamente siete distintos niveles. En el modelo TCP/IP realmentenosedescribeunaestructuratanprecisadenivelescomoenel modeloOSIaunquesepuedenasimilarycompararambosmodelosdela formasiguiente.

392

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

En todos estos niveles podemos hablardesus respectivos procolos de comunicacin. El trmino protocolo indica un conjunto de reglas perfectamenteestablecidasquepermitenygarantizanelintercambiode informacin.Encadaniveldelmodelolacomunicacintienesupropio protocoloysupropiocometido. LosprotocolosTCPestnorientadosaconexinconloque,sepodra hablardesesinasimilandosealnivel5OSIperoUDPnoestorientado a conexin y por ello no sepuede hablar propiamente de sesin. Las corespondenciasdenivelesentreOSIyTCP/IPnosonperfectas. TCPestorientadoaconexin.Enunaprimerafaseseestablececonexin yconellosemantieneunasesindetrabajoquefinalizarconuncierre. UDPutilizadatagramas.Esdecirqueenlugardeabrirunaconexincon eldestinoparaestablecerundialogo,funcionasimplementeenviandoala red fragmentos de informacin denominados datagramas. FTP, HTTP, 393

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

SMTP,yTELNETsonserviciosmuypopularesysonunbuenejemplode protocolos orientados a conexin. SMNP, y NFS son ejemplos de serviciosorientadosadatagramas.Msadelanteampliaremostodoesto hablandodelModeloCliente/Servidor ElnivelTCPyelnivelUDPdeleganenelnivelIPlatransmisindela informacinperonoasumenqueIPtengaxito.Esdecirsupervisanla transmisinyseocupandereenviarlospaquetesencasonecesario. ElniveldeIPgestionaladireccindelmensajeparaquealcancesunodo destino.ElprotocoloIPsepuedeasimilaralnivel3OSI.Enestenivel existen tambin los protocolos siguientes: ICMP (Internet Control MessageProtocol)ARP(AddressResolutionProtocol)RARP(Reverse AddressResolutionProtocol). Existenunaspginasdelmanualonlinequeestntraducidasqueexplican unpocotodoesto.ip(7),udp(7),tcp(7),socket(7). Enelnivel1OSIllamadonivelfsicosedefinencomosonloscables,los conectoreslosniveleselectricosdelasseales,latopologa,etc.Peroen elmodeloTCP/IPlosniveles1y2quedanasimiladosaunniconivelde interfaz hardware que pasamos a describir. Tampoco aqu la correspondenciadenivelesesperfectayaqueenenniveldeInterfazno sedefinencablesniconectores,etc. A diferencia de otros SO tipo Unix, en Linux no se usan disposivos especiales tipo /dev/... sino que se crean interfaces dinmicamente medianteifconfig. EnelncleodeLinuxsepuedenincluirdistintostiposdeinterfaceso controladores.Algunosdeellosson:

lo

394

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Interfaz de bucle local (loopback). Se utiliza para pruebas aunque algunaaplicacinpuedenecesitarlaigualmente.Notienesentidotener msdeuninterfazdeestetipo.

eth

EslainterfazgenricaparatarjetasEthernetdeusomuyfrecuente.

sl

InterfazSLIPparapuertoserie.Montarunaredmedianteunpuerto serieespocoeficienteperolaposibilidadexiste.

ppp

InterfazPPPparamodem.

ippp

InterfazIPPPparaISDN(RDSI).

plip

Interfaz PLIP para puerto paralelo. Montar una red mediante un puertoparaleloespocoeficienteperolaposibilidadexiste. Para cada uno de estos controladores se requiere la correspondiente opcinenenncleodeLinux. ModeloCliente/Servidor Cadaservicioseinstalaasociadoaunpuertoygeneralmenteseusanlos servicios ms comunes en puertos previamente establecidos y universalmenteconocidos.Cadaserviciohadetenerunpuertodistinto perolosserviciosTCPylosUDPnoentranenconflictoalusarelmismo puerto. 395

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Los servicios en general (no solos los servicios de red) se pueden configurarenlosSOtipoUnixdedosformasdistintas.

ModoStandalone:Enestemodoparaqueelservicioestactivoel servidordeberestarpermanentementearrancadoyescuchandosu puertoparapoderatendercualquierpeticindeservicio. Modosupeditadoalservidordeserviciosinetd:

En este modo los servidores estarn parados y ser inetd(8) quien estarpermanentementearrancadoyalaescuchaentodoslospuertos. Paraellousarelfichero/etc/servicesquedeterminaquepuertostiene queescucharyqueserviciosestnasociadosacadapuerto.Deesta formaencasonecesarioarrancarunservidordeunservicioconcreto cuandodetecteunapeticindeservicioensupuertoasociado.Mireel contenidode/etc/servicesparasabercomoestconfiguradosuinetd. Veaseservices(5). Ensusistemaprobalmentetendrsimultaneamenteserviciosactivosen modoStandaloneyotrossupeditadosmedianteinetd.Estodependedel tipodeservicioydeltipodeusoquetenga.Estclaroqueunservicio utilizado de forma espordica no es bueno tenerlo permanentemente arrancadoconsumiendorecursosmientras permaneceinactivolamayor parte del tiempo. Por el contrario un servicio que recibe un autntico bombardeodepeticionesdeserviciosnoesbuenoquetengaquearrancar ypararacadapeticin. Sidetieneelservidordeinetd,dejaratodoslosserviciossupeditadossin posibilidad de activarse. Los servicios se pueden asociar a puertos distintos de aquellos que por convenio se suelen usar pero si usa un servicio en un puerto distinto del preestablecido los clientes de ese servicionopodrnusarloanoserqueantesaveriguenelpuerto. LasredesenLinuxutilizanporlotantosoncapacesdeusarservicios siguiendoelmodelocliente/servidormedianteelcualunodelosprocesos escapazdeaceptardeterminadotipodepeticionesygenerardeterminado tipoderespuestasdeacuerdounprotocolopreestablecidoqueestablece 396

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

lasreglasdecomunicacinentreambos.Unservidoryunclientesonpor tanto procesos independientes que generalmente aunque no necesariamenteresidirnenmaquinasdistintas. SustituiraunprogramaclientequehablausandoelprotocoloSMTPcon unservidoroaunprogramaclientequehablaPOP3conunservidores muy fcil. SMTP usa elpuerto 25yPOP3usael puerto110.Sinos conectamosportelnetaunservidorusandoalgunodeestospuertosse iniciar una conversacin de acuerto al protocolo y de esta forma mediantetelnetpodremosenviarcorreomedianteSMTPobajarcorreo porPOP3,oborrarunmnsajeennuestroservidordecorreo,etc.Basta para ello conocer el protocolo que en estos dos caso se limita a un reducidonmerodecomandossencillos. SisumquinatieneactivoelserviciodeSMTPpuedeprobarlosiguiente. telnet127.0.0.125 HELP HELO127.0.0.1 QUIT Lo queacaba dehaceresdialogarenSMTPconsuservidorlocal de SMTPasociadoalpuerto25.Estoesaplicableamuchosotrosservicios. ElinterfazdellamadaPPP ParaconectarainternetprimerosumodemtelefonearasuProveedorde ServiciosdeInternet(ISP)yparaestablecerconexinsenegocialaforma deenviaryrecibirpaquetesporlalneaenfuncindelascapacidadesde ambos extremos. Es decir que tienen que ponerse de acuerdo en la velocidadausar,formadecompresindelosdatosymscosas.Paraello apppd,oensucasoaipppd(elsegundoesparaRDSI)hayquepasarle algunosparmetrosenformadeargumentosenlalneadecomandoso bienatravsdeunficherodeconfiguracin(/etc/ppp/options)yconestos datoslanegociacinsehacedeformaautomticaytransparente.Tambin sesolicitalaidentificacindelusuarioqueharealizadolallamada.Ano 397

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

serquecontratelaobtencindeunadireccinIPfijayreservadapara ustedobtendrencadaconexinunadireccinIPdistinta.Alaprimerase lallamatambindireccinIPestticaporqueessiemprelamsmayala segunda direccin IP dinmica. De todos estos detalles se ocupa el protocoloPPP(PointtoPointProtocol) ElaccesoaunISPmediantemodemmerecerauncaptuloenteropero suponemos que con lo explicado ya habr comprendido que funciona comouninterfazderedpppensusistemaenelcualpuedenexistircomo yahemosmencionadootrosinterfaces. Unavezlogradalaconexindispondrdeuninterfazderedqueledar accesoainternet.Paracomprobarsitieneconexinpruebeahacerpinga unservidorconocido. pingwww.altavista.com PROTOCOLOSTCP/IP Introduccin Estecaptuloesenrealidadunasegundapartedelanteriorenelcualyase comentaronalgunascosas.SedijoqueelprotocoloTCP/IPesunodelos protocolosmasampliamenteusadosentodoelmundo,yporestarazn merecelapenaprofundizarenesteprotocoloenparticular. OSI y TCP/IP son pilas de protocolos distintos y el intento bien intencionado que se hizo el el captulo anterior solo era una t aproximacinnecesariamenteimprecisadeambosmodelosdificilmente comparables. En el caso de TCP/IP es mejor utilizar OSI slo como modelo de referencia terico y estudiar en profundidad el verdadero modeloTCP/IPqueesloqueharemosahora. Este captulo contiene fragmentos de un anterior trabajo en el cual participLuisColoradoUrcolayporelloaprovechoparaagradecersu aportacin. (En la actualidad desconozco su direccin de correo 398

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

electrnico)Convieneaclararunaseriedeconceptosyempezaremospor explicarqueesunadireccinIP. Direccionesip ElprincipalbeneficiodeIPesqueescapazdeconvertirunconjuntode redes fsicamente distintas en una sola red aparentemente homognea. UnainternetesunaredIPaparentementehomognea.LaInternet(con mayscula) es la red de redes. En realidad solo es una internet muy grande y que se exitende por todo el planeta. La caracterstica de cualquierinternetesquecadaunodelosnodostieneunadireccinIP nica y distinta a la de cualquier otro nodo. Las direcciones IP son cadenasdetreintaydosbitsorganizadascomounasecuenciadecuatro bytes. Todas las tramas (paquetes) IP llevan una direccin de origen (dondeseoriginolatrama)yunadireccindestino(adondevalamisma). Bsicamenteestoestodoloquehayquesabercuandoseconectaunoala redyladireccinIPtelaasignaunadministradordered. Estasdireccionestienenunarepresentacincomocuatronumerosenteros separadosporpuntosyennotaciondecimal.Lasdireccionesrepresentan elinterfacedeconexindeunequipoconlared.Asi,unhostqueest conectado a varias redes como regla general, no tendr una nica direccindered,sinovarias(normalmenteunaporcadaredalaqueesta conectado).Perointernamente,Estonoesdeltodocierto.Lasdirecciones IPsedividenendospartes(cadaunaconunciertonumerodebits)cuyo significadotienequeverconelsistemadeenrutadodetramas.Laprimera parte (cuya longitud no es fija y depende de una serie de factores) representa la red, y debe ser igual para todos los hosts que esten conectadosaunamismaredfsica.Lasegundaparterepresentaelhost,y debeserdiferenteparatodosloshostsqueestanconectadosalamisma redfsica. ElmecanismodedecisindeIPquehacequetodaslastramaslleguena su destino es el siguiente: Cuando la direccin origen y la direccin destinoestanambasenlamismared(estosesabeporquesudireccinde 399

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

redesigualenambas,ladireccinderedserlaconsecuenciadesustituir porcerostodalapartedehostenladireccinconsiderada)IPsuponeque existeunmecanismodenivelinferior(enestecasoEthernet,TokenRing, etc.)quesabecomohacerllegarlatramahastaelhostdestino.Cuandola direccinnderedorigenyladedestinonocoinciden,entonceshayque enrutar. Paraenrutar,sedisponedeunatablaquecontieneentradasparacadauna delasredesalasquesequierenhacerllegartramas,quenoseanlocalesa estehost(unhost,engeneral,estaconectadoavariasredes,delasque hacedegateway(pasarela),siladireccindestinodelatramatieneuna direccin de red que coincide con alguna de las direcciones de red propiaslasqueresultandesustituirporceroslapartedehostencada unodelosinterfaces,entoncesnohacefaltaenrutar).Estatablatiene msomenosentradasenfuncindelacomplejidaddeunainternet(ored deredes)yladireccindelsiguientehostenelcaminohastalaredde destino. Porotrolado,lapartequecorrespondearedylapartequecorrespondeal host,serealizausandoestemodelo(salvoparaelsubnetting,queaade algodecomplejidad). Clasesderedes Existen5tiposdedireccionesIP.Acadatiposeleasignaunaletra,asi, existendireccionesdeclasesA,B,C,D,E.Lasdireccionespertenecena estasclasesenfuncindeloscuatrobitsmssignificativosdelprimer byte. ClaseA 7Bitsred+24bitshost ClaseB 10nnnnnn nnnnnnnn hhhhhhhh hhhhhhhh

0nnnnnnn hhhhhhhh hhhhhhhh hhhhhhhh

400

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

14bitsred+16bitshost ClaseC 21bitsred+8bitshost ClaseD (multicasting) ClaseE (reservadas) Lanrepresentalapartedereddeladireccinyhlapartedehost.xtiene otrotratamiento. LasclasesDyEnoparticipanenelsistemadeenrutadoIPynolas comentaremos(lasdireccionesdeclaseDseusanenmulticastingylas direcciones declaseEestanreservadas,porellonodebenusarsepara configurarhostseninternet) (ComosepuedeverhaymuypocasredesdeclaseA,quepermitentener muchos hosts por ejemplo InfoVa (Muchas redes de clase C para poquitos hosts)Los centros proveedores de Internet; y un rango intermedio pararedesquetenganambos requisitos).Porotrolado,las redes de clase A tienen el primer byte como parte de red y los tres restantescomopartedehost,lasredesdeclaseBtienenlosdosprimeros bytescomopartederedylosdosltimoscomopartedehostylasredes declaseCtienencomopartederedlostresprimerosbytesycomoparte dehostelltimo. As,puestoennotacinpunto,lasredesdelasdistintasclasescubrenlos siguientesrangosdedirecciones: claseA dela1.0.0.0 >127.255.255.255 1111xxxx xxxxxxxx xxxxxxxx xxxxxxxx 1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx 110nnnnn nnnnnnnn nnnnnnnn hhhhhhhh

401

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

claseB dela128.0.0.0 >191.255.255.255 claseC dela192.0.0.0 >223.255.255.255 Ejemplodeunapequeared Vamosaexplicarcomoconstruiriamosporejemplotresredespequeas interconectadasentresyquedireccionespodriamosusarparaello.De estaformapodremosexplicarcomofuncionaelenrutado. Usaremos un ejemplosencilloparaexplicar esto.Existenunaseriede direccionesespecialmentereservadasparausosprivados.Esdecirnose usaranenunaredpblicadeinternet. DireccionesreservadasparalaclaseA10.0.0.0 DireccionesreservadasparalaclaseB172.16.0.0 >172.31.0.0 DireccionesreservadasparalaclaseC192.168.0.0 >192.168.255.0 ParanuestroejemplousaremostresredesdeclaseBdetipo172.22.n.n. En todas las redes (incluidas las que tienen subnetting) existen dos direccionesdehostqueestnreservadas.Laprimeraeslaquetienetodos losbitscorrespondientesalapartedehostacero.Estadireccinseutiliza pararepresentaralapropiaredyportantonosedebeasignaraningun host.Laotraeslaquetienetodoslosbitspuestosauno,yrepresentaa todosloshostsqueestanconectadosaunamismared.Enredesdondese permite el broadcast(dondeunhostpuedehacerquetodosreciban el mensaje que ha enviado) esta direccin se utiliza para este fin. Estas direccionessellamandireccionesderedydebroadcastrespectivamente. TambinestreservadaladireccinIPquetienetodoslosbitsaceroenla partederedparaindicarestared,aunqueestasoloest;permitidousarla cuando aun no conocemos nuestra direccin IP completamente (por ejemplocuandohayqueadquirirlaporlapropiared,enelarranque,al configurar,etc.)

402

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

LaconfiguracindelospuestosA,B,C,Dseralasiguiente: A IP.ADR B C D

172.22.22.21 172.22.22.22 172.22.23.21 172.22.23.22 0.0.0.255 172.22.22.0 0.0.0.255 172.22.23.0 0.0.0.255 172.22.23.0

N.MASK 255.255.255.0 255.255.255.0 255.255.255.0 255.255.255.0 BROADK 0.0.0.255 NETWRK 172.22.22.0

Hay dos gateways, con dos direcciones cada uno, y su configuracon sera: GW1 IP.Addr 172.22.22.2/172.22.21.2 403 GW2 172.22.23.1/172.22.21.1

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

N.Mask 255.255.255.0(ambas) NetAddr 172.22.22.0/172.22.21.0

255.255.255.0(ambas) 172.22.23.0/172.22.21.0

Broadc 172.22.22.255/172.22.21.255 172.22.23.255/172.22.21.255

Segnloquehemosexplicado,lared172.22.0.0esunaredclaseBypor tanto su mscara por defecto es la 255.255.0.0. En el ejemplo est subneteadaconmscara255.255.255.0ydadoqueestamscaranoesla mscarapordefectolaredhadeindicarseporsudireccinIPseguidade sumscara.Estastresredesportantoson: 172.22.22.0/255.255.255.0 172.22.23.0/255.255.255.0 172.22.21.0/255.255.255.0 Mscarasdered LareddelejemploestformadaportressubredesdelareddeclaseB 172.22.0.0conmscaras255.255.255.0(osea,consideradascomoosila red172.22.0.0sehubierasubneteado) LamscaraderednoesmsqueunadireccinIPdondesehasustituido todos los bits de la parte de red de la direccin por unos y los bits correspondientesalapartedehostporceros.As,lamscaraderedde una red de clase A ser 255.0.0.0, la de una red de clase B ser 255.255.0.0yladeunaclaseCser255.255.255.0. Porqueseusaentonceslamscaraderedsiestimplcitaeneltipode direccion? Sehacomprobadoqueaveceselsistemadeclasesnoesapropiado.Aun proveedorledanunaclaseCcompletaperoelquieredividirlaencuatro redesdiferentes,ynovaausarcuatroclasesCparaesto1000direcciones IP,porquesemalgastaranmuchas.Puesbien,dentrodeunamismared, sepuedeextenderelmecanismoderouting,considerandoquelapartede 404

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

hostsonlosbitsceroylapartederedsonlosbitsunodelamscaray asociandoacadadireccinIPunamscaraenelmomentodeconfigurarla (por supuesto, los valores por defecto sern los de la clase dela red, aunquesepodrnaadir,ysolamenteaadir,bitsunoalamscara,conel findesubnetearla. Enelcasodelejemplodeesteparrafo,elproveedorpodraextenderla mscaradesubreddosbitsmsalldelafronteraimpuestaporeltipode ladireccinadquiridayconsiderarquetienecuatroredes(enestecasola partederedseranlosprimerostresbytesydosbitsdelcuartoylaparte delhostlosrestantes). Tablasderutas Porejemplopartiendodelared21.0parairala23.0habraqueusarel GW1,yparairdela23.0ala22.0habraqueusarGW1yGW2. Perocomoseindicalarutaatomarparacadadestino? Paraelloseusanlastablasderutasyparaconstruirlas,formaremospara cadamquina,unatablaconlaformadedirigirlastramashacialasredes que no vemos directamente, con la ventaja adicional de que como la direccin0.0.0.0representaobviamentelaredlocal,podemosusaresta direccinespecialparaindicarlarutapordefecto(esdecir,ladireccin localalaqueenviarlastramasquenotienenrutayquenecesariamente hayqueenrutar).As,lastablasderutasquedaran: HostA: HostB: HostC: HostD: GW1: GW2: 0.0.0.0(default)>172.22.22.2 0.0.0.0(default)>172.22.22.2 0.0.0.0(default)>172.22.23.1 0.0.0.0(default)>172.22.23.1 172.22.22.0 >172.22.21.2 172.22.23.0 >172.22.21.1

405

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Sinosfijamos,podemosverquelarutapordefectoeselgatewaypor defectoqueapareceenlaconfiguracindemuchasmquinasLinux,pero paralosgatewaysnoapareceningungatewaypordefecto.Estoesuna caractersticadelasredesquetienenbackbones. Backbon Literalmente, backbone significa columna vertebral. Las tramas se canalizanhaciaelbackbone,peroeste,alfinaldebedecidiradondevana pararlastramas.Comoconclusindeestaltimafrasesedesprendeque entodobackbone(reddeniveljerrquicosuperiordondenohayninguna redmasimportante.p.ej.elbackbonedeInternet,olaredprincipaldeuna empresa que no tiene conexiones con el exterior) los gateways que formanelbackbonedebentenerrutasatodaslasredesynoapareceruna rutapordefectoensustablasderutas,mientrasqueparaelrestodelas redes,larutapordefecto(yparaloshosts)sersiemprelaquellevehacia elbackbon. Configuracindeunpuesto Unavezcomprendidoslosconceptospasemosacalcularlasdirecciones. ConladireccinIPylamscaraderedsepuedenobtenerlasdems. Tomando como ejemplo el nodo A observamos que se cumplen las siguientesrelacioneslgicasusandolosoperadoreslgicos(AND,NOTy OR)sobrelosbitsqueloscomponen:

406

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Mscara deRed Direccin IP

255.255.255.000 172.022.022.021 AND

Direccin deRed NOT(Ms caradeRed) Direccin deRed

172.022.022.000

000.000.000.255 172.022.022.021 OR

Direccin deBroadcast

172.022.022.000

ObservequeconladireccinIPylamscaraderedsepuedededucirlas restantesdirecciones.Porlotantositienequeconectarseaunaredlocal bastarconpreguntaraladministradordelamismaesosdosnicosdatos. Criteriosparasubnetearunared Vamosacomentarloscriteriosquesepuedentenerencuentaalahorade decidirsubnetearunagranredenvariasmspequeas. Subnetear una red no sirve unicamente a criterios topolgicos relacionadosconlainstalacinfsicadelared.Estclaroquelaredes 407

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

topolgicamente distintas o que usen diferentes protocolos de transmisin, deberan tener direcciones distintas para no mezclar artificialmentecosasdistintasperotambinsepuededividirunagranred envariasporotrosmotivos.Porejemploparafacilitarlaadministracin delareddelegandoacadaadministradorlagestindedireccionesdeuna subred. Quizs las estructura de una empresa aconseje separar redes disintasparadistintosdepartamentosporejemplo.Esdecirlassubredes pueden facilitar la adaptacin de la red a la estructura de una organizacin.Tambinpuedenservirparaaislarredescontrficointerno abundanteyfacilitareldiagnsticodeproblemasenlared. Entehorasepuededividirunasolaredfsicaenvariaslgicasperosila separacin fsica fuera posible conviene hacerla uniendolas con un gatewayporqueaumentaremoselanchodebandatotalenlared.Hayque tenerencuentaqueunaredethernetesunbusconacesoCsma/CDypor lotantoenuninstantedetiempodado,variospuestospuedenescuchar simultaneamenteperonuncapuedenhablardosusandoelmismobusala vez porque origina la colisin de los paquetes y estos debern ser reenviadosdeformanosimultnea. Los trminos Pasarelas (Gateways), Routers (Routers) y Puentes (Bridges)serefierenaunaseriededispositivosparainterconectarredes. Muchas veces estos dispositivos son un PC con un par de tarjetas de comunicaciones para conectarse simultaneamente a dos redes funcionando con un software apropiado. Un puente conecta dos redes parecidas(porejemplopuedenserdistintasensuvelocidad)sincambiar laestructuradelosmensajesquecirculanporellas.UnRouterconecta dos redes que son iguales (o parecidas). No hay traduccin de un protocoloaotroperositraduccindedirecciones.Unapasarelapuede conectar redes distintas (por ejemplo una ethernet y una token ring) realiza la conversin de protocolos y la traduccin de direcciones. Si recordamoslosmodelosOSIyTCP/IPexplicadosanteriormentevemos queenlosdistintosdispositivosmencionadosactuaranadistintonivel delmodelodecomunicaciones.

408

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Puestoqueunrouterincluyelafuncindepuente,ylapasarelaengloba lasfuncionesderouterydepuente.Porqueentoncesnoseusasiempre unapasarela(gateway)? Cuandotodoslosnodosdeunareddebenalcanzartodoslosnodosdeotra red, se provoca una sobre carga de la red debido a los protocolos de rutado.Enestecasoycuandoambasredesutilizenelmismoprotocolode red,lamejorsolucionesunpuente. Existeotrotipodedispositivoquesirveparaconectardosredesyquese llamaFirewall.Setratadeundispositivolgicoquesirveparaconectar deformaseguralaparteprivadadeunaredconlapartepblica.Estos dispositivos pueden establecer una poltica de restricciones a la informacinquecirculaporellos. Para determinar una ruta como la mas idonea, se utiliza el siguiente criterio.Elprotocolodeinformacinderutado(RIP)esunprotocoloque estbasadounicamenteenelcoste. Acadarutaseleasociauncosteenfuncindelrendimientodelared,tipo delalinea,etc.Estopermitedeterminardeentrevariasrutasposiblescual es la de menor coste. Cadarouterdeunaredenvayrecibeinformacinderutadoquepermite actualizarlastablasderutadocada30segundos.Cuandoelcostedeuna rutasuperaelvalor16elsistemaseconsiderafueradealcance.Lacaida deunnododelaredsueleprovocarlaperdidadealgunosmensajeshasta quelastablasderutadodetodoslosrouterssereajustan. ServidoresdeNombres Las direcciones IP son muy adecuadas para las mquinas pero son dificiles de recordar. Por esta razn se usan nombres de dominios. AdemsusandosolounadireccinIPsinnombretendramosquecambiar de direccin cada vez que nos alojemos en un servidor distinto. Si asimilamos una direccin a un nombre podemos mantener nuestra presenciaeninternet cambiandodeservidorsinqueapenassenoteel 409

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

cambio.Enlaprcticaelcambionosucedeinstantaneamenteporquetiene quepropagarselainformacindelcambiodenombreengranpartedela red. Para una red pequea nos bastara usar un fichero /etc/hosts que sea comnatodoslosnodosdelared.Silaredesmsgrandecadacambio ha de ser propagado a los dems lo antes posible y controlar que la informacin se mantiene coerente o usar un sistema de base de datos compartidocomoNIS,etc. Apesardeellotodoestoresultainsuficientecuandohablamosderedes muygrandes.Elfichero/etc/hostsoequivalenteseraenormeasiquelo quesehaimplementadoparaqueeninternetexistaunserviciodenombre esqueesunprotocolollamadoDNSquepermitetenerestainformacin distribuida adecuadamente mediante un sistema de dominios que se reparten la carga de gestionar estos nombres organizados de forma jerrquicageneralmentehastatresnivelesdeloscualeselprimerosuele indicareltipodeactividad.Porejemplo:

com:Empresascomerciales org:Organizacionesnocomerciales. edu:Universidadesycentrosdeinvestigacin. net:Pasarelasynodosadministrativosdelared.

Conelfindeaumentarlaeficienciaylatoleranciaafalloscadazonatiene unservidordenombresautorizadoomaestroycadaunodeestostiene variosservidoressecundarios.Laszonassedefinencomosuperconjuntos deredesIPredondeadasaniveldeunocteto. Estructuradepaquetes Lospaquetesotramassonsecuenciasdebitsquecontienennosololos datosconinformacindeusuariosinodatosdecabeceraydecolaquese estructurandeformaquelosnivelesinferioresdetransmisindedatos vanencapsulandoalosnivelessuperiores.ParaformarunpaqueteUDP habraqueenvolverlodelaformasiguiente. 410

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Datos Nbytes UDP 20bytes IP 20bytes UDP 20bytes UDP 20bytes Datos Nbytes Datos Nbytes Datos Nbytes Ethernet 4bytes

Ethernet IP 14bytes 20bytes

La parte que representamos a la izquierda de los datos son datos de cabecera, y los de la derecha son datos de finalizacin del paquete. nicamente el niveldeInterfaz Ethernet tienepartedefinalizacin, y todos los niveles tienen datos de cabecera. Para el caso de TCP la estructurasersimilar. Datos Nbytes TCP 20bytes IP 20bytes TCP 20bytes TCP 20bytes Datos Nbytes Datos Nbytes Datos Nbytes Ethernet 4bytes

Ethernet IP 14bytes 20bytes

La parte de datos puede tener distinto tamao segn los casos pero generalmentenosermuchomayorde1KByte. Estudiarendetallelaestructuradeestospaquetesexcedelaspretensiones deestecursoapesardeelloconvieneilustrarconunpardeejemploslo queseranunpardecabecerasyparaellousaremoslaestructuradeuna cabeceraIPydeunacabeceraTCP.Ambassonestructurasde20Bytes.

411

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

CabeceraIP(20bytes) Versin IHL TipodeServic. Identificacin TiempodeVida Protocolo Flags TamaoTotal Desplazamientodel Fragmento

ChecksumdeCabecera

DireccindeOrigen DireccindeDestino SimplementenosconformaremosconresaltarquelacabeceraIPtiene datosdeidentificacinydireccionamientoylacabeceraTCPcontiene informacindelospuertosascomoindicadoresdecontrol,numerode secuenciadelospaquetes,etc.paradetectarlaperdidadepaquetesosu deterioroafindegestionarelreenvidepaquetesencasonecesario. CabeceraTCP(20bytes) PuertodeOrigen Puertodestino Nmerodesecuencia NmerodeConfirmacin Desplz. UA P R S F delos Reservado R C S S Y I datos GKH I NN Checksum Ventana PunterodeUrgencia

EnInternetundestinoyunorigennoimplicaunarutafija.Losmensajes buscansurutapasandoatravesdevariosnodosydicharutapuedevariar incluso dentro de una misma sesin o de una misma transferencia de ficheros.Porejemplolacaidaenunarutasupondralaperdidadealgunos paquetes pero no afectara a la transmision ya que esta continuara rpidamenteporotrarutasinqueapenaspodamospercibirlo. Recordemos que Internet proviene en sus origenes de diseos con objetivosmilitares. 412

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Sihaceunpingaunamquinaremotarecibirunainformacinutilpara diagnosticarlacalidaddesuconexionconeseservidor.Setratadeun serviciomuycorrienteorientadoadatagramas. Primeroleirmostrandounaseriedelneasdondepodrcomprobarel tiempo de respuesta expresado en milisegundos. Si interrumpe su ejecucinmostrarunasestadsticasdondepodrverentreotrascosasel porcentagedepaquetesperdidos. Enestemomentopodemosentendermejorcualesladiferenciaentreun repetidor (repeater), un puente (bridge), un enrutador (router), una pasarela(gateway),yuncortafuegos(FireWall).Salvolosrepetidoresy engeneral,estosdispositivospuedenserunPCconunpardetarjetasde redconectadacadaunadeellasaunareddistinta. Representaremos en azul claro la parte de las tramas que pueden ser afectadasosolotenidasencuenta.REPETIDOR(REPEATERS) Unrepetidorsoloamplificayretocalasealanivelpuramenteelctrico. Porlotantoignoracualquiercosasobrelainformacintransmitida. Ethernet IP UDP 14bytes 20bytes 20bytes Ethernet IP TCP 14bytes 20bytes 20bytes PUENTE(BRIDGE) Unpuenteactatraduciendoocontrolandolacirculacindepaquetesa niveldeInterfazdered.EnnuestrocasoeslacapaEthernet.Ambasredes debernsermuyparecidasyaquecualquierdiferenciaenlosprotocolos superiores hara imposible la conexionde ambas redes.En laprctica pueden permitirconectarredescondiferentes velocidades,peroambas redesfsicassecomportarancomounamismaredlgica. Datos Nbytes Datos Nbytes Ethernet 4bytes Ethernet 4bytes

413

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ethernet IP 14bytes 20bytes Ethernet IP 14bytes 20bytes

UDP 20bytes TCP 20bytes

Datos Nbytes Datos Nbytes

Ethernet 4bytes Ethernet 4bytes

ENRUTADOR(ROUTER) UnRouteractuatraduciendoocontrolandolacirculacindepaquetesa niveldered.Podemosvereneldibujosiguientecomounrouterpuede actuaraniveldeInterfazdered(EnnuestrocasoEthernet)yanivelde red(ennuestrocasocapaIP). Ethernet IP 14bytes 20bytes Ethernet IP 14bytes 20bytes UDP 20bytes TCP 20bytes Datos Nbytes Datos Nbytes Ethernet 4bytes Ethernet 4bytes

PASARELA(GATEWAY) Unapasarela(Gateway)actuaraniveldetransportequeennuestrocaso puedeserTCPoUDP.Tambinenglobalosnivelesinferiores. Ethernet IP 14bytes 20bytes Ethernet IP 14bytes 20bytes UDP 20bytes TCP 20bytes Datos Nbytes Datos Nbytes Ethernet 4bytes Ethernet 4bytes

CORTAFUEGOS(FIREWALL) Un CortaFuegos (FireWall) puede actuar permitiendo o denegando el paso de paquetes considerandolos en su totalidad permitiendo el ms ampliocontrolposible.Unodelosusosmscomuneseseldeproteger una intranet de accesos indeseados en ambos sentidos con el exterior 414

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

especificando una polticas restrictivas a nivel de puertos, servicios, direccionesIP,ocualquierotracosa. Ethernet IP 14bytes 20bytes Ethernet IP 14bytes 20bytes UDP 20bytes TCP 20bytes Datos Nbytes Datos Nbytes Ethernet 4bytes Ethernet 4bytes

En la siguiente ilustracin se muestra a que nivel se comunican dos equiposintercomunicadosporunodeestosdispositivos

415

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ELARRANQUEENLINUXYCOMOSOLUCIONAR SUSPROBLEMAS(PrimeraParte)
Introduccin Enestecaptulointentaremosdescribirlasposiblescausasporlascuales unsistemaLinuxpuedetenerproblemasparaarrancaroparafuncionar correctamenteylaformadesolucionarlo. Estos problemas pueden aparecer durante la instalacin con relativa frecuencia perotambin puedenpresentarsepordistintas causasenun sistema que lleva tiempo funcionando. En estos ltimos casos suele tratarse de un descuido cometido desde root o bien por un fallo del hardware.Algunasvecesseconviertenenautnticaspesadillas parael usuarioquelaspadece. Paradefendersedetodoestotenemosqueaprenderbastantescosassobre el sistema y su funcionamiento. Trataremos primero de describir el procesodearranque. Este tema ha sido dividido en dos partes. La primera describe principalmente los diferentes cargadores de arranque, y la segunda el procesodeinicializacin. Cargadoresdearranqueengeneral Uncargadordearranqueesunsoftwareencargadodecargarenmemoria elsistemaoperativo.Setratadealgocuriosoyaquebienmiradoesun softwareencargadodecargarenmemoriaotrosoftware.Peroentoncesel astutolectorsepreguntarquiencargaalcargador?Larespuestaesmuy sencilla.LaBIOS.(BasicInputOutputSistem).Esunsoftwarequereside enunamemoriaespecialnovoltildelordenador.Novoltilquieredecir 416

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

queseconservainclusonoelordenadorapagado.Estamemoriaesde solo lectura. Denominada por ello ROM (Read Only Memory) por contraposicinalaRAMqueesmemoriatotalmentevoltil. No se pretende explicar el hardware del PC pero para no dejar esto incompletomencionaremosqueexisteotrocomponentehardwarequea diferenciadelaROMydelaRAMadmitelaalteracindeciertosvalores de configuracin que no se perdern cuando el ordenador se apague, aunqueparaelloserecurreaunapequeapila.Estamoshablandodela CMOS. LaBIOS esperaencontrar uncargador enalgndispositivo.Conviene tener presente que la CMOS debe configurarse de modo que intente arrancarexplorandolosdistintostiposdedispositivos,(disquete,cdrom,o discoduro,etcenlasecuenciaqueanosotrosnosinterese). Existen distintas alternativas para arrancar en Linux. Nosotros comentaremosLilo,Loadlin,yGrub.Nosepuedeafirmartajantemente que uno sea superior a otro. Son muy distintos en su filosofa y ello presenta ventajas e inconvenientes para cada uno dependiendo de las circunstancias.Todoselloscomopasofinalpasanelcontrolalsistema operativo.Algunoscargadoresofrecenlaposibilidaddeelegirarrancar condistintossistemasoperativos. LaBIOSdebercargarunaseccinespecialdeldiscoodisquetequeno se localiza en ninguna particin pues se encuentra en una pequea localizacinpreviaalaparticiones.Estaseccineselregistromaestrode arranqueabreviadamenteMBR(MasterBootRecord).Unavezcargadoel MBRyasepuedelocalizarlaparticindonderesideelkerneloncleo del sistema operativo y cargarlo. Tambin podr localizar la particin donde reside el sistema de ficheros raz que no tiene porque ser necesariamentelamisma. Undisquetenoposeeparticiones.nicamentedisponedeunsectorde arranquede512bytesyunazonadedatos. 417

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

UndiscodurotieneunMBRyhastaunmximodecuatroparticiones primarias.Sisenecesitanmsparticionessetomaunadelasparticiones primariasysesubdivideenparticioneslgicasperoentonceslaparticin primariatratadadeestaformapasaallamarseparticinextendida. Resumiendotodoelprocesodearranqueseraalgoas: 1. La seal elctrica de reset o la de establecimiento de la alimentacin elctrica instruyen a la CPU para ejecutar las instruccionesdelaBIOSdesdesupuntoinicial. 2. LaBIOSbasndoseenlaconfiguracindelaCMOSlocalizael dispositivodearranqueycargaelMBR. 3. ElMBRpasaelcontrolalsectordearranqueenlalaparticin adecuada. 4. ElsectordearranquecargaelSOylecedeelcontrol. Discosyparticiones RecordamoslanomenclaturadelosdiscosylasparticionesenLinux. (/dev/hd[ah]paradiscosIDE,/dev/sd[ap]paradiscosSCSI,/dev/ed[ad] para discos ESDI, /dev/xd[ab] para discos XT, /dev/fd[01] para disquetes). Estos nombres de dispositivo se refieren siempre al disco entero. El dispositivo puede ser un disco duro no removible, un disco duro removible, una unidad lectora o lectora/grabadora de cdrom, o de cdrom/dvd,unidadeszip,uotrascosas. Imaginemos un PC con tres discos duros IDE, dos discos SCSI, una disquetera y unlector de CDROM IDE conectado al controlador IDE primarioesclavo
/dev/hda /dev/hdb controlador IDE controlador IDE primario primario maestro esclavo

418

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html /dev/hdc controlador IDE secundario maestro /dev/hdd controlador IDE secundario esclavo /dev/sda primer dispositivo SCSI. /dev/sdb segundo dispositivo SCSI /dev/fd0 disquetera /dev/cdrom -> /dev/hdb (link simblico para unidad cdrom conectado al controlador IDE primario esclavo

ComomximocadadiscopodrtenercuatroparticionesprimariasPara un primer disco IDE (/dev/hda) las particiones primarias seran /dev/hda1 ... /dev/hda4. Las particiones lgicas se nombran siempre a partirdela/dev/hda5enadelante. Por ejemplo vamos a suponer que deseamos disponer de cuatro particionesdistintas.Vamosasuponerqueusamos2particionesprimarias yunaterceraextendidasobrelacualsehandefinido2particioneslgicas elresultadoseraelsiguiente.
+-------------------------------------+ | Tabla de particiones /dev/hda | | +-----------------------------------| | | Particin 1 /dev/hda1 | | | | | |-----------------------------------| | | Particin 2 /dev/hda2 | | | | | |-----------------------------------| | | Particin extendida /dev/hda3 | | | +---------------------------------| | | | Tabla de particiones extendida | | | |---------------------------------| | | | Particin 3 /dev/hda5 | | | | | | | |---------------------------------| | | | Tabla de particiones extendida | | | |---------------------------------| | | | Particin 4 /dev/hda6 | | | | | +-------------------------------------+

419

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Es decir tenemos /dev/hda1, /dev/hda2, /dev/hda5, y /dev/hda6. La particin /dev/hda3 extendida no se usa directamente. Es un mero contenedordeparticioneslgicas.(Nosedebeformatear). SeguramenteleresulteextraoporqueenlosSOoperativosdeMicrosoft nosesueleusarmsdeunaparticinprimaria.Realmentesepodrahaber usadounaparticinprimariayunaextendidacontresunidadeslgicas. Es decir podramos haber usado /dev/hda1, /dev/hda5, /dev/hda6, y /dev/hda7dejando/dev/hda2comoparticinextendida. Tambinpodramoshaberusadolascuatroparticionescomoparticiones primarias/dev/hda1,/dev/hda2,/dev/hda3,/dev/hda4. ParavercualeslasituacinactualensuPC.Hagalosiguiente:
$ fdisk -l

Conviene sacar esta informacin por impresora y guardarla. Si accidentalmentesepierdelainformacindelatabladeparticiones,por ejemploporescrituraaccidentalenelprimersectordeundiscopodra volver a recuperarla usando ese listado. Tambin se puede guardar la informacin del primer sector de un disco duro salvndolo a disquete mediante:
$ dd if=/dev/hda of=/dev/fd0 count=1 bs=512

Pararecuperarestesectorbastahacer:
$ dd of=/dev/hda if=/dev/fd0 count=1 bs=512

Puede valer si solo usa particiones primarias, pero esto no salva la informacindelasparticioneslgicas.Lomejoresconservarlasalidade

420

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

'fdisk l'. No cuesta nada volver a particionar todo igual que estaba nuevamenteusandofdisk. CompartirelarranqueconotroSO InstalarLinuxenundiscoqueyatieneotroSOtipoWindows.Daremos unarecetamuysimplesuponiendoquepartedeunsistemaconunsolo discoduroyconunasolaparticinqueyatieneotroSOtipoWindows. 1. Desinstale antivirus y otros programas que pueda residir en posicionesfijasalfinaldeldiscoduro. 2. Desfragmentar el disco duro con la opcin de mxima descompresin. 3. Asegresedequetodalainformacinquedaagrupadaytomenota decuantoespacioquedalibre. 4. Dividir la particin con fips cortando por una parte donde no existainformacin. 5. Eliminarlasegundaparticin.Puedehacerloconelpropiofdisk deLinux. 6. Aadir una particin pequea para swap. y el resto la para la futuraparticinrazdeLinux.Paralaswappuedeusaruntamao deunos150Mbytes. 7. PorltimoinstaleLinux. Lilo LiloesprobablementeelcargadormsutilizadoenLinuxperosepuede usarparacargarunagranvariedaddesistemasoperativos. ElcargadorLilopuedeubicarseendistintoslugares.

SectordearranquedeundisqueteLinux.boot=(/dev/fd0,...) MBR de la primera unidad de disco duro. boot=(/dev/hda, /dev/sda,...)

421

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Sector de arranque del primer sistema de ficheros Linux en el primerdiscoduro.boot=(/dev/hda1,...)

Lilotambinpermitearrancardesdeunaparticinextendidaaunquenoes frecuentetenerquerecurriraesto. Nodebeconfundir/dev/hday/dev/hda1.Comoacabamosdeexplicarson cosasbiendistintas. SiustedtieneunSOdistintodeLinuxen/dev/hda1yusaboot=/dev/hda1 deteriorarelsistemadearranquedeeseotroSO.EnMSDOSsepuede regeneraresaprdidamediantelatransferenciadelosficherosdelsistema dearranquedesdeundisquetedelsistemamedianteelcomandosys. Siutilizoboot=/dev/hdaLilosegrabarenelMBR.Sidesearecuperarel MBR de MSDOS oWindows use desde undisquete dearranque que contengaelcomandofdiskdeMSDOSelcomandofdisk/MBR.Setrata deuncomandonodocumentadodeMSDOS. PorlotantocadavezqueustedejecutaelcomandoLilodeLinuxpuede estar afectando el proceso de arranque de otros sistemas operativos instaladosensumquina.AMicrosoftnolegustacompartirdemasiado su sistema de arranque con otros sistemas operativos. Durante la instalacindeWindowsnoserespetaelMBRyporellosidebeinstalar WindowsyLinuxconvieneinstalarLinuxensegundolugar.Paraello dejeunapartedeldiscolibreconsuficienteespaciooreserveundisco completoparasuLinux. Liloseconfiguramedianteelfichero/etc/lilo.conf.Semuestraunejemplo deconfiguracinbsica.Constadetrespartes:

Seccingeneraloglobal. SeccindeentradasLinux(image=<kernel>) SeccindeentradasnoLinux.(other=<particiondearranque>)

422

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Existe una parte general previa yluegopara cada opcindearranque etiquetadaconunidentificadorlabel=<etiqueta>.Paracadaopcinde arranque se puede definir cosas nuevas o redefinir ciertas cosas previamentedefinidasenlapartegeneral.
boot = /dev/hda delay = 40 vga = normal root = /dev/hda1 read-only image = /zImage-2.5.99 label = kern2.5.99 image = /zImage-1.0.9 label = kern1.0.9 image = /boot/vmlinuz label = linux vga = ask root = /dev/hdb2 other = /dev/hda3 label = dos table = /dev/hda

Salvoquesendicecualeslaentradapordefectoconlaopcindefault=, laprimeraentradaseconsideralaentradapredeterminadapordefectoy encasodenointervencinelsistemaarrancarusandoestaentrada.Antes deesoesperaruntiempo(delay=<dcimasdesegundo>)paradar tiempoainterveniryelegirelarranquedeseado.Sinoserecuerdacuales son las opciones para poder arrancar basta usar la tecla de cambio a maysculas <Shift> y se mostrarn la lista de las distintas opciones disponibles.Tambinsepuedeusarparalomismolacombinacindelas teclas<Alt>+<Ctrl>.Sisequiereforzarlaaparicindeestalistasintener queusarlasteclasusaremoslaopcinprompt. Elkernelausarseestablecemedianteimage=<ficherodelkernel>La variablerootpermiteespecificarcualserlaparticinraz.Denoexistir estavariablelilotomarelvalordeterminadoenelpropiokernel,locual puedealterarseconlautilidadrdev.

423

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Ennuestroejemplohemosdefinidounaparticinrazparalossistemas linuxmedianteelusoderoot=/dev/hda1enlaseccinglobalperoestose puedealterarylaentradalabel=linuxusarroot=/dev/hdb2yvga= ask.Estoltimopermiteelegirduranteelarranqueelmododepantallaa usar.Laopcinreadonlyhacequeelsistemadeficherosrazsearranque inicialmente en modo de solo lectura. Esto es lo normal pero posteriormenteduranteelarranquecambiaraamodolecturaescritura. Se puede incluir un mensaje durante el arranque mediante message = <fichero>. La opcin compact permite una carga ms rpida y es recomendableporellosuusoendisquetes(boot=/dev/fd0)peropuede serincompatibleconlaopcinlinear.Buenohaymuchasopcionesmsy convienemirarladocumentacindelilo. Unavezeditadoelfichero'lilo.conf'hayqueejecutarelcomando'lilo' parainstalarelcargadordearranque,queseactivarlaprximavezque searranqueelsistema.Elmsmnimocambioqueafecteaalgunodelos ficherosqueintervienenenelarranqueharqueestefalle.Porejemplosi sacaunacopiadelkernel,borraeloriginalyrenombralacopiaconel mismonombrequeeloriginaltodoparecerqueestigualqueantespero lasposicionesendiscoyanosonlasmismasyelarranquefallar.Para evitarestodespusdelarecompilacindeunkernelodecualquierotro cambioencualquieradeloselementosinvolucradosduranteelarranque deberreconstruirelcargadorvolviendoaejecutarelcomandolilo. LILO puede informar de la limitacin de la BIOS para acceder por encimadelcilindro1024.Silaparticindearranquesuperaestelmite cabelaposibilidaddequeelkerneluotroelementonecesarioduranteel arranqueresidaporencimadeeselmiteyresulteinaccesibleparaLilo impidiendo elarranquedelsistema.Laopcinlinearpuedeevitareste problema. Comonormadeprecaucindejesiempreunaentradaconelltimokernel defuncionamientocomprobadoparapoderarrancardesdelencasode queelnuevokernelgeneradofalle. 424

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Siustednopuedearrancarporqueolvidejecutarlilodespusdealgn cambio, deber arrancar desde un disquete y recuperar el arranque. Vamos a suponer que su sistema usaba la particin raz montada en /dev/hda1.(Esunasuposicinnadams).Enesecasoysidisponedeun disquete de arranque que ya est preparado para arrancar usando la particin raz /dev/hda1 el problema ser fcil de solucionar. Bastar ejecutar'lilo'unavezquearranquedesdedisquete.Undisqueteaspuede obtenersedevariasformas.Unadeellasessiustedcompilelkernel usando'makezimage'.(Veremosenposteriorescaptuloslacompilacin del kernel). Tambin podemos usar un disquete o CD de rescate que arranqueconunaparticinrazcualquierasiemprequeelkernelutilizado seacompatibleconnuestrosistema.Encualquiercasosepuedesiempre intentar.Unavezarrancadocondisquetederescatecreamosundirectorio paramontarenlnuestraparticinraz.
mkdir /hda1 cd /hda1 mount -t ext2 /dev/hda1 /hda1 chroot /hda1 lilo shutdown -r now

Laclavedeesteprocedimientoesten'chroot'.Setratadeuncomando queobtieneunasesinbasholanzauncomandocambiandoeldirectorio razactualporunodiferente.Evidentementeelnuevodirectoriodebede tener la estructura adecuada y los ficheros adecuados a cualquier directoriorazquesepreciedeserlo.Eldirectoriorazeslacajadonde ocurrecualquiercosaenelsistema.Hacer'chroot'equivaleacambiarde caja.FueradelanuevacajaescomosinadaexistieraparanuestroSO. Nosotroslousamosparaquelilofuncionedesdelaparticinrazquenos interesa. Tambinpuedeobtenerundisquetedearranquequeuselaparticinraz/ dev/hda1. Introduzca un disquete virgen formateado en la disquetera. Tendrquesaberdondeseencuentrasukernel.Puedemirarelfichero

425

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

/etc/lilo.confpararecordarlo.Esteeselficherodeconfiguracindelilo. Vamosasuponerqueelkernelfuera/hda1/boot/kernel.
mkdir /hda1 cd /hda1 mount -t ext2 /dev/hda1 /hda1 dd if=/hda1/boot/kernel of=/dev/fd0 rdev /dev/fd0 /dev/hda1 shutdown -r now

Conellocrearundisquetedearranqueparasuparticinraz.Despusde arrancardesdeelnuevodisquete,ejecuteliloparapoderarrancardesdeel discoduroenocasionesposteriores. Sonmuchaslascosasquesepuedendecirsobreliloyalgunosdetalles tcnicossoncomplicadosdeexplicar.Generalmenteesfcilconfigurar una arranque bsicoquefuncioneyencasodefallodaremos algunas indicacionessobrelasposiblescausas. Mensajesdeprogresodelcargadordearranquelilo. AmedidaqueLilovaprogresandovamostrandolasletras'L','I','L','O'.y sisedetieneenalgnpuntoserporquehasurgidoalgnproblemaquele impideprogresar. 1. Sinoapareceningunaletraduranteenarranquesignificaqueel cargador Lilo no pudo encontrarse. Quizs olvid ejecutar el comandolilo. 2. SisoloapareceLprobablementeexistaalgnproblemahardware. 3. Sisoloaparece LI elkernelnofuelocalizado.Aadalaopcin linearparaversisesolucionaelproblema.Estaopcingenera direccioneslinealesdesectoresenlugardedireccionesutilizando cilindros, cabezas y sectores. Esto permite direccionar sin necesidaddeusarlageometradeldisco.Porellotambinpuede servirparasolucionarellmitedelos1024cilindrosimpuestopor algunasBIOS.Estaopcinnodebeusarseconlaopcinlba32son 426

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

mutuamenteexcluyentes.Laopcinlineartambinpuedeentrar enconflictoconlaopcincompact. 4. SisoloapareceLILsignificaquenosepuedenleerlosdatosdel ficherodemapaypuedetratarsedealgnproblemahardware. 5. SiapareceLILOsignificaquelilofinalizcorrectamente. Loadlin SetratadeuncargadordelinuxqueactadesdeunsistemaDOS.Loadlin hadeejecutarsedesdeunsistemaDOSquepodrserundisquetecon autoarranqueoundiscoduro. Estecargadorpuedevenirbienenalgunascircunstancias.Hayquetener encuentaquelosPCssuelenestarpensadosparaarrancarsistemasDOSy algunavezpuedenincluiruncomponentehardwarequedependadeun controlador DOS para configurar unos pocos registros en el hardware antesdearrancarelSO. Elprocesodearranqueconloadlinsedivideendosetapas.Unaesel arranquedelpropiosistemaDOSyposteriormenteseejecutaloadlin.exe comounprogramaDOSnormalycorrientepasandocomoargumentosel kernelyalgunascosasms. Compararemos la secuencia de arranque con lilo o con loadlin en el siguientegrfico:

427

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Vamosacomentarunarecetaparaconstruirundisquetedearranquecon loadlin. FormateeundisquetedesdeDOSincluyendolosficherosdelsistemade arranque.Esdecir'formata:/s' DesdeLinuxcopieaesedisqueteelkernel.Porejemplo


$ mcopy /boot/kern24 a:

Editeunficheroautoexec.batparaquecontengalosiguiente:
$ loadlin kern24 root=/dev/hda3 ro vga=3

Copieloaldisquete.'mcopyautoexec.bata:'Tambincopieloadlin.exe, 'mcopyloadlin.exea:'Esunficheroquepuedevenirenalgnpaquetede su distribucin oenelCDdeinstalacin. Antesderetirar eldisquete asegurequesegrabarontodosesosficherosusando'sync;sync' Grub

428

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

GRUB Es un cargador que ofrece algunas ventajas sobre LILO pero tambin algunas desventajas. GRUB no es sensible a cosas como la sobreescrituradeunkernelantiguoporotronuevoconelmismonombre ninecesitavolveraejecutarelcargadorsinohaycambiosanivelde ficherosenloselementosqueparticiparanenelarranque.Estossuelen encontrarse localizados generalmente en /boot/grub/. La linea de comandos del cargador es ms compleja en GRUB. El fichero de configuracindeGRUBes/etc/grub.conf Unejemplodegrub.confparaunaconfiguracinbsicasera:
root (hd0,2) install /boot/grub/stage1 (hd0,2) /boot/grub/stage2 0x8000 (hd0,2) /boot/grub/menu.1st quit ############ (fd0) /dev/fd0 (hd0) /dev/hda ############ timeout=7 splashscreen = (hd0,1)/boot/messages.col24 default=0 title=Linux root=(hd0,2) kernel=/boot/vmlinuz.2.4 noapic nosmp root=/dev/hda3 title=Windows chainloader=(hd0,0)+1

El timeout viene expresado en segundos (en Lilo eran decimas de segundos).Eldefaultsealaconunnmerolaopcindearranquepor defecto.Enestecasoporvaler0tomarlaprimeraqueestitle=Linux dondetitlehacelasvecesdelabelenLilo.root=(hd0,2)indicaquela particinrazseencuentraenelprimerdiscoduro,terceraparticin.La lineadelkernelenGRUPmezclacosasqueirancomoappend=ycosas queenLiloaparecanenotraslneasdelilo.conf

429

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Montarydesmontarparticiones(mount) Lautilidadparamontarydesmontarparticionesesmount(8). Graciasamountlosdistintosdispositivosoparticionessepuedencolgar enalgnpuntodelgranarboldelsistemadeficherosraz. Elficherodeconfiguracinqueutilizamountparasabercomodonde,y cuando debe montar las particiones es fstab(5) que se localiza en /etc/fstab. Cada linea de fstab representa un registro donde se describe un determinadosistemadeficherosdelsistema. Loscamposencadalneaestnseparadosportabsoespacios.Elordende losregistrosenfstabesimportanteporquefsck(8),mount(8),yumount(8) recorren fstab secuencialmente a medida que trabajan. Los distintos camposdefstabson: 1. fs_spec)Describeeldispositivoasermontado. 2. fs_file)Describeelpuntodemontajeparaelsistemadeficheros. Para particiones de intercambio (swap), este campo debe decir ``none'' 3. fs_vfstype) Describeeltipodelsistemadeficheros.(minix,ext, ext2,msdos, vfat,autofs,iso9660,nfs,swap,...etc) 4. fs_mntops) Opciones de montaje. Es una lista de opciones separadasporcomas.Estaspuedenser: o defaults Resumetodaslasopciones(rw,suid,dev,exec, auto,nouser,atimeyasync). o rw,ro Respectivamente montaenescritura lectura oen sololectura

430

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

suid, nosuid Respectivamente permite o impide el funcionamientodeldelicadobitdepermisosetuid. o dev,nodev Respectivamenteinterpretaonocaractereso bloquesdeundispositivoespecialdebloques. o exec, noexec Respectivamente permite o impide la ejecucindebinarios.(Laejecucindescriptsnopuede ser impedida y tampoco confe en esto para impedir la ejecucindeunbinario.Cualquierprogramaquepuedaser ledopuedeserejecutado,aunqueseaindirectamente). o auto, noauto Respectivamente se puede montar con la opcina oserequiere hacerlo explcitamente. Es decir unoporuno. o user, nouser Respectivamente permite o impide que cualquiera pueda montar y desmontar dicho sistema de fichero. Lonormal es nopermitir que cualquier usuario puedahacerlo. o sync, async Toda entrada salida sobre este sistema de fichero se realizar de modo sncrono o asncrono. El modoasncrononoaseguraelmomentoenquelascosas realmenteocurrenperograciasaesto,elSOsercapazde optimizarlasoperacionesdeentradasalida. o atime,noatimeNoactualizarlaltimafechadeaccesoa uninodo.Conelloseaumentalavelocidaddeacceso. 5. fs_freq)Estequintocamposeusaparadeterminarsielcomando dump(8) necesita volcar o no el contenido de este sistema de ficheros. 6. fs_passno) Lo usar fsck(8) para saber en que orden deber comprobarlossistemasdeficheros.Sinotienevalorseasumeque el sistema de ficheros no debe ser chequeado. El sistema de ficherosrazdeberallevarfs_passnoiguala1,yotrossistemasde ficherosdeberanllevarfs_passnoiguala2omas.Sistemasde ficherosenunmismodiscosernchequeadossecuencialmentey conviene establecer el orden mas conveniente entre ellos, pero sistemas de ficheros en diferentes discos, con mismo valor fs_passnosernchequeadosalmismotiempoparaganartiempo.
o

431

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Paraquemountseacapazdemontarundeterminadosistemadeficheros resultaimprescindiblequeexistaelsoporteadecuadoenelkernelbiensea estticamenteocomomdulo.Enelcasodelaparticinraznosirveusar unmduloparadichosistemadeficherosniparasucontroladordedisco ni nada ya que para acceder a los mdulos es requisito previo imprescindibletenermontadoelsistemadeficherosraiz. Ejecutandomountasecaspodemosverlossistemasqueestnmontadosy conqueopciones.Conelcomandodf(1)vemoslossistemasmontadosy elnumerodebloquetotales,libres,usadosyelporcentajedeuso. Unavezmontadaslaparticionespodemosconsiderarqueelarranqueha tenidolugardadoqueexisteunkernelfuncionandoyloscontroladores bsicosdememoria,dediscosydesistemadeficherosfuncionan. Serahoracuandosearranqueelprimerprocesoencargadodeinicializar todoelsistema.Estoloveremosenelsiguientecaptulo.

432

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

ELARRANQUEENLINUXYCOMOSOLUCIONAR SUSPROBLEMAS(SegundaParte)
Introduccin Enlaprimerapartedeestetemayacomentamoslosdiferentescargadores dearranque,yahoracomentaremoselprocesodeinicializacin. Tambin repasaremos los problemas que pueden aparecer en nuestros discosoennuestrossistemasdeficheros.Asumiremosenestecaptulo quelaparticionesLinuxsondetipoext2.Entreotrascosastrataremosde explicar como reparar sistemas de ficheros ext2. Para otro tipo de sistemasdeficheroscomoext3,reiserfs,JFS,XFSseusarnutilidades diferentesycambiarnalgunascosasrespectaext2.Enreiserfsyenext3 noresultanecesariochequearelsistemadeficherosdespusdeunapagn peroesonolohacemssegurofrenteacortesdefluidoelctrico.Puede haberdiferenciasderendimientoentrelosdiferentessistemasdeficheros dependiendodelostamaosdeficherosydeotrascircunstanciaspero tampocodebenesperarsediferenciasespectacularesderendimientoentre ellos. Nosiemprelonuevoeslomejor.Elsistemaext2esmuyestableporque llevamuchotiempofuncionando.Lossistemasnosonperfectosysobreel sistemadeficherosrecaemucharesponsabilidad.Unfalloenunsistema deficherospuedeprovocarlaprdidadetodalainformacindelsistema. Hayalgunasdistribucionesquepordefectoinstalansistemasdeficheros distintos de ext2. En parte es una cuestin de gustos. Nosotros nos limitamos a ext2 pero aunque usted use otro sistema de ficheros encontrarmuchainformacinutilenestecaptulo. Enestecaptulosemencionarlalocalizacindemuchoseimportantes scriptsdelsistema.Ustedyatienenivelsuficientecomoparaentenderlos. 433

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Muchosdeellossonbastantecrticosyesmejornomodificarlosotrosno son tan crticos ypuedenadaptarsesin riesgoalas necesidades desu sistema. En cualquier caso sea curioso, repase los diferentes scripts y aprendermuchascosasinteresantes. Muchossonlosaspectosdelkernelqueincidenenlaproblemticadel arranqueperoesaparteladejaremosparaunposteriorcaptulo. Inicializacindelsistema(init) Unavezelcargadorcompletalacargadelkernel,esteterminacediendoel controldeejecucinalsistemaoperativoelcualefectuarunaseriede tareasqueconvieneconocer. 1. Existeunalimitacininicialquevienedeldiseooriginaldelos PCs.IBMeligicomolmite1MegaByteporqueensumomento no consider la posibilidad de que un ordenador personal necesitarajamsaccederamsde1MegadememoriaRAM.Por estaraznelkerneldeLinuxsecargaenformacomprimidapara no rebasar ese primer Megabyte de la memoria RAM. A continuacinseejecutaunaprimeracabeceradeesainformacin grabadaenRAMquepasalaCPUamodoprotegidoydeesta formaeliminalarestriccindeaccesoaRAMpudiendoentonces acceder ms all del primer Megabyte de memoria, y pasando seguidamente a descomprimir todo el kernel para su posterior ejecucin. 2. El kernel monta el sistema de ficheros raz raz en modo solo lectura,ylohacesinpoderusarningunodesusmdulosyaque estos solo son accesibles una vez el sistema raz est perfectamentemontado.Elkerneltambinnecesitasercapazde manejar el sistema dememoria virtual sinusar ningnmdulo antesdequesemonteelsistemaraz. 3. Elkernelarrancaelprocesoinitquizsprecedidodealgnproceso planificadordependiendodelossistemas.Elprocesoinittendr

434

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

comoPIDelvalor1.Serelprocesoquegenereatodoslosdems procesosdelsistema. 4. 'init'leeelfichero'/etc/inittab'.Esteficherocontienelalistadelos procesosquedebenserarrancados.Losprocesosserepartenen distintosnivelesdeejecucinparagarantizarunordendearranque o parada entreellos dependiendo delniveldeejecucin alque estnasociados.Losprocesossernarrancadosmediantescriptsrc situadosen/etc/rcX.d/dondeXeselniveldeejecucin. Estos scriptsusanunanomenclatura'Snn...'o'Knn...'dondeelprefijoS significa arranque de un servicio y el prefijo K parada de un servicio. Viene de (S)tart, y (K)ill). Los dos dgitos siguientes determinan el orden de ejecucin de cada script dentro de un mismonivel. 5. 'init' arranca los procesos que estn asociados al nivel 1 de ejecucin,quesecorrespondeconelmodomonousuario.Antes deentrarenestenivel1seejecutaranlosscriptsasociadosalnivel 'S'quenoesenrealidadunniveldeejecucinquesepuedausar directamente,sinoquecontienescriptsespecficosqueseejecutan durante el arranque, y como acabamos de explicar se ejecutan antesinclusodelnivel1.Sedeterminasielsistemadebechequear el sistema de ficheros con 'fsck(8)'. Esto ser necesario si se terminbruscamentesindesmontarlossistemasdeficherosobien porqueelsistemadeficherosalcanceunciertonmerodeveces de montaje y desmontaje sin que se chequee el sistema de ficheros.Porlotantosiresultanecesariosechequearelsistema deficherosrazysielchequeoterminasinnovedadsecontinua conelmontajedelosrestantes sistemasdeficheros,perosise detecta algn tipo de problema serio el sistema solicitar la contraseaderootquedandoelsistemaenelnivel1monousuario parasepuedaejecutar'fsck'manualmente.Trataremosestetema msadelante. Lossistemasdeficherostienenincorporadouncontadordeforma que alcanzado un cierto valor mximo se considera necesario chequearelsistemadeficheros.Dichovalormximopuedeser 435

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

alteradousando'tune2fs(8)',perogeneralmentenoesbuenaidea hacerlo. Un chequeo ms frecuente resultar incmodo, uno menos frecuentesuponeaumentarelriesgodeundeteriorodel sistemadeficheros. 6. Finalizadoelchequeodelaparticinrazestasevuelveamontar peroestavezenmodolecturaescritura.Chequearelsistemade ficheros Se montan el resto de los sistemas de ficheros especificados en '/etc/fstab' salvo aquellas entradas (lineas) que figurencomonoauto.Vease'mount(8)'y'fstab(5)' 7. Elsistemaentrarenelrunlevelpredeterminadoquepordefecto queenelcasodeDebianesel2.Estealigualquemuchascosas vieneespecificadoen'/etc/inittab'
8. 9. # The default runlevel. id:2:initdefault:

EnestenivelenDebiansearrancaelentornogrficodeventanas mientrasqueenotrossistemasestoocurreenelnivel5.Los nivelesdeejecucin(runlevel)puedenvariardeunsistemaaotro peroentrminosgeneralesestnorganizadosdelaforma siguiente: 0Detieneelsistema. o 1Entraenmodomodousuario. o 25Entraenunavariedaddemodosmultiusuario. o 6Provocaelrearranquedelsistema. 10. Despusdeejecutarlosscriptsdelrunlevelpredeterminado,'init' procedeaarrancarmediante'getty(8)'unaseriedeterminaleso seudoterminalesconectadosalsistema.
o

'getty'presentasobreelterminalunintroductor'login:'quetomar elnombredeusuario.Unavezintroducidoelnombredeusuario esteprocesosetransformaenelprocesologinpormediodeuna llamadaexec.(Estoyaseexplicenlapartedelcursodedicadaa losprocesos).Elprograma'login(8)'solicitarunapasswordyen casodequeestaseavlidasetransformarmedianteunnuevo 436

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

exec en la shell destinada a ese usuario mediante su correspondienteentradaen'/etc/passwd'. Cuandolashellmuere,initlodetectacomosielprocesogettyque arranchubieramuerto.(Enrealidadelpidnovaraalhacerlos sucesivosexec).Dadoquelosgettysearrancanenmodorespawn, 'init'losrearrancacadavezquemueran. Explicacindeinittab Primero consute la pgina man inittab(5). Luego examine su fichero '/etc/inittab'. Tiene quetener claro quelamodificacin deestefichero conduce con enorme facilidad a situaciones donde el sistema no ser capazdevolveraarrancar. Porelmomentoesmejorqueselimitealeerinittabsinmodificarlo.Las lneasqueempiezanpor'#'sonsimplescomentarios.Lasdemslneas constarndecuatrocamposseparadospor':' 1. IdentificadorGeneralmenteelidentificadoradmiteunmximode doscaracteresquedebersernicoparacadalnea. 2. Niveles de ejecucin Contiene los niveles de ejecucin en los cuales la accin resulta adecuada. Si no aparece ninguno se entiendeadecuadaparacualquiernivel. 3. TipodeaccinHayunascuantostiposdeacciones(once,sysinit, boot, bootwait, wait, off, ondemand, initdefault, powerwait, powerfail,powerokwait,ctrlaldel,kbrequest)Puedeconsultarla pginamandeinittab(5)dondevienenexplicados. 4. ProcesoProgramaaejecutar. Elcomandorunlevel(8)devuelvelosdosltimosnivelesdeejecucin. Encasodenoexistirunniveldeejecucinprevioalactualserepresentar conlaletraN.

437

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Pruebeapasarmodomonousuarioconelcomandoinitotelinit.

# init 1

Ocon

# telinit 1

Recuerdequeenestemodonadiemsqueessuperusuariopodrusarel sistemaynopodrusarningnserviciodelsistema.Estosehacepara reforzarelcontrolderootsobretodoelsistema. Ensituacionesdelicadaslepermiteasegurardequeensistemanoesta ocurriendoabsolutamentenadasalvolasordenesque'root'vaejecutando. Ofreceunabsolutocontroldeoperacinparaeladministracinfrentea todotipodeproblemasincluidoslosataquesintencionados. Lamejormaneradesalirdelmodomonousuarioesrearrancarcon

# shutdown -r now

Ocon

# init 6

Ocon

# telinit 6

438

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Losscriptsrc Lainformacinsobrelosscriptsrcosobreinittabpermitecomprenderel proceso completo del arranque de Linux. Gracias a esta informacin podr con un poco de suerte diagnosticar una enorme variedad de problemasysolucionarlos,peroexperimentarporpurojuegoconestas cosaspuedeocasionarproblemasconunagranfacilidad. Los scripts rc o el fichero inittab son fciles de interpretar pero su funcionamientoesbastantecrticoparaelbuenfuncionamientodelresto delsistema. Nuncadeberatocarnadasinasegurarsequepuedellegadoelcasodar marchaatrsydejarlotodocomoestaba.Porejemplosieditaalgunode estosficherossaquepreviamenteunacopiadeloriginalyguardelaporun tiempo. Existeunaopcinparaarrancarelprocesoinitsinqueejecuteningunode losficherosdescript.

# init -b

Esto est especialmente indicado para ciertos problemas de arranque. Como veremos luego ficheros deconfiguracin del tipo quesean que impidan unarranquepuedenserrecuperados montandolaparticin en modolecturaescritura. Losscriptsrcsonficherospresentesenlosdirectorios/etc/rc.d#.ddonde # es el runlevel . Cada script rc suele implementarse como un link simblicoqueempiezaporSoK(start)o(kill)seguidodedosdgitosy queapuntaaunficheroconelmismonombreperosinSniKnilosdos dgitos. Hagalosiguiente: 439

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

# cd /etc # ls -l rc*.d/*cron* init.d/*cron*

Obtendralgoparecidoalosiguiente:

init.d/anacron init.d/cron rc0.d/K11cron -> rc1.d/K11cron -> rc2.d/S20anacron rc2.d/S89cron -> rc3.d/S20anacron rc3.d/S89cron -> rc4.d/S20anacron rc4.d/S89cron -> rc5.d/S20anacron rc5.d/S89cron -> rc6.d/K11cron ->

../init.d/cron ../init.d/cron -> ../init.d/anacron ../init.d/cron -> ../init.d/anacron ../init.d/cron -> ../init.d/anacron ../init.d/cron -> ../init.d/anacron ../init.d/cron ../init.d/cron

Losservicioscronyanacronsonserviciosqueyahemostratadoenun captulo anterior. Observe que estos servicios de forma similar a la mayora de los servicios se arrancan y paran desde 'init.d/cron' y 'init.d/anacron' respectivamente.Observequelosenlacessimblicosde arranqueapuntanalmismoscriptquelosenlacessimblicosdeparada. Cualquier servicio puede arrancarse o detenerse de forma individual haciendo: '/etc/init.d/servicio start' o '/etc/init.d/servicio stop' respectivamente. Elproceso'init'procesaloscontenidosdelosdirectorios'rc#.d/'parair arrancandoyparandolosserviciosadecuados. Comopuedeverseen'/etc/inittab'elencargadodeprocesarlosscripts'rc' es '/etc/init.d/rc' que se usa pasndole el nivel de ejecucin como argumento.Elscript'rc'eselqueusalaletrainicialdelenlacesimblico

440

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

paralanzarelscriptaadiendounargumento'start'o'stop'segnresulte laletrainicial. ElordendeejecucindelosdiferentesscriptsdelsistemaenDebianeses siguiente: 1. Comopuedeverseeninittab(si::sysinit:/etc/init.d/rcS)desde'init' searranca'/etc/init.d/rcS'. 2. Desde'/etc/init.d/rcS'sonarrancadoslosscriptsqueseajustanal patrn'/etc/rcS.d/S[09][09]*' 3. Desde '/etc/init.d/rcS' se arranca los scripts en '/etc/rc.boot/*' usando'runparts/etc/rc.boot'. 4. Desde '/etc/init.d/rcS' se arranca '/sbin/setup.h' (Esto en Debian Potato,enSlinkera'/root/setup.sh') 5. Comopuedeverseeninittab(5)desde'init'searrancalosscripts delniveldeejecucinpasadocomoargumentoainitoencasode ausencia los scripts correspondientes al nivel de ejecucin por defecto. (En Debian es el 2). Para ello se usa '/etc/init.d/rc' pasndoleelniveldeejecucincomoargumento. Como hemos visto hay una serie de scripts destinados a procesar un conjuntodescriptscontenidosenundirectorio.Estatcnicaseusaen varioscasos:

Enelcasode'/etc/init.d/rc'seprocesalosscriptsdeldirectorio correspondienteaeseniveldeejecucinaadiendounargumento startostopdependiendodequeelnombreempieceporSoporK. En el caso de '/etc/init.d/rcS' solo se procesan los scripts encontradosqueempiecenporSaadiendolaopcinstart. Enelcasode'runparts(8)'soloseprocesalosscriptsdeldirectorio pasado como argumento sin aadir argumentos al script. Ya habiamos visto que 'runparts', es utilizado con frecuencia para procesar las tareas peridicas con 'cron(8)' organizando en directorios las distintas tareas dependiendodequeseandiarias, semanales,mensuales,anuales,etc. 441

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Personalizandoelprocesodearranque Nodecimosqueestosscriptsdearranquenosepuedantocarperohacerlo esarriesgado.Porejemplounscriptquenoterminesuejecucincolocado en'/etc/rc.boot'detendrelprocesodearranque. Siintentaaadirunservicioquedebaestarpermanentementeactivolo mejoresincluirloenelpropioinittabasociadoalaopcinrespawnpara queen caso demorirelprocesoinit lorearranque. Sinembargosiel proceso muere nada ms arrancar init lo rearrancara continuamente creandounproblemaenelsistema.Afortunadamenteinitdetectareso.Si init detecta que un proceso rearranca ms de 10 veces en 2 minutos suspenderdurantecincominutoselnuevointentodearranque.Tiempo quetendrqueaprovecharsolucionarelproblemadealgunaforma. Por ejemplo. Puede intentar editar directamente '/etc/inittab'. Si no se ponenerviosodisponede5minutosantesdequeseproduzcanotros2 minutosdelocuradelsistema. Siedita'/etc/inittab'desdeelpropiosistemaelprocesoinitnotomaren cuentaloscambiosmientrasnosearranqueomientrasnoseleinformede ellomediante:

# init q

Siestonoleconvenceonoseleocurrenadamejorpuederearrancar desdeunsistemadedisqueteparaeliminarlaentradaeninittabmientras el problema no est solucionado. Ms adelante se explica como solucionarunproblemadeolvidodepasswordderootybsicamenteen estecasohabraquehacerlomismoperoenlugardeeditar'/etc/passwd' habrqueeditar'/etc/inittab'. Recuerdequelamodificacinde'/etc/inittab'esunaoperacincrticaque puedeafectaralacapacidaddearranquedesusistema. 442

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

EnDebiansepuedeaadirunscriptasociadoaunniveldeejecucin deseado. Paraellosecolocaelscripten/etc/init.d/ yluegoseejecuta 'updaterc.d(8)' con los argumentos adecuados que crear los enlaces simblicoscorrespondientes. Porejemplo:

# update-rc.d mi-script defaults 88

CrearalosenlacessimblicosS88miscriptyK88miscriptparatodoslos runlevels.

# update-rc.d mi-script stop 83 1 2 3 5 6 start 85 2 3 5

CrearaK83miscriptparalosniveles1235y6,yS85miscriptparalos niveles23y5. ParaeliminarserviciosinnecesariosenDebianpuedehacerlosiguiente: 1. Creeundirectorioporejempo'/etc/services_off/' 2. Guarde la informacin actua siguiente: 'ls l d rc*/* > /etc/services_off/lsl.out', y despus mueva los scripts correspondientesalosserviciosinnecesariosdesde'/etc/init.d/'a'/ etc/services_off/'.(Sepuedenenlugardeesoeliminarlosscripts perodeestaformapodemosdarmarchaatrsconmsfacilidadsi fueranecesario). 3. Para cada unos de los servicios eliminados hacer 'updaterc.d nombre_servicioremove'.Conelloseeliminarnselectivamente todos los links simblicos que apunten a '/etc/init.d/nombre_servicio'desdelosdirectorios. Continuamosconladescripcindelprocesoderranque.Cuandoarranca elsistemaaparecenunosmensajesquepuedenseralteradoseditando'/etc/ 443

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

motd','/etc/issue',y'/etc/issue.net'Quizslesorprendaverunoscaracteres extraos pero son secuencias de escape destinadas a la consola. Si le interesacomprenderlasconsultelapginamandeconsole_codes(4). Recordemos que existen otros scripts que se ejecutan previamente al establecimientodeunasesindeintrpretedecomandos. Elprimeroqueseejecutaenelcasodeinterpretesdecompatiblesconsh( sh(1),bash(1),ksh(1),ash(1),..)ser'/etc/profile' En el caso de abrir una sesin con bash desde login se ejecutar '~/.bash_profile' que a su vez ejecutar '~/.bashrc'. Si la sesin no se arrancadesdelogin,(Porejemplosiarrancamosunasubshelldesdeun editor.),soloseejecutar'~/.bashrc'. HayotrosscriptsqueseejecutanparaarrancarsesionesdeXWindow mediantexdm(1)ostartx(1).Paraconfigurarelarranquedexwindows mediante el arraque de una serie de procesos en background que personalizanelarranqueenmodogrficoseusa'~/.xinitrc'ensudefecto seusar'/etc/X11/xinit/xinitrc'. Paraestablecerelservidorseusar'~/.xserverrc'ensudefectoseusar '/etc/X11/xinit/xserverrc'.Arranquedirectoconshsinusarinit Existeunaformadearrancarusadaenemergenciasquepuedesalvaren casodeapuroperodebeusarseconlamximaprecaucin. Consisteenarrancarusandoenlugardelprocesoinit,hacerloarrancando directamenteunashell.Esosepuedehacerpasandolealkernellaopcin 'init=/bin/sh'.Estosepuedehacerdesdeliloporejemplo.Deestaformase podra montar la particin raz en modo lectura/escritura y modificar nuevamente el fichero daado, cambiar una password olvidada, o cualquierotracosa. Silohacemos ashayquetenerencuentaquenoestamos usandoun mododefuncionamientonormal,yporelloantesderearrancarconviene 444

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

asegurarse que el sistema de ficheros queda perfectamente escrito sin operacionesdeentradasalidapendientesenmemoria.Paraellohagalo siguiente.

# sync # sync # shutdown -r now

Por el contrario si apaga de cualquier manera, el dao podra ser considerableeinclusopodraverseobligadoareinstalarlotodo. Algunasvecessearrancadeestaformacuandosesospechaqueelfichero correspondiente al ejecutable 'init' pudiera estar daado impidiendo totalmente el arranque pero podra ocurrir que arrancanco con 'sh' tampocologremosnada.Tanto'init'como'sh'usanlibrerascompartidas comunes y un dao en alguna de estas librera impedir el arranque usandocualquieradelasversionesnormalestantode'init'comode'sh'. Unalibreradinmicacompartidaconsisteenunconjuntodefunciones que pueden cargarse en memoria una sola vez y ser aprovechadas y compartidasporvariosprocesosfuncionandosimultaneamente. Porejemplo'libc.so.6','/lib/ldlinux.so.2'sonlibrerascomunesamuchos programasen Debian2.2.Puedecomprobarloconsultandolas librerias compartidasusadaspor'init'y'sh'.Paraellohagalosiguiente:

# ldd /bin/sh /sbin/init

Obtendrlosiguiente:

/bin/sh: libncurses.so.5 => /lib/libncurses.so.5

445

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html (0x40019000) libdl.so.2 => /lib/libdl.so.2 (0x40057000) libc.so.6 => /lib/libc.so.6 (0x4005b000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) /sbin/init: libc.so.6 => /lib/libc.so.6 (0x40019000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

LalibccontienetodasfuncionesdelaconocidsimalibreraestandardeC yalgunasfuncionalidadesaadidasporGNU.estecursonoestenfocado alaprogramacin.Dedotasformassinecesitainformacinsobreesta librerapuedeconsultarlousando:

# info libc

Hayquienmantieneunaversincompiladaestticamentedeinitosh.En realidad no es necesario. En caso de que el sistema tenga deteriorada libreras dinmicas lo apropiado es partir de un disco de rescate y recuperardesdecopiasdeseguridadantiguastodoelsistema. QueesunCDderescateyparaquesirve Unsistemapuedesufriralgnaccidenteoataquequeleimpidavolvera arrancar. La prdida de informacin de un sistema se puede subsanar mediantecopiasdeseguridadcomolasqueyasecomentaronenlecciones anteriores.Sisehaperdidoabsolutamentetodoresultaevidentequehabr querecurriralaltimacopiadeseguridadglobalperounacopiaglobal resultamuycostosayquizsnosehagacondemasiadafrecuencia.Por ellogeneralmentesehaceocasionalmenteysecomplementanconcopias incrementalesposteriores. Apesardeellosiserecuperaunsistemaapartirdelaltimacopiapuede haberinformacinnorespaldadaporserdemasiadoreciente. 446

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Afortunadamentelaprdidadelacapacidaddearrancarnosignificaque setratedeundesastrequeobliguearecuperartodoelsistemadesdelas copiasdeseguridadovolviendoainstalar,etc. Generalmente se puede recuperar el arranque interviniendo exclusivamentedonderesideelproblema. Deestaformalarecuperacinresultarmascompleta,msrpidaypuede quenossirvaparapreveniruncasosimilarenelfuturo. Parapoderarrancardeformaindependienteypoderiniciarlareparacin delsistema,esparaloqueseusanlosdisquetesoCD'sderescate. Evidentemente en caso del CD es importante que nuestro sistema sea capaz de arrancar desde CD. Para ello las opciones de arranque correspondientesdebendeestarhabilitadasenlaCMOS. Si nuestro sistemanopuedearrancarenmodoalgunodesdeCDROM habrqueconformarseconelusodeundisquetederescateperoenun disquetederescatenocabendemasiadasutilidadesdeayuda. Puede darse el caso que unsistema quearranca necesite serreparado desdeunsistemaderescate.Porejemplosielsistemadeficherosest deterioradoynopodemosusardemodofiablelasutilidadesdelsistema paraautorrepararseusaremoselCDderescate. Muchas distribuciones permiten que alguno de los CDs de instalacin puedaserusadoparaarrancarenmodorescate.Unavezqueunsistema derescatehaarrancadotenemos unpequeosistemaLinuxarrancado. Unadelasformasenlasqueundiscoderescatepuedearrancaresde formatotalmenteindependientesinnecesidaddeusarningndiscoduro parafuncionar. Generalmente se recurre a usar ramdisk para montar la particin raz aunquegeneralmentemenosadecuadotambinpodrausarseparaesoun disquete. 447

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

EnDebiantambinpodemosintroducirelCDdeinstalacinyprogresar hastaseleccionareltecladoyelidiomaparapodertrabajarcmodamente. Despusdeestosepuedeabandonarlainstalacinycontinuarabriendo unasesinnuevaenunseudoterminal.Porejemploycontinuarcomosi estuviramosenmodorescateotambinsepuedearrancardesdeesteCD usando distintas modalidades. Por ejemplo indicando la particin raz. Desde un sistema Debian tambin se puede montar el cdrom de instalacin y crear con ello un par de disquetes de rescate. Para ello montamoselcdromen/cdromyponemosundisqueteformateadoenla disqueterayluegohacemos:

# dd if=/cdrom/install/rescue.bin of=/dev/fd0 bs=1k count=1440

Estocreaelrescuedisk,conelquesearrancaelequipo.

# dd if=/cdrom/install/root.bin of=/dev/fd0 bs=1k count=1440

Conestootrosecreaelrootdiskquepedirmientrasarranque. Siusamoslaparticinrazendiscodurosoloservirparacasosenlos queelproblemasoloafecteaelementosmuyconcretosdelarranquetales como kernel, cargador de arranque, etc. Pero no para casos donde la propiaparticinrazestcomprometidaporalgnproblema. En cualquier caso un disco de rescate deber incluir un conjunto de herramientasadecuadasparasolucionartodotipodeemergencias. EnDebiancomoyahemosdichoelprimerCDesmultipropsito.Por defectoempezaraelprocesodeinstalacinperoleyendoatentamenteen las primeras pantallas de arranque con lilo descubrir las distintas posibilidadesparaarrancar. 448

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Sisevaausarunaparticinrazindependienteporejemploenramdiskse podrusarunCDderescatedeunadistribucincualquierapararescatar unsistemadeotradistribucindistinta.Unadministradordesistemascon varios sistemas LinuxasucargosolonecesitaunCDderescatepara solucionarunagrancantidaddeemergenciasencualquiersistemaLinux. AlgunosdeestosCDsespecialmentediseadospararescateseofrecenen suversinminiaturadeltamaodeunatarjetadecrdito. Unavezarrancadoelsistemaconvienecomprobarquelosdiscosestn perfectamentereconocidosporelkerneldelsistemaderescate.Paraello haga:

# fdisk -l

Obtendr la informacin de los discos presentes en su sistema y sus diferentes particiones. Esta es una informacin que usted debera conservarenpapelporsiacasoalgndaseborraporaccidentelatabla de particiones. La perdida de la tabla de particiones no es un fallo frecuente pero puede ser muy grave ya que provoca la prdida de absolutamente toda la informacin salvo que se vuelva a particionar exactamentetodoigualqueestaba.Elparticionadosehaceconfdisk(8) queesunadelasutilidadesquenodebefaltarenundiscoderescate.La listadelasherramientasmsimportantesquedebecontenerunCDde rescateson:

Unkernelcapazdereconocerunagranvariedaddesistemasde ficherosydedispositivosdediscos. Todo tipo de herramientas de diagnstico, exploracin, manipulacinyreparacindesistemasdeficheros,ydediscos.La listaseramuylarga.Casitodassonmuyimportantes. Uneditorsencillodetexto. Siquedaespacio,otrasmuchasutilidadesdeusofrecuentepueden venirmuybien.

449

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

IMPRESCINDIBLE.Compruebequesusistemaderescatecontienelas utilidadesadecuadaspararecuperarlascopiasdeseguridaddelsistema. Empaquetadoydesempaquetadodeficheros(afio,cpio,tar)compresory descompresor(gzip,unzip,bzip2,etc),otroscomo(find,etc)driverspara losdispositivosdediscoydeunidadderespaldo. Asegurese haciendo copias pequeas de prueba y recuperandolas arrancandodesdeelCDodisquetederescate.Tengamuchocuidado.La recuperacin de un backup es una operacin que exige la mxima prudencia. Un errorpuedeserfatal. Repaseelcaptulo dedicadoalas copias de seguridad. Dedique tiempo a estudiar y dominar sus herramientasdecopiayrespaldo. Eltiempogastadoendominarestostemasestiempoganado.Lonormal enpersonasqueadministranellosmismossusequiposyquenodominan estostemasesquetardeotempranopierdanunmontndedasosemanas devaliosotrabajo. LomejoresilustrarelusodelosdisquetesoCDsderescatemediante medianteunejemploqueestodounclsico.Olvidarlapasswordderoot. Olvidar la password de root Nosepreocupe. Este es un problema relativamente frecuente. Afortunadamente no es grave.Algoquemuchospreguntanes:Siunolvidodelapasswordde root puede ser solucionado fcilmente entonces que utilidad tiene la passwordderoot? La password noimpedir quealguien seacerque a suordenador ylo destroceamartillazos,olorobe.Tampocoevitaqueotraspersonascon accesofsicoasuordenadorpuedancambiarlapassword.Seasumeque ustednovaapermitiraccederfsicamenteallugardondeseencuentrasu equipoacualquierpersona.

450

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html boot: alias_arranque init=/bin/bash

Esto hace que se arranque una sesin shell sin necesidad de poner password. Es una operacin bastante delicada repase las instrucciones relativasaArrancarconinit=/bin/bash.Unavezarrancadobastacambiar lapassword.usaremoselcomandopasswd(1).

# passwd root

Otraformaseraarrancardesdeundiscoderescatequenousenuestra particinrazparaarrancar. Debercrearundirectoriotemporalquenosotrosllamaremosmnttmpy montarenlnuestraparticinrazenmodolecturaescritura.Repaseel comando'mount(8)'. Despusdeesoentramosen'/mnttmp/etc/passwd'yeliminamoselcampo delaclave.Enestefichero'passwd(5)'


cuenta:contrasea:UID:GID:GECOS:directorio_home:intrprete

Bastausaruneditoreneseficheroparacambiarporejemplo:
root:x:0:0:root:/root:/bin/bash por root::0:0:root:/root:/bin/bash

Por
root::0:0:root:/root:/bin/bash por root::0:0:root:/root:/bin/bash

Siexisteunfichero'/mnttmp/etc/shadow'debereliminarigualmenteel segundocampoenesteotrofichero.Muyimportante.Antesderearrancar desmonteelsistemadeficheroshaciendolosiguiente. 451

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

# # # #

sync sync umount /mnttmp shutdown -r now

Conello laprximavezquesehagalogin:rootnolepedirninguna password.Nodebeolvidardardealtaunapasswordusandoelcomando passwd. Recuperarunsistemadeficherosdaado Puedeocurrirqueunsistemadeficherosdaadonopuedaserreparadode formaautomticaduranteelarranque.Enelcasodequeelsistemadetect lanecesidaddechequeoenalgunadelasparticiones'fsck'laschequeary en caso necesario las reparar. El ordende los registros en'/etc/fstab' (vease'fstab(5)'esimportanteporque'fsck(8)','mount(8)',y'umount(8)' recorrenfstabsecuencialmenteamedidaquetrabajan.Elsextocampo, (fs_passno),lousaelprogramafsck(8)paradeterminarelordenenelcual sevanachequearlossistemasdeficheroscuandoelsistemaarranca.El sistema de ficheros raz debera llevar fs_passno igual a 1, y otros sistemas de ficheros deberan llevar fs_passno igual o superior a 2. Sistemas de ficheros en un mismo disco sern chequeados secuencialmenteysitienenelmismovalorde(fs_passno)elordenserel orden de los registros en '/etc/fstab', pero sistemas de ficheros en diferentesdiscosconelmismovalorparafs_passno,sernchequeadosal mismo tiempo para utilizar el paralelismo disponible en el equipo. Si fs_passno (sexto campo) no est presente o tiene un valor de 0, fsck asumirqueesesistemadeficherosnonecesitaserchequeado. Encasodequelaparticinconelsistemadeficherosraznotermine satisfactoriamente no se prosigue con el montaje de otros sitemas de ficherossinoqueelsistemasolicitarlacontraseaderootparaejecutar fsckmanualmente.

452

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Siestoleocurrealgunavezynoesustedunexpertolimiteseachequear la particin con la opcin y que en lugar de preguntar cosas quizs incompresiblesparaustedasumircontestacinafirmativapordefecto,ya que es la contestacin menos comprometida en estos casos. Una vez finalizado el chequeo deber hacer 'shutdown r now' para rearrancar. Mientrastantodebercruzarlosdedos.(Generalmentetienexito). Noesposiblechequearunsistemadeficherossiesteestmontadocon opciones de lectura/escritura. Si se llegara a forzar tal posibilidad de alguna manera, la destruccin de todo el sistema de ficheros sera inevitableperoafortunadamentefscksedacuentadeelloynolointentar chequearsisedatalcircunstancia. fscknormalmentenohacenadasilaparticinpareceestarcorrectaperosi ustedquiereforzarunchequeoapesardetododeberusarlaopcinf. Enelsupuestoquenoseaunexpertocontineusandolaopciny,Es decir
# fsck -fy /dev/....

fsck(8)actualmenteestimplementadocomounintermediarioqueasu vez usar algn fsck especfico para el tipo de sistema de ficheros detectado sobre esa particin. La nomenclatura para estos comandos especficos es fsck.tipofs. Por ejemplo fsck.ext2(8) que puede usarse directamente en lugar de fsck. Debera consultar las pginas man de ambos comandos si est usando sistema de ficheros linux ext2. El comando mount(8) usado sin argumentos le puede informar sobre los tiposdeficherosqueactualmenteestnmontadosensusistema. Lainformacinclavedeunsistemadeficherossesitaenelsuperbloque. Estaestructuraestduplicadapormotivosdeseguridad.Sialgunavez obtieneunerrorindicandoquenosepuedemontarelsistemadeficheros debidoaqueelsuperbloqueestdaadointentehacerlosiguientesin olvidarlaopcinS.Tambindebeirseguidadeunchequedetodoel sistemadeficheros. 453

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html # mke2fs -S /dev/... # e2fsck -fy /dev...

Estaoperacinnogarantizalarecuperacindesussistemadeficheros La informacin del superbloque puede ser obtenida mediante dumpe2fs(8)perosiustednoconoceenprofundidadlaestructuradesu sistema de ficheros no le resultar demasiado til. A pesar de ello encontraralgunacosaquesilepuedeinteresar.Porejemplolepermitir sabercualeselmximonmerodevecesquesepuedemontarsusistema deficherosantesdeestimarnecesariounchequeoycuantasveceshasido montado desde el ltimo chequeo y en que fecha tuvo lugar. Lo que queremosdeciresquetampocoesnecesarioentenderlotodoparasacarle algnprovechoaestecomando. Recuperarundiscodurodaado Puedeocurrirqueunsistemasevuelvainestableysoliciteconfrecuencia elchequeodealgunaparticin.Puedequeapesardequeaparentemente el fsck solucione el problema este reaparezca nuevamente con mucha frecuencia,oinclusoacadanuevoarranque. Esto se debe generalmente a un dao en su disco duro. Los motivos pueden ser varios. Puede ser una avera grave o puede ser que algn sectorcomoconsecuenciadeuncortedeluzduranteunaescriturafsicaa discotengadeficienciasdeformatoabajonivelenlossectoresgrabados, escomosiquedarangrabadosdeformaincompletadebidoalcortede suministroelctricoenelprecisoinstantedeesaoperacin. Estetipodedaospuedeafectaracualquierparticinylasituacinnoes equivalente.Sepuedeverafectadalaparticinraz,algunaotraparticin dedatosoprogramas,ounaparticindeintercambioswap. Unaparticindeswapdaadaprovocarcuelguesdelsistemadeforma msomenosaleatoria. 454

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Sialgnprogramaolibreradinmicacompartidaestadaadapuedeque el sistema no pueda arrancar normalmente y deba arrancar desde un sistemaderescate.Encualquiercasoenestetipodesituacionespuede que los elementos destinados a reparar su sistema estn igualmente daadosyporellolomejoresarrancardesdeundiscoderescateyhacer unchequeoatodaslasparticionesincluidaslasparticionesdeswap. Deestaformasecercioraunodelaamplituddeldao. Puede intentar usar badblocks(8) pero si no funciona adecuadamente puedequealgnbloquedefectuosoestafectandoalpropiobadblocksoa algunadelaslibrerasdinmicas. Usebadblocksdesdealgndiscoderescate.LosprimerosCDsdelas distribucionessuelenofrecerlaopcindearrancarenmodorescue. badblocks es independiente deltipodesistema deficheros queusela particin.Puedeserext2,ext3,reiserfs,linuxswap,umsdos,vfat,etc. NoesnecesariousarunCDderescatedelamismadistribucin.Vale cualquiera.Lonicoquesenecesitaespasarbadblocksyluegosepueden hacer variascosas.Laopcinodebadblocks produceunasalidaque puedeserusadapore2fsck(8)opormke2fs(8)ambosconlaopcinl. Estosprogramastambinadmitenlaopcincparahacerquee2fscko mke2fs usen a su vez badblocks. Realmente es muy sencillo y convenientesinembargolerecomendamoslosiguiente. 1. Pasebadblocksatodoslossistemasdeficherospresentesenel disco afectado uno a uno y anote o guarde lo resultados. (Por ejemploredirigiendosalidaaundiscosano). 2. Pasee2fsckconlaopcincenlasparticionesdaadas.Deesta formalossectoresdefectuososyanoseusarn 3. Si el problema persiste saque una o dos copias de seguridad. Quizstengaqueolvidarsedesusutilidadesynecesiterecurrira lasutilidadesdesudiscoderescateparaeso. 4. Verifiquemuybiensuscopiasdeseguridad. 455

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

5. formateeprimeroabajonivelusandoalgunautilidaddelaBIOSu otraproporcionadaporelfabricantedeldiscoduro. 6. Formateeusandomke2fsc. 7. Recuperesuscopiasdeseguridad. 8. Antesdeusarelsistemavuelvaapasarbadblocks.Sielproblema continuaovuelveaapareceralpocotiempoytieneunmnimode aprecioasusdatos,considereseriamentetirareldiscoduroala basura. Conestoterminamosestedensocaptuloyllenodesugerenciasdeltipo mireustedtalcosaoconsulteustedtalotra.Paralaasimilacindeeste captuloseexigemsdeunalecturayunacantidaddetrabajopersonal curioseandoafondounmontndecosas.Quizsaustedlebasteconocer superficialmente estas cosas para en caso de apuro poder localizar el remedioadecuadoperoenesecasoguardeestematerialenmsdeun ordenador,osaqueunacopiaporimpresora. Quizscuandomslonecesitenopuedaaccederalprecisamentepor tenerunserioproblemaensuequipo. Si,si...yalos,perolosiento.EstecursosoloseeditaenformatoHTML ynoquedamuyestticoalimprimir.(Actualmenteesten*.doc,*.odty *.pdf). No obstante existe la libertad para que aquel que lo desee adapte el formatosegnsusnecesidades.Entalcasonoestarademscompartirel frutodesuesfuerzodelamismaformaenqueyoloestoyhaciendo,al publicarestecurso.

456

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

CONSEJOSGENERALESPARACOMPILAR KERNELS
Introduccin Comodecostumbrenovamosaprofundizarenaspectostericossinoque vamosarealizarunenfoqueprcticodeestetema.Vamosahablardel ncleo(kernel)porqueconmuchafrecuenciaresultanecesariorecompilar elncleoparaadaptarloalasnecesidadesdenuestrohardware. ParaunapersonaquenicamentepretendeusarLinuxenunounospocos ordenadoressimplementeconpropsitospersonalespuedequetodoesto lesueneaalgomuycomplicadoonoaptoparasimplesmortales. Lasdistribucionesporreglageneralproporcionanunncleoconamplias capacidadesparaabarcarunagrancantidaddehardwaredisponible.Esto conduceancleospocooptimizadosporestarsobredimensionados.Para agravar el problema algunas distribuciones comerciales desaconsejan recompilarelkernelsinosetienesuficienteexperienciayadviertenque en caso de recompilar el ncleo, se pierde el derecho a la asistencia gratuitaenperiododeinstalacin. Haymuchagentequecreequelarecompilacindelkernelesunatarea paraexpertos.Unacosaestclaro.Cuandoserecompilaunnuevoncleo resulta una temeridad no contemplar la posibilidad de arrancar con el ncleoantiguoporsialgofallaenelnuevo.Enrealidadesmuyfcil olvidaralgoygenerarunncleoquenoseacapazsiquieradearrancar peroesonoesunproblemasimantenemoselantiguo. Locierto esquelacompilacindeunkernelenLinuxesmuchoms simplequeenotrosSO.Confrecuenciaseconsideralarecompilacinde unkernelamedidacomounatareaobligadayaqueconellosepuede 457

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

obtenerunncleomsreducidoypersonalizadoanuestrasnecesidades. Estoresultaespecialmenteinteresanteenloscasosdeordenadorescon pocaRAM. Las primeras versiones del kernel de Linux residan ntegramente y permanentementeenlaRAMfsicadelordenador. EnlaactualidadlosncleosdeLinuxsonmodulares.Esdecir,haypartes delkernelquepuedenresidirendiscoysolosecarganenelmomentoque resultenecesario.Sellamanmduloscargables ygeneralmentehayun programallamado'kerneld'encargadodesucargaydescarga. Lasversionesdelkernel Haydoslneasdefuentesdelncleo.Lasdeproduccinquesonestables ylasdedesarrolloquenoloson.Lasdedesarrollosonadecuadasparalos programadoresquedeseanexperimentarconfuncionalidadesnuevasdel kernel,oparalosusuariosquecompraronhardwarequenoestsoportado deunamaneratotalmentesegurayprobadaenelkernel. La nomenclatura de las versiones del ncleo utiliza tres nmeros separadosporpuntos.Porejemplosihacemos'cat/proc/version'podemos obtenerlaversindelkernelqueestamosusandoyquepodraseralgodel tipo'Linuxversion2.2.17'.

Elprimernmeroennuestrocasoesun'2'yrepresentaelmximo niveldecambioposible.Deunkernel'1.x.x'auno'2.x.x'hayun enormesalto. El segundo nmero debe considerarse de forma totalmente independientesiesparosiesimpar.Laserieparcorrespondeala serieestableylaserieimparaladedesarrollo.Porelloala2.2.x laseguirala2.4.xyala2.3.xlaseguirala2.5.x.Elniveldeeste cursohacesuponerqueustednodeberasiquieraintentarusarla serie impar reservada para desarrolladores con ganas de probar cosas nuevas, para lo cual se suele usar un ordenador especialmentereservadoparaesoysininformacinvaliosa.Los 458

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

cambios en este segundo nmero 2.0.x, 2.2.x, 2.4.x realmente representan un importante cambio en el SO y por ello no se aseguralacompatibilidaddetodoslosprogramasconlaversin anterior.Esdecirlosprogramasdesarrolladospara2.4.xpueden nofuncionarparalaversin2.2.xyloqueespeorlosprogramas desarrollados para 2.2.x pueden dejar de funcionar para las versiones 2.4.x. Lo cual significa que debe acompaarse de numerosasactualizacionesdelsoftware.Lasdistribucionessuelen facilitarestoscambioscuandosecambiaaunaversinsuperiorde esadistribucin. Eltercernmerorepresentageneralmenteunaversinmejoradade la versin anterior manteniendo total compatibilidad. Suele corregir fallos detectados y aadir algo de soporte para nuevo hardwaremanteniendolacompatibilidad.

Quizsalgodeloqueacabamosdedecirseatotalmenteexactoperosi que le permite entender bastante bien todo lo que significa esta nomenclatura. Cuandoconvienesubirlaversindeunkernel? En un servidor dando servicio en Internet puede resultar necesario actualizarloregularmenteparacorregirlosproblemasdeseguridadque aparezcan, pero nosotros estamos tratando temas bsicos de administracin para sistemas de uso personal ya sea profesional o domstico. Por lo tanto si su sistema operativo est funcionando correctamenteysuhardwareestperfectamentesoportadonohaymotivo paraactualizarlo.Laideaesquesialgofuncionanohayquearreglarlo. Otracosaesrecompilarlamismaversindelkernelsimplementepara cambiaralgunascosasaefectodeoptimizarlo.Detodasformassitiene ustednoticiadequeciertoproblemaocarenciasesolucionausandouna versin superior del kernel recuerde que mantener los dos primeros nmerosdelaversindelkernelesmuchomssencilloquepasarauna

459

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

seriesuperiorenlaqueelsegundonmeroessuperioryrecuerdeusar siempreversionesparesestables. Cuandoconvieneusarmdulos Alahoradeconfigurarelkerneltendrqueirleyendodetenidamenteel significado decadaopcinyverqueparaalgunas opciones resultar posiblenicamenteincluirlasonoincluirlasdeformaesttica.Esdecir solopodrnestarenelkerneldeformapermanenteonoestar.Porel contrario otras opciones admiten una tercera posibilidad que es su inclusincomomduloyaquvienelapreguntainteresante.Cualesla mejor formadeincluirlo ?Larespuestaesquetodoloquepuedaser puestocomomduloestarmejorcomomduloanoserqueincluirlode formapermanenteresulteimprescindibleparaarrancaroquesuusovaya asercasicontinuo.Tengaencuentaquesisukernelesporejemploun 2.2.17losmdulosserncargadosdesde'/lib/modules/2.2.17/'peropara esolaparticinrazdebedeestarmontadaysiustedtienesuparticin raz en un disco ide necesitar que las opciones correspondientes a BLK_DEV_IDE,BLK_DEV_IDEDISKdebendeestarenmodoesttico (permanente)porquesiestncomomduloscargableselsistemajams podra arrancar desde un disco ide. Hay otras opciones que tambin pueden ser necesarias en modo esttico EXT2_FS, BINFMT_ELF, VT_CONSOLE,PROC_FS,etc Porelcontrarioestaclaroquelaunidaddecdrom,laimpresora,sistemas de ficheros que se usen de forma ocasional, etc. pueden y deben ser configuradoscomomdulos.Sitienedudasdeberleerparaquesirven intentandodeducirsisonnecesariosparaarrancarono.EXT2_FSespara sistemadeficherosLinuxylgicamenteesimprescindible.PROC_FSes un sistema deficheros que se monta en /proc yque es usado porun montn de programas de forma casi continua. BINFMT_ELF permite ejecutar la inmensa mayora de los binarios de Linux y por ello es imprescindible,etc.Sinoescapazdellegaraunaconclusinsobresies imprescindible,convienequelopongacomoestticolaprimeravezque lointente,ysitodovabienpuedeenunfuturoprobaraponerlocomo 460

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

mduloperosiendoconscientedequequizsnoarranque.Todosestos cambiosdebenhacerseteniendomuyclarocomovolveralasituacin anteriorusandoelkernelantiguo. Primeraprueba Suponiendo que usted est usando arranque desde disco duro con el cargadorLILOleproponemospracticarlosiguiente: 1. 2. 3. 4. Repaselasleccionesanterioresquetratansobreelarranque. Localicesukernelactualmirando/etc/lilo.conf. Saqueunacopiadesukernelconotronombredistinto. Editesu/etc/lilo.confaadiendounaentradaparausarlanueva copiadelkernel. 5. !!Importante!!.Ejecuteelcomando'lilo'. 6. Rearranqueusandoalternativamenteunacopiadelkerneluotra. En realidad estar usando el mismo kernel para arrancar pero de esta formayapuedecomprobarquepuedearrancarasueleccinusandodos ficheros de kernel que notendran porque haber sidoiguales. Cuando obtengaunnuevokerneldebedeasegurarsequeencasodequeesteno arranquepodrusarelantiguo. Encualquiercasonolerecomendamoscompilarelncleosinhaberledo detenidamenteelcaptulocompleto. Instalacinapartirdelasfuentes 1. Loprimeroquetendrquehaceresdescargarlo.Parabajarlos fuentes del kernel existen muchos sitios enInternet parapoder hacerlo. Por ejemplo ftp://ftp.us.kernel.org. Puede consultar en http://mirrors.kernel.org para localizar otros lugares adecuados. Vamosasuponerquedeseamosinstalarunkernel2.4.10.Unavez descargado tendremos un fichero empaquetado y comprimido.

461

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Probablemente algo similar a linux2.4.10.tar.gz o linux2.4.10.tar.bz2. 2. Creeundirectorio2.4.10(mkdir2.4.10) 3. Conviene engancharlo a un link simblico /usr/src/linux. Compruebesien/usr/srcexisteundirectorioounlinksimblico 'linux'. 1. Sinoexisteundirectorioounlinksimblico'linux'. 1. Cree un link simblico 'linux' mediante: 'ln s 2.4.10linux' 2. Siexistaundirectorio'linux'. 1. Renombrarlo con el nombre de la versin correspondiente.Porejemplo2.4.2mediante:'mv linux2.4.2' 2. Cree un link simblico 'linux' mediante: 'ln s 2.4.10linux' 3. Siexistaunlinksimblico'linux'. 1. Borreellinksimblicomediante:'rmlinux'. 2. Cree un link simblico 'linux' mediante: 'ln s 2.4.10linux' 4. Despeshayquedescompactar. 1. Paralinux2.4.10.tar.gzusar'tarxzvflinux2.4.10.tar.gz' 2. Paralinux2.4.10.tar.bz2usar'bzcatlinux2.4.10.tar.bz2| tarxv' Estoexpandeelficherocomprimidovolcandosucontenidoenun directoriolinuxperocomonosotroslohemospreparadolometer en2.4.10graciasallinksimblico,sinafectaralkernelanterior. 5. Situeseahoradentrodeldirectoriolinux>2.4.10.Comprobar queexisteunMakefile.Esteficheroeselquedeterminalaforma ysecuenciaenquesecompilarelkernelascomootrasacciones depreparacinyconfiguracin. 6. Laprimeravezquesecompilaunnuevokernelconvienehacer: 'makemrproper'ynosernecesariovolverloahacercadavezque serecompileaunqueseaconunaconfiguracindistinta.Tengaen 462

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

cuenta que 'make mrproper' eliminar el fichero que guarda la configuracin de la ltima compilacin del kernel. '/usr/src/linux/.config' y generar un '.config' con valores por defectoloscualespretendenresultaradecuadosparalamayorade loscasos. 7. Paraconfigurarelkerneldesdeconsolaelmtodomscmodoes usar 'make menuconfig'. Para X Window se puede usar 'make xconfig' ms amistoso pero requiere tener bien configurado el entornogrfico.Laconfiguracindelkernelesunalabordelicada quetrataremosenunaseccinposterior. 8. Para compilar el kernel habr que ejecutar una serie de pasos secuencialmente.'makedep;makeclean;makebzimage'Esto dejar un kernel en el fichero '/usr/src/linux/arch/i386/boot/bzimage'Sitienedudasporqueleha parecidoveralgnerror,compruebelafechadecreaciondeeste ficheroparaasegurarsedequeeselqueacabadecrear.Parausar estekernelhabrqueaadirloalficherodeconfiguracindeLILO odelcargadorqueestusando.Lasimplesustitucindelkernel antiguonolepermitiraarrancarconelkernelantiguosialgofalla. Tambin se puede generar directamente el kernel de arranque sobreundisquetedesdeelcualelsistemasercapazdearrancar. Para eso en lugar de 'make bzimage' use 'make bzdisk'. Otra alternativamsquenovamosaexplicaresusarbzlilo.Esms fcil equivocarse y no poder arrancar o sobreescribir el kernel antiguonopudiendovolverausarlo.EnDebiansepuedeconstruir un disquete de arranque mediante el comando 'mkboot' que necesitacomoparmetrolarutaalkernel. 9. Si la compilacin fall leer el README para saber si el compiladoreseladecuadoparacompilaresencleo.ErrorSignal 11Lacompilacindelkernelesunprocesomuyexigenteyresulta una verdadera prueba de fuego para la gestin de la memoria. Algunasvecesunamemoriaaparentementesana,fallayprovoca unerror'signal11'durantelacompilacindelncleo.Estopuede ocurrirporejemplosiloschipsusadosparalamemoriaRAMno

463

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

tienenexactamentelamismavelocidaddeaccesooporalgunos otrosproblemasensuhardware. 10. Salvoqueelkernelfueracompiladoenmodoesttico,quegenera un kernel enorme poco eficiente y solo se usa para casos especiales,lomshabitualesquetengaquegenerarlosmdulosy quetengaqueinstalarlos.Siestrecompilandolamismaversin desukernelperoconopcionesdistintasestarmodificandocosas que anteriormente seusabanconelkernel antiguo(elqueest actualmente funcionando) y por lo tanto dar marcha atrs para dejarlo todo como estaba puede serms complicado. Si porel contrario est compilando una versin distinta de la actual los mdulosseinstalarnenunlugardiferente.Paralacompilacine instalacindelosmduloshagalosiguiente:(makemodules&& makemodules_install).Porlotantoleaconsejamosusarunkernel diferente al que ya usa para mantener una versin antigua sin problemas. 11. Hay varias formas de arrancar con un determinado kernel. Si arrancaporejemplodesdeundisqueteMSDOSconloadlin.exe bastar duplicar el disquete y sustituir el kernel. Si us bzlilo bastargenerarundisquetenuevo.Enamboscasosconserveel antiguo disquete de arranque durante algn tiempo. Etiquete correctamentelosdisquetes.Recuerdequecon'rdev(8)'sepuede retocarlaimagendeunkernelyaseaendisqueteoendiscoduro porejemploparaestablecereltamaodelaramolaparticinraiz, oelmodovideodeconsola. Para arrancar desde disco duro tambin hay varias formas. Dependiendodelcargadorcomoyahemosexplicadotendrque copiarelnuevokernelallugaradecuadoparaqueelcargadorlo use.ComentaremosnicamenteelcasodeusarelcargadorLILO queeselmsutilizado. 1. Copie el kernel '/usr/src/linux/arch/i386/boot/bzimage' a '/boot/bzimage2.4.10'.

464

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

2. Copieelnuevofichero'/usr/src/linux/System.map'creado durantelacompilacina'/boot/System.map2.4.10' 3. EsimportantequesepautilizarLILOqueseexplicenun captuloanterior.LaconfiguracindeLILOseguardaen/ etc/lilo.conf.Partiremosdeunejemplo:


boot = /dev/hda delay = 40 vga = normal root = /dev/hda1 read-only image = /boot/bzimage.2.4.2 label = linux.2.4.2 other = /dev/hda3 label = dos table = /dev/hda

4. Tenemos elkernel antiguoen'/boot/bzimage.2.4.2',para aadir una nueva entrada para '/boot/bzimage2.4.10' haramoslossiguiente:
boot = /dev/hda delay = 40 vga = normal root = /dev/hda1 read-only image = /boot/bzimage.2.4.2 label = linux.2.4.2 image = /boot/bzimage.2.4.10 label = linux.2.4.10 other = /dev/hda3 label = dos table = /dev/hda

5. Lgicamente los nombres (label) pueden ser diferentes. Solo deben ser distintos entre ellos y que sirvan para recordarquekerneles.Esmuyimportanteunavezeditado 465

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

y salvado '/etc/lilo.conf' no olvidarse de ejecutar el comando'lilo'yaquedeotraformaelsistemanoarrancar laprximavez. 12. Laprimeravezquearranqueconunnuevokernelconvieneque ejecuteelcomando'depmoda'.Estochequealasdependenciasde losmdulosusandoelfichero'etc/modules'.Esteesquemaresulta sencilloyeselqueseutilizaenDebianperootrasdistribuciones usanunesquemadiferenteparapoderarrancardiferenteskernels con diferentes conjuntos de mdulos. Por ejemplo en RedHat existeunarchivo'/etc/rc.d/modules'quesirveparadeterminarla ubicacin de los diferentes conjuntos de mdulos. Vease depmod(8)ymodules(5).Paralacargaydescargamanualdelos diferentesmdulosconsultemodprobe(8),insmod(8),rmmod(8), ylsmod(8).Ningunodeellosefectuacambiospermanentesensu sistema. Para determinar cuales son los mdulos que deben cargarsedeformaautomticaexistendistintasherramientaspara las distintas distribuciones. Concretamente para Debian existe 'modconf'queesunaherramientadiseadaabasedemensyes muy fcilyagradabledeusar.Permitedeterminarlosmdulos queserncargadosdeformaautomtica. Documentacin Ladocumentacinespecficadesuncleoseencuentraeneldirectorio '/usr/src/linux/Documentation/' Si tiene dudas sobre el soporte de determinadoHardwareosuconfiguracinenelkernelesenestelugar dondetienequebuscar.Usegrepparabuscar. /usr/src/linux/Documentation/Changeslepermitirsaberlosrequisitosdel nuevokernel.Contieneunlistadoconlasversionesmnimasnecesarias dedeterminadosprogramascompatiblesconesekernel.Silaversindel kernelsolodifiereenelltimonmerodeversinlacompatibilidadcon kernelsanterioresdeesamismaserieestgarantizada. Configuracin 466

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Esrecomendablesalvarel'.config' conunnombredistintoparaevitar perderloalhacer'makemrproper'oalhacer'makemenuconfig'etc.De esaformasigeneramosunnuevokernelconmuchasopcionesdistintasy noconseguimosquefuncionenisabemosqueopcionessonlasqueestn malelegidaspodremosvolveralaconfiguracininicialyapartirdeella irgenerandonuevoskernelvariandocadavezpocascosasparadetectar cualeslaopcinquedaproblemas.Convieneusarunnombrelargoy descriptivo como por ejemplo '.config.original.distribucion' o '.config.sinsoporte.sonido',etc.yguardarloporuntiempo. Sinolohamiradonuncamiresu'.config'mediante'less.config'. Podr veralgodeltipo:
.... CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_SYSCTL is not set CONFIG_BINFMT_AOUT=m CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set ....

Esdecirqueelresultadodeunaconfiguracineslacreacindeunfichero conunalistadeopcionesysusvalores.Lasopcionesquenoseincuiran aparecencomentadasconun'#'aprincipiodelnea. Evidentemente las opciones para configurar un kernel son las mismas independientemente del procedimiento make lo_que_sea_config empleado. Vamosasuponerqueconfiguramosdesdeconsoladetexto.Lasopciones puedenaparecerendistintoestado: '[*]' '[]' '<*>' Opcinestticaseleccionada. Opcinestticanoseleccionada. Opcincargableseleccionadaenmodoesttico. 467

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

'<M>' Opcincargableseleccionadacomomdulocargable. '<>' Opcincargablenoseleccionada.

Paraalterarelestadodelasdiferentesopcionesseusanlateclas'N','M', 'Y',ylabarradeespacio.Estaltimapermiteirvariandolasopcionespor las diferentes posibilidades. Las otras determinan las siguientes transicionesdeestados. '[*]' '[]' '<>' '<>' (N)> '[]' (Y)> '[*]' (Y)> '<*>' (M)> '<M>'

'<*>' (N)> '<>' '<*>' (M)> '<M>' '<M>' (N)> '<>' '<M>' (Y)> '<*>' Usando 'make menuconfig' desde /usr/src/linux. Aparecer el siguiente men:

468

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Puedeusarlasteclasdeflechasverticalespararecorrerlasopcionesdel men.Laspocionesquedisponendelaindicacin'>'sonaquellasque acceden aun submen.Seleccione laprimerayaparecer el siguiente submen:

469

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Puedeverqueapareceunasolaopcin.Siestseleccionada'[*]'conviene generalmentedeseleccionarla,'[]'.Paraellopulselatecla'N'.Conelloel presentemenocultartodaslasopcionesconsideradasexperimentales. Dependiendodelhardwarepuedeverseobligadoausarestaopcin.Lo lgico es que la documentacin del fabricante mencione tal necesidad pero algunos fabricantes de hardware no ofrecen mucha informacin sobreelusodesusproductosenLinux.Generalmenteestainformacinse obtienebuscandoenlaweb. Sinecesitaincluirlaopcindeberusarlatecla'Y'.Enestecasoesta opcinnoestdisponibleparaserincluidacomomdulo.Sifueraasen lugarde'[*]'o'[]'figurara'<*>',''o'<>'paraindicarrespectivamente opcinincluidaestticamenteenelkernel,(seseleccionacon'Y')opcin seleccionadacomomdulocargable,(seseleccionacon'M')uopcinno seleccionada. (se deseleciona con 'N') en este caso no es aplicable el concepto de mdulo a esta opcin ya que solo estamos eligiendo una formadefuncionamientodemenuconfigparaquemuestremsomenos opcionescomodisponibles.Lasprimerasvecesqueseusamenuconfig todo es muy nuevo y estamos obligados a leer gran cantidad de 470

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

informacin en ingls generalmente. Para acceder a la informacin relativaaunaopcinbastasituarseenesaopcinypulsarlatecla'?',o hacerclickenelbotn'Help'. Sinoentendemosnadadeloqueponeynotenemosniideadeloquenos convienehacerlomejoresvolveraleerlaltimapartedeesaexplicacin donde se explica cual es la opcin ms recomendable en caso de no tenerloclaro. Vuelvaalmenprincipalusandolatecla'ESC'opulsandoelbotn'Exit'. Seleccioneacontinuacinlasegundaopcin:

Este men muestra varias opciones para distintas familias de procesadores.Siustedseleccionaunaopcinparaunprocesadorinferior alquerealmente tieneseguramenteelkernelfuncionaraunquepuede quenolohagaaprovechadotodaslascapacidadesdesuprocesador.En cambiosiseleccionaunaopcincorrespondienteaunprocesadorsuperior alsuyoelkernelnofuncionar.Suponiendoqueeligieralaopcinrelativa alprocesadorPentiumaparecerunnuevomen: 471

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Seleccionelaopcinadecuadaypulse<Enter>.Unavezseleccionadala opcinretrocedahastaelmenprincipal. Unavezenelmenprincipal,seleccioneacontinuacinlaterceraopcin:

472

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

Recomendamosqueelijalasopcionesquemostramosenlaimagencomo seleccionadas '[*]'. En cualquier caso ya sabe que puede acceder a la ayudadelasdiferentesopciones.Unavezrealizadalaseleccinretroceda almenprincipalmedianteelbotn'exit'. Sipulsalatecla<ESC>desdeelmenprincipalaparecerunapantalla que preguntar si quiere guardar la configuracin actual. Si contesta afirmativamente la configuracin actual se guardar en '.config' perdindoselaconfiguracinanterior. Elnmerodeopcionesaconfigurarsonmuchasynopodemosdetallar todoelprocesoperoyatieneunaidea.Recuerdequemuchasopcionesdel ncleodependiendodesusistemasernobligatoriasparaqueelkernel puedafuncionar. Amododeguaseresumirnunaspocasindicacionescrticasrespectoa lacapacidaddearranquedeunkernelquepermitatrabajarconel:

Procesortypeandfeatures(ProcesorFamily)

Comoyahemosdichosuordenadornofuncionarsieligeunaopcin correspondienteaunprocesadorsuperioroincompatible.

Generalconfiguration o PCIsuport ObligatoriaensistemasconPCI


o

Sysctlsuport

Activela ya que solo interesa desactivarla en sistemas especialesllamadosincrustados.


o

Kernelcore

473

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

DebeserELF
o

kernelsuportforELFbinaries

Incluyalacomoparteestticausando'Y'.Nodebeestarcomo mdulo.

Blockdevices

Cualquierdispositivoqueresultenecesarioparaarrancarymontarla particinrazdebesercompiladoestticamente.Sinosecompilaoso compilacomomdulonoarrancar.

Characterdevices

Sernnecesarioscomomnimolassiguientesopciones: Virtualterminal o Suportforconsoleonvirtualterminal o UNIX98PTYsuport Filesystems


o

Comomnimodeberincluirsoporteparaelsistemadeficherosdel sistema de ficheros raz que generalmente es ext2, y sea cual sea deberestarincluidoestticamenteynocomomdulo.

Consoledrivers o VGAtextconsole

InstalarunnuevokernelpersonalizadoenDebian TodolodichosirvetambinparaDebianperoenDebianexisteunaforma alternativamuyinteresante.

474

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

AntesdelaaparicindelkernelmodularenLinuxunkernelcompletoera unsimplefichero.Estasencillezpermitaporejemplomigrarunkernelde unamquinaaotrasimplementecopiandoestefichero.Esloquesucede ahora si compilamos un kernel en modo totalmente esttico. Es decir obtenemosungranypesadokernel,totalmentecompletoyfuncionalpero sinsoporteparacargarmdulos. Parapodermigrarunkernelcompletoenelcasogeneraldequetenga soporte para mdulos habra que trasladar como mnimo el fichero compiladoestticamenteycomomnimotodossusmdulos. Por ello existe enDebian unmakekpkgcapaz degenerarunpaquete Debian'mi_kernel.deb'conelbinariodelkernelysusmdulos.Sepuede por ejemplo copiar ese'mi_kernel.deb' aotra mquina ybastarhacer "dpkgi'mi_kernel.deb'"parainstalarelkernelenesamquina.Para usarestesistemadeberinstalar'kernelpackage'yalgunosotrospaquetes quedependendelyquenoestntodavainstalados. Lasprimerasvecesquecompileunkernelnonecesitausarestesistema peroesteprocedimientoresultaespecialmenteindicadoenlainstalacin dekernelspersonalizadosenmsdeunamquinaodediversoskernels personalizadosenunamismamquina. Paraterminar Soloustedpuedesaberqueotrascosassonnecesariasoconvenientesen funcin del ordenador utilizado. Las primeras veces le costar trabajo porquetendrqueleerlaayudadecadaunadelasopcionesperomuchas deellasrecordarsusignificadolaprximavez.Lomejorespartirdeun kernelquefuncioneyeliminartodasaquellasopcionesquesabemoscon certezanonecesitaremosusarnuncaennuestroequipo.Recuerdequelas opcionesqueestncomomdulosapenassuponenunahorroprescindir totalmentedeellas.Porelcontrariounaopcinquefigurecomoesttica innecesariamente est sobrecargando la parte esttica del kernel y eso

475

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html

reducesueficiencia.Unkernelpequeoessensiblementemsrpidoque unogrande. Sitienedificultadesparaarrancarconelnuevokernelintentehacerlocon el antiguo y si esto tampoco resulta repase el captulo dedicado a las dificultadesconelarranqueenLinux. No olvide que lo primero que hace cualquier kernel al arrancar es informardetodosaquellosdispositivosqueescapazdesoportar.Estolo puedevisualizarnuevamentecon'dmesg(8)'.Sialgncomponentedesu hardwarenoapareceytampocoestdisponiblecomomdulosignificar queesedispositivonoestasoportado.Tambinpuedeaccedera'/proc' para comprobar una amplsima variedad de capacidades de su kernel actual.

476

You might also like