Professional Documents
Culture Documents
html
Autor:AntonioCastroSnurmacher.
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Primeraedicin(Nov2008)
(PreviamentefuepublicadoenEne2000enformatohtmlenla webhttp://www.ciberdroide.com)
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.
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.
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
Cdigolibre
Seconsideraqueelcdigoeslibrecuandolosfuentessondedominio pblico.
Integridaddelosfuentes
Serecomiendanorestringirlosderechosdemodificacindelcdigo fuente,aunqueseaceptanalgunasfrmulasquerestringenlaformade efectuar ciertas modificaciones pero no entramos en estos detalles ahora.
Nodiscriminacinparagruposopersonas
Lalicencianoconsideradistincinalgunaparaningntipodepersona ogrupo.
Nodiscriminacinparaactividadopropsito
Distribucindelalicencia
13
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Lalicenciaafectaralassucesivasdistribucionesdelosprogramasde formaautomticasinnecesidaddetrmitealguno.
LalicencianodebedeserespecficadeDebian
EsdecirDebiannoadmitiraunalicenciaqueimpidaelusodeun programafueradeladistribucinDebian.
Lalicencianodebecontaminarotrosprogramas
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
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:
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:
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:
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.
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
Expansindecorchetes.
Expansindelatilde.
ArithmeticExpansion.
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.
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
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.
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
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
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
63
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
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
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
$ # 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
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
90
91
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
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 ..... ......
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
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
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 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
$ ls dir2 ejs1 $ ls -li dir1 59172 lrwxrwxrwx ejs1 -> ej0 1 pepe user 3 may 18 17:28
104
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
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
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
/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
114
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:
116
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
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
$ $ $ $
121
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ 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.
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.
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
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
find(1)
126
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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 /
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.
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.
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.
132
more(1) Esunpaginadormuchomssencilloqueelsofisticado'less'.
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
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
$ who | paste - -
pr(1) Permitepaginaruntextoincorporandocabeceras.
$ ls /*/* | pr -h ejemplo-pr -o 5 -l 35 | less
$ 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
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.
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.
140
Tailtieneunaopcinmuytilparamostrarqueesloqueestpasandoen ficherosqueseestngenerandooquecrecencontinuamente.
$ tail -f fichero
talk(1) Permiteabrirunasesindecharlainteractivaconotrousuario.
tee(1) Este comando se utiliza para obtener una bifurcacin en un flujo de entradasalida.Actacomounaderivacinenformade'T'.
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ telnet localhost
Con esto podemos probar telnet conectndonos con nuestra propia mquina.Acontinuacinsaldrlasolicituddelogin.
$ 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
&
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.
$ w
wc(1)
144
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
who(1) Sacalainformacindequienesestnconectadosalsistema.
$ who
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
write(1) Siemprequesetengapermisopermiteenviarmensajesaotrousuario.
$ write root
xargs(1) Sirveparapasarargumentosauncomandomedianteentradasalida.
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.
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
166
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
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
Ahorasivamosaentraryasalireneleditor.
$ vi
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
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.
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!)
175
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
. .N .+N N $ %
:#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
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.
$ $ $ $
Dado que no exista ningn fichero 'ejvi1.txt' estaremos editando un ficheronuevoydependiendodeleditorusado(nosotrosusaremos'vim') apareceralgodeltipo.
177
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
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.
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
vamosasalirperosinguardarningunodeloscambiosrealizados.Primero intentaramossalirsinmscon':q'desdeelmodocomandos.
:q
Perorealmentedeseamossalirsinsalvarasqueintentamosdenuevocon ':q!'desdeelmodocomandos.
:q!
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
Probablementeaparecerenlalineainferiordesueditorunaadvertencia dequeestenmodosololectura.
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
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
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]*//
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'
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
Unavezdentrodeleditorhacemoslosiguiente.
:args
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#
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
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
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
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
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
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
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
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
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
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
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
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
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
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
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
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
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>
TRUEsiesunacadenavaca. TRUEsiesunacadenanovaca. TRUEsiambascadenassonidnticas.OJOhay dejarespaciosaunladoyotrodelsignoigual paranoconfundirlaordenconunaasignacin. TRUEsisondistintas. TRUEsinoescadenanula.(Unavariableque no existe devuelvecadenanula). Comparacindenmeros
!=
<cadena>
eq ne gt ge
lt TRUEsi<num1>menorque<num2>.
219
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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>)
Ejemplos:
$ test -r /etc/passwd ; echo $? 0 $ test -w /etc/passwd ; echo $? 1 $ test -x /etc/passwd ; echo $? 1
220
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
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
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
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
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
232
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$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
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
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
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
\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 +
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, "+" }
Estamosdefiniendounnicocarctertabuladorcomoseparador.Ahora ejecutelosiguiente:
$ awk -f /tmp/delim3.awk /tmp/delim1.dat + aaa bbb ccc + + ddd + + + 111 222 333 444 + + + +
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
252
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
Vamosaejecutaresteejemployvamosaversusalida $awkfcontabdescarte.awk<contabil.dat
1 fecha|concepto|importe 2 ----------+--------+------35 (32 rows)
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
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
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
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'
sub(r,s,t)
substr(cadena, beg,len)
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
, , , , ,
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
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 , , , , ,
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); } }
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
Vamosaejecutaresteejemplopasandovaloresyvamosaversusalida
$ awk -f contabil6.awk minimo=100000 maximo=120000 deliminador='|' < contabil.dat
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 }
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
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
0 0 14 17
0 0 0 0
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
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
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
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
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
/===============/
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
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
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`
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
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
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
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
#!/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
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)
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
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
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
total buffers cached Mem: 258100 10248 51988 -/+ buffers/cache: Swap: 393552
shared 56800
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
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
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
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
/===============/
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.
345
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
/===============/
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
356
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
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
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
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
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
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
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
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
57 feb 29
382
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
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).
(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.
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
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
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
255.255.255.0(ambas) 172.22.23.0/172.22.21.0
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
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:
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
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
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
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
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.
421
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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:
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
Editeunficheroautoexec.batparaquecontengalosiguiente:
$ loadlin kern24 root=/dev/hda3 ro vga=3
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
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
# 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
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:
CrearalosenlacessimblicosS88miscriptyK88miscriptparatodoslos runlevels.
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.
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:
Obtendrlosiguiente:
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)
# 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:
Estocreaelrescuedisk,conelquesearrancaelequipo.
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
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
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
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
# # # #
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
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
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
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
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
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.
Sysctlsuport
Kernelcore
473
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
DebeserELF
o
kernelsuportforELFbinaries
Incluyalacomoparteestticausando'Y'.Nodebeestarcomo mdulo.
Blockdevices
Characterdevices
Comomnimodeberincluirsoporteparaelsistemadeficherosdel sistema de ficheros raz que generalmente es ext2, y sea cual sea deberestarincluidoestticamenteynocomomdulo.
Consoledrivers o VGAtextconsole
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