Está en la página 1de 476

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

html

CURSO DE LINUX
PARA NOVATOS,
BRUTOS Y
EXTREMADAMENTE
TORPES

Autor:AntonioCastroSnurmacher.

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

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

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

CopyrightMadrid(Enero2000).

2
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.

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

Cuandotermineustedlasegundapartenoscomosesentir
usted,peroyomesentirfelizporquetodavanoestterminada,
yparacuandodecidaterminarlaseguramentehabrquecambiar
algunascosas.Lasegundapartedeadministracinhaperdido
msvigenciaquelaprimeraquecontinuasiendobsica.

Parauncorrectoaprovechamientodelcursoserecomiendauna
lecturasecuencialdecadaunodeloscaptulosenorden
establecidoenestendice.(secuencialquieredecirprimeroel1,
luegoel2,luegoel3,etc...)

Efectivamenteesteltimocomentarioentreparntesisva
especialmentededicadoanuestropblicopredilectoalquenos
referimosenelttulo,peroalgunoslistillostambindeberan
probarnuestrocurso.

Lasconvencionesutilizadasenestecursoylametodologade
trabajotambinseexplicandeformaprogresivaporlocual
saltarseuncaptulopuedellevarleainterpretarerrneamenteel
materialdelcurso.Posiblementeesteustedtentadodeempezar
directamenteporlasegundapartedelcursoperodemomentono
sehaconsideradofacilitarestalabor.

Estecurso,comoyahemoscomentado,constaporelmomentode
dospartesbastantedistintas.

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

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

implicaraciertoriesgoyaquesetratadeunusuarioconpermisos
enelsistemaparahacercosasdetodotipo.

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

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

5
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

6
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

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

bastante distintos de otros conceptos que forman parte de la cultura


microinformticafundamentalmentedeMicrosoft.

La documentacin de Linux es muy abundante, sin embargo muchas


vecesseasumeunaculturageneraldeUnixquerealmentenosiempre
existe.LasgeneralidadesmsbsicasdeUnixmuchasvecessetratande
un modo superficial ypocosistemtico quizs porquesontemas muy
viejos.

Elcontenidodeestecursoesenmsdeun90%serviraparacualquier
SOtipoUnixynosoloparaLinux.

Enestecursoseexplicarnconceptosqueincidenelconocimientointerno
delsistemaoperativo.Aestasalturasmsdeunoempezarapreguntarse
sirealmenteesnecesarioconocertodosestosdetallesparaunsimpleuso
deunSO.Lociertoesqueactualmenteexistenescritoriosgrficosque
permitenhacerbastantescosasdeformaintuitiva.EnLinuxtenemospor
ejemplo KDE o GNOME que permiten usar los programas de forma
mucho ms amistosa e intuitiva. Sin embargo la amistosidad tiene un
precio. Los entornos intuitivos no permiten hacer cualquier cosa y
consumenmuchosrecursosdeCPUymemoria.EnLinuxestosentornos
sonunaopcinnounaobligacin.Estecursoestaorientadoalusode
Linuxdesdelaconsola.Parasacarleelmximoprovechoyparaalcanzar
ciertodominiodellenguajeshellscriptnoquedamsremedioquetratar
estostemasperoestamossegurosdequeunavezalcanzadoelfinalde
estecursotendrunavisindeUnixquelepermitiratreverseconcosas
impensablesahora.

Tambinseproponeelaprendizajedeloscomandosmsinteresantesdel
sistemaparapoderhacerungrannmerodecosasyalcanzarunaltonivel
deautosuficienciaensumanejo.

Estecursoessuficienteparaqueunapersonaquenicamentepretenda
defenderseenestesistemaoperativoconsigasupropsito,peroadems
permite que elusuarioconozca aspectos quesonimprescindibles para
poderavanzarmuchomsporsucuentasieseessudeseo.

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

Seevitarenloposiblemencionaraspectosrelativosalaadministracin
delsistemayaqueestoseraobjetodeotrocurso.

Existen documentos que tratan de la administracin de Linux y de la


instalacindeLinux.

Si usted pretende usar su propio SO Linux en su ordenador personal


convendraquecontinuaraaprendiendolaadministracindeunSOLinux
yaqueustedseraeladministradordesusistema.RecuerdequeLinuxno
fueconcebidocomosistemamonousuario.Solounarecomendacinmuy
bsica.Tengaensuordenadorcomomnimodosusuarios.Unoserael
superusuario'root'concapacidadilimitadaparalobuenoyparalomaloy
otro su usuario de trabajo normal. La razn es que una equivocacin
cometidadesdeunusuarionormalsolopuedetenermalasconsecuencias
paraelreadetrabajodeeseusuario.Porelcontrariounaequivocacin
desde'root'puededestruirtodalainformacindesusistema.

DadoquevamosausarLinuxdesdeconsolayalgunosusuariospueden
tenerexperienciapreviaconMsdos,meparecenecesariohacerunanueva
advertenciadestinadaaestosusuarios.

El comportamiento del interprete de comandos de Msdos y de Linux


tienenalgunasemejanzaperoalgunascosasqueestamosacostumbradosa
usar en Msdos no son otra cosa que burdas imitaciones de las
extraordinariasposibilidadesdelinterpretedecomandosdeLinux.Como
consecuenciadeestounintentodehacerenLinuxcosasparecidasalas
quehacemosenMsdospuedellevaradesagradablessorpresasyaqueen
Linux se requiere tener una idea de como funciona el interprete de
comandos.

Darunarelacindecomandosequivalentesentre(UnixoLinuxyMsdos)
sin explicar nada ms puede llevar a confusiones peligrosas. En otras
palabras,puedescagarlasitepasasdelisto.Enestesentidoloscomandos
bsicosparaelmanejodeficheros'rm','mv',y'cp'nosedeberanusarsin
comprender correctamente el funcionamiento bsico del interprete de
comandosdeLinuxyenparticularcomoesteexpandelasordenes.

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

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

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

INTRODUCCIONALINUX

Unpocodehistoria

Linuxesunkernel(unncleodeunsistemaoperativo)creadoporLinus
Torwalds. Naci en Finlandia el 28 de Dic 1969 y estudi en la
universidaddeHelsinki.DesarrollLinuxporquedeseabadisponerdeun
SOUnixensuPC.ActualmentetrabajaenlosEE.UU.

LinusT.quisocompartirsucdigoparaquecualquierapudierausarloy
contribuir a su desarrollo. Dado que en GNU ya haban desarrollado
bastantesherramientasparaUnixconlamismafilosofadesoftwarelibre
pronto se consigui un SO Linux/GNU totalmente libre. Dos de las
herramientasmsimportantesaportadasporGNUfueronelinterpretede
comandos,yelcompiladordeC.

En los comienzos Linux era un sistema principalmente adecuado para


hackersypersonasconmuchosconocimientostcnicos.Actualmenteya
noesas.Elcrecimientoennmerodeusuariosvienesiendoexponencial
desdesuscomienzosen1991.Actualmenteyaempiezaaservistocomo
unaalternativaalosSOdeMicrosoft.Puesestahistoriadelahistoriade
Linuxestancortacomosupropiahistoria,porlocualesteapartadoyaes
tambinhistoria.Nosedesmoralice.Sinohaentendidoesteltimojuego
depalabras,puedepasaralsiguienteapartadosinpreocuparsemuchopor
ello.

Tiposdelicenciaslibres

La licencia ms utilizada en Linux es la licencia GPL de GNU. Sin


embargo hay otras licencias igualmente aceptables bajo el trmino de
softwarelibre.

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

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

Libertaddedistribucin

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


necesariopagarderechosdeningntipo.

Cdigolibre

Seconsideraqueelcdigoeslibrecuandolosfuentessondedominio
pblico.

Integridaddelosfuentes

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

Nodiscriminacinparagruposopersonas

Lalicencianoconsideradistincinalgunaparaningntipodepersona
ogrupo.

Nodiscriminacinparaactividadopropsito

Por ejemplo no se distingue entre uso comercial, domstico,


educativo,etc.

Distribucindelalicencia

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

Lalicenciaafectaralassucesivasdistribucionesdelosprogramasde
formaautomticasinnecesidaddetrmitealguno.

LalicencianodebedeserespecficadeDebian

EsdecirDebiannoadmitiraunalicenciaqueimpidaelusodeun
programafueradeladistribucinDebian.

Lalicencianodebecontaminarotrosprogramas

Lalicencianodebeimponerrestriccinalgunaaotrosprogramas.Por
ejemplonoseraadmisibleobligaraqueelprogramasolosepueda
redistribuirenunmedioquenocontengasoftwarecomercial.

Ejemplosdelicenciaslibres

GPL,BSD,yArtisticsonejemplosdelicenciaslibres.

Cada licencia tiene sus peculiaridades. Porejemplo siusteddesarrolla


aplicaciones haciendo uso de fuentes protegidas pajo la licencia GPL
estarasumiendoparatodosudesarrollolacondicindeGPL.Encambio
podradesarrollarsoftwarepropietarioderivadodefuentesbajolicencia
BSD. La GPLsehahechomuypopularporqueprotegeellegadodel
softwarelibreparaquecontinecomotal.

QueesLinux/GNU

QuizshaledoqueLinuxsignifica'L'inux'I's'N'not'U'ni'X'.Peroen
realidadLinuxesunncleodeSOtipoUnix.SucompatibilidadPosixes
alta.ElSOsecomplementaconunaseriedeaplicacionesdesarrolladas
porelgrupoGNU.Tantoestasaplicacionescomoelncleosonsoftware
libre. Linux/GNU es un SO tipo Unix, SO Multiusuario, Multitarea,
Multiprocesador,Multiplataforma,Multilingue,nacidoenlaredderedes
Internet.

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

UnixseoriginoenloslaboratoriosBelAT&Tacomienzosde1970yel
Msdos tom muchas ideas de este SO pero sus planteamientos eran
mucho ms modestos y solo se intento implementar unas burdas
imitacionesdeunascuantasbuenasideasdeUnix.Elsistemaenrbolde
directorioslaredireccindeentradasalidaylaestructuradeuncomando
porejemplo.MsdosnacicomounjuguetitocomparadoconUnixyluego
lanecesidaddemantenerlacompatibilidadconversionesanterioresha
condicionado fuertemente el crecimiento de Msdos primero y de
Windowsdespus.PorelcontrarioUnixhamantenidolacompatibilidad
conversionesanterioressinningnproblema.TradicionalmentelosSO
Unixsehancaracterizadoporserpocointuitivosdecaraalusuario.Esto
esta cambiando rpidamente porque Linux est ofreciendo cada vez
entornos ms intuitivos para su utilizacin. Esto es resultado del
acercamientoprogresivodeLinuxhaciaelusuariodomsticoyofimtico.

Detodasformasexisteunabarreradetipoculturalqueconvienetener
presente.Muchosusuarioshoyendasabenloquesignifica'formata:'.a:
eselnombredeunaunidaddedisqueteenMsdosoenWindowsperoen
Linux no existen unidades lgicas. En Linux deberamos hablar de
sistemasdeficherosenlugardeunidadeslgicasqueesunconceptomuy
distinto.

DistribucionesdeLinux

LinuxesunncleodeunSOperoparatenerunSOoperativocompleto
hay que acompaarlo de un montn de utilidades, dotarlo de una
estructuradedirectorios,ascomodotarlodeficherosdeconfiguracin,y
scripts para muydistintas tareas.Unscriptesunficheroquecontiene
instruccionesparaelintrpretedecomandos.Todasestascosasjuntasy
bienorganizadassonlascosasquedebeproporcionarunadistribucin.
Algunas distribuciones incluyen software comercial de su propiedad.
OtrasencambiosoloincorporansoftwareGPLosimilar.(softwarelibre)
DistribucioneslibressonSlackwareyDebianporejemplo.Distribuciones
propietariassonRedHat,SuSE,Caldera,Mandrakeetc.

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

Cada distribucin tiene sus propias caractersticas quela hacenms o


menosadecuadaparaciertosusos.

Unodelosaspectosmsimportantesdelasdistribucionesessusistema
deactualizacindepaquetesquepermiteactualizarelSOacadanueva
versinteniendoencuentalasdependenciasentreunospaquetesyotros.

Lasaplicacionesenformatobinariopuedenfuncionarenunadistribucin
yencambionofuncionarenotra.Sinembargopartiendodelosfuentesde
una aplicacin casi siempre basta con recompilar la aplicacin para
obtenerunbinarioquefuncioneenesadistribucin.Estosedebealuso
delibrerasdinmicasquepuedenvariardeunasdistribucionesaotras.
Paraobtenerunbinarioquefuncioneencualquierdistribucinsepuede
compilarunaaplicacinestticamentelocualhacequeelejecutablesea
mucho mayor. Estos problemas estn en vas de solucin ya que las
diferentesdistribucionesestnhaciendoesfuerzosdeestandarizacinpara
que cualquier aplicacin pueda funcionar en cualquier distribucin de
Linux.Entretodasellashayalgunasespecialmentefamosasporalgunau
otrarazn.

Slackwareesunadistribucintotalmentelibreymuysencillaenel
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.
RedHatesactualmenteladistribucinmsampliamentedifundida
aunque eso no significa que sea la mejor. Ofrece un entorno
amigablequefacilitalainstalacin.Incorporasoftwarepropietario
degrancalidad.Elsistemadepaquetes'RPM'esmuybuenoy
utilizadoporungrannmerodedistribuciones.
SuSE Es una distribucin comercial alemana que ha tenido un
crecimiento espectacular. Ofrece un entorno muy amigable que
facilita mucho la instalacin. Seguramente es la ms fcil de
instalarydemantener.CapacidaddeautodeteccindeHardware.
Incorpora abundante software propietario de gran calidad. En
generalsepuededecirqueesmuycompletaymuyrecomendable
paracualquieraquenotengamuchosconocimientosdeLinux.
Caldera Es una distribucin comercial. Ofrece un entorno
amigablequefacilitalainstalacin.Incorporasoftwarepropietario
degrancalidad.

Laeleccindeunadistribucinvienecondicionadapormuchosfactores.
Haymuchasdistribucionesactualmenteycadapocoaparecennuevas.

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

ALGUNOSCONCEPTOSBSICOS

Visinpanormica:

Ensumomentotrataremoslostemasabordadosenestecaptulodeforma
completa.Enestemomentodadoquepartimosdecerosehacenecesario
al menos esbozarunaseriedeconceptos quesontanelementales que
difcilmentesepuedeexplicaralgosinhacerreferenciaaellos.

Porotraparteestosconceptosestninterrelacionadosdetalformaque
tampocosepuedeabordarningunodeellosendetalleenestemomento.
PorellonuestroprimerobjetivoesofrecerunavisinpanormicadelSO.
Porborrosaqueresultesiempresermejorestoqueempezardirectamente
abordandoendetallelostemas.

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

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

Losconceptosquemencionemosenestecursoprocuraremosilustrarlos
conejemplos.

Elcomando'echo'esuncomandoquevamosausarmuchoparapracticar.
Estecomandoselimitaavisualizarenpantallatodoaquelloqueselepasa
comoargumentos.Poresonosresultarmuytil.

Loprimeroquevamosapracticaryquenodebeolvidareselhechode
que en Unix los ficheros, comandos etc. deben indicarse exactamente
respetandoladiferenciaentremaysculasyminsculas.

$ echo hola
$ ECHO hola

Lasegundalneahabrproducidounmensajedeerrorporquenoexiste
ningncomandollamadoECHOconmaysculas.

Variablesdeentorno:

Empezaremoshablandodelasvariablessinprofundizarahoraenello.
Unavariablesoloesunelementoquetieneunnombreyqueescapazde
guardarunvalor.Paradefinirunavariablebastaponersunombreunigual
ysuvalor.(Ojonodejarespacios).

$ VAR33=valor_de_la_variable_VAR33

EnUnixlasvariablesdelsistemasellamanvariablesdeentorno.Para
consultarelvalordeunavariableseutilizaelnombredelavariable
precedidopor'$'.

$ echo $VAR33

Paravertodaslasvariablesysusvaloresseutilizaelcomandoset.

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

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

$ set
$ readonly
$ export

Existen algunasvariables predefinidas yhaytresvariables importantes


quemencionaremosenseguidayqueson$PATH,$PS1y$PS2.

Directorios:

Aqutambintenemosquehacerunpequeoavancesobrelaestructura
de directorios de Unixporque si nopuede que nose entienda lo que
vamosahablarsobrelavariable$PATH.

EnUnixlaestructuradedirectoriosesenformaderbolsimilaralade
Msdos.Dadoquelaestructuradedirectoriosseorganizacomolasramas
deunrbolparalocalizarunpuntocualquierahayqueutilizarcadauno
de los directorios que conducen a ese punto desde el directorio raz.
Nosotroslollamaremos caminoyenUnixselesuelellamarpath.Se
empiezaeneldirectoriorazrepresentadopor'/'yseavanzaporlasramas
deeserbolseparandocadaidentificadorporunnuevocarcter'/'.De
esta forma '/usr/local/bin' indica un lugar concreto en el rbol de
directorios.QuizssepregunteporquUnixusa'/'enlugarde'\'comoen
Msdos.RecuerdequeMsdosfueposterioraUnixyqueaBillGatesle
gusta inventar cosas totalmente nuevas y revolucionarias. Aunque el
astutolectoryasehabrdadocuenta,adviertoalosdespistadosqueestoy
ironizando.

Aprovechandoqueestamoshablandodedirectoriosmencionaremosque
haydirectoriosconsignificadoespecial.Esteldirectorioraz'/'queya
hemosmencionado.Esteldirectorio'home'queeselpuntodondeel

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

sistemanossitaparatrabajarcuandoentramosenl.Recordemosqueen
Unixnormalmentenodisponemosdetodoelsistemaparanosotrossolos.
Luegopodemoscambiardedirectoriodetrabajo.Eldirectoriodetrabajo
actualserepresentacomodirectorio'.',Eldirectorioanteriorodirectorio
padredeestedirectorioserepresentapor'..'.Loscomandos'cd','mkdir'y
'pwd' sirven para cambiar de directorio actual, crear un directorio y
averiguarenquedirectorionosencontramosactualmente.

Estamosdandoideasenformaintuitiva.Enrealidadcuandodigo"...en
que directorio nos encontramos actualmente ..." es una forma de
expresarse. Normalmente el usuario no estar en un directorio sino
sentado en una silla sentado delante de una pantalla, pero la shell
mantieneentodomomentoalgndirectorioabiertocomodirectoriode
trabajoactual.

Comandos

Uncomandoesgeneralmenteunficheroejecutablelocalizadoenalguna
partedenuestrosistema.Existeunavariablellamada$PATHque
contieneunalistadecaminosdebsquedaparaloscomandostodosellos
separadospor':'.Compruebeelvalordesuvariable$PATH.

$echo$PATH

Siuncomandonoestlocalizadoenningunodeesoscaminosdeberser
referenciadoindicandoelcaminocompletoyaquedeotraformanopodr
serreferenciado.Siquieresaberdondeseencuentraunejecutableuseel
comandowhich.Estecomandobuscarenloscaminoscontenidosenla
variable$PATHhastaqueencuentreelcomandoyentoncesmostrarel
camino completo que conduce al comando. Puede ocurrir que un
comandoseencuentreduplicadoyquelosdossitiosdondeseencuentre
figuren en el $PATH. En ese caso se ejecutar el comando que se
encuentreenelprimercaminoreferenciadoenel$PATH.Igualmenteel
comando which solo mostrar el primer camino referenciado en el

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

$PATH.Estamosusandouncomandollamadoechoparamostrarvalores.
Vamosalocalizarlo.

$whichecho

Echo esta situado en uno de los caminos contenidos en $PATH. En


resumidas cuentas $PATH es una variable que usa el interprete de
comandosparalocalizarloscomando.Enlaleccinsiguientehablaremos
de'man'.Esuncomandoquesirveparaconsultarelmanualenlneade
Linux.Puesbienexisteunavariablellamada$MANPATHquecontiene
lalistadeloscaminosdondeelcomando'man'debebuscarlaspginas
delmanual.Lavariable$MANPATHserusadaporelcomando'man'y
quizsalgnotro.Lavariable$PATHserusadaporlashellyquizspor
algn otro comando como por ejemplo 'which' del cual acabamos de
hablar.

Somosconscientesdequenoestamosexplicandograncosaahora,pero
sonconceptosmuyelementalesquevamosautilizarantesdeexplicaren
profundidadtodoelsistemadeficherosdeUnix.

Msadelantetambinhablaremosmsdetenidamentesobrelasvariables
de entorno. Estamos dando unos pequeos esbozos sobre algunas
cuestionesporquehaymuchainterrelacindeunosconceptosconotrosy
resultaimposibleabordarnadaenprofundidadalprincipio.

Usuarios

Linuxesunsistemaoperativomultiusuarioyesoimplicaunafilosofade
uso muy distinta a la del tradicional ordenador personal. Cuando un
usuario va a usar un SO Tipo Unix lo primero que necesita hacer es
identificarseparaserautorizadoaabrirunasesindetrabajo.Tambines
multitareayporelloenelmismoinstantevariosprocesospuedenestar
funcionando y cada uno puede pertenecer a usuarios distintos. La
informacinqueseguardaeneldiscodurotambinpuedepertenecera
distintosusuariosyparaevitarquetodoelloprovoqueconflictosexisten

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

unosatributosdeusuarioqueseasocianalosficherosalosdirectorios,a
losprocesos,etc.Enfuncindeestohaycosasqueestarnpermitidasa
ciertosusuariosyaotrosno.

Losusuariospuedenestarorganizadosendiferentesgruposafindepoder
manejar permisos a nivel de grupo. Esto se hace para simplificar la
administracindelsistema.

Losusuariosylosgruposdentrodelsistemasemanejancomounnmero
llamadoUIDyGIDrespectivamente.Losnmerosenunordenadorse
manejanconmuchamsfacilidadqueunliteral.Poresoelnombrede
usuarioyelnombredegruposeguardarnsoloenunficherojuntoal
nmeroUIDyGIDasociado,peroparaelsistemaunusuario,ungrupo,
unproceso,unfichero,ymuchasotrascosasseidentificanporunaclave
numrica.Paraunordenadorresultamssencilloconsultarsielproceso
456pertenecientealusuario105tienepermisodeescrituraenelfichero
48964queconsultarsielusuario'pepito'pertenecientealgrupo'alumnos'
tiene permiso de escritura en el fichero '/home/pepito/leccion005.txt'.
Cuandoelordenadortienequemostrarinformacinenformatointeligible
buscarladescripcincorrespondienteacadaclavenumrica.Cadaclave
recibe un nombre como por ejemplo los UID, GID que ya hemos
comentadootraseraporejemploelPID,paraprocesosyexistenotras
muchasmsqueiremosaprendiendoyqueformanpartedelajergade
esteSO.

Para ver los datos de identificacin relativos a su usuario pruebe lo


siguiente:

$ id

El comando 'id un' o el comando 'whoami' muestran su nombre de


usuario.

$ whoami

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

Existe un usuario especial que goza absolutamente de todos los


privilegiosyquesellamaroot.SunmerodeusuarioesdecirsuUIDes
0.

ElNcleodelsistema(kernel)

Elncleodelsistemallamadotambinkerneleselencargadoderealizar
lamayoradefuncionesbsicasdelsistemaygestionaentreotrascosasla
memoria,losficheros,losusuarios,lascomunicaciones,losprocesos,etc.
Lagestindeestascosassehacenpormediodeunlimitadonmerode
funcionesquesedenominanllamadasalsistemayquepuedenserusadas
porlosprogramas.Losprocesosqueusanunallamadaalsistemacambian
sumododeejecucin.Mientrasestnejecutandolallamadadelncleose
dicequeestnenmodoncleoycuandoestnejecutandocdigoqueno
pertenecealncleosedicequeestnenmodousuario.Sondosnivelesde
ejecucindistintosyaqueelmodoncleoesunmodoprivilegiado.Esto
garantiza a nivel de hardware que ningn programa de usuario pueda
accederarecursosgeneralesdelsistemaniinteractuarconotrosprocesos
anoserqueuselasllamadasdelncleolascualesestablecernsitieneo
nopermisoparahacerciertascosas.Estoproporcionagranrobustezde
funcionamiento. Un programa mal diseado no perjudicar jams al
sistema ni a otros procesos. Cada proceso tiene su propia zona de
memoria y no puede acceder fuera de ella ni intencionadamente ni
accidentalmente. Para que un programa pudiera tener un efecto
destructivoenelsistematendraquepertenecera'root'operteneceral
propioncleodelsistemaysoloeladministrador'root'puedealterarel
dicho ncleo. Si el ordenador aparece un buen da destrozado a
martillazostambinbuscaranlaformadeculpara'root'paranoperderla
costumbre.

Procesos

Unprocesoadiferenciadeunprogramaesalgovivoesdeciralgoque
estfuncionando.Enunsistemamultitareacomoeste,unprogramapuede
dar lugar a varios procesos. A cada proceso le corresponder con un

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

nmero de identificacin llamado PID que le identifica totalmente.


Ademsdeestoseguardalainformacindeidentificacindelusuario
propietario.Cuandounusuarioejecutauncomandosearrancaelproceso
correspondientedelcualgeneralmentepermanecercomopropietario.Es
decirelsistemanoaceptardenesannimas.Siemprefigurarunusuario
parahacercadacosa.EstoseindicaconunnmeroUIDparaidentificar
elusuariocorrespondiente.NosiempreesteUIDsecorrespondeconel
usuario que arranc elproceso.Porelloexisteadems deunUID un
identificadordeusuarioefectivo(EUID)queeselquerealmenteestenido
encuentaporelsistemaalahoradeconcederpermisoparahacerciertas
cosas. El EUID de 'root' es 0. Ahora no importa como pero algunos
comandosdeformabiencontroladapodranconvertirnosvirtualmenteen
superusuarioshaciendoquesuEUIDvalga0.Estoserviraporejemplo
parapermitirhacercosasespecialesymuyconcretasnadamsqueen
condiciones normales solo 'root' podra hacer. No hemos mencionado
intencionadamentealgunascosas(comoporejemploelgrupodeusuario),
porqueestamossimplificandomuchointencionadamenteparaintentarque
enestemomentosolocapteunaprimeraideageneral.

Sisesienteunpocomareadoyconfusoreljeseyacostmbreseaesta
sensacin. Los primeros pasos suelen ser los ms complicados.
EspecialmenteenUnixporquenofuediseadocomounsistemaintuitivo.

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

ELMANUALDELSISTEMA

man(1),apropos(1)

Generalidadesdelmanual

ManeselmanualenlneadetodoslossistemasoperativostipoUnix.
Estanoeslaleccinmsatractivadeestecursoperosiqueesunadelas
msnecesarias.Unodelosobjetivosdelcursoesalcanzarciertonivelde
autosuficienciaenLinux.Mannoeslanicafuentedeinformacinpero
frecuentementesueleserelprimersitiodondesesuelemirar.Siusted
haceunaconsultaenunalistadeusuariosdeinternetdeLinuxsobreun
temaquepodrahaberaveriguadoporsimismoconsultandoelmanual
alguienlerecordar(entonomsomenosamabledependiendodelda
quetenga)queesainformacinestabaenelmanual.

Sepuedenexplicarmuchascosassobremanperoesimprescindibleque
practiqueusted.Paraellodeunrpidoprimervistazoalapginaman
relativaalcomandoman.

Mientras no indiquemos lo contrario conviene que pruebe todos los


comandosqueseindicanamododeejemplo.Sitieneposibilidaddeusar
dossesionesleresultarmscomodopracticarsobrelamarcha.Teclee
ahoraelcomandosiguiente:

$manman

Habrvistoundocumentoqueexplicaelusodemanyquetieneuna
estructuracaractersticadetodaslaspginasman.

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

Laspginasdelmanualutilizanunformateadordedocumentosllamado
troff.Permiteespecificarelestilodeundocumento.(Maneraenquese
ven los ttulos, encabezados, prrafos,donde aparecen los nmeros de
pgina,etc.Debidoasuflexibilidadtroffresultabastantedifcildeusar.
nroffygroffsirvenparalomismoperonoexplicaremossusdiferencias.
Pensamos que solonecesitar conocersuexistencia.Sinoinstalaestos
programasnopodrusarmanensuordenador.

Otroejemplo.Paraobtenertodalainformacinrelativaalcomando'ls'
hagalosiguiente:

$manls

Cuandonoseconoceexactamentelapalabraquesedeseabuscarsepuede
buscarporpalabraclave.Paraellousaremoslaopcink,ylaopcinf.
Estaopcinnoestdisponibleenmuchossistemasdebidoaquehayque
generar referencias y esto consume mucho espacio en disco. El
administradorpuedegenerarlasreferenciasusandoelcomando'catman'

Cuandonoconocemoselnombredeuncomandoytampocoencontramos
nadaporpalabraclaveperosabemosqueesloquehacepodemosusarel
comando'apropos'.Comprubelotecleandolossiguientescomandos:

$aproposman
$aproposapropos
$manapropos

Si tiene su sistema Linux correctamente configurado para imprimir


documentosenformatoPostScrippodrimprimirunapginadelmanual
haciendo

$mantman|lpr

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

Seccionesdelmanual

Paraindicarenundocumentounareferenciaaunapginadelmanualse
sueleindicarconelcomandoseguidodelaseccinentreparntesis.El
ttulodeestaleccin'man(1)'esunejemplo.Paraconsultaruncomando
en una seccin concreta habra que teclear man <nmero_seccin>
<comando_o_funcin>. Veamos un par de ejemplos con printf(1) y
printf(3).

$man1printf
$man3printf

Comohabrpodidoobservarserefierenacosasdistintas.Enelprimer
casoprintfesuncomandoyenelsegundounafuncinestndardeCcon
elmismonombre.Sinoseindicalaseccinlabsquedasellevaacabo
en todas las secciones de manual disponibles segn un orden
predeterminado,yslosepresentalaprimerapginaencontrada,incluso
siesapginaseencuentraenvariassecciones.Porelcontrariousandola
opcinapresentar,secuencialmente,todaslaspginasdisponiblesenel
manual.Compruebeestoconlossiguientesejemplos:

$manprintf
$manaprintf

Consultelasseccionesqueestndisponiblesensusistemaen man(1).
Acabamosdeindicarloquesignificaman(1)asqueelastutolectorya
deberaestarmirandoenlaseccin1delmanual.

Conclusiones

Parafinalizartambinmencionaremosotrafuenteimportantedeconsulta
enLinuxquesonlosHOWTOsylosFAQs.Estossondocumentosque
explicancomohaceralgoolaspreguntasmsfrecuentesrelativasaun
determinado tema. Este tipo de documentos monotemticos son

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

frecuentes en Linux. Proceden de contribuciones desinteresadas de


usuarios bien informados y estn disponibles en distintos formatos
(HTML.textoplano,etc).Suelensermsdidcticosquelaspginasde
man, pero man es la referencia obligada para cada comando y cada
funcinimportante.Nosevitatenerquerecordartodaslasopcionesde
cada comando ya que frecuentemente cada comando tiene un amplio
juego de opciones.Hayalgunos documentos enespaolespecialmente
adecuadosparanovatos.

Hemos visto unas pocas opciones del comando man. Intente utilizar
algunas otras opciones. Es importante que se familiarice con l. Las
pginasmannoestnpensadasparaensear,perocadavezquetengauna
dudadecomoseutilizaalgotendrquerecurriraellascomoprimera
fuentedeinformacin.

Con esto pretendemos que abandone usted algunas de sus viejas


costumbres.Antesustedpensabadelasiguientemanera:

Sifuncionaaceptablementeparaquetocarlo.

Sinofuncionaapagamosyvolvemosaencender

Sinadadeestosirvellamamosaunamigo.

Ahora ya sabe que tambin puede optar por una lectura del manual.
Hgalo pero consulte de momento solo la informacin relativa a los
nmeros de seccin, partes de un manual, y las opciones a, k, t.
Asumimosquenoesnecesariolalecturaenprofundidadporquehabr
cosasqueaunnopuedeinterpretar.Tengaencuentaquepartimosdeun
nivelcero.Annosabeustedloquesignificanalgunascosas.Poresouna
vezfinalizado elcursoconvendrquevuelvaamirarestapginaman
relativaalcomandomanparasacarlemsprovecho.

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

LASHELL

sh(1)ksh(1)csh(1)bash(1)

IntroduccinalashelldeUnix

ExistenvariasshellsparaUnix,KornShell(ksh),BourneShell(sh),C
Shell(csh),ymuchasms. Existenalgunasparapropsitosespeciales.
PorejemplolaremoteShell(rsh)seutilizaparaejecutarcomandosenun
ordenadorremoto.LaSecureShell(Ssh)seutilizaparaestableceruna
conexinseguraconunordenadorremoto.

LamsutilizadaenLinuxeslaBourneAgainSHell(bash).

NosotrosdemomentovamosatratarprincipalmentelaBourneShellque
eslamsestndar.

La KornShell y la Bash son distintos superconjuntos distintos de la


BourneShell y por ello todo lo que se diga para la BurneShell ser
vlidotambinparalaKornShellyparalaBash.

EnLinuxsesueleusarlaBourneAgainSHell(bash),comosustitutadela
BourneShell (sh). Puntualmente tambin explicaremos alguna
peculiaridaddelabash.

Parasaberqueshellestusandoustedhagalosiguiente:

$ps|grep$$

Siaparecebashoshpuedecontinuarsinproblemasyaqueestusando
unashelladecuadaparapracticarloquevieneacontinuacin.Encaso

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

contrariotecleelcomando'sh'oelcomando'bash'antesdecontinuar.
Vuelvaarealizarlacomprobacinanterioryverqueahoraestausando
otrashell.

EncualquiercasocualquierShellesunprogramanormalycorriente,pero
incorporamuchosdelosconceptosmsprcticosdeUnix.Notienenada
departicularquealgunossistemasincorporenalgunasShellsdistintas.

UnaShellnoessolounintrpretedecomandos.UnaShellessobretodo
unintrpretedeunpotentelenguaje.

Estructuradelalneadeorden

Sabeustedloqueesunintroductor?(eningleslollamanprompt).Pues
esaquelloqueelinterpretedecomandosmuestraparaindicarqueest
esperandoaqueseintroduzcaunaorden.EnUnixelintroductordela
orden de comandos no es siempre el mismo. Por defecto suele venir
configuradodistintosintroductoresparadistintosinterpretesdecomandos
ytambinseusaunintroductordistintoparaelusuarioroot.Sinembargo
elintroductorpuedeservariadoyaqueesalmacenadoenunavariabledel
sistema.Enrealidadlashellutilizadosintroductoresdistintos.Paraver
cualesestutilizandoahoratecleelosiguiente:

$echo"Introductor1=$PS1"
$echo"Introductor2=$PS2"

Cuandoapareceelprimerintroductordelsistema$PS1indicaquelashell
est esperando la introduccin de unaorden. Las ordenes se terminan
mediante.Sidespusdepulsarlashellnoconsideraqueelcomandoeste
completo quedar esperando ms entrada mostrando el segundo
introductor$PS2.

Sialgunaveznoescapazdeterminarlaintroduccindeuncomando
pruebeaabortarusando<CtrlC>

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

Unaordenconstardeunnmerovariabledeelementosseparadospor
blancos,opor<tab>.

En una orden se pueden distinguir comandos, opciones, argumentos,


metacaracteres, comentarios, comandos internos...etc. Los blancos se
usanparasepararlasopcionesyargumentospresentesenunalineade
ordenes y usados de esta forma (como separadores) una secuencia de
blancostieneelmismoefectoqueunosolo.(OjoenUnixlasmaysculas
yminsculassonsignificativas.)

Acontinuacinsemencionadeformanoexhaustivaloselementosdel
lenguajeshellscript.Nointentamosqueseaprendatodosestoselementos
nivamosacomentarahoratodosellos.Bastarquesehagaunaideade
quetiposdeelementospuedenintervenir.

Comandos:

Sonficherosejecutables.Paraquelashelllocaliceelcomandodeber
estarenunsubdirectorioqueformepartedelavariablePATHodelo
contrariodebeespecificarseelcaminocompleto.

Opciones:

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

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

Metacaracteres:

Tienenunsignificadoespecialparalashellysonunodelossiguientes
caracteres:

;&()|>><espacio><tab>

Operadoresdecontrol:

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

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

Sonpalabrasreservadasparaimplementarellenguajeshellscript.Son
palabrasreservadas:

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

Comandosinternos:

Comandos que estn implementados dentro de la propia shell. No


necesitanPATH.Ejemplosdecomandosinternosson:

cd,exec,arg,eval,exit,...

Paraunareferencia exacta ycompleta debera acudiralapginaman


bash(1)aunqueesoresultaraexcesivoenestemomento.

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

Vamos a dar una serie de ejemplos para que los practique en su


ordenador.Noesnecesarioqueintroduzcaloscomentarios.

$#Ordenconunnicocomandosinopcionesniargumentos
$ls

$#Ordensinocionesperocontresargumentos
$ls./..

$#Ordenconuncomandoyunaopcin
$lsl

$#Ordenconuncomandoytresopcionesindicadadevariasformas
$#distintasperoequivalentesentresi.
$lstrl
$lsrtl
$lsltr
$lsltr
$lsltr
$lsltr
$lsltr

$#Opcionesqueempiezancon''
$lshelp
$lsversion
$lscolor=auto

$#Ejemplodeopcionesyargumentossensiblesalorden.
$datednowR
$datedRnow

$#ejemplodeopcionqueempiezapor'+'
$date+'%a%b%e%H:%M:%S%Z%Y'

Expansindelalineadeorden:

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

Existeundetallemuyimportanteenelfuncionamientodelashell.Una
cosaesloquenosotrosescribimosyotraloquelashellordenaquese
ejecute.Antesdequelashellejecutecomandoalgunoexpandelalneade
ordenes.Esdeciresalneasetransformaenotralneamslarga.Laorden
resultantepuedesermuylargaytenermuchosargumentos.Porejemplo
un'*'sersustituidoporlalistadeficherosqueseencuentrenenel
directorioactual.Quizsalguienencuentrequeexisteunparecidoconel
usode'*.*'enMsdosporejemploperoelparecidoesmuysuperficialy
engaoso.CuandoenUnixhacemos'ls*'elintrpretedecomandos
expandeelasteriscoyelcomandolsrecibeunalistadeficherosquetiene
quelistar.EnMsdoscuandohacemos'dir*.*'elinterpretedecomandos
noexpandenada.Elcomandodirrecibecomoargumentonolalistade
ficherosquetienequelistarsinoun'*.*'yserelpropiocomandodir
quientengaqueexpandirelargumentoparaobtenerlalistadeficheros
quetienequelistar.PorlotantolaexpansinenUnixestcentralizadaen
elinterpretedecomandoselcualpermitehacerexpansionesmuchoms
potentesqueenMsdos.Uncomandonoesmsqueunejecutableylos
ejecutablesgeneralmenteadmitenargumentos.EnUnixloscomandos
tomanlosargumentosquelespasalashelldespusdelaexpansin.

El'*'seexpandeenbasealosnombresdeficherospresentesennuestro
directorioactual,sustituyndoseporunacadenadecaracterescualquiera
quenoempieceporunpunto.

Vamosarealizarunaprcticacompleta.Algunosdeloscomandosque
vamos ausar como'cd','mkdir','touch'yotrossoncomandos queno
explicamos en este momento pero que servirn para situarnos en un
directoriodetrabajoycrearalgunosficherosparalaprctica.

$comando...

salidadel
comando...

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

Ahora introduzca los comandos que indicamos a continuacin y


compruebelasalidaobtenida.

$cd/tmp
$mkdirpruebas
$cdpruebas
$#Yahemoscreadoundirectoriodepruebasyyaestamos
dentrodel.
$#Paracomprobarlohacemos
$pwd
/tmp/pruebas
$#Ahoracreamosunosficherosparapracticar
$touchkk1kk2kkkkkk.txtkk.docj2.txt.kk
$echo*
kk1kk2kkkkkk.txtkk.docj2.txt
$echok*
kk1kk2kkkkkk.txtkk.dox
$echo*xt
kk.txtj2.txt
$echo*.

$echo.*
.kk
$echo*.*
kk.txtkk.docj2.txt

Fjese que los resultados dependen de los ficheros existentes en el


directorioactual.Losmismoscomandosrealizadosdesdeotrodirectorio
distintodaranotroresultado.

Mantengalasesindelaprcticaenestepuntoporquecontinuaremos
haciendoalgunasprcticasmsdesdeestemismopunto.

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

El'?'seexpandecomounnicocarcterytampocoexpandeunpuntoen
el comienzo del nombre del fichero. Introduzca ahora los siguientes
comandosycompruebelasalidaobtenida.

$echo???
kk1kk2
$echokk?
kk1kk2

Acontinuacinnotecleenadayaqueelresultadoessolounahiptesis.
Supongamosqueobtenemosunerrordeestetipo.

$ls*
ksh:/bin/ls:arglisttoolong

Estosignificaqueel'*'seexpandeenunnmerodemasiadograndede
ficherosyesoresultaunproblemaparaelinterpretedecomandos.La
formadeobtenerlalistadeficherosserahaciendo:

$ls

Otambin.

$ls.

Siquisiramosaveriguarelnmerodeficherospodramoscontarloscon
'wc'.Aquestamosusandoun'|'queaunnohemosexplicadoperoquelo
explicaremosenelprximocaptuloderedireccindeentradasalida.

$ls|wcl

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

PeculiaridadesdeexpansinenlabashdeLinux

Solovamosamencionarunascuantasyremitimosallectoralapgina
delmanualdebashparamsinformacin.

Expansindecorchetes.

Esteesuntipodeexpansinquenotieneparanadaencuentalos
ficherosexistenteseneldirectorioactual.

$echoa{d,c,b}e
adeaceabe

Expansindelatilde.

Estaesunacaractersticaespecial delashelldeLinuxqueresulta
realmentetil.Expandelatildecomodirectoriohome.

$echo~
$echo~root
$echo~root/*

ArithmeticExpansion.

Estopermiteexpandirexpresiones$((expression))

$echo$(((4+11)/3))
5

Enbash(1)enelapartadodeEXPANSIONsemencionanmscosas.

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

Redireccindeentradasalida:

Normalmente los procesoutilizan para entrada y salida de datos unos


dispositivos estndar. Son entrada estndar, salida estndar y salida
estndar de errores. Generalmente se utiliza como entrada estndar la
entradadetecladoycomosalidaestndarysalidaestndardeerroresla
pantalla.Lasalidaestndarseusacomosalidanormaldedatosylasalida
estndardeerroresseusaparasacarmensajesqueindicanalgnerror,
aunquetambinseusasimplementecomoflujoalternativoencasodeque
noresultedeseablesumezclaconotrosdatosquedebensalirporsalida
estndar.

Sepuedealterarflujodedatosquevadesdeundispositivoestndaraun
programa o viceversapuedeserredirigidoaotrodispositivo,oaotro
programa,ofichero,etc.

Desdelashellsepuedehacerestodevariasformas.

>

Redirigelasalidaestndaraunficheroodispositivo.

<

Redirigelaentradaestndartomndoladesdeunfichero.

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

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

susficherosyelprocesolectoracusarlacondicincomounfinde
datosdeentrada.

>>

Redirigelasalidaestndaraunficherosinsobrescribirlo.Enlugarde
elloaadealfinaldelmismo.

<<FIN

Redirigeentradaestndardesdelapropialneaderdenes.(Enlugar
deFINsepuedeusarcualquierliteral).

2>

Redirigelasalidaestndardeerroresaunficheroodispositivo.

2>&1

Redirigelasalidaestandarddeerroresdondeestaredirigidolasalida
estndar.(0=entradaestndar,1=salidaestndar,2=salidadeerrores
estndar)

Ejemplos

Laordensiguientenoproduceningnresultadovisibleporquelasalida
estndarseredirigealdispositivo/dev/null.Estedispositivoescomoun
pozosinfondo.AdiferenciadeunapapeleradeWindowsnosepuede
recuperarluegonada.

$date>/dev/null

Ahoraunejemplocurioso.Elcomando'time'sirveparamedirconsumos
detiemposdeotroscomandosyparaevitarmezclasdedatosensalida

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

estndarsedecidiquelasalidanormaldetimefueralasalidaestndar
deerrores.

$timewhoami>/dev/null

Podemosverelconsumodetiempodelcomando'whoami'porqueeste
saleporlasalidaestndardeerrores.Esunejemplodeutilizacindela
salidaestndardeerroresparasacarinformacinquenotienenadaque
verconningnerror.Sinembargotimeesuncomandointernoyporello
losiguientenofuncionaracomoustedpiensa.

$timewhoami2>/dev/null

Enestecasolaredireccinafectasoloalcomandowhoami.

Los comandos internos sonpartedela shell ypararedirigir susalida


habraqueredirigirlasalidacompletadelashell.Dejaremosestoparaun
captuloposterior.

Antesdecontinuarvamosaasegurarnosqueestamosenunsitioseguro
paratrabajar.

$cd/tmp
$mkdirpruebas>/dev/null
$cdpruebas
$#Paracomprobarqueestamosen'/tmp/pruebas'hacemos
$pwd
/tmp/pruebas

Elcontenidode'/tmp'sueleservaciadocuandorearrancalamquinao
quizsenalgnotromomento.Contieneinformacintemporal.Hemos
usado/dev/nullparaignorarlasalidadeerroresdelcomandomkdir.Siya
exista '/tmp/pruebas' mkdir habra dado un error pero nosotros lo

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

ignoramosporquesolonosinteresaquelocreeencasodequenoexistay
encasocontrariodaigual.Eldispositivo'/dev/null'tambinresultatil
parasimularunaentradanuladedatos.Porejemploparacrearunfichero
vaci.Siyaestamossituadosen'/tmp/pruebas'pruebelosiguiente:

$cat</dev/null>kk
$lslkk

Elmismoefectopodramosconseguirusando.

$>kk
$lslkk

Esto se puede utilizar para vaciar ficheros respetando los permisos


originales.

Vamosmirarelcontenidodeldirectorioraz

$lsl

Ahoraqueremosrepetirelcomandoperoguardandoelresultadoenel
ficherokk

$lsl/>kk

Novemosnadaporquetodalasalidavaapararalfichero.Paravisualizar
elcontenidodeunficherousaremoselcomando'cat'.

$#Mostrarelcontenidodelficherokk.
$catkk

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

$#Equivalealanterior.
$cat<kk

$#Parecidoalosdosanteriores./dev/ttyesundispositivoque
$#seidentificacomonuestroterminal.
$cat<kk>/dev/tty

Tambin podemos visualizar la salida de un comando a la vez que


guardamos la salida en un fichero. El comando tee acta como un
bifurcacin.

$lsl/|teekk1
$catkk1

Recuerdequeloquesigueaun'|'hadesersiempreunejecutable.

$touchkk
$date|kk

Estohabrdadounerror.Probemosahoraaredirigirlasalidaestndarde
erroresaunficheroylasalidaestndaraotro.

Stouchkk
$date|kk2>errores>salida
$caterrores
$catsalida

Existeuncomando'yes'quesirveparagenerarcontinuamenterespuestas
afirmativasenformadecaracteres'y'yfinalesdelnea.Estecomando
estpensadoparaserusadocon'|'yproporcionarentradasafirmativasa
uncomando.Usaremoselcomando'head'quesirveparasacarporsalida

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

estndarsolounaprimerapartedelosdatosdelaentrada.Lacantidad
datospuedeespecificarseennmerodelneasenbytes,etc..Nosotros
vamosautilizarbytes.Lasalidade'yes'laentregaremosaheadparaque
tomelos 1000primeros bytes quepasamosalprograma'wc'paraque
cuentelneaspalabrasycaracteres.

$yes|headbytes=1000|wc
5005001000
Tuberarota

Elcomando'yes'podrafuncionareternamente.Susalidaredirigidapor
lasbuenasaunficherollenaraeldisco(cosanadadeseableporcierto)y
acabara dando un error. En lugar de esto lo hemos redirigido a un
programaqueaceptarsololos1000primeroscaracteresyluegocerrar
suentradaprovocandounerrordeTuberarota.

Lashelltambinpermiteintroducirdatosenunaformaespecialquese
llamadocumentoaqu.Paravariarunpocousaremosahoraelcomando
'sort'quesirveparaordenar.Observequeenesteejemplounfindelnea
noterminaelcomando.Porelloaparecerelintroductorsecundario$PS2
quenosotrosindicamosconun'>'enamarillo.

$ # Para ordenar unas lineas que introducimos en la


propia linea de
$ # ordenes usamos el operador '<<' seguido de una
clave de
$ # finalizacin, de la entrada.
$ sort <<FIN
> aaaaa
> cccccc
> zzzzz
> bbbb
> yyyy
> FIN

aaaaa
bbbb
cccccc

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

yyyy
zzzzz

Operadorgrave:

Cuando colocamos algo dentro de las comillas graves '`' la shell lo


interpretaracomounacadenacuyovaloressustituidoporelresultadode
esecomandoqueproduceesecomandoensalidaestndar.

$echodateproduce`date`

dateproducelunene1020:59:12CET2000

Elresultadoessolounejemploynopuedecoincidirexactamenteconel
resultadoobtenidoporustedyaquedeberaponerlafechacorrectaensu
sistema.

Quizaselejemploqueacabamosdeusarnoledeunaideaexactadela
potencia del operador grave. Recuerde que esto ocurre durante la
expansindelalneaderdenesantesdeejecutarseelcomandoecho.Por
ellopodemoshacercosascomolassiguientes.

$#Ejecutamosdateyguardamoselresultadoenunficherocuyo
$#nombreconstruimosenbaseanuestronombredeusuarioyal
$#aodelafechaactual.
$date>fichero`whoami``date+%Y`
$lslfichero*
$catfichero*

Hemosusadouncomandoparaconstruirelnombredelficherodesalida.
No mostramos los resultados pero confiamos en que ya los ha
comprobado.

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

Caracteresdeescape:

Dado que la Shell interpreta caracteres. Blancos como separadores.


Asteriscoseinterrogacionescomocomodines.Operadorgrave.Comillas
dobles,Comillasnormales,$,etc...Seplanteaelproblemadequehacer
cuando queremos usar estos caracteres como tales sin que sean
interpretadosporlashell.Existenvariasformasdeescaparcaracterespara
quelashellnolosexpanda,ointerprete.

Lashellnoelnicoprogramaconcapacidaddeexpandireinterpretar
caracteres especiales. Por ejemplo find, egrep, sed, y otros tambin
interpretanciertoscaracteresqueademspuedencoincidirconalgunosde
los que interpreta la shell. Para usar caracteres especiales que pueden
interpretarseporlashellhabrqueescaparlossiemprequedeseemosque
lleguenalcomando.

Vamosavertresformasdistintasdeescaparcaracteres:

Cuando usamos las dobles comillas, los comodines asterisco,


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

Vamosavertodoestoconunosejemplos:

$#Laordensiguientemuestraelmismoliteralqueelentrecomillas.
$echo"**?*"

$#Enestecasolashellinterpreta`pwd`y$PATH,encambio'*'y
$#'?'noseinterpretan.

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

$echo"*?`pwd`$PATH"

$#Enestecasoseconservatodoelliteralsininterpretar.
$echo'*?`pwd`$PATH'

$#Acontinuacinlaordenmostrardoscomillasdobles.
$echo\"\"

$#Elcaracter<nuevalinea>tambinpuedeserescapadoyeneste
$#casopuedeservirparaintroducircomandosmuylargosdeforma
$#mslegible.Parahacerestapruebadeberpulsarlateclade
$#<nuevalinea>justoacontinuacindelcaratcter'\'
$lsl/|\
$headn10|\
$tee/tmp/resultado|\
$wc

Ejercicio:

Lassiguientesrdenesproducenresultadoscuyaexplicacinnoresulta
trivial.Estoesdebidoaquepermitimosconlaopcinequeelcomando
'echo'interpretecaracteres.Porlotantoloqueocurreesqueprimeroel
intrpretedecomandosinterpretaloscaracteresdelalneaderdenesy
luego el comando echo interpreta los caracteres recibidos. Consulte la
pginamandeecho(1)ybusquelaopcine.Ejecuteloscomandosque
leproponemosacontinuacineintenteexplicarlosresultados.Puedeque
necesitepapelylpiz.

$echoe\n
n
$echoe\\n

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

$echoe\\\n

$echoe\\\\n
\n$echoe\\\\\n
\n$echoe\\\\\\n
\
$echoe\\\\\\\n
\
$echoe\\\\\\\\n
\\n

Resumen

Hemosvistomuchascosasquenospermitenhacernosideadelapotencia
delaBourneShelldeUnix.LabashdeLinuxesunsperconjunto.Es
decirescompatibleperomspotente.

Queremosresaltarqueparalaspersonasquehanconseguidoterminareste
captuloyasehaconseguidoalgoimportante.Personasacostumbradasal
usosdeMsdoscometenbarbaridadesqueluegonisiquierasoncapacesde
explicar. La clave muchas veces est en la expansin de la lnea de
rdenes.

En realidad este tema no est agotado ni mucho menos y lo


completaremos encaptulos posteriores aunqueintercalaremos material
msligeroporquenodeseamoshacerlesufrirdemasiado.Sololojustoy
porellocreoqueeselmomentodeconfesarqueexistauntrucopara
realizarmsfcilmenteelejercicioanterioraunquenolomencionamos
antes porque habra resultado demasiado fcil y cmodo. Se trata de
activar la trazadelashellcon'setx'.Deestaformapodemosverel
resultadodelaexpansindelneaderdenesprecedidaporelsigno'+'.

$setx

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

+setx
$echoe\\\\\\\\n
+echoe'\\\\n'
\\n
$set+x
+set+x

Puede utilizar este truco cuando no sepa que est ocurriendo con la
expansindeunalneaderdenesquenofuncionacomoustedpensaba.

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

INTRODUCCINALOSPROCESOS

Queesunproceso

A estas alturas ms de uno empezar a preguntarse si realmente es


necesarioconocertodosestosdetallesparaunsimpleusodeunSO.Este
cursoestaorientadoalusodeLinuxdesdelaconsolayresultanecesario
conocer estas cosas incluso para un usuario normalito. No vamos a
describir detalladamente como estn implementados los procesos en
Linux.

Quizsparauncursodeprogramacinavanzadasifueranecesario,pero
lo que nosotros vamos a describir es nicamente los detalles ms
importantesdesdeunpuntodevistadidcticoyprcticoparaunusuario
normal.

Enunsistemamultitareatodofuncionaconprocesosasqueconocerunos
cuantos principios bsicos sobre procesos le resultar de la mxima
utilidad. En un sistema monotarea se usa frecuentemente el trmino
programaindistintamenteparahablardeunprogramaenpapel,encdrom,
endiscodurooenfuncionamiento.Enunsistemamultitareanosedebe
usareltrminoprogramaparahablardelaejecucindelmismo.Ensu
lugar hablaremos de proceso indicando con ello que esta arrancado y
funcionando.Unprogramapuededarlugaravariosprocesos.Porejemplo
en un mismo instante varios usuarios pueden estar usando un mismo
editor.Unprocesopuedeestardetenidoperoadiferenciadeunprograma
existeunainformacindeestadoasociadaalproceso.Unprogramaes
algo totalmente muerto. Un proceso detenido es ms bien como si
estuvieradormido.

Losprocesostienenorganizadalamemoriadeunaformaespecialmuy
eficiente.Porejemplolaprtedecdigodelprocesoesunapartedesolo

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

lecturaypuedesercompartidaporvariosprocesosalavez.Imaginemos
quehayvariosusuariosenelsistemausandounmismoeditor.Enese
casoseraundesperdiciotenerlamismainformacindecdigodeese
programarepetidavariasvecesenmemoriayocupandounrecursotan
valiosocomoeslamemoriaRAM.

Enelcasodetenervariosprogramasdistintosenejecucintambinse
suele dar el caso de que contengan partes comunes de cdigo
pertenecientes alibreras que contienen grancantidad defunciones de
propsitogeneral.Parahacerunusoeficientedeestaslibrerasexisten
librerasdinmicasdeusocompartido.EnLinuxelusodeestaslibreras
noestorganizadodeunaformaunificadaparatodaslasdistribuciones
por lo cual los ejecutables binarios pueden ser incompatibles entre
distintasdistribuciones.Esteproblemasepuedesolucionarpartiendode
los fuentes y recompilando la aplicacin en nuestro sistema. Por esta
raznunbinariodeRedHat,oSusepuedenofuncionarenSlackwareoen
Debian.

PIDyPPID

A cada proceso le corresponder un nmero PID que le identifica


totalmente.Esdecirenunmismomomentoesimposiblequeexistandos
procesosconelmismoPID.Lomismoquetodoslosprocesostienenun
atributoPIDqueeselnmerodeprocesoqueloidentificaenelsistema
tambinexisteunatributollamadoPPID.Estenmerosecorrespondecon
elnmeroPIDdelprocesopadre.Todoslosprocesosdebendetenerun
proceso que figure como padre pero entonces que ocurre si un padre
muereantesquealgunodesushijos?Enestoscasoselproceso'init'del
cualhablaremosenseguidaadoptaraestosprocesosparaquenoqueden
hurfanos.

Elprocesoinit

Cuandoarrancaelsistemasedesencadenaunasecuenciadeprocesosque
agrandes rasgoseslasiguiente. Primero secargaelncleo deLinux

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

(Kernel) de unaforma totalmente especial y distinta a otros procesos.


Dependiendo de los sistemas puede existir un proceso con PID=0
planificador,oswapper.EnLinuxyencasitodoslossistemastipoUnix
seguirunprocesollamado'init'.ElprocesoinittienePID=1.Leeun
fichero llamado inittab dondeserelacionan unaseriede procesos que
deben arrancarse para permanecer activos todo el rato (demonios).
Algunos de ellos estn definidos para que en caso de morir sean
arrancados de nuevoinmediatamente garantizando laexistencia deese
serviciodeformapermanente.

Esdecir'init'esunprocesoquevaagenerarnuevosprocesosperoestano
es una cualidad especial. Esmuyfrecuente queunprocesocualquiera
generenuevosprocesosycuandoestoocurresedicequegeneraprocesos
hijos.

Estenoesuncursodeadministracinperodiremosqueainitselepuede
indicar que arranque el sistema de diferentes formas, por ejemplo en
modomonousuarioparamantenimiento.Esteesuncaptuloenelcual
pueden surgir muchas preguntas retorcidas tales como, que pasa si
matamosainit,oquieneselpadredeinit,perononosinteresaresponder
aestoyaqueinitesunprocesomuyespecialysupadreanms.Encada
sistema de tipo Unix las respuestas a cosas como estas pueden variar
mucho porque aese nivel la implementaciones varan mucho. Ningn
programanormalnecesitarusaresetipodeinformacin.Quedanmuchos
detalles interesantes relativos a temas de administracin. Los curiosos
siempretienenelrecursodemirarlapginamandeinit(8)ydeinittab(5)
peronosotrosnoinsistiremosmsenestetema.(Quealivioverdad?)

UIDyEUID

Los procesos tienen un EUID (Efectiv User Identif), y un UID


normalmenteamboscoinciden.ElUIDeselidentificadordeusuarioreal
quecoincideconelidentificadordelusuarioquearrancelproceso.El
EUIDeselidentificadordeusuarioefectivoysellamaasporqueesel

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

identificadorquesetieneencuentaalahoradeconsiderarlospermisos
queluegoexplicaremos.

ElUIDesunodelosatributosdeunprocesoqueindicapordecirlode
algunamaneraquieneselpropietarioactualdeeseprocesoyenfuncin
de ello podr hacer ciertas cosas. Por ejemplo si un usuario normal
intentaraeliminarunprocesodelcualnoespropietarioelsistemanolo
permitirmostrandounmensajedeerrorenelqueadviertaqueustedno
eselpropietariodeeseprocesoyportantonoestautorizadoahaceresa
operacin.Porelcontrarioelusuariorootpuedehacerloquequieracon
cualquier procesoyaqueelsistema nocomprueba jams siroottiene
permisosonoparahaceralgo.rootsiempretienepermisosparatodo.
Esto es cierto a nivel de llamadas del sistema pero nada impide
implementaruncomandoquehagacomprobacionesdepermisosincluso
conroot.AlgunoscomandosenLinuxtienenopcionesquepermitenhacer
estas cosas y solicitar confirmacin encasodedetectar unaoperacin
peligrosaoinfrecuente.

ElUIDtambinesunatributopresenteenotroselementosdelsistema.
Porejemplolosficherosydirectoriosdelsistematienenesteatributo.De
estaformacuandounprocesointentaefectuarunaoperacinsobreun
fichero.ElkernelcomprobarsielEUIDdelprocesocoincideconelUID
del fichero. Por ejemplo si se establece que determinado fichero solo
puede ser leido por su propietario el kernel denegar todo intento de
lecturaaunprocesoquenotengaunEUIDigualalUIDdelficherosalvo
quesetratedeltodopoderosoroot.

Aunqueestamosadelantandocosassobreelsistemadeficherosvamosa
continuar con un ejemplo. Comprobaremos cual es el UID de su
directoriohome.

$ # Cambiamos el directorio actual a home


$ cd
$ # Comprobamos a quien pertenece 'uid' y 'guid'
$ ls -ld .
$ # Ahora obtenemos el 'uid' y el 'gid' con sus

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

valores numricos.
$ ls -lnd .

Si su directorio home est configurado de forma lgica deber


pertenecerle a usted. Si esto no es as reclame enrgicamente a su
administrador, pero si el administrador resulta ser usted sea ms
indulgente y limtese a corregirlo y no confiese su error a nadie. En
realidad casi todo lo que se encuentre dentro de su directorio home
deberapertenecerleausted.Usteddebeserelpropietariodesudirectorio
homeporquedeotraformaydependiendodelospermisosasociadosa
estedirectoriolosprocesosqueustedarranqueseveranobienincapaces
detrabajarconl,oloqueespeorcualquierapodrahacercualquiercosa
conl.Comoeslgicohemosmencionadodepasadaeltemadepermisos
dedirectoriosparailustrarunpocolautilidaddeluidperoestoseveren
detalleenelcaptulodedicadoalsistemadeficherosdeLinux.

Algunos ficheros ejecutables poseen un bit de permisos que hace que


cambieelEUIDdelprocesoqueloejecuteconvirtindoseenelUIDdel
propietario del fichero ejecutado. Suena complicado pero noloes.Es
decirimaginemosqueustedejecutauncomandopropiedadderootque
tieneestebit.PuesbienenesemomentoelEUIDdesuprocesopasaraa
serelderoot.Graciasaestounprocesopuedetomartemporalmentela
identidad de otro usuario. Por ejemplo puede tomar temporalmente la
identidadderootparaadquirirprivilegiosdesuperusuarioyasacceder
porejemploaficherosdelsistemapropiedadderoot.

ElsistemarecibecontinuamentepeticionesdelosprocesosyelEUIDdel
procesodeterminar queelkernelleconcedapermisoparaefectuar la
operacindeseadaono.

MuchasvecessorprendequeenLinuxapenasseconozcanunospocos
casosdevirus,mientrasqueenotrossistemasparecenestaralaordendel
da. Es perfectamente posible realizar un virus que infecte un sistema
Linuxperodeunaformaodeotraeladministradortendraquedarlelos

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

privilegiosqueleconviertenenpeligroso.Poresonoesfcilqueestos
viruslleguenmuylejos.

Comosecreaunnuevoproceso

Elncleodelsistemallamadotambinkerneleselencargadoderealizar
la mayora de funciones bsicas que gestiona entre otras cosas los
procesos.Lagestindeestascosassehacenpormediodeunlimitado
nmero de funciones que se denominan llamadas al sistema. Estas
llamadas al sistema estn implementadas en lenguaje C y hablaremos
ahoraunpocosobreunpardeellasllamadasfork()yexec().Silogramos
quetengaunavagaideadecomofuncionanestasdosimportantsimas
funciones facilitaremos la compresin de muchas otras cosas ms
adelante.

Lallamadaalsistemaexec()

Cuandohablamosdeprocesodebeustedpensarsolamenteenalgoquese
estejecutandoyqueestvivo.Unprocesopuedeevolucionarycambiar
totalmentedesdequearrancahastaquemuere.Lonicoquenocambiaen
un proceso desde que nace hasta que se muere es su identificador de
procesoPID.Unadelascosasquepuedehacerunprocesoescambiarpor
completo sucdigo.Porejemplounprocesoencargadodeprocesarla
entradaysalidadeunterminal(getty)puedetransformarseenunproceso
deautentificacindeusuarioypassword(login)yesteasuvezpuede
transformarseenuninterpretedecomandos(bash).Silallamadaexec()
fallaretornarun1.Estonoescursodeprogramacinasquenosda
igualelvalorretornadoperoloquesinosinteresaessaberquecuando
estallamadatienexitonoseproducejamsunretorno.Enrealidadno
tendra sentido retornar a ningn lado. Cuando un proceso termina
simplementedejadeexistir.Enunapalabramuereyyaest.Lallamada
exec() mantiene el mismo PID y PPID pero transforma totalmente el
cdigodeunprocesoenotroquecargardesdeunarchivoejecutable.

Lallamadaalsistemafork()

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

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

Tambin normalmente aunque no siempre esta parte de la leccin es


necesarioreleerlamsdeunavez.

Estamosdandopequeosdetallesdeprogramacinporqueenestasdos
llamadasdelsistemasonmuysignificativas.Sufuncionamientoresulta
chocanteysucomprensinpermiteexplicarunmontndecosas.

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

MSSOBREPROCESOSYSEALES

Lasformasdecomunicacinentreprocesos

Losprocesos notienenunafacilidaddeaccesoindiscriminada aotros


procesos.Elhechodequeunprocesopuedainfluirdealgunamaneraen
otroesalgoquetienequeestarperfectamentecontroladopormotivosde
seguridad.Comentaremossolomuyporencimalasdiferentesformasde
comunicacinentreprocesos.

1. Atravsdevariablesdeentorno:

Soloesposibledepadresahijos.

2. Medianteunaseal:

Soloindicaquealgohaocurridoysolollevacomoinformacindeun
nmerodeseal.

3. Medianteentradasalida:

Eslaformamscorrienteaniveldeshell.Yahemoscomentadoel
operadorpipe'|'queconectadosprocesos.

4. MediantetcnicasIPCuotras:

Semforos,Memoriacompartida,Colasdemensajes.

5. Mediantesockets:

Estesistematienelapeculiaridaddequepermitecomunicarprocesos
queestnfuncionandoenmquinasdistintas.

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

Noprofundizamossobreestoporqueahoranoestamosinteresadosenla
programacin.Msadelantesicomentaremosbastantesobrevariablesy
entradasalidaporquedaremosnocionesdeprogramacinenshellscript.
Tambindaremosacontinuacinunospequeosdetallesquetienenque
verconelarranquedelsistemaporquetambinnosresultarutilpara
comprendercomofuncionanlascosas.

Secuenciadearranqueenunasesindeconsola

Para consultar la dependencia jerrquica entre unos procesos y otros


existeenLinuxelutilsimocomandopstree.Noesesencialyquizsnolo
tengaustedinstaladoperoresultamuyprctico.Sidisponedelpruebe
loscomandos'pstree',y'pstreep'.Nosotrosvamosamostrarelresultado
deamboscomandosenelsistemaqueestamosusandoenestemomento
para que en cualquier caso pueda apreciar el resultado pero le
recomendamos que lo instale si no dispone de l ya que resulta muy
prctico.Tambinpuedeusarcomosustitutode'pstree'elcomando'ps
axf'peronoespereunresultadotanbonito.

$ pstree

init-+-apache---7*[apache]
|-atd
|-bash---pstree
|-2*[bash]
|-bash---vi
|-bash---xinit-+-XF86_S3V
| `-mwm-+-.xinitrc---xterm---bash
| `-.xinitrc---xclock
|-cron
|-getty
|-gpm
|-inetd
|-kflushd
|-klogd
|-kpiod
|-kswapd
|-kupdate
|-lpd
|-portmap

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

|-postmaster
|-sendmail
|-sshd
|-syslogd
`-xfs

Esteformatonosdaunrboldeprocesosabreviadoenelqueprocesos
conelmismonombreyquetenganunmismopadreaparecerndeforma
abreviada.Enelejemploanterioraparece'2*[bash]'indicandoquehay
dos procesos bashcomo hijos deinit, ytambin hayalgunos proceso
apachearrancados.Elqueexistanmuchosprocesosarrancadosnoindica
necesariamenteunaltoconsumodeCPU.Puedequeestntodosellos
haciendoelvago.Buenoenelcasodeapachequizsestnhaciendoel
indio.(Estoltimoesunabromaquenohepodidoevitar).

$ pstree -p

init(1)-+-apache(204)-+-apache(216)
| |-apache(217)
| |-apache(218)
| |-apache(219)
| |-apache(220)
| |-apache(1680)
| `-apache(1682)
|-atd(196)
|-bash(210)---pstree(1779)
|-bash(211)
|-bash(212)---vi(1695)
|-bash(215)---xinit(1639)-+-XF86_S3V(1644)
| `-mwm(1647)-
+-.xinitrc(1652)---xterm(1660)---bash(1661)
|
`-.xinitrc(1655)---xclock(1673)
|-bash(214)
|-cron(199)
|-getty(213)
|-gpm(143)
|-inetd(138)
|-kflushd(2)
|-klogd(131)
|-kpiod(4)

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

|-kswapd(5)
|-kupdate(3)
|-lpd(153)
|-portmap(136)
|-postmaster(168)
|-sendmail(179)
|-sshd(183)
|-syslogd(129)
`-xfs(186)

Enesteotroformato.AparececadaprocesoconsuPID.Podemosverque
el Proceso 'init' tiene pid= 1y harealizado varios forks()generando
procesosconpid>1.Enalgunossistemaslageneracindenmerosde
PIDparaprocesosnuevosserealizaensecuencia. Enotrosresultaun
nmeroimpredecible.

Entre los procesos generados por 'init' estn los procesos 'getty'. Se
arrancarun'getty'porcadaterminal.Esteprocesoconfiguralavelocidad
yotrascosasdelterminal,mandaunsaludoyluegosetransformacon
execelproceso'login'.TodosestosprocesosseejecutanconEUIDyUID
=0,esdecir comoprocesosdelsuperusuarioroot.Cuandoelproceso
'login'conocenuestraidentidaddespusdevalidarusuariopasswordse
transformarconexecenlashellespecificadaeparanuestrousuarioel
fichero/etc/passwd

Paraverlalneaquecontienesusdatospruebeahacerlosiguiente:

$grep`whoami`/etc/passwd

La lnea tiene el siguiente formato.


login:contrasea:UID:GID:nombre:dir:intrprete

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

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

EUID.Vamosarepresentartodoestomarcandolospuntosenlosque
ocurrealgnfork()conunsigno'+'.

[init]-+fork()->[getty]
|
+fork()->[getty]-exec()->[login]-exec()->[bash]
+fork()-exec()->[comando]
|
+fork()->[getty]
|

Lashellpuedearrancaruncomandomedianteunfork()yluegounexec()
y esperar a que este muera. Recuerde que la funcin exec() no tiene
retorno posible ya que finaliza con la muerte del proceso. En ese
momentolashelldetectalamuertedesuhijoycontinuasuejecucin
solicitando la entrada de un nuevo comando. Cuando introducimos el
comando'exit'estamosindicandoalashellquefinaliceysupadre'init'se
encargar de lanzar nuevo proceso 'getty'. Lgicamente 'exit' es un
comandointernodelashell.Quizslellamelaatencinquelamuertede
'bash'termineprovocandounnuevo'getty'cuando'getty'pasa'login'y
estea'bash'peroenestasecuenciagettyloginbashnohayningnfork()
poresogetty,login,ybashsonenrealidadelmismoprocesoendistintos
momentosconelmismoPIDobtenidoenelfork()realizadopor'init'solo
quehaidocambiandosupersonalidadmanteniendolamismaidentidad
(mismoPID).Para'init'siempresetratdelmismohijoylamuertede
cualquieradeellos(getty,loginobash)provocaquesearranqueunnuevo
'getty'sobreesemismoterminalconelfindequeeseterminalnoquede
sinservicio.

LapresentacindelmensajedeLoginesmostradapor'getty'.Unavez
introducido el identificador de usuario ser 'login' quien muestre la
solicitud de introduccin de la password, y una vez introducido el
password ser lashellquienmuestre elintroductor decomandos pero
estamoshablandosiempredelmismoproceso.

A modo de ejercicio compruebe estas cosas por usted mismo usando


algunosdeloscomandosqueyaconoce.Parahacerestaprcticanobasta

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

conusarunterminalremotosinoquenecesitarunPCcompletoparair
haciendocosasdesdedistintassesiones.Leproponemoshacerlomso
menosdelasiguientemanera:

1. Entre en cada uno de los terminales disponibles de forma que


todos los terminales estn ocupados por un intrprete de
comandos.Bastarconhacerloginentodosellos.
2. Luegocompruebequenohayningnproceso'getty'.
3. Hagaunexitdesdeunodeestosterminales.
4. Compruebe desde otro termina que ahora si existe un proceso
'getty'yanotesupid.
5. Introduzcaelnombredeusuarioeneseterminalquequedlibre.
6. Compruebeahoradesdeotrasesinqueexisteunprocesologin
conelPIDqueustedanot.
7. Terminedeidentificarsetecleandolapassword
8. Compruebedesdeotrasesinqueahoraexisteunashellconel
PIDqueanotamos.

Sinotieneelcomando'pstree'tendrqueusar'ps'peroconpstree
puedevermsfcilmenteloqueocurrirahora.

9. Ahoratecleeelcomando'sleep222'desdelasesinquetieneel
PIDanotadoporusted.
10. Compruebedesdeotrasesinqueelinterpretedecomandosha
realizadounfork()generandouncomandoqueestejecutandoel
comandoindicado.

Sinohapodidorealizarelejercicioanteriortendrqueconfiarenquelas
cosassoncomodecimosyyaest.

Comandops

Muestralosprocesosactivos.Estecomandoesmuyutilparasaberque
comandosestnfuncionandoenundeterminadomomento.

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

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

Ejemplos:

$ # Para ver todos sus procesos que estn


$ # asociados a algn terminal.
$ ps

PID TTY STAT TIME COMMAND


.......

$ # Para ver todos sus procesos y los de otros


$ # usuarios siempre asociados a algn terminal.
$ ps a

PID TTY STAT TIME COMMAND


.......

$ # Para ver todos sus procesos estn asociados o


$ # no a algn terminal.
$ ps x

PID TTY STAT TIME COMMAND


.......

$ # Para ver todos los proceso asociados al


$ # terminal 1
$ ps t1

PID TTY STAT TIME COMMAND


.......

$ # Para ver todos los procesos del sistema.


$ ps ax

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

PID TTY STAT TIME COMMAND


.......

Estosejemplosqueacabamosdeverobtienenunmismoformatodedatos.
Explicaremoselsignificadodeestosatributos.

PID Eselvalornumricoqueidentificaalproceso.
Eselterminalasociadoaeseproceso.Losdemoniosdel
TTY 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
STAT suspendido esperando la liberacin de un recurso (CPU,
Entrada Salida, etc.) necesario para continuar.
Explicaremossoloalgunosdeestosestadosensumomento.

TIME
IndicaeltiempodeCPUquellevaconsumidoeseproceso
desdequefuearrancado.

COMM Muestra el comando y los argumentos que le fueron


AND comunicados.

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 Tiempo real gastado (Duracin real)


user Tiempo CPU de usuario.
sys. 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 0m6.021s
user 0m0.020s
sys 0m0.000s

El resultado obtenido puede variar ligeramente en cada sistema pero


bsicamenteobtendruntiempo'real'deunos6segundosyuntiempode
CPU('user'+'sys')muypequeo.

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

Vamos a medir tiempos en un comando que realice operaciones de


entradasalidaascomoprocesodedatos.

$ time ls /* > /dev/null

real 0m0.099s
user 0m0.080s
sys 0m0.010s

EnestecomandoverqueelconsumototaldeCPUessuperioraldel
comandosleep.Encualquiercasoeltiemporealtardadoenlaejecucin
delcomandoessiempremuysuperioralconsumodeCPU.

Vamosaprobaruncomandoqueapenasrealiceotracosaqueentrada
salida. Vamos a enviar 10Mbytes al dispositivo /dev/null. Existe un
comando'yes'queprovocalasalidacontinuadeuncarcter'y'seguidode
uncarcterretornodecarro.Estapensadoparasustituirlaentradadeun
comando interactivo en el cual queremos contestar afirmativamente a
todo lo que pregunte. Nosotros filtraremos la salida de 'yes' con el
comando'head'paraobtenersololos10Mbytesprimerosproducidospor
'yes'ylosenviaremosaldispositivonulo'/dev/null'quevieneaserun
pozosinfondoenelcualpodemosintroducircualquiercosasinquese
llene,peronopodremossacarabsolutamentenada.Enunapalabravamos
aprovocarprocesodeentradasalidaperfectamenteintil.

$ time yes | head --bytes=10000000 > /dev/null

Tubera rota

real 0m6.478s
user 0m5.440s
sys 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 0m2.528s
user 0m2.520s
sys 0m0.010s

EnunPentium200Mhzestecomandotard3segundospara300cifrasy
20segundosusando600cifras.Decimosestoparaqueveaqueeltiempo
quesetardaaumentaexponencialmenteyquedependiendodelapotencia
desuordenadorpuedesuponerbastantetiempodeproceso.Quizstenga
quevariarelnmerodecifrassignificativasparapodermedirtiemposcon
comodidad.

Estecomando'time'esuncomandointernoperoenLinuxtambinhayun
comandoexternollamadodelamismaforma.Parapoderejecutarlocon
estashelldeberaincluirelcaminocompleto.Nodeseamosabusardesu
escaso 'time' as que no lo comentaremos. Para buscar en el man el
comando'time'quehemosexplicadoodecualquierotrocomandointerno
tendraquemirarenlapginadelmanualdebash.

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

Comandokill

Estecomandoseutilizaparamatarprocesos.Enrealidadenvasealesa
otrosprocesos,perolaaccinpordefectoasociadaalamayoradelas
sealesdeunixesladefinalizarelproceso.Lafinalizacindeunproceso
puedeveniracompaadadelvolcadodelainformacindelprocesoen
disco.Segeneraunfichero'core'eneldirectorioactualquesolosirve
paraque los programadores localicen elfalloqueprovocestabrusca
finalizacindelproceso.Porejemplosielprocesointentaaccederfuera
delespaciodememoriaconcedidoporelkernel,recibirunasealquelo
matar.Lomismoocurrirsiseproduceunadivisinporcerooalgn
otrotipodeerrorirrecuperable.

Unprocesounixpuedecapturarcualquiersealexceptolaseal9.Una
vezcapturadalasealsepuedeactivarunarutinaquepuedeprogramarse
contodalibertadpararealizarcualquiercosa.

'kill'pordefectoes'kill15'envaunSIGTERMygeneralmenteprovoca
cierreordenadodelosrecursosenuso.Estasealpuedeserignorada,o
puede ser utilizada como un aviso para terminar ordenadamente. Para
matarunprocesoresultarecomendableenviarprimerounkill15ysino
seconsiguenadarepetirconkill9.Esteltimo9envaSIGKILLqueno
puedeserignorada,yterminainmediatamente.Solofallarasinotenemos
permisosparamatareseproceso,perosiesunprocesonuestro,kill9
resultaunaopcinseguraparafinalizarunproceso.

Lassealesactanfrecuentementecomoavisosdequehaocurridoalgo.
Existen muchos tipos de seales para poder distinguir entre distintas
categorasdeincidenciasposibles.

Comandonice

ElmultiprocesoestaimplementadoconcediendocclicamentelaCPUen
rodajasdetiempoacadaprocesoqueestaenejecucin.

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

Existen dos nmeros de prioridad. La prioridad NICE y la prioridad


concedida por el Kernel mediante un algoritmo. Esta ltima no tiene
porque coincidir con nice y puede valer mas de 39. En cambio el
comandonicesoloaceptavalorescomprendidosentre0y39,siendo20el
valorpordefecto.Cuandonicesubeelvalorsignificaqueelprocesotiene
bajaprioridad.Elcomando'nice10'incrementaraelvalorniceen10(es
decirbajalaprioridad).Parabajarelvalordenice(Esdecirparasubirla
prioridad)hacefaltapermisosdesuperusuario.

Enunsistemaconpocacargadetrabajonosenotarapenasdiferenciaal
ejecutaruncomandoconbajaprioridadoconaltaprioridad.Peroenun
sistemaconlaCPUsobrecargadaloscomandosejecutadosconprioridad
msbajasevernretrasados.yaqueelkernelconcedermstiempode
CPUalosprocesosconprioridadmsalta.

Hayotroscomandosdeinters.Porejemplo'top'muestralosprocesos
quemasCPUestnconsumiendo.'vmstat'sacainformacindelconsumo
dememoriavirtual.

Hayquetenerencuentaqueelsistemagastarecursosenlagestindelos
procesos.Porejemplosiestamoscompartiendounamquinaconotros
usuarios y tenemos que realizar 15 compilaciones importantes
terminaremos antes hacindolas en secuencia una detrs de otra que
lanzndolastodasalavez.LaavariciadequererusartodalaCPUposible
paranosotrospuedeconduciraunasituacinenlacualninosotrosni
nadiesacargranprovechodelaCPU.Elsistemarealizarunacantidad
enormedetrabajoimproductivodestinadoamantenersimultneamente
funcionando una gran cantidad de procesos que gastan mucha CPU y
muchamemoria.Lamquinacomienzaausareldiscoduroparasuplirla
faltadeRAMycomienzaagastarcasitodoeltiempoenelintercambio
delaRAMconeldiscoduro.Aestasituacinseladenominaswaping.

Comandorenice

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

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

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

SISTEMADEFICHEROS(Primeraparte)

Introduccin

Esteessindudaunodeloscaptulosconmayorintersprctico.

Amenudolapalabraficherosepuedeusardedosformas.Ficherosen
sentidoampliocomocualquiercosaquetienenombreenunsistemade
ficheros y otra como ficheros propiamente dichos que ms tarde
llamaremosficherosregulares.Estosltimossonlaclasedeficherosms
normalitosysirvenparacontenerinformacinlegibleoejecutable.

Setratadeunacoincidenciadenombresespecialmentelamentableporque
dificultamitrabajodeexplicarahoralascosas.

Por ejemplo cuando hablamos de generalidades para los nombres de


ficherosycuandohablemosdetiposdeficherosestaremoshablandode
ficheros en sentido amplio, en cambio cuando hablamos de dirigir la
salidaaunficheroocuandodecimosqueleemosunficheronosreferimos
aficherospropiamentedichosesdecirficherosregularesquesonlosque
seusannormalmentecomocontenedoresdeinformacin.

Las palabras no siempre significan lo mismo usadas en diferentes


contextosasquenosotrosconfiaremosensucapacidaddededucciny
usaremos indistintamente la palabra fichero para ambas cosas aunque
reconocemos queesunacostumbrequenofacilitalas cosas,peropor
desgraciaverestetrminoutilizadoendiferentessitiosusadoparaambas
cosas.Nosepreocupeytengapacienciaalfinyalcabosiyahallegado
hastaaqu,susagacidadaquedadoprcticamentedemostrada.

Comprendertodoestocuandohablemosdetiposdeficheros.

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

Paraponerapruebaunavezmssusagacidad,(santapaciencialasuya)
usaremoseltrminoficherosensusdosacepciones paradescribiruna
clasedeficherosllamadadirectorios.

Los directorios pueden considerarse como una clase de ficheros que


pueden contener toda clase de'ficheros' (ensentido general) incluidos
nuevosdirectorios,locualhacequelaestructurafinaltengaestructura
similaraladeunrbol.

Lasramasdeunrbolformanlaestructuradetodoelrbolydeforma
muysimilarlosdirectoriosformanelarmazndetodalaestructuradel
sistemadeficheros.

UnsistemadeficherosenUnixtieneestaestructuraderbolyelpuntode
origensellamaroot(raz)ysecaracterizaporqueelpadrede'root'resulta
serelmismo'root'ysesimbolizapor'/'.

Yasabemosqueestoesraroperonopreguntecomoalguienpuedeser
padre de si mismo. Esto sencillamente es un truco para rematar la
estructuradetodoelrboldealgunaforma.

Ojo,alsperusuariotambinselellama'root'peronotienenadaquever
conesto.Essolootramolestacoincidencia.

Nombresdeficheros

Un nombre defichero valido para elncleo deLinux puedecontener


cualquier carcter salvo el carcter '/' y salvo el carcter '\0' (carcter
nulo).Sinembargonoesprudenteusarcaracteresespecialesinterpretados
por la shell ($,",',&,#,(,),*,[,],{,}, etc..) Tampoco debe empezar por el
carcter '' que puede ser confundido con una opcin. Por ejemplo si
llamamosaunfichero'r'nosolonopodremosborrarlosinoquesepuede
confundirconlapeligrossimaopcin'r'deborradorecursivo.

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

Cuandounusuarioesdadodealtasedefinelashellpordefectoqueusar
yeldirectorio deentrada.Estedirectoriodeentradaalsistemaserel
valordelavariable$HOME.

Encadadirectoriohaydosentradascomomnimoqueson'.'y'..'que
referencian respectivamente al directorio actual y al directorio padre.
(Cuandonotenemosenlavariable$PATHreferenciadoelsubdirectorio
actualtendremosqueejecutarloscomandosdenuestrodirectorioactual
mediante./comando)

El carcter '/'seutilizaparasepararlosdiferentes componentes deun


nombredeficheroyporesonosepuedeusarcomoparedeunnombrede
fichero.ElcarcternuloseusacomofindecadenaenlenguajeCquees
ellenguajeenelqueestescritoelSO.Poresotampocosepuedeusarese
carctercomonombredefichero.

Cuando usamos un nombre de fichero que empieza por '/' se llama


nombre de camino completo o nombre de camino absoluto. Si por el
contrarioempiezapor'.',por'..',oporunnombresedenominarnombre
decaminorelativo,porquesuutilizacindependedelsubdirectorioactual
dondenosencontremos.Laltimapartedelnombredespusdelltimo
carcter'/'sellamanombrebase.basename(1).

$ # Ejemplo de uso del comando basename


$ basename /usr/include/sys/signal.h

signal.h

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

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

seusandeestaformaparaqueelusuariopuedaignorarlosencondiciones
normales.

En 'msdos' existeunconceptollamado extensin.Correspondeconun


mximo de tres caracteres despusdel ltimo puntoenunnombrede
fichero.EnUnixlosnombrespuedentenervariospuntosydespusdel
ltimopuntopuedehabermsdetrescaracteresalfanumricosyaqueno
existeelconceptodeextensin.Deexistirnombresqueterminandeuna
ciertaformapuedetenersignificadoespecialparaalgunosprogramaspero
noparancleo(kernel)ytampocoparaelintrpretedecomandos.

Loquesitieneuntratamientoespecialaniveldesistemaoperativoson
los caracteres '/' queforzosamente indican los elemento de uncamino
formadoporlasucesindecaracteres.Esdecirserimposiblecrearun
fichero con nombre 'x/a' dentro de un directorio porque el sistema
interpretaraquequeremoscrearunfichero'a'dentrodeundirectorio'x'.

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

Comandosparamanejarelsistemadeficheros

Relacin de comandos ms importantes para manejar el sistema de


ficheros.

ls <lista> Muestra el contenido de directorio actual.


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

Recuerdequetieneasudisposicinelcomando'man'paraconsultarlas
distintasopcionesdecadaunodeestoscomandos.

Aliasparaelusodeloscomandosmsfrecuentes

El comando 'cd' es un comando interno que sirve para cambiar de


directorio actual.Existeotrocomandointernollamado'alias'quesirve

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

paraalgoquenotienequeverconelsistemadeficherosysinembargolo
mencionaremosaquporrazonesprcticas.

En muchos sistemas parecer que existe la disponibilidad de usar un


comando 'll' que sirve para mostrar un directorio con abundante
informacin.Enrealidadsetratadeunalias.Ustedpuedeverificarlos
alias definidos para su usuario tecleando 'alias' sin argumentos.
Generalmenteseusaparaabreviarelusodecomandosmuyutilizados.
Estopuederesultarledeintersparapersonalizarsuentorno.

Cuando el interprete de comandos arranca se ejecutan una serie de


ficheros '/etc/profile', '~/.bash_profile', '~/.bash_login', y '~/.profile' en
esteorden.En'.bash_profile'sueleexistirunapartequepreguntaporla
existenciadeun'~/.alias' yencasoafirmativoloejecuta.Estefichero
'.alias' contiene una serie de comandos de alias que permanecern
disponiblesdurantesusesindetrabajoconesashell.

Podraparecerqueestamosobsesionadosconlashellyquenosabemos
hablar de otra cosa pero solo queremos proporcionarle ahora unos
consejosprcticosquelefacilitenelusodesusistema.Paraellotendra
queeditarelfichero'.alias'presenteensu$HOMEyaadirlaslneas
siguientes:

alias ll='ls -lrt --color=auto'


alias ll.='ls -adlrt --color=auto .[a-zA-Z0-9]*'
alias ls='ls --color=auto'
alias ls.='ls -adrt --color=auto .[a-zA-Z0-9]*'
alias md='mkdir'
alias mv='mv -i'
alias rd='rmdir'
alias 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-- 1 acastro acastro 3 abr 16 20:01
kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk3
drwxr-xr-x 2 acastro acastro 1024 abr 16 20:01
kkkk

$ # 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-- 1 acastro acastro 3 abr 16 20:01
kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk3
drwxr-xr-x 3 acastro acastro 1024 abr 16 20:03
kkkk

kkkk:
total 4
-rw-r--r-- 1 acastro acastro 3 abr 16 20:03
kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:03
kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:03
kk3
drwxr-xr-x 2 acastro acastro 1024 abr 16 20:04
kkkk

kkkk/kkkk:
total 3
-rw-r--r-- 1 acastro acastro 3 abr 16 20:04
kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:04
kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:04
kk3

$ # 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 ./kkkk/kkkk
8 ./kkkk
12 .

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 Compresor de GNU


find Buscar ficheros
tar Empaqueta ficheros y directorios en un solo
fichero.
cpio Empaqueta ficheros y directorios en un solo
fichero.

Sistemaplanodeficheros

Laestructuraenformaderboltieneelinconvenientedequeserequiere
irrecorriendoelrbolparairlocalizandocadaunodeloselementos.Por
ellosehacenecesariounsistemamuchomsdirecto.

A cada ficheros se le asocia un nmero para poder localizarlo


directamente.Dichonmerosellamainodo.Losnmerosdeinodosson
elndicedelsistemaplanodeficheros,tambinllamadoporellotablade
inodosCadaficherodecadasistemadeficherostieneuninododistinto
salvoquesetratedeunenlacergido(hardlink).Sinembargohayinodos
quenosecorrespondenconningnfichero.

Unficheroensentidoestrictoindicacapacidaddecontenerunasecuencia
debytes.

Uninodoindicabsicamentelacapacidaddetenerunnombreasociadoal
sistemadeficheros.

Unficherotieneasociadasfuncionesdeposicinydelecturayescritura
deinformacindentrodelfichero.Uninodoesunareferenciamuydirecta
aunficheroyagrandesrasgostieneasociadasfuncionesquepermiten
manejaryconstruirlaestructuraderboldelsistemadeficheros.

Tiposdeficheros

Regular.Sonmerosalmacenesdeinformacin.Algunoscontiene
cdigoejecutable.
DirectoriosSonunatablaconnmerosdeinodosynombresde
ficheros.

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

Ficheros especiales. Pueden ser dispositivo tipo carcter o


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

Generalmente los diferentes tipos de ficheros son capaces de aceptar


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

$ echo > .

bash: .: Es un directorio

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

Atributosdefechaenficheros

EnUnixyLinuxlosficherosensentidoampliotienenasociadassiempre
tres fechas. En realidad estas fechas estn almacenadas internamente
comoelnmerodesegundostranscurridosdesdeel'1deEnerode1970'.

Una de ellas indica el tiempo del ltimo acceso realizado sobre ese
fichero.Laotraindicalafechadecreacin(enrealidadeslafechadel
ltimo cambio de estado) de ese fichero y la ltima y quizs ms
importante(eslaquevemosalconsultarcon'lsl')indicalafechadela
ltimamodificacin.

Enrealidadsicambiamoselestadodeunficheroporejemplocambiando
permisos o el propietario se modificarn las fechas de creacin y del
ltimoacceso.Poresolafechaquehemosdenominadodecreacinpuede
serposterioralafechademodificacindelfichero.

Cuandosecreaunficherolastresfechastendrnelmismovalor.Cuando
seleeunficherosemodificalafechadeaccesodelmismoperoaccederal
nombredeunficherooconsultarelestadodeunficheronomodifica
ningunafecha.Sufechadeaccesotampocoyaqueenrealidadloquese
haceesleerlainformacindeldirectorioquelocontieneelcualsique
vermodificadasufechadeacceso.

Lasfechasdemodificacinasociadasalosdirectorioscambianconlas
altas,obajasdeloselementosdentrodeldirectorio.Estoesdebidoaque
dichasoperacionesseconsiderancomosifueranescriturasenelfichero
especialdetipodirectorio.Undirectorioesalfinyalcabounasimple
tabla. Esto lo recordaremos cuandohablemos depermisos asociados a
directorios.

Paramodificarlasfechasdemodificacinydeaccesodeunficherose
puedeusarelcomandotouch(1)

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

SISTEMADEFICHEROS(Segundaparte)

Permisosdeficheros

Usaremoseltrminoficheroensusentidomsamplio.Esdecirqueel
temadepermisosesaplicableadistintostiposdeficherosconalgunas
matizacionesqueexplicaremosmsadelante.Losficherostienenmuchos
atributosademsdesunombre.Paraverlosmssignificativosharemos:

$ ls -l /

Supongamosquetenemoselsiguienteficherollamado'kkkkk'

-rwxrwxrwx 1 root root 14740 abr 15 12:05 kkkkk


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

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

d Directorio
l Enlace simblico
p Fifo con nombre
b Dispositivo de bloques
c 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 Esto equivaldra a un permiso


735
4 2 1 - 0 2 1 - 4 0 1 ( 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 Set uid on execute.


02000 Set gid on execute.
01000 Save text on image after execution.
00400 r Permiso de lectura para el propietario (owner)
00200 w Permiso de escritura para el propietario
00100 x Permiso de ejecucin para el propietario
00040 r Permiso de lectura para el grupo (group)

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

00020 w Permiso de escritura para el grupo


00010 x Permiso de ejecucion para el grupo
00004 r Permiso de lectura para cualquiera (others)
00002 w Permiso de escritura para cualquiera
00001 x Permiso de ejecucion para cualquiera

Los atributos Set uid, Set gid, y Save text no los explicaremos de
momento.

Consulte las pginas del manual relativas a este comando. Como de


costumbre el manual resulta imprescindible a la hora de recordar la
utilizacindeuncomandoperonoalahoradecomprenderconceptos
nuevos. No se preocupe con los ejercicios que le proponemos a
continuacincomprenderperfectamente:

$ cd /tmp
$ echo > kk
$ ##################################
$ chmod 777 kk
$ ls -l kk

-rwxrwxrwx .... .... ......

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

-rwx---rwx .... .... ......

$ ##################################
$ chmod 421 kk
$ ls -l kk

-r---w---x .... .... ......

$ ##################################
$ chmod 124 kk
$ ls -l kk

---x-w-r-- .... .... ......

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

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

$ chmod 0 kk
$ ls -l kk

---------- .... .... ......

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

-r--r--r-- .... .... ......

$ ##################################
$ chmod +x kk
$ ls -l kk

-r-xr-xr-x .... .... ......

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

---x--x--x .... .... ......

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

-r-x--x--x .... .... ......

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

-r-------- .... .... ......

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

-r----x--- .... .... ......

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

-r----x--x .... .... ......

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

$ ##################################
$ chmod a+rwx kk
$ ls -l kk

-rwxrwxrwx .... .... ......

rm kk

Comandochown

Elcomando'chown'sirveparacambiarelUIDyelGIDdeunfichero.
Estosolosepuedehacersitenemoslospermisosparaello.Normalmente
suusoestreservadoa'root'yporellonodiremosnadams.Esmuy
posiblequesiustedusaLinuxenunordenadorpersonalnecesitealgunos
deestosconocimientosperosesaledelospropsitosdeestecurso.Le
bastaconsaberqueexisteyparaquesirve.

Concesindeaccesoporpartedelkernel

Explicaremoselfuncionamientodelospermisosdelaformamsprecisa
quenosseaposible.

Paraellousaremosunasabreviaturasqueyaconocemos.

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

Enrealidadhablamosdepropietariocomoelusuarioquecreoelfichero.
ElKernelrealizarelsiguientetestparaconcederaunprocesoelacceso
deciertotipoaunfichero.

1. SielEUIDdelprocesoes0sedaacceso.(rootpuedehacerloque
sea)

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

2. SielEUIDdelprocesoesigualalUIDdelowner(propietariodel
fichero)seconcedeelaccesosilospermisosdeusuariorwxson
losadecuados.
3. SielEUIDdelprocesoesdistintoalUIDdelowner,ysielEGID
delprocesoesigualalGIDdelowner,seconcedeelaccesosilos
permisosdegruporwxsonlosadecuados.
4. SielEUIDdelprocesoesdistintoalUIDdelowner,ysielEGID
delprocesoesdistintoalGIDdelowner,seconcedeelaccesosi
lospermisosdeothersrwxsonlosadecuados.

NOTAelcomandormpermiteborrarcualquierficheroseacualseanlos
permisoscuandoelprocesotieneunEUIDcoincidenteconelpropietario
del fichero. nicamente ocurre que si el fichero esta protegido contra
escritura suele pedir (dependiendo de la configuracin) confirmacin
antesdeborrarlo.Elpermisoparaborrarunficheronoseguardacomo
atributo del fichero. Esto se hace a nivel de directorio y pasamos a
explicarloinmediatamente.

Significadodelospermisosendirectorios

Paraentendercomofuncionanlospermisosaplicadosaundirectoriohay
queimaginarqueundirectorioesunficheronormalquesolocontieneuna
tablaenlaqueserelacionanlosficherospresentesenesedirectorio.En
todoslosdirectoriosexistensiempreunpardeentradasobligadasqueson
'.'y'..'paraeldirectorioactualyparaeldirectoriopadrerespectivamente.
Vamosaexplicarlosobrelamarchaalavezquehacemoselejercicio.
Recuerde usar un usuario normal (distinto de root) para realizar los
ejercicios.

$ cd /tmp
$ mkdir kk
$ cd kk
$ echo > k1
$ echo > k2
$ cd /tmp
$ chmod 777 kk

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

$ ## Para ver como ha quedado


los permisos hacemos ...
$ ls -ld kk

drwxrwxrwx 2 ..... ......


kk

$ ## Para ver que ficheros


contiene el directorio kk
hacemos ...
$ ls kk

k1 k2

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


cualquiercomandoincluidolsaveriguarcualessucontenido.

Sinabandonarlasesinanteriorcontinuamoselejercicio

$ ###(1)###
$ ## Eliminamos los premisos de lectura del
directorio kk
$ chmod -r kk
$ ls -ld kk

d-wx-wx-wx 2 ..... ...... kk

$ ls -l kk

ls: kk: Permiso denegado


$ ## En este intante podemos entrar dentro del
directorio
$ ## Incluso podemos crear un nuevo fichero pero ya
no podemos
$ ## Saber cual es el contenido del directorio.
$ cd kk
$ pwd

/tmp/kk

$ echo > k3
$ ls -l

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

ls: .: Permiso denegado

$ ## Hemos podido meternos dentro del directorio kk


porque aun
$ ## Tenemos permiso para ello pero seguimos sin
poder saber
$ ## cual es su contenido.
$ cd /tmp

Sinosetienepermisodeejecucinenundirectorionosepodrhacercd
aesedirectorio,nianingunodelosdirectoriosquecuelgandeel.Esto
imposibilitatodaslasoperacionesqueutilicenesedirectoriocomoparte
delcamino.

Sinabandonarlasesinanteriorcontinuamoselejercicio

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

d-w--w--w- 2 ..... ...... kk

$ ## 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

d-wx-wx-wx 2 ..... ...... kk

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

dr-xr-xr-x 2 ..... ...... kk

$ ## 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 root 28896 jul 17 1998


/usr/bin/passwd

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


parecidoalanteriorperoaniveldegrupo.Esdecirelprocesoqueejecuta

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

estecomandotemporalmentecambiesuEGIDtomandoelvalorGIDdel
fichero.Porejemploelcomadolprnosolonosconvierteen'root'cuando
loejecutamossinoquenoscambiaelgrupoporelgrupodeimpresin.

-rwsr-sr-x 1 root lp 14844 feb 7 1999


/usr/bin/lpr
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

---S------ 1 ..... ..... kk

$ chmod 4100 kk

---s------ 1 ..... ..... kk

$ chmod 2000 kk

------S--- 1 ..... ..... kk

$ chmod 2010 kk

------s--- 1 ..... ..... kk

$ chmod 1000 kk

---------T 1 ..... ..... kk

$ chmod 1001 kk

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

---------t 1 ..... ..... kk

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

SISTEMADEFICHEROS(Terceraparte)

Tiposdeenlaces(links)ysumanejo

La palabra link es inglesa y para el concepto que vamos a tratar


podramostraducirlaporenlace.Haydostiposdeenlacesllamados'hard
link'y'symboliclink'.Podriamostraducirloporenlacergidoyporenlace
simblico.Eltrminoenlacesimblicoseusaconfrecuenciaenespaoly
parecemuyadecuadoperorealmentenoexisteunatraduccinparahard
linktanaceptada.Nosotrosemplearemoseltrminorgidoparahardque
literalmentesignificaduro.

Ya hemos mencionado algunas cosas sobre ellos pero sin profundizar


demasiado.

Elmanejodeambostiposdeenlacessehaceconelcomando'ln'.Como
es habitual un repaso a la pgina man de este comando es muy
recomendable.Lacreacindeunenlacergidoyunosimblicoesmuy
similar.Ladiferenciaesqueparaelenlacesimblicotendremosqueusar
laopcins.

Como es habitual asumimos que las prcticas se realizarn desde un


usuariodistintoderoot.

$ cd /tmp
$ mkdir /tmp2
$ cd tmp2
$ echo xxxx > ej0
$ ## Ahora creamos un par de enlaces rgidos con ej0
$ ln ej0 ej1
$ ln ej0 ej2
$ ## Creamos tambin un enlace simblico ejs1 a ej0
$ ln -s ej0 ejs1
$ mkdir dir1

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

$ ## Tambin creamos un enlace simblico dir2 a dir1


$ ln -s dir1 dir2
$ ls -l

drwxr-xr-x 2 pepe user 1024 may 18 17:28 dir1


lrwxrwxrwx 1 pepe user 4 may 18 17:28 dir2 -> dir1
-rw-r--r-- 3 pepe user 1 may 18 17:26 ej0
-rw-r--r-- 3 pepe user 1 may 18 17:26 ej1
-rw-r--r-- 3 pepe user 1 may 18 17:26 ej2
lrwxrwxrwx 1 pepe 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 drwxr-xr-x 2 pepe user 1024 may 18 17:28


dir1
59173 lrwxrwxrwx 1 pepe user 4 may 18 17:28
dir2 -> dir1
59171 -rw-r--r-- 2 pepe user 10 may 18 17:30
ej1
59171 -rw-r--r-- 2 pepe user 10 may 18 17:30
ej2
59172 lrwxrwxrwx 1 pepe user 3 may 18 17:28

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

ejs1 -> ej0

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

$ mv ejs1 dir2
$ #
$ ## Comprobamos el resultado
$ ls -li

73449 drwxr-xr-x 2 pepe user 1024 may 18 17:32


dir1
59173 lrwxrwxrwx 1 pepe user 4 may 18 17:28
dir2 -> dir1
59171 -rw-r--r-- 2 pepe user 10 may 18 17:30 ej1
59171 -rw-r--r-- 2 pepe user 10 may 18 17:30 ej2

$ ls dir2

ejs1

$ ls -li dir1

59172 lrwxrwxrwx 1 pepe user 3 may 18 17:28


ejs1 -> ej0

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

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

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

$ mv ej2 ej0
$ cat dir2/ejs1

cat: dir2/ejs1: No existe el fichero o el directorio

Buenoesteerroreslgicoporqueelenlace'dir2/ejs1'apuntaa'ej0'yno
importaqueestemosenelmismodirectorioque'ej0'sinoque'dir2/ejs1'y
'ej0'estnenelmismodirectorio.Losenlacessonsiemprerelativosal
sitio donde se encuentra el propio enlace. En caso contrario podra
resultar graciossimoperopocoprctico porquedependiendodedonde
estuviramos nosotros ( ms exactamente dependiendo del directorio
actualdelprocesoquelouse)apuntaraaundirectoriodistintocadavez.

Detodasformascomprobmoslotrasladando'ej0'a'dir2',yobservando
comohaquedadotodo.

$ mv ej0 dir2
$ cat dir2/ejs1

kkkkkkkkk

$ ls -li

73449 drwxr-xr-x 2 pepe user 1024 may 18 17:34


dir1
59173 lrwxrwxrwx 1 pepe user 4 may 18 17:28
dir2 -> dir1
59171 -rw-r--r-- 2 pepe user 10 may 18 17:30
ej1

$ ls -li dir2

59173 lrwxrwxrwx 1 pepe user 4 may 18 17:28


dir2 -> dir1

$ rmdir dir2

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

rmdir: dir2: No es un directorio

$ rm dir2
$ ls -li

73449 drwxr-xr-x 2 pepe user 1024 may 18 17:34


dir1
59171 -rw-r--r-- 2 pepe user 10 may 18 17:30
ej1

$ ls -li dir1

59171 -rw-r--r-- 2 pepe user 10 may 18 17:30


ej0
59172 lrwxrwxrwx 1 pepe user 3 may 18 17:28
ejs1 -> ej0

Montagededispositivos

Puedenexistirvariossistemasdeficheroscadaunoenundispositivoo
particindistinta,peroparahacerloaccesiblehadesermontadodentro
del sistema principal de ficheros. Para ello se utilizan los comandos
'mount'y'umount'.

Explicaremosestounpocoms.Supongamosquedisponedeundisquete
enel que deseaguardarinformacin accesible comoparte delsistema
actual. En MSDOS se accedera a la unidad que representa este
dispositivomedianteelcomandoa:ob:porejemplo.EnUnixestono
ocurreporqueesepatticoinventollamadounidadlgicanoexiste.

PerdnporlodepatticoperoesqueenMSDOS,yenWindowscambias
lascosasdesitioyterminasreinstalandotodo.

Supongamosquetenemosenundispositivocdrom,cinta,disquete,olo
quesealasiguienteestructuradedirectorios.

.
|-- Guia-del-enROOTador-2.8

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

|-- curso
|-- glup_0.6-1.1-html-1.1
|-- lipp-1.1-html-1.1
|-- man_instal_debian_21
|-- novato-a-novato
`-- rhl-ig-6.0es
|-- cpps
`-- icons

Para poder acceder a esta informacin tendramos que realizar una


operacindemontadosobrealgnpuntodenuestrosistemadeficheros
actual. Por ejemplo si disponemos de un directorio '/misc/novato'
podramos montar en ese punto nuestro dispositivo y en ese caso la
operacinseracomoengancharunarbolenlaramadeotroarbol.Deesta
formaparaelsistemaseracomosielrbolcreciera.

.
`-- misc
`-- novato
|-- Guia-del-enROOTador-2.8
|-- curso
|-- glup_0.6-1.1-html-1.1
|-- lipp-1.1-html-1.1
|-- man_instal_debian_21
|-- novato-a-novato
`-- rhl-ig-6.0es
|-- cpps
`-- icons

Si el administrador considera que montar y un dispositivo no entraa


riesgos para el sistema conceder permisos para que esto pueda ser
realizadoporlosusuarios.Porejemplounadministradorpuedeconsiderar
quelosusuariossolopuedanmontarlaunidaddecdrom.

Enunentornomultiusuarioymultiprocesonointeresahacerefectivalas
actualizaciones sobre un dispositivo de forma instantnea sino que se
intentaoptimizarlosaccesosaldispositivo.Poresosiescribimosenun
dispositivodelecturaescrituracomoporejemploundisqueteysacamos
dicho disquete antes de desmontarlo lo ms probable es que algunas
operacionesdeescriturasquedensinrealizarporqueestabansimplemente

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

guardadasenmemoriaalaesperadeserrealizadas.Cuandosedesmonta
unsistemadeficherosseescribenlasoperacionespendientessobreese
dispositivoyentoncespuedeserextradodelsistemasinpeligro.

Directorio/proa

Estedirectorioesundirectoriomuyespecial.Esundirectorioenelcual
est montado un sistema de ficheros virtual. En realidad muestra
informacinquenoresideenningndispositivosinoqueeselaboradapor
elpropiokernel.Porellosetratadefalsosarchivos.Suocupacinen
discoes0.Sirveparacomprobarlaconfiguracinyelfuncionamientodel
kernel.Noentraremosahoraacomentarloendetalleporqueestetemaes
deintersparaadministradoresdelsistema.Loquenosinteresacomentar
es que aqu la presentacin en forma de sistema de ficheros es una
simulacinysehaceasparaquepuedasermanejadaexactamentedela
misma forma que si realmente estuviera contenida en directorios y
ficheros.

Algunos de estos ficheros son de solo lectura otros son de lectura y


escrituray permitencambiarlaconfiguracindelkernelsindetenerlo.
Evidentemente todo ello est configurado con los permisos adecuados
paramantenerlaseguridaddelsistema.

Simiramosdentrodeldirectorio'/proc'veremosquehayunmontnde
directorioscuyonombreesunnmero.Estosdirectoriosrepresentancada
uno a un proceso por su pid. Ya hemos estudiado el proceso init en
captulosanterioresasquevamosaponerunejemplo.

Pruebeahacerlosiguiente:

$ cat /proc/1/status

Obtendr la informacin de estado ms importante del proceso init.


Ademsdecontribuiralaculturageneralsobrenuestrosistemaloque

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

hemos mencionado sobre '/proc' nos sirve para introducir el siguiente


tema.

Sistemadeficherosvirtual

En Linux un sistema de ficheros puede corresponderse fsicamente y


lgicamenteconcosasmuydistintas.Acabamosdeverqueeldirectorio'/
proc'aparentementeestorganizadocomosifueraunsistemadeficheros
idnticoalosqueresidenendiscoduroysinembargosetratadealgo
totalmentedistinto.Unsistemadeficherospuederesidir,enmemoria,en
unaparticin dediscoduro,enundispositivoraidformadoporvarios
discosdurosfuncionandoenparaleloyconunsistemaderedundancia,en
disquetes, en cdroms, en un dispositivo remoto conectado a red, etc..
Tambin se puede implementar un sistema de ficheros dentro de un
fichero. Por ejemplo umsdos es un sistema de ficheros linux
implementado dentrodeunficheromsdos.Realmente es unasolucin
muypocoeficienteperoponederelievelaflexibilidaddelsistemavirtual
deficheros.Unsistemadeficherospuedetenerunformatointernoqueno
siempreeselmismo.Linuxpuedemanejarsistemasdeficherosdeotros
sistemas operativos. En resumen lo que Linux ofrece con su sistema
ficheros virtual (VFS) es un sistema unificado de acceso a toda una
variedadderecursosmuydistintos.Estoesposibleporquesedefinenuna
seriedefuncionesparamanejarunsistemadeficherosgenrico.EnUnix
cadasistemadeficherostieneasociadounsistemaplanodeficheros.Las
estructuraspuedenserdiferentesparacadatipodesistemadeficheros,
perolasfuncionesquelomanejanquedanunificadasporel(VFS)

EstructuraestandardelsistemadeficherosdeLinux

Existeundocumento'fsstnd'dondesedescribeunarecomendacinpara
estandarizar la estructura del sistema de ficheros de Linux para las
distintas distribuciones. Nosotros vamos a resumir brevemente la
informacin ms importante. Un detalle mayor sera necesario si este
cursofuerauncursodeadministracindelsistema.

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

Esteltimocaptulonoexplicaconceptosnuevosperoservirparaque
comprendaloquetieneensusistema.Puedeinvestigartodoloquequiera
porsucuentasiemprequeuseunusuarionormalitosinprivilegios.Si
algunavezsesienteperdidosolotienequeintroducirelcomando'cd'para
volveracasita.

Puedehaberdiferenciasimportantesenlaestructurageneraldelsistema
deficherosentreunasdistribucionesyotrasperoenlneasgeneralesel
aspectodeladisposicindelosdirectoriosmsimportantesseramso
menoselsiguiente;

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

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

| | |-- src
| | `-- tmp
| |-- doc
| |-- include
| |-- info
| `-- src
| `-- linux
|-- proc
`-- var
|-- cache
|-- catman
|-- lib
|-- local
|-- lock
|-- log
|-- run
|-- spool
| |-- cron
| |-- lpd
| |-- mail
| `-- mqueue
`-- tmp

Siobservadiferenciasconlaestructuradeficherosdesudistribucinno
debepreocuparseestoessolounejemplo.Comentaremoselcometidode
losdirectoriosmssignificativos.

Eldirectorioraz

Para arrancar el sistema, debe estar presente lo suficiente como para


montar'/usr'yotraspartesnoesenciales delsistemadearchivos.Esto
incluye herramientas, informacin de configuracin y del cargador de
arranque(bootloader)yalgunaotrainformacinesencialalarrancar.

Para habilitar la recuperacin y/o la reparacin del sistema, estar


presente en el sistema de archivos raz aquellas herramientas que un
administrador experimentadonecesitaraparadiagnosticaryreconstruir
unsistemadaado.

Los errores deldisco,quecorrompenlainformacin enelsistema de


archivos '/' son un problema mayor que los errores en cualquier otra

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

particin.Unsistemadearchivos'/'(raiz)pequeoesmenospropensoa
corrompersecomoresultadodeunfallodelsistema.

La principal preocupacin que se usa para balancear las anteriores


consideraciones,quefavorecenelcolocarmuchascosasenelsistemade
archivos raz, es la de mantener '/' (raiz) tan pequeno como sea
razonablementeposible.

/ --- El Directorio Raz

bin Binarios de comandos esenciales


boot Archivos estticos de cargador de
arranque(boot-loader)
dev Archivos de dispositivos
etc Configuracin del sistema local-mquina
home Directorios home de los usuarios
lib Libreras compartidas
mnt Punto de montaje de particiones temporales
root Directorio hogar del usuario root
sbin Binarios del sistema esenciales
tmp Archivos temporales
usr Segunda jerarqua mayor
var Informacin variable

Lajerarqua/usr.

'/usr' es la segunda mayor seccin del sistema de archivos. '/usr' es


informacincompartible,desololectura,estosignificaque'/usr',debeser
compartible entre varias maquinas que corren LINUX y no se debe
escribir.Cualquierinformacinqueeslocalaunamquinaovaraconel
tiempo,sealmacenaenotrolugar.

Ningn paquete grande (como TeX o GNUEmacs) debe utilizar un


subdirectorio directo bajo '/usr', en vez, debe haber un subdirectorio
dentrode'/usr/lib'(o'/usr/local/lib'sifuinstaladocompletamentelocal)
para ese propsito, con el sistema X Window se hace una excepcin

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

debido a un considerable precedente y a la prctica ampliamente


aceptada.

/usr --- Segundo mayor punto de montaje (permanente)

X11R6 Sistema X Window Version 11 release 6


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

/usr/local:Jerarqualocal

La jerarqua '/usr/local' estparaserutilizadaporeladministradordel


sistemacuandoseinstaleelsoftwarelocalmente.Necesitaestarasalvode
ser sobrescrito cuando el software del sistema se actualiza. Puede ser
usadoporprogramasyporinformacinquesoncompartiblesentreun
grupodemquinas,peronoseencuentranen'/usr'.

/usr/local Jerarqua local.

bin Binarios solo-locales


doc Documentacin local
etc Binarios de configuracin solo-local
games Juegos instalados localmente
lib Libreras para /usr/local
info Pginas de info local
man Jerarquas de pginas de manual para
/usr/local

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

sbin Administracin del sistema solo-local


scr 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

catman Pginas del manual formateadas


localmente
lib Informacin del estado de
aplicaciones
local Informacin variable del software de
/usr/local
lock Archivos de bloqueo
log Archivos de bitcora
named Archivos DNS, solo red
nis Archivos base de datos NIS
preserve Archivos almacenados despus de una
falla de ex o vi
run Archivos relevantes a procesos
ejecutndose
spool Directorios de trabajos en fila para
realizarse despus

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

tmp Archivos temporales, utilizado para


mantener /tmp pequeo

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

ALGUNOSCOMANDOSTILES

Tenemos una excelente noticia parasus neuronas.Enestecaptulo no


introduciremosconceptosnuevos.

Le proporcionaremos una lista alfabtica de comandos que puedan


resultarle de utilidad. Entre estos comandos no encontrar comandos
internos de la shell, ni comandos relacionados con la programacin o
administracindesusistema.Soloincluiremosloscomandosdeusuario
deusomsfrecuente.Eneltemadecomunicacionessolomencionaremos
unospocoscomandosbsicos.

Noslimitaremosaindicarbrevementeparaqueseusan.Enalgunosde
ellospondremosalgnejemploperolosdetallestalescomoformadeuso
yopcionesdebenconsultarseenelmanual.Elobjetivoessimplemente
que conozca la existencia de los comandos que pueden resultarle de
mayorutilidadenestemomento.

Recuerdequeunnmeroentreparntesisacontinuacindeuncomando
indicaelnmerodeseccinenelman.

Dado que no vamos a mencionar en este momento ningn comando


internodelinterpretedecomandosbashloquesipodemosindicarleesla
formadesabercualessonycomoobtenerinformacinsobrecualquiera
de ellos. Bastarconteclear elcomando'help'.Siquiereobtener ms
informacinsobrecualquieradeellosteclee'helpcomando'.

Ejemplo:

$ help | less

$ help cd

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

Dijimosquenoexplicaramosningncomandointernoperoenrealidad
'help'esuncomandointernoytenemosqueaadirqueadmiteelusode
metacaracteres.

$ help help

$ help *alias

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

Seleccindeloscomandosexternosdeusuariomstiles.

aproposatatqatrmawkbannerbatchbccalcatchgrp
chmodchowncksumclearcpcpiocutdatedfdiffduecho
egrepemacsenvexexprfalsefgrepfilefindfingerfreeftp
fusergawkgrepgzipheadhostnameidinfoispellkillkillall
lesslnlocatelpqlprmlsmailmanmkdirmoremvnice
nohuppasswdpasteprpspstreepwdreniceresetrmrmdir
rshscriptsedsleepsortsplitsttysutailtalkteetelnettest
tloadtoptrtrueviwwcwhatiswhereiswhowhoamiwrite
xargszcatzdiffzgrepzlesszmore

Loscomandosawk,cpio,egrep,fgrep,find,gawk,grep,sed,sort,test,y
viserntratadosendetalleencaptulosposteriores.

apropos(1)

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

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

$ apropos compress

at(1)

Se utiliza para programar un comando para que se ejecute en un


determinado momento. Este comando no admite intervalos de tiempo
menoresaunminuto.Lasalidadeberestarredirigidayaqueseejecutar
en segundo trmino sin un terminal asociado. Una vez ejecutado este
comando devuelve un nmero de tarea y el momento en el cual se
activarelcomando.Ejemplos:

$ echo 'date > /tmp/salida' | at now + 1 minute


$ echo 'date > /tmp/salida' | at 8:15am Saturday
$ echo 'date > /tmp/salida' | at noon
$ echo 'echo feliz ao nuevo > /dev/console' | at
11:59 Dec 31
$ echo 'banner a comer > /dev/console' | at 1:55pm

atq(1)

Permiteverlacoladetareaspendientes.

$ atq

atrm(1)

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

Permite cancelar una tarea programada y pendiente de ejecutarse ms


tarde.

$ atrm 188

awk(1)

Setratadeunprogramaqueimplementaunlenguajeparatratarficheros
de texto estructurados en campos y registros. Es muy potente y se
estudiarmsadelante.

banner(1)

Paragenerarcabecerasconletrasgrandes.Ejemplo:

$ banner hola

# # #### # ##
# # # # # # #
###### # # # # #
# # # # # ######
# # # # # # #
# # #### ###### # #

batch(1)

Esuncomandomuysimilaralcomandoatperonorequierelaindicarel
momento en ese caso se ejecutar en un momento con baja carga.
Ejemplo:

$ echo 'date > /dev/console' | batch

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

bc(1)

Esunacalculadoradeprecisinarbitraria.(Esdecircontodalaprecisin
queunoquiera)Sepuedeusarinteractivamenteoadmitircomandosporla
entrada estndar. Admite expresiones bastante complejas y sentencias
condicionales y de repeticin que constituyen un potente lenguaje de
programacinparaestacalculadora.PorejemplocalcularelnmeroPI
con300cifrasdecimales.

$ echo "scale=300; 4*a(1)" | bc -l

3.141592653589793238462643383279502884197169399375105
820974944592307\
81640628620899862803482534211706798214808651328230664
709384460955058\
22317253594081284811174502841027019385211055596446229
489549303819644\
28810975665933446128475648233786783165271201909145648
566923460348610\
454326648213393607260249141272

cal(1)

CalendarioEjempos:

$ cal

$ cal 2000

cat(1)

Leeunoomsficherosylossacaporlasalidaestndar.

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

$ cat fichero1 fichero2 > fichero1_mas_2

chgrp(1)

Permite cambiar el atributo de grupo de uno o ms ficheros. Solo el


propietariodelficheroounusuarioprivilegiadopuedeusarlo.

chmod(1)

Permite el cambio de los permisos asociados a un fichero. Solo el


propietariodelficheroounusuarioprivilegiadopuedeusarlo.

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

chown(1)

Permitecambiarelpropietarioactualdeunfichero.Soloelpropietariodel
ficheroounusuarioprivilegiadopuedeusarlo.Tambinpermitecambiar
elgrupo.

$ chown usuario fichero


$ chown usuario:grupo fichero

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

cksum(1)

Obtieneuncdigo(CRC)queestdiseadoparadetectarvariacionesen
lainformacinporproblemasenlagrabacinotransmisindedatos.

$ cksum fichero

clear(1)

Limpiaelcontenidodelaconsola.

cp(1)

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

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

cpio(1)

Admiteunalistadenombresdeficherosparaempaquetarlosenunsolo
fichero.Esuncomandomuypotenteyverstil.Juntocontarseusaentre

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

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


combinacinconfind.Loestudiaremosmsadelante.

cut(1)

Permiteextraercolumnasocamposdesdeunoomsficheros.

$ cut -d: -f1 /etc/passwd


$ cut -d: -f6 /etc/passwd

date(1)

Obtiene la fecha. Las opciones permiten obtener distintos formatos de


salida.

$ date

dom jun 11 18:17:14 CEST 2000

$ date +"%Y/%m/%d %T"

2000/06/11 18:16:49

$ date +%s

960740283

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

df(1)

Informadelautilizacindediscoenlasparticionesqueestnmontadas.

$ df -a

diff(1)

Sirveparalocalizardiferenciasentredosficherosdetexto.

$ diff fich1 fich2

du(1)

Permiteaveriguarlaocupacindeespaciodetodoaquelloquecuelgade
un determinado directorio. Este comando conviene usarlo de vez en
cuandoparalocalizardirectoriosdemasiadocargadosdeinformacin.

$ du -s .

$ du .

$ du -s * | sort -n

echo(1)

Permitesacarmensajesporsalidaestndar.

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

egrep(1)

Es una variedad del comando grepquepermite elusodeexpresiones


regularesextendidas.Sirvenparabuscarcadenasdetextoosecuenciasde
caracteresenficheros.Seestudiarnmsadelante.

emacs(1)

Esuneditormultipropsito.

env(1)

Obtienelalistadevariablesdeentornoysusvalores.

ex(1)

Es un editor interactivo similar al vi. En Linux existe una versin


mejoradallamadaelvis.

expr(1)

Esunevaluadordeexpresiones.

$ expr \( 55 + 31 \) / 3

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

28

false(1)

Solotienesentidousarloenprogramacinyretornauncdigoderetorno
queindicaerror.Enotraspalabrasnosolonohacenadasinoqueadems
siemprelohacemal.Pareceabsurdoperotienesuutilidad.Sinofueras
noexistiraynoeselnicocomandodeestetipo.

fgrep(1)

Esunavariedaddelcomandogrep.Sirvenparabuscarcadenasdetextoo
secuenciasdecaracteresenficheros.Seestudiarnmsadelante.

file(1)

Sirveparaaveriguareltipodeficheropasadocomoargumento.Distingue
muchostiposdeficheros.

$ file fich
$ file dir1 fich2

find(1)

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

Permite localizar ficheros dentro de la estructura de directorios. Es


tremendamenteverstilyseestudiarmsadelante.

$ find /var -name '*.log'

finger(1)

Sirveparaaveriguarquienestconectadoalsistema.

$ finger
$ finger -l

free(1)

Proporcionaestadsticasdeusodelamemoriadelsistema.

ftp(1)

Comandoparaintercambiarficherosentredistintosordenadores.

fuser(1)

Indicaqueprocesoestusandounficherooundirectorio.

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

$ fuser /

gawk(1)

EslaversinGNUdeawk.Setratadeunprogramaqueimplementaun
lenguajeparatratarficherosdetextoestructuradosencamposyregistros.
Esmuypotenteyseestudiarmsadelante.

grep(1)

Junto a egrep, fgrep y rgrep sirven para buscar cadenas de texto o


secuenciasdecaracteresenficheros.Seestudiarnmsadelante.

gzip(1)

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

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

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

head(1)

Permitesacarlasprimeraslneasdeunfichero.

hostname(1)

Obtieneelnombredelamquina.

id(1)

Devuelveinformacindeidentidaddeaquelqueloejecuta.

info(1)

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

ispell(1)

Es un comprobador ortogrfico que puede ser acoplado a diversos


editorescomoporejemploalvi.Existendiccionariosortogrficospara
distintoslenguajes.

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

kill(1)

Envaunasealaunproceso.Sellamakillporquegeneralmenteseusa
para "matar" procesos. Requiere que se conozca el identificador del
procesoPID.

killall(1)

Comoelanteriorperopermitepasarelnombredelcomandoy"matar"a
todoslosprocesosquetenganesenombre.

less(1)

Esunpaginadorquepuedeusarseensustitucindelpaginadormore.

$ less fichero
$ cat fichero | less

ln(1)

Creaenlacesrgidosyenlacessimblicosquesoncosasqueyahemos
estudiado.

locate(1)

Permitelalocalizacinrpidadeficherosensusistemadeficheros.Se
utiliza una base de datos que debe de ser actualizada regularmente

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

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

lpq(1)

Informasobreelestadodelacoladeimpresin.Muestralastareasque
estnellacolasuidentificadornumrico,orden,tamaoypropietario.

lprm(1)

Permite cancelar tareas de impresin usandoel identificador numrico


obtenidoconlpq.

ls(1)

Obtiene un listado de los ficheros de un directorio. Tiene una gran


cantidaddeopciones.

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

mail(1)

Seusaparaenviaruncorreoelectrnico.Sumanejocomparadoconotros
programasdecorreoelectrniconoresultamuyamigableperonosolo
sirveparausarloenmodointeractivo.Selepuedepasarporlaentrada
estndar el contenido de un mensaje. Una aplicacin de esto es que
podemoscoleccionarmensajescortosporejemploparasuscribirseode
suscribirsedelistasdecorreo.

$ echo unsubscribe l-linux | mail


majordomo@calvo.teleco.ulpgc.es

$ mail -s unsubscribe debian-user-spanish-


request@lists.debian.orga < null>

man(1)

Este fu el primer comando que se estudi en este curso y no nos


cansaremosderecomendarlequesefamiliariceconel.Lainformacinde
estaspginasdelmanualnosueleresultarmuydidctica.EnLinuxno
vienenapenasejemplos.Apesardeellosueletraerinformacincompleta
deopcionesyformasdeuso.

mkdir(1)

Creaunoomsdirectorios.Lospermisosdependerndeelvaloractual
de 'umask'.Estoyalovimosencaptulos anteriores.Paraeliminarun
directorioseusar'rmdir'.

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

$ mkdir dir1 dirA/dirB/dirC/dir2 dir3

more(1)

Esunpaginadormuchomssencilloqueelsofisticado'less'.

$ ls | more

$ more fichero

mv(1)

Seutilizapararenombrardirectoriosyficherosoparatrasladarlosdeun
lugaraotro.Convieneusarloconprecaucinporqueseprestaaobtener
resultados diferentes enfuncindelaexistencia onodeunfichero o
directoriodedestino.Moverunficheroaotroqueyaexistesupondra
sobrescribirlo asqueunerrorpuedeprovocarperdidadeinformacin.
CuandoseusanmsdedosargumentosenLinuxseobligaaqueelltimo
seaundirectoriodedestinolocualprevieneerrores.

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

nice(1)

A un usuario normal le permitir bajar la prioridad de los proceso


lanzados con este comando. Solo root puede usarlo para aumentar la

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

prioridad.Unavezqueuncomandohasidolanzadosepuedemodificar
suprioridadconrenice.

$ nice comando

nohup(1)

Loscomandoslanzadosconnohupnoterminanalabandonarlasesin.Se
puedeusarcombinadoconlaejecucinenbackground.

$ nohup GeneraInformeMensual > informe01-05-2000.out &

$ # logout
$ exit

passwd(1)

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

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

paste(1)

Seusaparacombinarcolumnasdedistintosficherosenunosolo.Vienea
serlocontrariodelcomandocut.

$ who | paste - -

pr(1)

Permitepaginaruntextoincorporandocabeceras.

$ ls /*/* | pr -h ejemplo-pr -o 5 -l 35 | less

ps(1)

Permiteobtenerinformacindelosprocesosenejecucin.Dependiendo
loquenosintereseexistendiversasopcionesparaunagranvariedadde
formatosydeseleccindelainformacindesalida.

pstree(1)

Muestra la jerarqua entre procesos mostrando las relaciones de


parentescoentreellos.

$ pstree

$ pstree -p

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

Laopcinpesmuytilparaaveriguarelpiddeunproceso.

pwd(1)

Estecomandoretornaellugardondenosencontramos.

$ pwd

Sepuedeusarporejemploparaguardarellugardondeestamosahoracon
objetoderetornaralamismolugarmstarde.

$ AQUI=`pwd`
$ cd /tmp
$ ls
$ cd $AQUI

renice(1)

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

$ renice +15 778

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

reset(1)

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

rm(1)

Yahemosexplicadoyusadoestecomando.Sirveparaborrarficheros.

rmdir(1)

Ya hemos explicado y usado este comando. Sirve para eliminar


directoriosquedebendeestarvacos.

rsh(1)

Permite siempre que tengamos permiso ejecutar un comando en un


ordenadordistinto.Sepuedeusarparatransferirgrandescantidades de
informacinatravsdelared.Porejemploimaginemosquequeremos
sacarunacopiadeseguridadguardandolainformacinenunaunidadde
cintaqueseencuentraenunordenadordistinto.Enesecasoselanzandos
comandos simultneos comunicndolos con un pipe. Un comando se

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

ejecutarenelordenadorremotoconrshyelotroseejecutaenlocal.
Ambosprocesosquedancomunicadosporentradasalidaperoesoimplica
queesacomunicacinviajaratravsdelared.

$ ### Para salvar


$ tar cf - . | rsh remotehost dd of=/dev/tape

$ ### Para recuperar


$ rsh remotehost dd if=/dev/tape | tar xf -

La forma de combinar comandos en unix conectando entrada salida


permite hacer muchas veces cosas sorprendentes como en este caso.
Existenuncomandosimilarquehacelomismoperolainformacinviaja
encriptadaatravsdelared.Setratade'ssh'.

script(1)

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

sed(1)

Este es un editor deflujo. Dichode otraforma es uneditor queest


pensadoparausarlocomoflujo.Deestaformasepuedeusarcomouna
poderosaherramientaparatransformartexto.Seestudiarmsadelante.

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

sleep(1)

Sirve para esperar sin consumir recursos. El proceso queda dormido


duranteelnmerodesegundosindicado.

$ echo hola; sleep 5 ; echo que tal

sort(1)

Estecomandopermiteordenarlineasdetexto.Sepuedeusarcomofiltro.
Seestudiarmsadelante.

split(1)

Estecomandosirveparapartirentrozosmspequeosunficherogrande.
Paravolveraobtenerelficherooriginalbastarconusarelcomando'cat'

$ split --bytes=52m ficherogrande parte

Estecomando troceaunficherograndeentrozosde52Mbytesquese
guardanenficherosqueempiezanconelprefijo'parte'seguidodeuna
numeracinsecuencial.

stty(1)

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

Sirve para comprobar el estado actual del terminal y para cambiar la


configuracin del mismo. Se puede cambiar el significado de algunos
caracteres de control, establecer el nmero de filas y columnas del
terminal,lavelocidaddetransmisin,etc.Paracomprobarelestadoactual
tecleelosiguiente.

$ stty -a

su(1)

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

$ su nuevousuario

$ su - nuevousuario

Paraunusuarionormalsesolicitarlapassworddelnuevousuario.

tail(1)

Ascomoheadservaparaobtenerlasprimeraslneasdeunficherotail
sirveparaobtenerlasltimaslneasdeunfichero

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

$ tail fichero

Tailtieneunaopcinmuytilparamostrarqueesloqueestpasandoen
ficherosqueseestngenerandooquecrecencontinuamente.

$ tail -f fichero

Estecomandonoterminanuncaymuestraelfinaldelficheroquedandoa
la espera de mostrarelrestodemismoamedida quesegenere.Para
terminarhayquematarloconCtrlC.

talk(1)

Permiteabrirunasesindecharlainteractivaconotrousuario.

tee(1)

Este comando se utiliza para obtener una bifurcacin en un flujo de


entradasalida.Actacomounaderivacinenformade'T'.

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

telnet(1)

Permiteabrirunasesindetrabajoenotramquina.

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

$ telnet localhost

Con esto podemos probar telnet conectndonos con nuestra propia


mquina.Acontinuacinsaldrlasolicituddelogin.

test(1)

Seusaparaevaluarexpresiones.Seusamuchoenlaprogramacinshell
script.Loqueseusaessucdigoderetorno.Tienedosformasdeuso
'testexpresin'o'[expresin]'

$ test "2" = "3"


$ echo $?

$ test "2" = "2"


$ echo $?

$ A=335
$ B=335

$ [ "$A" = "$B" ]
$ echo $?

Seestudiarmsadelante.

tload(1)

Convierteelterminalenunmonitorsemigrficoqueindicarelnivelde
carga del sistema. Se interrumpe con CtrlC. Si el sistema no est
trabajandodemasiadonovernadademasiadointeresante.

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

$ ls /*/* > /dev/null 2>&1 &

$ tload -d 2

top(1)

Muestra informacin de cabecera con estadsticas de uso de recursos.


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

$ top

Parasalirhayquepulsar'q'.

tr(1)

Seutilizaparasustituircarcter.

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

$ # Pasar a maysculas
$ tr '[a-z]' '[A-Z]' < fichero > nuevofichero

$ # Eliminar el carcter ':'


$ tr -d : < fichero > nuevofichero

true(1)

Este comando es el contrario del comando 'false'. Solo tiene sentido


usarloenprogramacinyretornauncdigoderetornoqueindicaxito.
Enotraspalabrasnohaceperoalmenoslohacecorrectamente.

vi(1)

Esteesuneditormuypotenteypresenteentodoslossistemasdetipo
Unix.Seestudiarmsadelante.

w(1)

Muestra informacin de usuarios actualmente conectados mostrando


momentodeiniciodesesinyelconsumodeCPUqueseharealizado.

$ w

wc(1)

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

Estees un comando queseusabastante. Sirveparacontarcaracteres,


palabrasylneasenunficherooenunflujodeentradasalida.

$ wc fichero

$ cat fichero | wc

whatis(1)

Sirveparamostrarlabrevedescripcindeuncomandoquefiguraenlas
pginasdelmanual

$ whatis ls

$ whatis whatis

who(1)

Sacalainformacindequienesestnconectadosalsistema.

$ who

whoami(1)

Paraaveriguarquienesustedenesemomento.Enunprogramapuedeser
interesantecomprobarquienloestejecutando.

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

$ whoami

whereis(1)

Sirve para localizar un comando en el sistema siempre que este est


localizadoen$PATH

$ whereis ls

$ whereis whereis

write(1)

Siemprequesetengapermisopermiteenviarmensajesaotrousuario.

$ write root

xargs(1)

Sirveparapasarargumentosauncomandomedianteentradasalida.

$ echo '-l' | xargs ls

Cosascomoestasaadenbastantepotenciaallenguajeshellscript.

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

z...

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

$ zless documento.txt.gz

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

EXPRESIONESREGULARES

Introduccin

Vamosaexplicarlasexpresionesregularesporqueseutilizanamenudo
desdeunagranvariedaddeaplicacionesenlosSOtipoUnixcomoLinux.
Permitenreconocerunaseriedecadenasdecaracteresqueobedecena
ciertopatrnquellamamosexpresinregular.Porejemplosideseamos
buscarlineasquecontengalaspalabras'hola'o'adis'enlosficherosdel
directorioactualharemos:

$ egrep 'hola|adis' *

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

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

losdistintosdialectossuelensermuypocas.Porejemplosiuncomando
usa los parntesis y adems admite el uso de expresiones regulares
extendidasseestablecerunaformadedistinguirsilosparntesisdeben
serinterpretadoscomopatrndelaexpresinregularocomootracosa.
Paraellosesueleusarlosparntesisprecedidosdelcarcterescape'\'.
Vamos a tomar a 'egrep' y 'sed' como comandos para aprender
expresiones regulares porque este curso tiene un enfoque prctico.
Usaremoselcomando'egrep'condistintospatronesyveremoscuando
cumpleycuandonocumpleydeesaformaseentenderperfectamente.

Operadoresusadosenexpresionesregulares.

* Elelementoprecedentedebeaparecer0omsveces.
+ Elelementoprecedentedebeaparecer1omsveces.
. Uncarctercualquieraexceptosaltodelinea.
? Operadorunario.Elelementoprecedenteesopcional
| Ounouotro.
^ Comienzodelinea
$ Findelinea
[...] Conjuntodecaracteresadmitidos.
[^...] Conjuntodecaracteresnoadmitidos.
Operadorderango
(...) Agrupacin.
\ Escape
\n Representacindelcarcterfindelinea.
\t Representacindelcarcterdetabulacin.

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

Estalistanoescompletaperoconestoessuficienteparahacercasitodo
loquenormalmentesehaceconexpresionesregulares.

Ejemplosparacadaoperadorcon'egrep'

Empezaremos usando un ejemplo lo ms sencillo posible para ilustrar


cadaunodeestosoperadores

Ejemplo para el operador '*' con el


patrn'ab*c' $ egrep 'ab*c' <<FIN
< 1 ac
< 2 aac
Este patrn localizar las cadenas de < 3 abbbc
caracteres que empiecen por 'a', que < 4 axc
continencon0oms'b',yquesigan < 5 aaab
< 6 cba
conuna'c'. < 7 aacaa
< FIN
La4fallaporquela'a'yla'c'novan
1 ac
seguidas ni existen caracteres 'b' entre 2 aac
ambas.La5fallapornotenerunasola 3 abbbc
'c'.yla6tieneloscaracteresadecuados 7 aacaa
peronoenelordencorrecto.
Ejemplo para el operador '+' con el
$ egrep 'ab*c' <<FIN
patrn'ab+c' < 1 ac
< 2 aac
Este patrn localizar las cadenas de < 3 abbbc
caracteres que empiecen por 'a', que < 4 axc
< 5 aaab
continencon1oms'b',yquesigan < 6 cba
conuna'c'. < 7 aacaa
< FIN
Solo la lnea 3 cumple la expresin 3 abbbc
regular.

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

$ egrep 'a..c' <<FIN


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

Ejemplo para el operador '?' con el $ egrep 'ab?cd' <<FIN


< abcd
patrn'ab?cd' < acd
< cd
Este patrn localizar las cadenas de < abbcd
caracteresqueempiecenpor'a',yque < FIN
opcionalmentecontinenconuna'b'y abcd
quecontineconloscaracteres'cd'. acd

$ egrep 'ab|cd|123' <<FIN


< xxxabzzz
Ejemplo para el operador '|' con el < xxxcdkkk
patrn'ab|cd' < badc
< dbca
< x123z
Este patrn localizar las cadenas de < FIN
caracteres que contengan 'ab', 'cd', o
'123' xxxabzzz
xxxcdkkk
x123z

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

$ egrep '^abc' <<FIN


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

$ egrep 'abc$' <<FIN


< abcd
Ejemplo para el operador '$' con el < 000abc
patrn'abc$' < xxabcx
< abc
Este patrn localizar las lineas que < FIN
terminenpor'abc'. 000abc
abc

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


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

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


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

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

$ egrep '0[a-z]0' <<FIN


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

$ egrep '0(abc)?0' <<FIN


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

Ejemplo para el operador '\' (escape) $ egrep '0\(abc\)?0' <<FIN


< 0(abc)0xx
conelpatrn'0\(abc\)?0' < 0(abc0xx
< hh00hh
< FIN
Este patrn localizar las cadenas que
tenganun'0'seguidoopcionalmentede 0(abc)0xx
')',yseguidodeotro'0'. 0(abc0xx

Ampliandoconocimientossobre'egrep'

Hemosaprendidocosasdeegrepparailustrarelusodelasexpresiones
regularesperotantogrepcomoegreppermitenelusodeciertasopciones
queannohemoscomentadoyquenovamosailustrarconejemplos
porquenoestnrelacionadasconlasexpresionesregulares.Solovamosa
sealarlasopcionesmstilesparaquelasconozca.

iBuscaignorandodiferenciasentremaysculasyminsculas.
wParaforzarquelacadenareconocidaseaunapalabracompleta.

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

l No muestra el contenido de la linea encontrada pero si que


muestraelficheroquecontiene lacadenabuscada.Estoestil
cuando deseamos buscar entre muchos ficheros de los cuales
algunos son binarios porque la muestra del contenido de un
ficherobinariopuededesconfigurarelterminal.
nMuestraelnmerodelneadentrodelficheroparaayudarasu
localizacin.
vEnlugardesacarlalineasquecumplenlabsquedasacarlas
quenocumplen.

Paraunmayordetalleconsultarlaspginasdelmanual.Setratadeun
comandodegranutilidadylerecomendamosquepractiqueporsucuenta
conel.Exstenvariasmodalidadesdeestecomando.

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

Usodeexpresionesregularesen'sed'

Ahoraveremosunosejemploscon'sed'.Estecomandoescapazdeeditar
unflujoochorrodecaractereslocualesdeenormeutilidaddadoque
muchos comandos se comunican a travs de entrada salida mediante
chorrosdecaracteres.Nopodemosvertodaslasposibilidades de'sed'
porqueloquenosinteresaessuusoconexpresionesregulares.Paraello
usaremosunnuevooperador'&'queenlapartedesubstitucinde'sed'
indicalapartequecoincideconlaexpresinregular.

Para usar 'sed' se pone como primer argumento a continuacin del


comandolaordenadecuada.Opcionalmentesepuedeponerunsegundo
parmetro que indicara el nombre de un fichero. De no existir ese
segundoparmetroesperarlaentradaporlaentradaestndar.

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

Se intentan reconocer las secuencias ms largas posibles ^ y $ no


consumencarcter'\n'si.

Empezamosconunasustitucinsencillita.

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

abcNUMEROdef

Ahorausamoseloperador'&'.Observecomosesustituyeporelpatrn
reconocido.

$ echo "abc1234def" | sed "s/[0-9][0-9]*/<&>/"

abc<1234>def

Despuseliminamoslasecuencianumrica.

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

abcdef

Vamosacomprobarqueenlasexpresionesregularesseintentasiempre
reconocerlasecuenciamslargaposible.

$ echo "000x111x222x333" | sed "s/x.*x/<&>/"

000<x111x222x>333

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

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

# Creamos un ficherito de prueba


$ cat <<FIN > prueba-sed.txt
< Hola este es un fichero con datos de prueba
< Hola otra vez.
< Hola otra vez.
< Hola otra vez.
< Hola otra vez y otra y otra y otra y otra y otra.
< Fin de los datos de prueba
< FIN
$ sed "3,4s/Hola//" prueba-sed.txt

Hola este es un fichero con datos de prueba


Hola otra vez.
otra vez.
otra vez.
Hola otra vez y otra y otra y otra y otra y otra.
Fin de los datos de prueba

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

$ sed "s/otra/una/" prueba-sed.txt

Hola este es un fichero con datos de prueba


Hola una vez.
Hola una vez.
Hola una vez.
Hola una vez y otra y otra y otra y otra y otra.
Fin de los datos de prueba

Vemosquesolosehacambiadolaprimeraocurrenciadecadalnea.Para
obtenerelresultadodeseadotendramosqueusarlagalfinal.

$ sed "s/otra/una/g" prueba-sed.txt

Hola este es un fichero con datos de prueba


Hola una vez.
Hola una vez.
Hola una vez.

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

Hola una vez y una y una y una y una y una.


Fin de los datos de prueba

Ampliandoconocimientossobre'sed'

Hemos aprendido cosas de sed para ilustrar el uso de las expresiones


regulares pero sed tiene muchas ms posibilidades que an no hemos
comentado. Comentaremos solo algo ms pero sin extendernos
demasiado.Ensedsepuedenespecificarvariasinstruccionesseparando
con';'cadaunadeellasousandolaopcineantesdecadainstruccin.
Tambinpodemosaprovecharelsegundointroductordelashell.

$ sed "s/otra/vez/g ; s/vez/pez/g" prueba-sed.txt

Hola este es un fichero con datos de prueba


Hola pez pez.
Hola pez pez.
Hola pez pez.
Hola pez pez y pez y pez y pez y pez y pez.
Fin de los datos de prueba

# Idntico resultado podramos haber conseguido usando


$ sed -e "s/otra/vez/g" -e "s/vez/pez/g" prueba-sed.txt
# Una tercera forma para conseguir lo mismo
$ sed "
< s/otra/vez/g
< s/vez/pez/g
< " prueba-sed.txt

Tambinpodemosobtenerelmismoresultadousandolaopcinfyun
ficherodeinstruccionespara'sed'.

$ cat <<FIN > prueba-sed.sed


< s/otra/vez/g
< s/vez/pez/g
FIN
$ sed -f prueba-sed.sed prueba-sed.txt

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

Existen posibilidades ms avanzadas para usar 'sed' pero con lo que


hemosmencionadosepuedenhacermuchascosas.

Podemoseliminar losblancosaprincipio yalfinaldelinea ascomo


sustituirmsdeunblancoseguidoporunsoloblanco.

$ cat <<FIN > trim.sed


< s/^ *//g
< s/ *$//g
< s/ */ /g
< FIN

Sinecesitahaceralgunatransformacinynoencuentralaformafcilde
hacerconsedpiensequequizsnecesiteusarvariastransformacionesen
cadena.

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

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

cal | head -n 1
cal | tail -n 7 | sed 's/ / +/g' | sed 's/^ /+/g' | \
sed 's/ / /g' | sed 's/+/ /g' | sed 's/$/& /' | \
sed 's/^/ /' | sed "s/ $DIAMES /\[${DIAMES}\]/"
# Trazas
cal | tee traza.1 | \
tail -n 7 | tee traza.2 | \
sed 's/ / +/g' | tee traza.3 | \
sed 's/^ /+/g' | tee traza.4 | \
sed 's/ / /g' | tee traza.5 | \
sed 's/+/ /g' | tee traza.6 | \
sed 's/$/& /' | tee traza.7 | \
sed 's/^/ /' | tee traza.8 | \
sed "s/ $DIAMES /\[${DIAMES}\]/" > traza.9

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

traza.1 contiene la salida del comando cal.

April 2002
S M Tu W Th F S
1 2 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

En traza.2 se ha eliminado la primera lnea.

S M Tu W Th F S
1 2 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

En traza.3 se ha sustituido toda secuencia de


dos blancos por ' +'

S +M Tu +W Th +F +S

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

+ +1 +2 +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

En traza.4 sustituimos los blancos a comienzo de


lnea por '+'

+S +M Tu +W Th +F +S
++ +1 +2 +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

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 +M Tu +W Th +F +S
++ +1 +2 +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

Ahora ya no son tiles los '+' y los sustituimos


por blancos. En traza.6 ya tenemos la salida
ensanchada.

S M Tu W Th F S
1 2 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

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 M Tu W Th F S
1 2 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

Ahora en traza.8 se ve como hemos aadido un


blanco a la izquierda.

S M Tu W Th F S
1 2 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

Por ltimo bastar sustituir el da del ms


entre blancos por el da de ms entre corchetes.

S M Tu W Th F S
1 2 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

Independientementedequeaustedseleocurraotrasolucinmejor,se
tratabadepracticarconsedyconsietesedsencadenadospensamosque
yahabrsaciadosuseddesed(1).

Detodasformassiloquieremsbonitoycortitopruebeestootro.

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

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

Yanossalimosdeltemaperosiestohadespertadosucuriosidadmire
console_codes(4).

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

ELEDITORVI(Primeraparte)

Introduccin

En primer lugar vamos a dedicar bastante esfuerzo a explicar porque


aprender'vi'.Quizspensqueestecaptulonoeraparaustedporqueya
sabeusarotroeditor.Tambinvamosexplicarlanecesidaddededicardos
largoscaptulosaesteeditor.

Cuandofinaliceestecaptulopodreditarsusficheroscon'vi'yhacer
bastantetrabajotilperoparaelloquizasnecesitealgomsdeesfuerzo
queencaptulosanterioresynoporqueseadificilsinoporquetendrque
practicarbastanteporsupropiacuenta.

Otracosasersacarleelmximopartidoa'vi'.Enunsegundocaptulo
dedicadoa'vi'veremosopcionesmsavanzadas.Sonopcionesquequizs
nonecesiteusartanfrecuentementeperocuandotengaoportunidadde
usarlascomprenderlapotenciaeleditor'vi'.

Muchoseditoresactualespermitenusardistintostiposdeletrasygeneran
documentosconunaspectopreciosoqueademscoincideloqueseveen
pantallacuandoseedita,yconloquesaldrporlaimpresora.Estclaro
que 'vi' no sirve para esto. 'vi' est diseado para editar ficheros en
formatodetextoestndar.Peroaunquesolosirvaparaesteformatode
textolohacemuybienysiempretendremosoportunidaddeusarloporque
auncompilador,oaunintrpreteledaiguallaesttica.

SonmuchosloseditoresdisponiblesenLinuxperodesdeunprincipio
dijimosqueestecursopodraservirengranmedidaparaaprenderotros
SOtipoUnix.Eleditor'vi'estpresentedesdehacemuchotiempoenun
montn de sistemas tipo Unix. Aqu explicaremos solo unos pocos
aspectosde'vi'conlaideadequepuedarealizarconrazonablesolturala

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

edicindeuntextoen'vi'.Conmuypocoscomandosde'vi'sepueden
hacermuchascosasy'vi'esuneditorqueparaciertastareasresultade
unapotenciaincreble.Elqueescribeestaslineasloesthaciendocon'vi'
yllevamuchosaosusandoesteeditorprcticamenteparacasitodoyle
sacoungranpartido,perocadavezquemeencuentroconalguinque
sabebastantede'vi'aprendoalgonuevo.'vi'esuneditormuyprcticosin
tenerqueconocerloafondoperoenmanosdeunexpertoresultadeuna
eficaciaespectacular.

'vi'esuneditordelineasinteractivoyhasidomuycriticado.Unadelas
razonesparaelloesquetienevariosestadosoformasdefuncionamiento
ysiunopasadeunestadoaotrosindarsecuentaycontinuatecleando
cosas,puedeocurrirunpequeodestrozoenelficheroqueesteditando.
Otroinconvenientede'vi'esquerequiereunpoquitodeaprendizaje.Hay
muchsima gente que est acostumbrada a usar otros editores ms
intuitivosyporquenodecirlomscmodos,yrechazana'vi'comoalgo
prehistrico. Otra cosa que suele criticarse es que se usan letras del
teclado para cosas tan normales como el movimiento del cursor y la
paginacindeltextoperoesteesunclaroejemplodelcondicionamiento
delaculturadeMicrosoftydelosPCs.'vi'fuediseadoparaquese
pudierausarenunagranvariedaddesistemasyterminales.Elusodelas
teclasdeflechaspuedelograrsemediantelaadecuadaconfiguracinde
'vi'.Unodelospuntosfuertesde'vi'essuadaptabilidad.

Quizsunadelasmspoderosasrazonesparaaprender'vi'esque'vi'
forma parte de la cultura de los SO tipo Unix. Muchas personas
acostumbradas a trabajar por ejemplo con Windows asumirn como
estndar cosas que no lo son y cuando se encuentran algo diferente
intentanaprovecharalmximosusconocimientosanteriores.

Generalmenteexisteunaexageradsimatendenciaacontinuarusandoel
primereditorqueseaprendiyluegosecambiasolodeeditorobligado
porcircunstanciaspoderosas.Nosotroshemosdecididoqueenposteriores
leccionesasumiremosqueustedyasabeusar'vi'.Prontotendrquehacer
susprimerosprogramasenshellscript.Entoncesnecesitaruneditory
nadamejorque'vi'.

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

EnestecursoseledamuchaimportanciaalaculturaUnix.Parauna
personaqueaprende'vi'surgenvariasoportunidadesparaaplicarloque
sabeencomandosdistintosde'vi'.Laformadetrabajarde'vi'hatenido
mucho impacto en otros programas. Puede encontrar juegos, hojas de
clculoutilidades,etcqueusancosasparecidasa'vi'.Yavimos'sed'que
usacomandossimilaresaalgunoscomandosde'vi'yahoravamosavera
continuacin algunas nociones de otro editor ('ed') que es otro buen
ejemplodeloqueestamoscomentando.

'ed'versus'vi'

Dadoque'vi'estpensadoparasuusointeractivodesdeunterminalno
resulta muy apropiado de usar en combinacin con otros programas
mediante redireccin de entrada salida. En el captulo anterior de
expresiones regulares vimos como 'sed' se poda usar como filtro de
entradasalida.Existeuneditorllamado'ed'queescapazdeeditartexto
en modo no interactivo. Para ello se suele recurrir a un script que
proporcionara'ed'lasinstruccionesadecuadas.Somosdelaopininde
quelasleccionesquenodejanverrpidamentecualessuutilidadyque
nosepracticanestncondenadasalolvido.Poresoqueremosevitarque
pienseentrminosde"paraquenecesitoyoconocerestodeed".Poreso
ms tarde comentaremos algo de 'diff' combinado con 'ed'. As
comprendermejorlautilidaddeleditor'ed'.

Ahoravamosagenerarunfichero'ejemplo.txt'conunaspocaslineaspara
hacerunaspocasprcticas.

$ cd /tmp
$ cat <<FIN > ejemplo.txt
> No olvide visitar nuestra web
> http://www.ciberdroide.com
> y esto es todo.
> FIN

Vamosasacarunacopiaparacomprobarluegoloscambios.

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

$ cp ejemplo.txt ejemplo.txt.original

Ahorageneramosunficheroconlasinstruccionesparaeditarelfichero
anterior. Deseamos que primero localice la linea que contiene
'www.ciberdroide.com' yacontinuacinaadaunalinea(comando'a')
'(Tienda Virtual de Linux)'. Salimos al modo comandos (comando '.')
Salvamos(comando'w')ysalimos(comando'q').

$ cat <<FIN > ejemplo.ed


> /www.ciberdroide.com/
> a
> (Tienda Virtual de Linux)
> .
> w
> q
> FIN
$ ed ejemplo.txt < ejemplo.ed

73
http://www.ciberdroide.com
99

Veamoscomohaquedado.

$ cat ejemplo.txt

No olvide visitar nuestra web


http://www.ciberdroide.com
(Tienda Virtual de Linux)
y esto es todo.

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

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

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

2a
(Tienda Virtual de Linux)
.

Vamos a partirdelfichero original ylevamos apasarporlaentrada


estndarnicamentelasdiferenciasobtenidascon'diffe'

$ cp ejemplo.txt.original ejemplo2.txt
$ diff -e ejemplo.txt.original ejemplo.txt > ejemplo.diff
$ cat ejemplo.diff

2a
(Tienda Virtual de Linux)
.

Vemos que falta las instrucciones 'w' y 'q' para salvar y salir
respectivamenteasquelasaadimosalfichero'ejemplo.diff'.

$ cat <<FIN >> ejemplo.diff


> w
> q
> FIN
$ cat ejemplo.diff

2a
(Tienda Virtual de Linux)
.
w
q

Ya tenemos todas las instrucciones necesarias. Vamos a aplicar los


cambioscon'ed'.

$ ed ejemplo2.txt < ejemplo.diff

73
y esto es todo.

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

99

$ cat ejemplo2.txt

No olvide visitar nuestra web


http://www.ciberdroide.com
(Tienda Virtual de Linux)
y esto es todo.

En lugar de guardar varias versiones de un gran fichero que sufre


pequeasdiferenciasdevezencuandosepodraguardarunasolaversin
yunospequeosficherosconesasdiferenciasocurridasentreunaversin
ylasiguiente.Deestaformapodranaplicarsesecuencialmenteparair
recuperandosucesivamentelasversionesanterioresencasodenecesidad.
Cuandosedesarrollaunaaplicacinsevanintroduciendosucesivamente
cambios en los programas y para poder recuperar versiones antigas
habraqueirsalvandoyconservandocadanuevaversin.Losprogramas
que se utilizan para el mantenimiento de distintas versiones de una
aplicacin suelen basarse en esta idea para ahorrar espacio de
almacenamiento.

'vim'versus'vi'

En Linux existe un editor 'vi' muy mejorado que se llama 'vim'. Este
editor es muy similar a 'vi' pero con importantes mejoras. La ms
importantesinlugaradudaseslacapacidaddedeshacerretrocediendo
uno a uno en los ltimos cambios realizados. Esto permite recuperar
aquellodelosdestrozosquedijimosantes.Tambinpermiteresaltarla
sintaxisdeciertosficheroscomo.shellscript,html,lenguajeC,yotros
muchos lenguajes. Este y otros detalles lo hacen muy adecuado para
programar.Elmanejodelcursorenlosdistintosmodosdeleditorresulta
muchomscmodoyunmontndecosasms.

Masadelanteveremosquesepuedenusardistintasopcionesparaqueel
editorfuncioneenlaformaquenosotrosqueramos.'vim'puedeejecutarse
enmodocompatible'vi'(:setcompatible)peroesmejorusarelmodono

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

compatible que nos proporcionar las agradables ventajas sobre el 'vi'


tradicionalqueantescomentamos.(:setnocompatible)Generalmenteen
Linuxseinstala'vim'comosustitutode'vi'deformaqueaunqueusted
teclee 'vi' en realidad puede estar ejecutando 'vim' o 'elvis' u otros
similares.Salgamosdedudas:

$ vi -? | less

Solosileinvitaausarlaopcin'h'hgalo.

$ vi -h | less

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

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

Ahorasivamosaentraryasalireneleditor.

$ vi

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

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

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

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 Editarunnuevofichero
*
** Editarunfichero.(Sielficheroesdesolo
vi<fichero>
* lecturaloeditaraenmodosololectura.
vi<fichero1>
* <fichero2> Editarvariosficherossucesivamente.
<fichero3>...
** viR<fichero> Editarenmodosololectura.
Editarrecuperandomodificacionesno
** vir<fichero>
salvadas.
MODOCOMANDOS
Sepasadesdeelmodoentrada(insercinoreemplazo)mediante
<ESC>.
Movimientosdelcursor .
** h Carcteranterior
** <ENTER> Lineasiguiente
** j Lineasiguiente
** k Lineaanterior
** <ESPACIO> Carctersiguiente
** l Carctersiguiente
* L Ultimalineadelapantalla
* H Primeralineadelapantalla
* M Lineacentraldelapantalla
* <CTRL+B> Retrocesodepgina

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

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

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

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

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

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

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

* :g/<s1>/s//<s2>/gc demperopidiendoconfirmacin.
* :n Siguientedocumento.
* :args Mirarficherosaeditar.
* :abmn Abreviaturas.Teclear1sesustituyepor2
* :unabm Desabreviar.
Crearmacro(mhacen)(Verejemplos
* :mapmn
conmacros)
Crearmacroenmodoinsercin(mhace
* :map!mn
n)
* :unmapm Destruirmacrom
* :unmap!m Destruirmacrodeinsercinm.
* :cd Cambiardedirectorioactual.
Activarvisualizacindenmerosde
** :setnu
lnea
Activarvisualizacindenmerosde
** :setnonu
lnea
** :setall Vertodaslasopcionesconsusvalores.
Opcinde'vim'paranoobligaraser
** :setnocompatible
compatible'vi'
** Paravisualizarsiempreelmodoenque
:setshowmode
* nosencontramos.
** Ejecutaruncomandoenunasubshell.
:!<comando>
* (Verejemploscon!)

Muchosdeestoscomandospuedenaplicarsedentrodeunrangode
lneas.Unnmerodelneapuedevenircomounnmero,unpunto,
un$.

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

Unpunto . Lneaactual
Unpunto .N NLneasantesdelaactual
Unpunto .+N NLneasdespusdelaactual
Unnmero N LneaN
Un$ $ Ultimalnea.
Desdelaltimaalaprimeralnea
Un$ %
(Abreviaturade1,$).

** :#linea1,#linea2w
Salvardesde1hastala2en<fichero>
* <fichero>
:#linea1,#linea2co
** Copiardesde1hasta2en3.
#linea3
:#linea1,#linea2mo
** Moverdesde1hasta2en3.
#linea3
** :#linea1,#linea2de Borrardesde1hasta2.
Sustituirlaprimeraocurrenciaencada
:#linea1,#linea2
** lineadesde1hastala2lacadena<s1>
s/<s1>/<s2>
porlacadena<s2>
Sustituirlaprimeraocurrenciaencada
:#linea1,#linea2
** lineadesde1hastala2lacadena<s1>
s/<s1>/<s2>/c
porlacadena<s2>conconfirmacin.
Sustituirtodaslasocurrenciasencada
:#linea1,#linea2
** lineadesde1hastala2lacadena<s1>
s/<s1>/<s2>/g
porlacadena<s2>
Sustituirtodaslasocurrenciasencada
:#linea1,#linea2
** lineadesde1hastala2lacadena<s1>
s/<s1>/<s2>/gc
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.

$ cd
$ mkdir cursolinux
$ cd cursolinux
$ vi ej-vi1.txt

Dado que no exista ningn fichero 'ejvi1.txt' estaremos editando un


ficheronuevoydependiendodeleditorusado(nosotrosusaremos'vim')
apareceralgodeltipo.

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

~
~
~
"ej-vi1.txt" [New File]

Est en modo comandos y va a teclear sus dos primeros comandos.


Cuandovea'<ENTER>'enlosejemplos significaquedebepulsaresa
tecla.

:set showmode<ENTER>
:set nu<ENTER>

Acabamosdeactivarlavisualizacindelmododefuncionamientoyla
visualizacin de los nmeros de lnea. Ninguna de estas cosas son
necesariasparaeditarunficheroperoanosotrosnosvanaayudaraver
msclaroloquehacemos.

Ahorapulsaremosla'i'yaparecerenlalineainferiorelindicadordeque
estamosenmodoentradaparainsercin.Desdeestemodointroduciremos
lassiguienteslineasdetexto.

1 Estamos practicando con el editor vi.<ENTER>


2 No parece tan difcil de usar.<ENTER>
3 Ya voy por la tercera linea y no ha ocurrido
nada grave.<ENTER>
4 <ENTER>
5 <ENTER>
6 Como he saltado un par de lneas voy por la
linea seis.<ENTER>
7 De momento no escribo nada ms.<ESC>
ZZ

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

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

$ vi ej-vi1.txt

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

:set showmode<ENTER>
:set nu<ENTER>
:3<ENTER>
dd
:1<ENTER>
p

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

1 Estamos practicando con el editor vi.


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

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

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

:w ej-vi2.txt
:4<ENTER>
2yy
:3<ENTER>
p
:3<ENTER>
p
:3<ENTER>
p

Estamosrepitiendovariasveceslalnea'Noparecetandifcildeusar.'
Deberaquedarfinalmenteconesteaspecto.

1 Estamos practicando con el editor vi.


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

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

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

vamosasalirperosinguardarningunodeloscambiosrealizados.Primero
intentaramossalirsinmscon':q'desdeelmodocomandos.

:q

Obtendremos un aviso del editor para no perder las ltimas


modificaciones.

No write since last change (use ! to override)

Perorealmentedeseamossalirsinsalvarasqueintentamosdenuevocon
':q!'desdeelmodocomandos.

:q!

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


vamosaverquepermisostieneestefichero.

$ cat ej-vi1.txt

Estamos practicando con el editor vi.


No parece tan difcil de usar.
Ya voy por la tercera linea y no ha ocurrido nada grave.

Como he saltado un par de lneas voy por la linea seis.


De momento no escribo nada ms.
$ ls -l ej-vi1.txt

-rw-r--r-- 1 xxxx xxxx 216 ago 12 18:24 ej-vi1.txt

Lainformacindepermisospuedeserdiferente.Recuerdequedijimos
quelospermisosdeunficherocuandosecreadependendela'umask'
peroahorasolonosinteresacomprobarefectivamentetenemospermisos

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

paraleeryescribirenestefichero.Vamosaeliminarlospermisosde
escrituradelficheroyvamosaintentareditarlonuevamente.

$ chmod 444 ej-vi1.txt


$ ls -l ej-vi1.txt
-r--r--r-- 1 xxxx xxxx 216 ago 12 18:24 ej-vi1.txt
$ vi ej-vi1.txt

Probablementeaparecerenlalineainferiordesueditorunaadvertencia
dequeestenmodosololectura.

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

Buenoapesardeellovamosaintentarhacercambiosycomoestamos
practicandocontinuaremosconunaseriedecomandosqueannohemos
vistoyquetenamosclasificadoscon'***'.

:3
:.,$ w trozofinal
:1,. w trozoinicial
:1,$ de
:r trozoinicial
:$
:r !date
:$
:r trozofinal
:w tempfich
:w

'readonly' option is set (use ! to override)

Permitiescribirotrosficherosperoseniegaasobrescribirelficheroque
estamoseditandoconloscambiosporqueestenmodosololecturay
sugierequeusemos'!'paraforzarsuescritura.

:w!

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

Enestecasoestamosforzandolasituacinyestamosescribiendoenun
fichero en el que no tenemos permisos pero puesto que somos
propietarios del mismo el editor puede manejar los permisos para dar
permiso de escritura, sobrescribir el fichero y volver a cambiar los
permisosdejandolospermisosoriginales.

Podemosejecutarcomandosdesdeeleditorasqueporquenomiramos
lospermisoscon'lsl'.

:!ls -l

total 6
-r--r--r-- 1 xxxx xxxx 304 ago 12 19:11 ej-
vi1.txt
-r--r--r-- 1 xxxx xxxx 304 ago 12 19:11 ej-
vi1.txt~
-rw-r--r-- 1 xxxx xxxx 216 ago 12 18:28 ej-
vi2.txt
-rw-r--r-- 1 xxxx xxxx 304 ago 12 19:09
tempfich
-rw-r--r-- 1 xxxx xxxx 147 ago 12 19:06
trozofinal
-rw-r--r-- 1 xxxx xxxx 126 ago 12 19:06
trozoinicial

Press RETURN or enter command to continue

Debemos pulsar <ENTER> para volver al editor Puesto que podemos


ejecutar cualquier comando tambin podemos ejecutar bash como una
subshell.Aprovecharemosparaverlosprocesosactivos.

:!bash
bash-2.01$ ps

PID TTY STAT TIME COMMAND


221 2 S 0:00 -bash
893 2 S 0:00 vi ej-vi1.txt
944 2 S 0:00 bash
951 2 R 0:00 ps
bash-2.01$ exit

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

exit

1 returned

Press RETURN or enter command to continue

Porfinestamosdevueltaeneleditor.Vamosacontinuarpracticando
algunoscomandosimportantesquenosquedan.

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

Conla'J'maysculahemosunidodoslneasenuna.Ahoravamosapasar
almodoentradaparareemplazar.

:3<ENTER>
R
XXXXXXXXXXXXXXXXX<ESC>sertar abriendo una linea. Ya
voy por la tercera linea y no ha ocurrido nada grave.

<ESC>
<CTRL+G>

"ej-vi1.txt" [Modified][readonly] line 4 of 10 --40%--


col 44

Desde el modo comandos podemos consultar el nombre del fichero,


cuantas lineas tiene entotal, enquelnea ycolumna estamos,yotras
cosasconsolopulsar<CTRL+G>.

Ahorautilicevariasveceselcomando'u'.Siesten'vim'vercomose
deshacen retrocediendo secuencialmente en las ltimas modificaciones
quehemosrealizado. Luegosiestusando'vim'use<CTRL+R>para

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

avanzardenuevoenlasltimasmodificacioneshastarecuperarlastodas.
Paraterminarsalgacon':q!'

Practiqueconlacombinacinde'yy'o'nyy'y'p'.Oconlacombinacin
'dd'o'ndd'y'p'.Seusanmuchoparacopiarotrasladarpequeosbloques
deinformacin.

Paramoverunalineahacer'dd',luegosituarseenlaposiciondestinoy
hacer 'p'. Para mover varias lineas hacemos algo parecido. Borramos
primerovariaslineasyluegodesdelaposicindestinohacemos'p'.Para
copiarenlugardemoverusaramos'yy'enlugarde'dd'.

Bueno utilice su propia imaginacin e investigue y practique por su


cuenta. Esta leccin no le obliga a digerir conceptos nuevos pero si
requiereiniciativaparapracticarconeleditor.

Existe un comando que lo hemos marcado como esencial cuando en


realidad se usa poqusimo pero es un comando que conviene conocer
porqueenelmomentomsinesperadopuedesernecesariousarlo.Con
estecomando eleditorredibujatotalmenteelcontenidodelapantalla.
Estopuedesernecesarioporqueasuterminalpodrallegarleinformacin
desdeotroproceso.Porejemplounmensajedeerrordelsistemaoun
avisodesuadministradorparaquefinaliceantesde10minutos.Quizs
suadministradoresdelosquerepiteelmensajemsdeunavezyacada
mensajerecibidosupantallaquedatotalmentedestrozada.Nopasanada.
Pulse<CTRL+L>ytodovolveralanormalidad.Estopuedeocurrirle
cuando este usandootroprogramadistintode'vi'yquizs puedausar
gualmente<CTRL+L>.

Recuperarlainformacinperdidapormuerteprematuradeleditor

Otracosaquedebesaberesquecuando'vi'recibeunasealparafinalizar
ordenadamente guardar el contenido de lo que est editando en un
ficherodeseguridad.Pararecuperarestainformacinnecesitarusar'vir
fichero'. Como ejercicio libre le proponemos que empiece a editar un
ficheroquellamaremos'pruebakill.txt'.Escribaunascuantascosasysin

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

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

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

ELEDITORVI(SegundaParte)

Objetivosdeestaleccin

Estaleccinmencionaalgunasposibilidadesavanzadasdeleditor'vi'.Se
supone que el alumno ha estudiado las lecciones precedentes y en
particularelcaptuloanteriordedicadoaleditor'vi'.Esosignificaqueya
sabeeditar.Vamosasuponerqueinclusohapracticadounpocoporsu
cuenta.Porelloloquevamosaexplicarenestecaptuloserdeescasa
utilidadsinohaasimiladolaleccinanterior.

Pocoapocovamosairasumiendounmayordominiodelalumno.Yano
vamos a detallar tan a menudo paso por paso cosas que ya se han
explicadoypracticadomsdeunavez.Esoleobligaraponerunpoco
msdeiniciativaporsuparte.

Los ejemplos de las lecciones anteriores eran prcticas totalmente


guiadas,comandoacomando,peroapartirdeahoratendrqueprobar
cosasnonecesariamenteidnticasalosejemplosquenosotrosutilicemos.

Nosepreocupe.Seguroqueloharmuybien.Sihallegadohastaaques
sealdehaberconseguidounavancesignificativoensusconocimientos,
ycomoLinuxeroseencuentra quizsamediocaminoentreelnovato
brutoyextremadamentetorpeyelrepugnantelistilloinformtico.

Confiamosplenamenteensucapacidad perorecuerdequenosotrosno
somos responsables deloquepuedapasarleasuordenador.Contine
practicando con un usuario distinto de root y un directorio que no
contengainformacinvaliosa.

Seguramente en esta leccin aprenda cosas que algunas personas que


llevan usando 'vi' durante varios aos an no conocen, pero tambin

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

contiene cosas que pueden ser muy importantes para usted. No todos
usamoslasmismascosas.Lamayoradelosdocumentosqueexplicanel
usode'vi'lohacendeformamuyincompleta.Nosotrosnovamosahacer
un tratado completo de este editor porque necesitaramos muchas
lecciones y nos saldramos de los objetivos del curso pero si
procuraremos mostrarle un amplio abanico de posibilidades para que
tengadondeelegir.Enlaprimeraleccinsobre'vi'lemostramosunjuego
reducidodecomandosperosuficienteparadefenderse.Enestaleccinle
damoslaposibilidaddeconvertirseenunvirtuosodeesteeditor.

Bsquedas

Desde el modo comandos se puede usar '/' para buscar. Admite


expresiones regulares. Por ejemplo si introduce '/debian.com' podra
localizarunacadena'debiancom'o'debian:com'ynosolo'debian.com'.
Recuerdequealgunoscaracterescomoelpuntoelasterisco,etctienenun
significadoespecialyparausarlasen'vi'hayqueprecederlasde'\'que
actuarcomocarcterdeescape.Tambinhayqueescaparloscaracteres
comoporejemplo'/'y'&'porquesintenersignificadocomooperadorde
expresinregularsitieneunsignificadoespecialpara'vi'queveremos
cuandoexpliquemoslassustituciones.Novamosavolveraexplicarlas
expresionesregularesporqueyadedicamosunaleccin.Practiqueloque
va aprendiendoyrecuerdequelas expresiones regulares nofuncionan
igualentodaslasaplicaciones.Vamosaponervariosejemplosparasu
usoenbsquedasdesde'vi'.Parabuscar'</TABLE>'habraqueusar'/<\/
TABLE>'.

Es decir que algunos caracteres no los podemos usar tal cual para
buscarlos sino que hay que es caparlos. En el caso anterior hemos
escapado'/'.Tengaencuentaestocuandointenteporejemplobuscarun
carcter'$'enuntexto.

Con'n'buscarlaocurrenciasiguientedelacadenaenelfichero.Con'N'
buscar la ocurrencia anterior. Una vez llegado al final comienza de
nuevolabsquedaporelprincipio.

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

Tambin se puede empezar la bsqueda desde el primer momento en


sentidoascendenteusando'?'enlugarde'/'.Enestecasoloscomandos'n'
y'N'tambinfuncionaranensentidocontrarioqueconelcomando'/'.

Si usamos '/' o '?' sin nada ms a continuacin, se repetir la ltima


bsqueda.

Lasexpresionesregularesofrecengrandesposibilidadescomoyahemos
vistoperoparticularmenteinteresantespara'vi'puedenserlasbsquedas
aprincipiooafinaldeunalnea.Enelejemplobuscaremo'El'aprincipio
deunalneayluego'as'alfinealdelnea.

'/^El'
'/as$'

Sustituciones

Ya dispone de un resumen de todos los comandos de 'vi' que


proporcionamosenelcaptuloanteriorasquelomejorespresentaruna
seriedeejemplosexplicandoparaquesirven.

Vamosaponertresformasdistintasdesustituir'encarnado'por'colorado'
enlastresprimeraslneasdeuntexto,ysolodeseamosqueocurrala
sustitucinenlaprimeraocurrenciadecadalneacaso.Esdecirsiuna
lneacontienevariasveceslapalabra'encarnado'solodeseamossustituir
laprimera.

:1,3 s/encarnado/colorado/
:1,3 s:encarnado:colorado:
:1,3 sencarnadocolorado

Ahora de dos formas distintas vamos a sustituir en todo el texto


'encarnado'por'colorado'.Esdecirsiunalineacontienevariasvecesla
palabra'encarnado'deseamosquelasutitucinserealiceentodasellas.
Paraesoutilizaremosuncomandosimilaralanteriorperofinalizadoen

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

'/g'.Losejememplossolovaranenlaformadeindicarcon'1,$'ocon'%'
labsquedaentodoeltexto.

:1,$ s/encarnado/colorado/g
:% s/encarnado/colorado/g

Ahora si sustituimos en todo el texto 'encarnado' por 'colorado' pero


confirmando cada cambio manualmente. Para eso utilizaremos un
comandosimilaralanteriorperofinalizadoen'/gc'.La'g'tieneelmismo
significadoqueenelcasoanterioryla'c'significa'confirmacin'.

:1,$ s/encarnado/colorado/gc

Vamosausarahoralassustitucionesconexpresionesregulares.

1)Poneradoblelneatodountexto.

:%s/$/\
/g

2)Eliminarblancosytabuladoresafinaldelinea.

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

3)Eliminarblancosytabuladoresalprincipiodelnea.

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

4)Sustituir cualquiersecuenciadeblancosytabuladores porunnico


blanco.

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

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

5)Ponerentreparntesistodoslosnmerosenterosdeuntexto.

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

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

echo 'kkkk'
echo 'kkkk'\''hhhh'

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

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

Deberquedarnosdeestaforma.

echo 'echo '\''kkkk'\'''


echo 'echo '\''kkkk'\''\'\'''\''hhhh'\'''

Bueno lo hemos realizado con 'vi' y a pesar de lo complicado del


resultadosolohemosrealizadotresoperacionessencillas.Ahoraejecute
esteficheroyvercomoobtieneelprimero.

BuenosinoconoceCnoleentusiasmaresteotroejemploperoesode
hacer programas que generan programas nos sirve para practicar las
sustituciones usando 'vi'. Podemos escribir el programa en C que
deseamosgeneraryluegotratarlosustituyendotodaslas'\'por'\\'ytodas
las '"' por '\"'. Es decir escapamos esos dos caracteres que daran

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

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

Lassustitucionesqueacabamosdemencionarserandeestaforma.

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

Edicindevariosficherossecuencialmente

Aleditor'vi'selepuedepasarcomoargumentonosolounficherosino
variosparasereditadosensecuencia.Porejemplo:

$ vi fich1 fich2 fich2

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

$ vi `grep -il acastro *.txt`

Unavezdentrodeleditorhacemoslosiguiente.

:args

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

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

este preparado para editar secuencialmente varios ficheros busque la


cadenaconeloperador'/'yaunquepasemosaeditarelsiguientefichero
seconservaralmacenadalacadenadebsqueda.Estaformadetrabajar
facilitamucholamodificacindevariosficheros.

Paraeditarficherossecuencialmenteleconvienetenerencuentalos
siguientescomandos.Algunosnoloshabamoscomentadotodava.

:args Obtiene la lista de los ficheros


:next Pasa al fichero siguiente
:prev Vuelve al fichero anterior
:rewind Vuelve al primero
:rewind! Vuelve al primero abandonando los cambios en el
fichero actual
:w Salva los cambios del fichero anterior
:q Sale del editor. (Solo si ya se han editados todos)
:q! Sale del editor incondicionalmente.

Edicinsimultaneadeficheros

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

:e fich1
:w
:e fich2
:e! fich3
:e#

Visualizacindecaracteresdecontrol

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

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

dedistinguiruncarctercircunflejorealseguidodeuna'K'esmoviendo
elcursorparaversidedesplazaunoodoscaracterescuandopasamospor
elcarctercircunflejo.Tambinseusaconsimilarsignificadoelcarcter
tilde'~'peroparacaracteresde8bits.

Introduciendocaracteresdecontroleneltexto

Imaginemosquedeseamosintroduciruncarcterdecontrolparaprovocar
unsalto depginaenlaimpresora.Paraellodeberemos introducirun
<CTRL+L>queservisualizadocomo'^L'.Laformadehacerloespulsar
desde el modo insercin el carcter <CTRL+V> y a continuacin el
carcter <CTRL+L>. Es decir el carcter <CTRL+V> acta como
carcter de escape. Podemos pulsar <CTRL+V> y luego una tecla de
funcin,uotrasteclasespeciales.

Tambinsepuedenbuscarcaracteresdecontrol.Paraellotambenhay
queintroducirlosusando<CTRL+V>.

Editeunficherodepruebayprocedaaponervariossaltosdepginaen
distintos lugares. Luego busque con '/' y con '?' los saltos de pgina.
Pruebeainsertarloscdigosdelasteclas<ENTER>y<ESC>,mediante
<CTRL+V><ENTER> y <CTRL+V><ESC> respectivamente. Debern
aparecercomo'^M'ycomo'^['.

Elcomandotilde

Elcomando'~'sustituyeelcarctersituadobajoelcursordemaysculaa
minsculayviceversaavanzandoluegoelcursor.

Operacionesconbloques

Sepuedenmarcarhasta26posiciones('a'..'z')paraunconjuntodeunoo
mas ficheros editados simultneamente. Permite trabajar marcando
principioyfindebloquesparamover,copiaroborrarenvariosficheros.
Sepuedenusarlasmarcasencualquiercomandoensustitucinde'.','$',o

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

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

:'a,'b de
:'b,'b+1 de
:'a,. de
:'a,'b co 'c
:'a,'b mo 'c

Tambin podemos posicionarnos en el lugar de una marca pulsando


comillasimpley<letraminscula>desdeelmodocomandos.Undetalle
interesante es que siempre podemos volver a la lnea donde nos
encontrbamos,laltimavezquedimosunsaltodeposicineneltexto.
Paraellopulsamos''(comillasimpledosveces).

Repeticindelltimocomando

Cuandohayquehacervariasveceslamismacosaresultatremendamente
tilpoderrepetirelltimocomando.Imaginemosquedesdeelmodode
comandos hacemos en una lnea 'RLnea <ESC>' para sustituir 6
caracteresporlacadena'Lnea'Inmediatamentedespusdeelloyantes
dehacerningunaotracosapodramossituarnosenotralneaypulsar'.'
(punto)pararepetiresemismocomandoyluegocambiaraotrayotra
lneayvolverapulsar'.'puntoacadavezparaefectuarelmismocambio

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

en varios sitios. Tamben mencionamos la posibilidad de ejecutar un


comando del sistema operativo lanzando una subshell. Pues bien este
tipodecomandos':<comando>'puedeserrepetidousando':!!'

Tabulacin

Elcarcterconlatecla<TAB>oconelcarcter<CTRL+I>insertarun
carcterdetabulacin.Elanchodelatabulacinserpordefectoiguala8
espacios.Estopuedeservariadoporejemploa5con':settabstop=5'.Si
deseamos aadir untabulador alprincipio delnea enlassiguientes 7
lineasalaposicindelcursorpodemoshacer.'7>>'.Tambensepodra
haber hecho lo mismo con ':.,.+7 >>'. Para insertar un tabulador a
principiodecadalneadeltextosera':%>>'Cuandoseusaeleditorpara
editar fuentes de programas puede resultar til usar la indentacin
automtica.'setai'paraeliminarlaindentacinautomticausaremos'set
noai'. Sien alguna ocasinnecesitasustituir todoslostabuladores por
caracteresenblancouseelcomando'expand'.Noesuncomandode'vi'
sinodelSO.Consulteconelmansusintaxisylasdistintasopciones.Para
hacer una prueba edite un fichero insertando tabuladores y luego
conviertalodelasiguienteforma.

expand fichero > ficheroexpandido.

Abreviaturas

En 'vi' hay muchos detalles pensdos a ahorrar pulsaciones de declas.


Vamosaverelcomando':ab'Siestacostumbradoalusodeabreviaturas
leresultarmuyprctico.Puededefinirlasabreviaturasquequierayuna
veztecleadasenmodoentradadedados(insercionosobrescritura)sern
sustituidasporlacadenaquedesee.Vamosausardosabreviaturasuna'ci'
para 'Ciberdroide Informtica' y otra 'INMHO' para 'en mi humilde
opinin'.Tambinvamosalistarlasabreviaturasdefinidas.

:ab ci Ciberdroide Informtica

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

:ab INMHO en mi humilde opinin


:ab

Usesuspropiasabreviaturasenuntextoyobservecomolaabreviaturano
serinterpretadasilasecuenciadecaracteresformapartedeunapalabra.

Macros

Esposibleprogramarmacros.Porejemplovamosahacerunamacroque
mueva4lneasalfinaldelfichero

:map xxx 4dd:$^Mp


:map

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

Podemoseliminarlamacroqueacabamosdecrearcon'unmap'

:unmap xxx

Muchas veces se usan las macros para definir comandos asociados a


teclasespeciales.Paraellohayqueconocerlasecuenciadecaracteresque
envan esas teclas. Si en modo insercin usamos <CTRL+V><F2>
obtendremos '^[[[B'. Pero tambin podemos usar '<F2>' para definir
macros.Vamosaponeralgunosejemplosprcticos.

F2(FiltroPGP)Firmar.

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

:map [[B 1G!Gpgp -satf 2>/dev/tty

Seralomismosiusaramos'<F2>'enlugarde'^[[[B'.

:map <F2> 1G!Gpgp -satf 2>/dev/tty

F3(FiltroPGP)Encriptar

:map [[C 1G!Gpgp -eatf 2>/dev/tty

F4(FiltroPGP)Desencriptarycomprobarfirma

:map [[D 1G!Gpgp 2>/dev/tty; sleep 7

F5(Filtroispell)Correctorortogrfico.

:map [[E :w
:!ispell %
:e!

Opcionesdevi

Sera absurdo pretender explicar en una leccin todo el editor 'vi'.


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

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

precedidade'no'.Porejemplo':setnonu'o':setnonumber'.Lasopciones
quedebentomarunvalornumricoseestablecenconelnombredela
opcinseguidade'='yelvalor.Porejemplo':settabstop=5'

Configuracindeleditor

Elficheromsestndarparaconfigurar'vi'encualquierSOdetipoUnix
es'~/.exrc'.Comoalternativasepuedeusarficherosmsespecficospara
eleditorconcretoqueestemosusando.Porejemploenelcasode'vim'
tenemos '~/.vimrc'. Compruebe si existe un ejemplo '/etc/vimrc' en su
Linuxymiresucontenido.Setratadeunficherodeejemploparacopiarlo
en'~/.vimrc'Contienealgunasconfiguracionesquepuedenresultartiles.
Elcarctercomilladoble'"'seusaparaconsiderarelrestodelalnea
comouncomentario.Siconsideraqueeleditortieneuncomportamiento
queustedconsideraincmodoquizssedebaalaexistenciadealgunas
opcionesquenoseadaptanalusoqueusteddaasueditor.Porejemplo
paraeditarprogramasCpuederesultarcmodolaautoindentacinpero
nolegustarquepartalaslneas automticamentecuandoexcedanun
determinado ancho. Tambin es buena idea incluir en su fichero de
configuracin lasabreviaturas ylasmacrosquedeseeusar.Yahemos
visto algunas yseguramente yasehapreguntadocomohacer parano
tenerqueintroducirlascadavez.Esbuenoperderunpocodetiempoen
personalizareleditor.

Tag

ParaeditarfuentesCporejemploresultamuypractico.Supongamosque
tenemos un fuentellamado pingpong.c.Crearemos enprimerlugar un
fichero tags ejecutando "ctags pingpong.c" (ver ctags(C)). Se crea un
ficherotagsquecontendrporejemplolosiguiente:

plot pingpong.c ?^plot(x, y, ch)$?


salir pingpong.c ?^salir(s)$?

Con ello se referencian las funciones. Para editar el fichero podemos


hacer vi tplot. Aparecera el cursor en la posicin de esa funcin. Si

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

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

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

PROGRAMACIONSHELLSCRIPT(PrimeraParte)

Queesunshellscript

Ya vimos hace algunas lecciones una introduccin al interprete de


comandos de Linux (shell). Vamos a ampliar nuestros conocimientos
sobrelashellysibienantesconsideramosalashellcomouninterpretede
comandosenestaleccinveremosqueesmuchomsqueeso.Lashellde
Linux que vamos a usar es la Bash que como ya dijimos es un
superconjunto de la BourneShell. Sin lugar a dudas esta leccin le
permitirdarunsaltoenormeenelaprovechamientodesuSOLinux.

Conestaleccinylassiguientesnosacercamosalmomentoenqueusted
podr presumir ante algunos de sus amigos de haber realizado en su
flamanteSOcosasqueellosnosabenhacerconGindos,aunqueellos
podran presumir de su habilidad cerrando las ventanas del General
FailiureydelDoctorGuasn.

Ellenguajeshellscriptesmuyverstilaunquehayqueadvertirquees
bastanteineficiente.Sonmuchomseficienteslosprogramasescritosen
lenguajeC.EsteesellenguajeenelqueseescribielkerneldeLinuxy
otrosmuchosSO.ElBashnoestaneficientecomoelC.Elvalordel
lenguaje shellscriptes que permite hacer cosas complicadas con muy
poco esfuerzo en perfecta combinacin con una serie de comandos
tambin muy potentes disponibles en Linux . Verdad que suena
interesante?AlgunaspartesdelSOquenopertenecenalkernelestn
escritas en shellscript. Por ejemplo muchos comandos que se van
ejecutando en secuencia mientras el sistema arranca son programas
realizadosenshellscriptasquelaineficiencianoesningnobstculo
paraciertastareas.Porelcontrarioparaunadministradortenerciertos
programasdelsistemaenshellscriptlepermiteretocarlosasugustocon
granfacilidad.

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

Despus de hacer login en el sistema obtendremos una sesin con el


intrprete de comandos asociado a nuestro usuario. (Esta asociacin
figuraenelfichero'/etc/passwd'juntoquizsconlaclaveencriptaday
otrascosas).Decimosquizsporquelaclavenosiempreesguardadaen
estefichero.Laraznesquepeseaestarencriptada/etc/passwdesun
fichero que cualquiera puede leer y resulta ms seguro otro sistema
llamadoshadow.Que/etc/passwdsealegiblenospermiteconsultarentre
otrascosascualesnuestrashelleneliniciodeunasesin.Desdeesta
sesinpodemosirintroduciendoordenesdesdeeltecladoperonuestro
interpretedecomandosnodejadeserasuvezunprogramanormalcomo
cualquierotro,asquesituviramosqueteclearvariascosaspodramos
guardarestasordenesenunficheroyredirigirlaentradaestndardela
shellparaquetomelaentradadesdeelficheroenlugardehacerlodesde
elteclado.

Vamos a ver unejemplo paramostrarfechayhoraenletras grandes.


Tecleeelcomandosiguiente:

$ banner `date '+%D %T'`

Ahoravamosapracticarrepasandounpocolasnocionesqueyavimosen
el primer captulo dedicado al shell script porque son conceptos que
convieneasentar.Paraellovamosaguardarestecomandoenunfichero
parapoderejecutarlocuandonosapetezca.Previamentenossituamosen
el directorio '/tmp' como es costumbre y nos aseguramos de no estar
usandoelusuariorootniningnotrousuarioconprivilegiosespeciales.

$ # Nos situamos en /tmp


$ cd /tmp
$ # Generamos el fichero con el comando
$ echo "banner `date '+%D %T'`" > fichero_ordenes
$ # Comprobamos el contenido del fichero
$ cat fichero_ordenes

banner 08/02/00 20:26:30

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

!! Vaya !! Estonoesloquequeramos hacer.Estecomando siempre


mostrara la misma fecha y hora y seguramente no pretendamos eso.
Dadoquehemosusadolasdoblescomillassehaproducidolaexpansin
delalneaderdenesconcretamenteeloperadorgrave.Sienlugardelas
doblescomillasusramoslascomillassimplesnosehabraproducidoese
errorperoexistenyacomillassimplesdentrodelpropiocomandoyla
shelltomaraelcierredelacomillasimpleenunlugarquenoeselque
nosotros desebamos. Todo esto lo comentamos a modo de repaso.
Entoncescomotendramosquehabergeneradoestecomando?Aques
donde el listillo dice que usando un editor de texto. Bueno al fin de
cuentasyasabemosusarel'vi'no?Buenopuesvamosprimeroahacerlo
sineditor.Recuerdaquemencionamoslaposibilidaddeescaparunsolo
carcterconelcarcter'\'?Intentemosdenuevo.

$ # Generamos el fichero con el comando


$ echo "banner \`date '+%D %T'\`" > fichero_ordenes
$ # Comprobamos el contenido del fichero
$ cat fichero_ordenes

banner `date '+%D %T'`

Ahorasi.Vamosausarlashelldelamismaformaqueharamosconun
programanormalredirigiendolaentradaestndardesdeestefichero.Por
lotantoelficherotienetratamientodedatosysoloserequierepermisode
lecturaparaejecutarlodeestaforma.

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

Para ejecutarlo sin redirigir entrada salida podemos pasar como


argumentoelnombredelfichero.Nuevamentesoloharfaltapermisode
lectura.

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

$ # Ejecutar pasando el nombre del fichero como


argumento
$ sh fichero_ordenes
$FIN

Ejecucindeunshellscriptdirectamentecomouncomando

Para ejecutarlo directamente como un comando necesitamos darle


permisodeejecucin.

$ # Ejecutar pasando el nombre del fichero como


argumento
$ chmod +x fichero_ordenes
$ ./fichero_ordenes
$FIN

Lodel'./'antesdelejecutableresultarnecesariosieldirectoriodondese
encuentra el ejecutable no figura en la variable '$PATH' En realidad
ocurrealgomuysimilaralcasoanteriorporquetambinsearrancauna
subshellquetomacomoentradaelfichero.

Estoocurrecuandolashelldetectaqueelejecutableestenformatode
texto.Sisetrataradecdigobinarioloejecutarasinarrancarunasub
shell. Para averiguar que tipo de fichero se trata, la shell mirar los
primeroscrteresquecontiene.Losficherosejecutablessuelentenerun
pardebytesinicialesqueservirnparaidentificareltipodefichero.En
casocontrarioseasumequeesunshellsrcip.

Aestosdoscaracteresinicialesjuntosformanloquesedenominanmero
mgico. Es solounacuestin denomenclatura. El SO lo vecomo un
nmeroenterodedosbytesynosotrosdesdeuneditorlovemoscomodos
caracteres.

Existeunprogramallamado'file'queutilizaestainformacinascomola
presenciadeciertospatronesparaidentificareltipodeunfichero.

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

Seusaeltrminoscriptparaficherosquesonlegiblesyejecutables.Es
decirelpropiofuentedelprogramaesejecutable.Fuentedeunprograma
esloqueescribeelprogramador.EllenguajeCnoesunlenguajetipo
scriptyaqueelfuentenoesejecutable.Hacefaltauncompiladorque
traduceelcdigofuenteacdigopropiodelamquina.LosScriptnose
ejecutandirectamenteenlamquinasinodentrodeunprogramaqueva
interpretandolasinstrucciones.Buenoengeneralestoesmsomenosas.

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

Ejecucinconlashellactual

Hastaestemomentosiemprehemosarrancadounasubshellquelealas
ordenesdelfichero,lasejecutabaydespusterminabaymoracediendo
elcontrolnuevamentealashelloriginalquearranclasubshell.

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

Existeunaformadedecirlealashellactualqueleayejecuteunaseriede
rdenes por si misma sin arrancar una subshell. Para ello hay que
anteponerunpuntoyunblancoalnombredelcomando.Nuevamentesolo
harfaltapermisodelectura.

$ # Ejecutar ordenes de un fichero desde la shell


actual
$ . ./fichero_ordenes

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

$echo echo \$PPID \$$ > fichero_ordenes


$ bash fichero_ordenes

213 2396

$ . ./fichero_ordenes

1 213

Evidentementecuandopruebeesteejemploobtendrunpiddistintode
213 pero lo interesante es ver como ambas ejecuciones establecen
claramentequelaprimerafueefectuadaporunprocesohijodelashell
queseejecutaensegundolugarusandoelpunto,seguidodelespacioy
del'fichero_ordenes'.

Losprocesoshijosheredanelentorno(variablesyotrascosas)desdeel
procesopadreporlocualunpadresipuedecomunicarseconsuhijode
esaforma.Porelcontrariounprocesohijo(subshellennuestrocaso)
jamspuedecomunicarsedeesaformaconsupadre.Resultaimposible
que un proceso hijo comunique valores de variables del entorno a su
padre.Sideseamosmodificarvariablesdelentornoejecutandounshell
scriptnopodremoshacerlonuncasilaejecutamosdesdedentrodeuna

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

subshell. Por el contrario deberemos usar algo del tipo '.


./fichero_ordenes'comoacabamosdever.

Existeunficheroeneldirectorioinicialdecadausuarioqueconsisteen
unaseriedeordenesinicialesparashell.EnelcasodelaBashestefichero
es '~/.bash_profile'. Podemos ejecutarlo si queremos pero este tipo de
ficherosincluyenordenesparainicializarvariablesentreotrascosas,as
queloadecuadoseraejecutarlodesdelashellactual.Hagalosiguiente:

$ cd
$ . ./.bash_profile

Observequehaytrespuntosenelltimocomandocontressignificados
distintos.Elprimeroesparaejecutarconlashellactual,elsegundoes
paraindicareldirectorioactual,yelltimoformapartedelnombreyse
usaparaquenoseatanvisibledadoqueunpuntoalprincipiodelnombre
deunficheronoserexpandidoporlashellcuandousemos'*'.

Vamosacomprobarlaaccindelnmeromgico.Paseaundirectorio
parapracticarsusejercicios,yediteunnuevoficheroquedebellamarse
'aviso'.

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


comando"

Ahoraediteotronuevoficheroquellamaremos'comando'.

#!/bin/bash /tmp/aviso
echo "COMANDO"

Vamos a ejecutar nuestro shellscript de dos formas distintas y


observamos que el resultado no es el mismo. En el segundo caso se
ejecuta el script 'aviso'. Este ltimo ejemplo no es completo ya que

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

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


independientedeltextoymostrarsiempreunmensajedeaviso.

$ # (1) Se ejecuta usando una sub-shell pero en este


$ # caso se pasa un argumento a la sub-shell y por ello
$ # no se ejecuta el cdigo del fichero comando.
$ chmod +x aviso
$ ./comando

Error este shell-script debi arrancarse con . /comando

$ # (2) Ahora ejecutamos con la shell actual

$ . ./comando

COMANDO

Laexplicacineslasiguiente.Elnmeromgicoindicaconqueshellse
ejecutar el script. Nosotros hemos puesto en lugar una shell sin
argumetosqueejecutaraesetextounashellquerecibeunargumento.Eso
hace que se ejecute el comando pasado como argumento en lugar de
tomar el texto del fichero que contiene el nmero mgico. Cuando
ejecutamosconlashellactuallainformacinsiguientealnmeromgico
nosertenidaencuentaporquesupondraarrancarunasubshell.

Esunejemplorebuscadoperohayqueintentarcomprenderloquesucede
endistintassituacionesporqueellenguajeshellscripttienesusrarezas.

Ejecutarenunasubshellusandoparntesis

Ya que estamos con el tema de la subshell vamos a comentar como


funciona el uso de los parntesis desde la linea de rdenes. No es
necesario realizar un script para ejecutar algo en una subshell (lista)
Ejecutaunalistadeordenesenunasubshell.

$ var1=888
$ ( var1=111; echo $var1 )

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

111
$ echo $var1

888

Estamos avanzando muy deprisa, y por eso tenemos que practicar


bastante para consolidar los conocimientos. No siempre resulta trivial
averiguarcomofuncionanlascosas.Observeelsiguienteejemplo:

$ echo $$ ; ( echo $$ ; ( echo $$ ) )

218
218
218

Nuevamente el resultado puede ser distinto en su ordenador pero lo


importanteesque'echo$$'pareceobtenerelmismopidpeseaocurriren
distintas subshells. Cuando parece ocurrir algo distinto de lo que
nosotros esperbamos resultamuytil usarelmodotraza con'setx'.
Repetimoselejemplomisteriosodeantes.

$ set -x
$ echo $$ ; ( echo $$ ; ( echo $$ ) )

+ echo 218
218
+ echo 218
218
+ echo 218
218
$ set +x

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

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

Ahora que ya sabemos que es un shellscript vamos a ir aprendiendo


cosasperonosepretendeunadescripcinexhaustivadelaBash.Puede
consultarconmanbashlasdudasquetenga.Recuerdequeelmannoes
unaherramientadeestudiosinodeconsulta.Cuandoconsulte'manbash'
vercantidaddeinformacinrelativaacosasquenohemosexplicadoy
mannoexplicacasinada.Porellomuchascosasde'manbash'nolas
entederaunquesiemprequedaelrecursodeprobarlascosasquenose
comprendenparavercomofuncionan.

Se irn proponiendo ejemplos que ilustren unos cuantos conceptos


bsicos. Una vez que haya practicado con estos ejemplos habremos
conseguidodarlosprimerospasosenlaprogramacindeshellscriptque
son los que ms cuestan. Despus un buen mtodo para continuar
aprendiendoaprogramarenshellscriptesintentarcomprenderlasshell
script que encontremos enelsistemaconayudadelmanual onlinede
unix.

Ellenguajeshellscriptesunpocoespecialconrelacinaotroslenguajes
yaquelosblancosylossaltosdelneatienenunsignificadoquehayque
respetar y la expansin de ordenes es algo que puede resultar
desconcertante.Esolohaceunpocoantipticoalprincipio.Esimportante
tener una buena base de conocimientos que en estos momentos ya
tenemos,ycontinuarpracticando.

Pasodeparmetrosaunshellscript

ImaginemosqueustedtienedificultadparapasardePtasaEuros,yquiere
hacerunprogramitaparapasardeunamonedaaotracmodamente.Edite
elcomandosiguiente,yluegoejecuteloenlaforma'pta2eu35':

#pta2eu
echo $1 '/ 166.386' | bc -l

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

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

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

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

Laejecucindeestapruebaquedaracomosigue.

$ ./pru_parametros

Numero de parmetros = 0
$0= ./pru_parametros
$1=
$2=
$3=
$*=
$ ./pru_parametros hola

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

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

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

$*= pararm1 param2 param3


$

Noexistelaposibilidaddeusar$10paraaccederalparmetrodcimo.En
lugar de acceder de esta forma habra que usar un comando interno
llamado'shift'.Elefectodeestecomandoesdesplazarlosargumentosuna
posicin.Deestaforma$1sepierdey$2pasaraser$1,$3pasaraser
$2,etc.Siexistanmsde10parmetrosahoraeldcimoqueantesera
inaccesible pasar a ser $9. $0 no vara. Se pueden desplazar varios
parametros de un golpe pasando un nmero a la funcin 'shift' por
ejemplo'shift5'desplazaraa5parmetros.

Vamosaeditarunficherodeejemploquellamaremos'pru_shift':Debe
editarlo, darle permisos de ejecucin con 'chmod +x pru_shift' y
ejecutarlo pasando distintos parametros. './pru_shift pararm1 param2
param3'.Observequeesunapruebaparecidaalaanterior.Intenteutilizar
susconocimientosdeviparanotenerquetecleartanto.Recuerdeque
puede leer un fichero desde dentro del editor y que puede duplicar
bloquesdeinformacindevariasformas.

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

Laejecucindeestapruebaquedaracomosigue.

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

$ ./pru_shift pararm1 param2 param3

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

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

PROGRAMACIONSHELLSCRIPT(SegundaParte)

Funciones

Se pueden definir funciones que podrn ser llamadas por su nombre


permitiendo el paso de parmetros de la misma forma que cuando se
llama a una shell. Tambin puede devolver cdigos de retorno. Las
variablesalteradasdentrodeunafuncintienenefectovisiblefueradela
funcinyaqueunafuncinnoseejecutainvocandoaunasubshell.Una
funcin se puede definir en un shellscript o en la propia linea de
comandos.Sisehaceestoltimosercomosiaadiramosuncomando
interno.

$ fff() { echo "---------------------------" ; }


$ fff

---------------------------

Sitecleamos'set'despusdeestoveremostodaslasvariablesdefinidasy
tambinaparecerestafuncinqueacabamosdecrear.

$ set

Ahoravamosaeditarunshellscriptqueuseunafuncin.Editeunfichero
quellamaremos'pru_funcion1'quetengalosiguiente.

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

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

echo '('$2')'
var=1234
}
## main ##
funcion1 111 222
echo $var

Ahoradamospermisosdeejecucinyejecutamossimplementemediante
'./pru_funcion1'.

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

Editeypruebeelsiguientecdigo.

# Visualizar los parametros del 6 al 14


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

Paradefinirlasintaxisdeunafuncinenshellscriptpodramosusarlo
siguiente:

_nombre_funcion_ () { _lista_de_ordenes_ }

Una lista de ordenes sera una o ms ordenes separadas por algn


operadorcomoporejemplo';','||','&&','&'o.Recuerdequeelshell
scripttieneunsignificadosimilara';'ysideseasuprimirestesignificado
deberprecederinmediatamentecon'\'paraescaparelcarcteryqueno
sea interpretado por la shell. En una cadena delimitada por comillas

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

simplesodoblesnotieneestesignificadoperopuedeusarse'\'paraevitar
queelcarcterquedeinsertadoenlacadena.

$ echo \
> kkk\
> xxx

kkkxxx

Cdigosderetorno

La palabra reservada 'return' interrumpe la ejecucin de una funcin


asignandounvaloralcdigoderetornodeesafuncin.Suusonoes
necesario al final de la funcin. La palabra reservada 'exit' termina la
ejecucindeunshellscriptliberandorecursosydevolviendouncdigo
deretornoelintrpretedecomandos.'exit0'terminarretornandocero.Si
soloponemos'exit'elcdigoretornadosercomosihiciramos'exit$?'.
Esdecirretornaelvalordelltimocomando.

Ahora edite un fichero que llamaremos 'pru_funcion2' que tenga lo


siguiente.

# pru_funcion2
# Funcion que devuelve un cdigo de retorno. Y shell
que devuelve otro
funcion2()
{
var=1234
return 33
var=4567
}
## main ##
funcion2
echo $?
echo $var
exit 888

Ejecutaremosesteejemplo

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

$./pru_funcion2

33
1234

Comandostrueyfalse

Los comandos que finalizan correctamente suelen retornar 0. Los que


finalizanconalgnerrorsuelenretornarunvalordistintode0ydeesa
formadistintoscdigosderetornopuedenindicardistintascausasdeerror
onoxito.

Enunaexpresinlgicadondeloqueinteresaessimplementedistinguir
entrealgoquesecumpleoquenosecumplesetomar0comovalor
lgicoTRUE(oseacierto)ydistintode0setomarcomoFALSE(falso).

'true'y'false'soncomandosquenohacennada.Simplementeretornanel
valorlgicoTRUEoFALSErespectivamente.Elvalorde$?siempre
devuelveelltimocdigoderetornoobtenidoporlashelldespusde
ejecutarelltimocomando.

Ejemplos:

$ true ; echo $?

0
$ false ; echo $?

Esperamosqueejemplostancomplicadoscomoestosdosltimosnole
desanimenparacontinuarconelcurso.

Comandotest

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

Como ya dijimos el lenguaje shellscript utiliza muy frecuentemente


comandosexternosdelsistemaoperativo.Queremosexplicarelcomando
'test'antesdeexplicarlassentenciascondicionalesdebashporquedeesta
formapodremosusarejemplosmscompletos.

'test'esuncomandoexternoquedevolveruncdigoderetorno0o1
dependiendodelresultadodelaexpresinquesigaacontinuacin.

Seusamuchsimoytienedosformatos.'test<expr>'o'[<expr>]'.ambas
formassonequivalentes.

LasexpresionesdeestetipoquesolopuedenvalerTRUEoFALSEse
denominanexpresioneslgicas.

Comprobacinsobreficheros

r<fichero> TRUEsielficheroexisteyeslegible.

w<fichero> TRUEsielficheroexisteysepuedeescribir.

x<fichero> TRUEsielficheroexisteyesejecutable.

TRUEsielficheroexisteyesdetiporegular
f<fichero>
(normal).

d<fichero> TRUEsiexisteyesundirectorio.

TRUEsiexisteyesundispositivoespecialde
c<fichero>
caracteres.

TRUEsiexisteyesundispositivoespecialde
b<fichero>
bloques.

p<fichero> TRUEsiexisteyesunpipe(fifo).

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

u<fichero> TRUEsiexisteytieneelbitsetuserID.

s<fichero> TRUEsiexisteytienetamaomayorque0.

Comparacindecadenas

z<cadena> TRUEsiesunacadenavaca.

n<cadena> TRUEsiesunacadenanovaca.

TRUEsiambascadenassonidnticas.OJOhay
<cadena1> =
dejarespaciosaunladoyotrodelsignoigual
<cadena2>
paranoconfundirlaordenconunaasignacin.

<cadena1> !=
TRUEsisondistintas.
<cadena2>

TRUEsinoescadenanula.(Unavariableque
<cadena> no existe
devuelvecadenanula).

Comparacindenmeros

<num1> eq
TRUEsiambosnmerossoniguales.
<num2>

<num1> ne
TRUEsiambosnmerossondistintos.
<num2>

<num1> gt
TRUEsi<num1>mayorque<num2>.
<num2>

<num1> ge
TRUEsi<num1>mayoroigualque<num2>.
<num2>

<num1> lt TRUEsi<num1>menorque<num2>.

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

<num2>

<num1> le
TRUEsi<num1>menoroigualque<num2>.
<num2>

Operadoreslgicos

OperadorlgicoNOTretornaTRUEsi
!
<expresin_logica>es
<expresin_logi
FALSEyretornaFALSEsi
ca>
<expresin_logica>esTRUE.

Operador lgico AND retorna TRUE si


<ExprLogi1>a
<ExprLogi1>y<ExprLogi2>sonambasTRUE
<ExprLogi2>
yFALSEencasocontrario.

Operador lgico OR retorna TRUE si


<ExprLogi1>o
<ExprLogi1> o <ExprLogi2> son alguna de
<ExprLogi2>
ellasTRUEyFALSEencasocontrario.

Agrupacindeexpresiones

Se pueden usar parntesis para agrupar


(<expr>) expresioneslgicas.EsdecirquevalganTRUE
oFALSE

Ejemplos:

$ test -r /etc/passwd ; echo $?

0
$ test -w /etc/passwd ; echo $?

1
$ test -x /etc/passwd ; echo $?

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

$ test -c /dev/null ; echo $?

0
$ test -r /etc/passwd -a -c /dev/null ; echo $?

0
$ test -w /etc/passwd -a -c /dev/null ; echo $?

1
$ test -r /etc/passwd -a -f /dev/null ; echo $?

1
$ [ -s /dev/null ] ; echo $?

1
$ [ ! -s /dev/null ] ; echo $?

0
$ [ "$$" = "zzzzzzzzzzzz" ] ; echo $?

1
$ [ 0 -lt $$ ] ; echo $?

0
$ [ 0 -lt $$ -a true ] ; echo $?

Comandoexpr

Estecomandoadmitecomoparmetrosloselementosdeunaexpresin
aritmtica pero hay que recordar que algunos operadores deben ser
escapadoscon'\'.Porejemplo.

$ expr 11 \* 2

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

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

Elcomando'expr'estilperonodejadeseruncomandoexternoyporlo
tanto su uso resulta ineficiente. Afortunadamente la propia shell tiene
capacidaddeevaluarexpresionesaritmticas.

ExpresionesaritmticasdentrodeBash

Lashellpordefectoasumequetodaslasvariablessondetipocadenade
caracteres.Paradefinirunavariabledetiponumricoseusa'typeseti'.
Esto aade un atributo a esa variable para que la shell realice una
expansin distinta sobre esta variable. Para evaluar una expresin
aritmticaasignndolaaunavariableusaremos'let'.

+ MenosunrioyMsunrio

*/% Multiplicacin,Divisin,yResto

+ Suma,yResta

ComparacionesMenoroigual,
<=>=<>
Mayoroigual,Menor,Mayor
==!=
Igualdad,desigualdad

Asignacinsimple,
=*=/=%=+== Asignacinconoperador
(multiplicacin,divisin,resto,suma,yresta)

Ejemplos:

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

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

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

10
$ let j+=3
$ echo $j
13
$ let k=j%3
$ let m=j/3
$ echo '(' $m '* 3 ) +' $k '=' $j
+AMA
( 4 * 3 ) + 1 = 13

Puede que el operador'%' noleresulte familiar. Es eloperador resto


tambinsellamamduloyesloquesobradespusdeladivisin.Lo
ciertoesqueespreferiblecontinuarexplicandootrascosasymsadelante
tendremos oportunidad de poner algunos ejemplos con expresiones
aritmticas.

Hayunaseriedeoperadoresquetrabajananiveldebitsperonovamosa
explicarlosdemomento.

Operadores'&&'y'||'

SonoperadoresANDyORaniveldeshellyposeencircuitode
evaluacincorto.Notienenqueverconlosoperadoresayoyaque
estoseraninterpretadosporelcomando'test'.Estosoperadores'&&'y'||'
serncolocadosseparandocomandosquelgicamenteretornansiempre
algnvalor.

'<comando1> && <comando2> && <comando3>' significa que debe


cumplirse <comando1> y <comando2> y <comando3> para que se
cumpla la expresin y '<comando1> || <comando2> || <comando3>'
significaquedebecumplirse<comando1>o<comando2>o<comando3>
paraquesecumplalaexpresin.

Si el resultado de '<comando1> && <comando2> && <comando3>'


fuera 0 (TRUE) significara que los tres comandos han retornado 0
(TRUE).Siporelcontrarioelresultadohubierasidodistinto(FALSE)
solosabramosqueporlomenosunodeloscomandosretornFALSE.

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

Supongamos que el primer comando retorn TRUE. La shell deber


continuarejecutandoelsegundocomando.Supongamosqueelsegundo
comando retorna FALSE. En este momento la shell no continua
ejecutandoeltercercomandoporquedaigualloqueretorneelresultado
ser FALSE. La razn es que se necesitaban todos TRUE para un
resultadoTRUE.Elhechodenoejecutarlaspartessiguientesunavezse
sabeelresultadoesloquesellamacircuitodeevaluacincortoysuuso
principaleseldeahorrarejecucionesdeordenesinnecesariasaunquese
puedeusartambienparaejecutarcosassolobajociertascondiciones.

Con el operador '||' (OR) pasa algo similar. Si el resultado de


'<comando1>||<comando2>||<comando3>'fuera1(FASE)significara
quelostrescomandoshanretornado1(FALSE).Siporelcontrarioel
resultadohubierasidodistinto0(TRUE)solosabramosqueporlomenos
unodeloscomandosretornTRUE.Supongamosqueelprimercomando
retorn FALSE. La shell deber continuar ejecutando el segundo
comando.SupongamosqueelsegundocomandoretornaTRUE.Eneste
momentolashellnocontinuaejecutandoeltercercomandoporqueda
igualloqueretorneelresultadoserTRUE.SenecesitabantodosFALSE
paraunresultadoFALSE.

Uncomandonormalcomoporejemplo'grep'o'echo'queterminabien
devuelveTRUE.Sihubiramosredirigidolasalidade'grep'ode'echo'a
unficherosinpermisodeescrituraoaunficheroconunpathinexistente
elretornode'grep'ode'echo'habrasidoFALSEindicandolaexistencia
de error. En otras ocasiones FALSE no indicar error sino que el
comando no tuvo xito. Esto ltimo sera aplicable a 'grep' (patrn
localizadoonolocalizado)peronoseraaplicableauncomandocomo
'echo'.

Veamosunejemplocon'grep'.

$ echo hola | grep hola ; echo $?

hola
0

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

$ echo hola | grep hola > /hh/hh/hh ; echo $?

bash: /hh/hh/hh: No existe el fichero o el directorio


1
$ echo xxx | grep hola ; echo $?

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 $?

AhoraparaAND.

$ # Como un AND no queda hasta que se evala el primer


resultado FALSE
$ # se evaluaran los dos comandos y devolver
igualmente TRUE.
$ echo "hola" && echo "adis"

hola

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

adis
$ # El resultado sera 0
$ echo $?

Elcircuitodeevaluacincortohadeusarsecorrectamente.Sisabemos
que un comando dar casi siempre un resultado que puede hacer
innecesario la ejecucin de otros comandos lo colocaremos en primer
lugar. Los comandos lentos se colocan en ltimo lugar porque de esa
formapuedenosernecesarioejecutarlos.Algunasvecesnonosinteresa
unresultadosinosoloqueseejecuteunaordendependiendodelresultado
de otra orden. Es decir queremos ejecutar solo si se cumple una
condicin.

$ test ! -w fichero && echo "Cuidado fichero sin


permiso de escritura"
$ test -w fichero || echo "Cuidado fichero sin
permiso de escritura"

PROGRAMACIONSHELLSCRIPT(TerceraParte)

Sentenciacondicional'if'

Yahemosvistounaformadehacerlousandolosoperadore'||'o'&&'dela
shell, pero existen formas que pueden resultar ms versatiles y ms
legibles.

if _condicin_
then _lista_de_ordenes_
[ elif _condicin_
then _lista_de_ordenes_ ] ...
[ else _condicin_ ]
fi

Enlugarde_condicin_podramoshaberpuesto_lista_de_ordenes_pero
queremosresaltarqueelcdigoderetornovaaserevaluado.

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

Laspartesentrecorchetessonopcionalesysivanseguidasdetrespuntos
'...' indica que puede presentarse varias veces. Todas las sentencias
condicionales'if'empiezanconlapalabrareservada'if'yterminanconla
palabrareservada'fi'.

Mejor vamos a ilustrar con algunos ejemplos. Deber editarlos y


ejecutarlos.

# Esto siempre mostrara '123'


if true
then echo '123'
fi

Acabamosdeutilizarunacondicinquesiempresecumplir.Vamosa
veralgounpocomsutil.

# Si la variable CMPRT01 est definida y contiene el


nombre de un fichero
# con permiso de lectura se mandar a la impresora con
'lp'
if test -r $CMPRT01
then lp $CMPRT01
fi

Tambin podemos programar una accin para cuando se cumpla una


condicinyotraparacuandonosecumpla.

# Si La variable 'modo' contiene el valor 'lp'


imprimir el fichero $FICH
# en caso contrario sacarlo por pantalla.
if [ "$modo" = "lp" ]
then lp $FICH
else cat $FICH
fi

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

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

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

Para usar este ltimo ejemplo ejectute './tipofichero ..' o './tipofichero


tipofichero'

Tengaencuentaquesibienla'bash'admiteelusode'elif'quizasotras
shellnoloadmitan.

Setenciacondicional'case'

Ya hemos visto que con 'elif' podemos evaluar distintas condiciones


programandounaaccinparacadacaso.

Existeuncasoespecial.Imaginemosquedeseamosevaluarunavariabley
enfuncindeloquecontengahacerunacosauotra.Podramosusaruna
sentenciacondicionalconabundantes'elif'perohayquetenerencuenta
unacosa.Con'elif'tenemosqueirevaluandoacadapasohastaquese

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

cumplaunavezyentoncesseejecutalaaccinyyanoseejecutaninguna
otra porque habremos finalizado. En el caso anterior si hubieramos
introducidoelnombredeunpipeconnombresehabranejecutadovarios
testantesdedeterminarqueeraunpipeconnombre,yesoresultalento.

Si lo que deseamos hacer est en funcin de unvalor utilizaremos la


sentencia condicional 'case' que es mucho ms eficiente porque no
requiereejecutarvariasordenesounaordenvariasvecescomoenelcaso
anterior.

Lasintaxisparalasentenciacondicional'case'seradelasiguienteforma:

case valor in
[_lista_de_patrones_)_lista_de_ordenes_;;]...
esac

Porvalorqueremosindicarelresultadodecualquierexpansinproducida
porlashell.La_lista_de_patrones_sonunoomspatronesseparadospor
elcaracter'|'ycadapatrnesdelmismotipoquelospatronesutilizados
paralaexpansindenombresdeficheros.Elordenesimportanteporque
sevancomprobandoporordenyenelmomentoqueunodelospatrones
corresponda con el valor se ejecutar la _lista_de_ordenes_ que le
correspondayyanoseejecutarnadams.Esfrecuenteutilizarenltimo
lugar un patrn '*)' para que en caso de no encontrar ninguna
correspondenciaconlospatronesanterioresseejecutesiempreunaaccin
por defecto. Edite el siguiente ejemplo y salvelo con nombre
'prueba_case'.

# prueba_case
case $1 in
1) echo Uno ;;
2) echo Dos ;;
[3-7]) echo "Entre tres y siete ambos incluidos" ;;
8|9|0) echo Ocho; echo Nueve; echo Cero ;;
[a-zA-Z]) echo Una Letra ;;
start|begin) echo Comienzo ;;
stop|end) echo Fin ;;
*) echo 'Fallo'

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

esac

Ahoraledamospermisodeejecucinyprobamoscomofunciona.

$ ./prueba_case 1

Uno
$ ./prueba_case 2

Dos
$ ./prueba_case 7

Entre tres y siete ambos incluidos


$ ./prueba_case h

Una Letra
$ ./prueba_case start

Comienzo
$ ./prueba_case begin

Comienzo
$ ./prueba_case aa

Fallo
$ ./prueba_case 12

Fallo
$ ./prueba_case 9

Ocho
Nueve
Cero
$ ./prueba_case stop

Fin

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

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

asquehaciendolascosaslomejorposibleestaremospreparadosenun
futuroparatrabajosmsexigentes.

Entradadedatosconread

La instruccin 'read' permite capturar datos desde la entrada estandar.


Paraelloquedaalaesperadeunfindelinea.Editeelficherosiguientey
llamel'pru_read'.

echo -e "Introduzca su nombre : \c"


read NOMBRE
banner Hola $NOMBRE

Ejecute'./pru_read'.Observequelosdatosintroducidossonguardadosen
lavariableNOMBRE.Sipulsadirectamentelavariabletomarvalor"".

Cuando se usa la instruccin 'read' sin una variable el contenido se


guardar en la variable REPLY pero si lo que desea es guardar el
contenido queda ms claro guardarlo en una variable concreta. Ms
adelanteveremosejemplosqueusanestainstruccin.

Bucles'while'y'until'

while _condicin_
do
_lista_de_ordenes_
done

Enlugarde_condicin_podramoshaberpuesto_lista_de_ordenes_pero
queremosresaltarqueelcdigoderetornovaaserevaluado.

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

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

Existeunbuclemuysimilaryquesolosediferenciaenquenoparanunca
hastaquesecumplalacondicin.Esdecirjustoalrevsqueantes.

until _condicin_
do
_lista_de_ordenes_
done

Editecomo'pru_while1'elsiguienteejemplo.

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

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

Vamosaejecutarelejemploparacomprobarsufuncionamiento.

$ ./pru_while1
aaaaa

(aaaaa)

bbbbb

(bbbbb)

()

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

VemosqueenlaltimaejecucinLINEAvala"".

Bucle'for'

Seproporcionaunalistadeelementosyseejecutaunalistaderdenes
haciendoqueunavariablevayatomandoelvalordecadaunodeestos
elementos.Entreestasordenessepuedeutilizarunnuevobucle'for'.

ElsiguienteejemplofuncionaperoesunamalaideayaquesuponeVarias
ejecucionesdeuncomandocuandosepodahaberhechoconunosolo.
Habrasidomejorhacer'chmod+x*'.

for i in $*
do
chmod +x $i
done

Elsiguienteejemplonofuncionarsinopreparaunpocounaseriede
cosasquesenecesitan.Concretamentedeberdeexistirunfichero'lista'
con varios elementos. Varios ficheros con nombre que empiecen por
SCAN.Variosficheros'*.doc'deloscualesalgunosdeberancontenerla
palabra'CODIGO'.Estudieelcontenidodelejemploquesigue.Editeloy
ejecutelopasandovariosargumentos.Suobjetivoeshacerlofuncionary
entendercomofunciona.

# Para ver distintos modos de manejar listas vamos a


generar todos los
# nombres posibles formados por combinacion de las
partes siguientes:
# Como parte 1 los nombres de ficheros de directorio
actual que
# empiezan por 'SCAN'.
# Como parte 2 los nombres contenidos en el fichero
'lista'.
# Como parte 3 los identificadores 'cxx0 cxx2 bxx5'
# Como parte 4 la lista de parametros $1 $2 $3 .. etc,
# Como parte 5 los ficheros '*.doc' que contienen la
palabra 'CODIGO'.

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

###
for i in `ls SCAN*`
do
for j in `cat lista`
do
for k in cxx0 cxx2 bxx5
do
for l in $*
do
for m in `grep -l "CODIGO" *.doc`
do
echo $i.$j.$k.$l.$m
done
done
done
done
done

Cuandotengamosbuclesunosdentrodeotrosdecimosquesonbucles
anidados.Elniveldeanidamientodeunbucleeselnmerodebuclesque
hayunosdentrodeotros.

'break'y'continue'

Existeunaformadecontrolarunblucledesdeelinteriordelmismo.Para
esopodemosusar'break',o'continue'.Sepuedenusarencualquieradelos
buclesqueacabamosdever(while,until,yfor).

Lapalabrareservada'break'provocalasalidadeunbucleporelfinal.Si
vieneseguidodeunnumero'n'saldrde'n'niveles.Noponernmero
equivaleaponerelnmero1.

Lapalabrareservada'continue'provocaunsaltoalcomienzodelbucle
paracontinuarconlasiguienteiteracin.Sivieneseguidadeunnumero
'n'saldrde'n'niveles.

# pru_break_continue
# Definir la variable j como una variable de tipo
entero e

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

# inicializarla a cero. Luego la incrementamos a cada


iteracin
# del bucle y si j es menor que diez mostramos el
doble de su valor.
# y en caso contrario salimos del bucle
typeset -i j=0
while true
do
let j=j+1
if [ $j -et 3 ]
then continue
fi
if [ $j -et 4 ]
then continue
fi
if [ $j -lt 10 ]
then expr $j \* 2
else break
fi
done

Probamosahoraaejecutarloyobtendremos

$ ./pru_break_continue

2
4
10
12
14
16
18

Ahora edite y pruebe el siguiente ejemplo que llamaremos


'pru_break_continue2'

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

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

for k in 1 2 3 4 5
do
echo $i $j $k
if [ "$j" = "b" ]
then break
fi
if [ "$k" = "2" ]
then continue 2
fi
done
done
done

Elresultadodelaejecucinseracomosigue.

$ ./pru_break_continue2

uno a 1
uno a 2
uno b 1
uno c 1
uno c 2
dos a 1
dos a 2
dos b 1
dos c 1
dos c 2
tres a 1
tres a 2
tres b 1
tres c 1
tres c 2

Arreglos

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

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

ailustrarloconunejemploquetieneunpocodetodo.Setratadeun
programaquedebeestudiardetenidamente.

# Desarrollar una funcin que admita un parametro de


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

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

for l in ${tab[*]}
do
echo $l
done
echo 2 ${tab[2]}
echo 1 ${tab[1]}

Elresultadodeejecutarestointroduciendounaseriededatosseracomo
sigue:

Introduzca algo o puse <INTRO> directamente para


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

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 0m1.413s
user 0m1.070s
sys 0m0.030s

# Bucle con expr (comando externo)


typeset -i N=0
time while [ $N -le 100 ]
do N=`expr $N + 1`
done

real 0m1.311s
user 0m0.230s
sys 0m0.060s

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

Ambaspruebastardanaproximadamentelomismoperoelprimerbucle
ejecuta20000iteracionesyelsegundosolo100.Esdecirqueelusodel
comando externo hace el comando unas 200 veces ms lento. Quizs
piense que es culpa de expr y en parte es cierto pero lo realmente
importanteesquehayquearrancarunasubshelllacualarrancarexpr
paraluegotomarlasalidaestandaryexpandirlotodocorrectamente.Esto
comporta abrir los respectivos ficheros de esos ejecutables y abrir un
fichero es algo que requiere un trabajo que no tiene lugar cuando
ejecutamoscomandosinternosdelashell.

Recomendacionesfinales

Acabamosdeexplicarunprogramamuysencillo.Compliquelounpoco
aadiendounaopcin9quemuestreunsubmenqueentreotrascosas
contengaunaopcinquevuelvaalmenprincipal.Usesuimaginaciny
practiqueparaintentarmejorarlo.

Enestosmomentosyadisponedetodalabasedeconocimientosquele
permitirpersonalizarsuentornodetrabajooconstruirsencillosscripts
queleayudenarealizarunagranvariedaddetareas,otambinpuede
investigaralgunosdelosprogramasdelsistemaescritosenshellscript.Si
seconformaconloestudiadoynointentaponerloenprcticaprontolo
olvidartodo.Practiquelaprogramacinenshellscriptyamismoantes
dequeolvidelateora.Empieceporlascosasquehemosexplicadopero
nosequedeeneso.Intentellegarunpocomslejos.

Enlasleccionesquesiguencontinuaremostratandotemasqueabrirn
nuevaspuertasasuconocimiento.Enningncasopodemosdetenernos
excesivamenteenningunadeellas.Alaprogramacinenshellscriptla
hemosdedicadovariasleccionesyanteriormentededicamosalgunosms
alashellcomointerpretedecomandos,perohallegadoelmomentode
decirquedebedeponermuchodesuparteyqueexisteel'manbash'para
buscarlascosasquenopudimosexplicaraqu.

NOCIONESDEPROGRAMACINENAWK

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

Queesawkyparaqueseusa

Lapalabra'awk'seusatantoparareferirseaunlenguajedemanipulacin
deficherosdedatoscomoparareferirseasuinterprete.

Dado que los SO tipo Unix incluido Linux acostumbran con mucha
frecuenciaausarficherosdeconfiguracindelsistemaenformatosdede
textoperfectamentelegiblesyeditablessediseounlenguajeparapoder
procesarestetipodeficherosdedatosenformatodetexto.

Cuandounprogramanecesitaunavelocidadmuyaltaparaaccederaunos
datosoparamodificarlosseutilizanestructurasdedatosmssofisticadas.

En muchos otros casos un fichero de configuracin ser accedido de


formamuyocasional,yresultamsinteresanteusarunformatodetexto
sencillo. Por ejemplo hay ficheros de configuracin que solo se usan
durante la carga de un programa. Algunos de estos programas suelen
cargarseunasolavezmientrasarrancaelsistemayluegoencondiciones
normalespermanecenarrancadostodoeltiempo.

'awk' naci en 1978 como un lenguaje pequeo y sencillo perodesde


entonceshaevolucionadomuchoyenlaactualidadsepuedeafirmarque
esunlenguajemuypotenteyverstil.Imposibletratarloenprofundidad
enuncursocomoeste.

'awk'esuncomplementomuybuenoparasuusoconshellscript.Esta
leccinnovaacondicionarlaasimilacindeleccionesposteriorespero
recomendamos que como mnimo le de un breve repaso ya que 'awk'
puederesultarextremadamentetilendeterminadascircunstancias.

Nosvamosaconformarconexplicarunaspocascosasporqueconello
conseguiremos dos objetivos. El primero que pueda usarlo para un
limitadotipodetareasbastantefrecuentes,yelsegundoqueconozcasu
existenciayparaqueseusa.Deestaformapuedeampliarconocimientos
porsucuentacuandolonecesite.

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

Nosvamosacentrarenelprocesamientodedatosenloscualescadalnea
estarestructuradaencampos.Estoscamposestarndelimitadosentresi
por algn carcter o por alguna secuencia especial de caracteres
especialmentereservadoparaello.Estasecuenciasereldelimitadorde
camposynodebeaparecerenelinteriordeningncampo.Cadalnea
equivaleaunregistro.

Lamayoradelasbasesdedatos,yhojasdeclculopermitenvolcarlos
datosenformatodetextoparapoderserexportadosentredistintasbases
de datos. Estas salidas se pueden procesar fcilmente mediante 'awk'.
Tambinsepuedeusar'awk'conlasalidadediversosprogramas.Esto
permite entre otras cosas usar 'awk' para acoplar una salida de un
programaconlaentradadeotroquenecesiteunformatomuydistinto.En
definitiva vamos a explicar solo una pequea parte de este potente
lenguajeperocomprobarsugranutilidadmuypronto.

Formadeuso

'awk'sueleestarinstaladoenlamayoradelossistemasyaquesuuso
suelesernecesario.PoresoenLinuxsueleencontrarseentrelospaquetes
bsicosdelsistemaentodaslasdistribuciones.

Sepuedeusardevariasformas.Tenemosquepasara'awk'eltextodel
programa,ylosdatos.Elprimerosepuedepasarbiencomoargumentoo
indicandofnombredelficheroquecontieneeltextodelprograma.La
entrada se puede pasar dando el nombre del fichero de entrada como
ltimoargumentooencasocontrariolotomarporlaentradaestndar.

$ ## Generamos en /tmp un par de ficheros


$ echo -e "\n" > /tmp/echo.out
$ echo '{ print "Hola mundo" }' > /tmp/ejemplo1.awk
$ ## Ejecutaremos el mismo programa de 4 formas
distintas
$ echo -e "\n" | awk '{ print "Hola mundo" }'
Hola mundo
Hola mundo
$ awk '{ print "Hola mundo" }' /tmp/echo.out

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

Hola mundo
Hola mundo
$ echo -e "\n" | awk -f /tmp/ejemplo1.awk
Hola mundo
Hola mundo
$ awk -f /tmp/ejemplo1.awk /tmp/echo.out
Hola mundo
Hola mundo

Elprogramaqueacabamosdeutilizarimprimirelliteral"Holamundo"a
cadalneadedatosqueprocese.Enestecasousamossolounpardelneas
vacascomoentradadedatos.

Vamosalocalizarelbinariode'awk'

$ whereis awk
/usr/bin/awk

Vamosasuponerqueensusistemaseencuentretambinen'/usr/bin'.
Puestoqueawkesunlenguajeinterpretadoperfectamentelegibletambin
podemosdecirquelosprogramasdeawksonscript.Parapoderusarlos
directamente podemos aadiruna primera lnea connmero mgico y
ponerpermisodeejecucin.

$ echo '#!/usr/bin/awk -f' > /tmp/ejemplo2.awk


$ echo '{ print "Hola mundo" }' >> /tmp/ejemplo2.awk
$ chmod +x /tmp/ejemplo2.awk
$ echo -e "\n" | /tmp/ejemplo2.awk
Hola mundo
Hola mundo

Estructuradeunprogramaawk

Unprograma'awk'puedetenertresseccionesdistintas.

Puede incluir una primera parte para que se ejecute antes de


procesar ninguna de las lneas de entrada. Se usa para ello la

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

palabra reservada BEGIN seguida de una o mas instrucciones


todasellasenglobadasdentrodeunpardecorchetes.'{','}'.
Puedeincluirunapartecentralqueseprocesarenteraparacada
lineadeentradadedatosyquepuedetenervariosbloques'{','}'.
Si uno de estos bloques contiene una expresin regular se
procesarsolocuandolalneadeentradaseajustealpatrndela
expresinregular.
Puedeincluirunapartefinalqueseprocesarenltimolugaruna
vezterminelalecturayprocesadodetodaslaslneasdeentrada.
SeusaparaellolapalabrareservadaENDseguidadeunaoms
instruccionestodasellasenglobadasdentrodeunpardecorchetes.
'{','}'.

Elprimerejemploquevimosanteriormente("Holamundo")solotena
una de las tres partes. Concretamente era la parte central ya que no
pusimosningunadelaspalabrasreservadasBEGINoEND.

Vamosaponerahoraunejemploconlastrespartes.Editeunficherocon
nombre'/tmp/3partes.awk'

BEGIN { print "Erase una vez..." }


{ print "...y entonces bla, bla, bla ..." }
END { print "...y colorn colorado este cuento se ha
acabado." }

Ejectelocon:

$ echo -e "\n\n\n" | awk -f /tmp/3partes.awk


Ama Erase una vez...
...y entonces bla, bla, bla ...
...y entonces bla, bla, bla ...
...y entonces bla, bla, bla ...
...y entonces bla, bla, bla ...
...y colorn colorado este cuento se ha acabado.

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

Es importante que comprenda que la parte central se ejecutar tantas


vecescomolneasdedatosexistan.Ennuestroejemplosoncuatrolneas
generadaspor'echoe"\n\n\n"'.Encambiolaspartes'BEGIN{...}'y
'END{...}'seejecutanunasolavez.Laprimeraantesdeprocesarla
primeralneaylaltimadespusdeprocesarlaltimalnea.

Loscomentariosen'awk'comienzanconun'#'yterminanalfinaldela
lnea.

Expresionesregulares

Algunasveceslosdatospuedenvenirconalgunaslineasquenointeresa
procesaroquesedebenprocesardeformadistinta.Podemosusaruna
expresinregulardelimitadaporelcarcter'/'paraseleccionarunaaccin
especial.Vamosaeditarotroejemploquellamaremos'/tmp/expreg.awk':

BEGIN { print "Erase una vez..." }


/^$/ { print "Linea vaca" }
/[0-9]+/ { print "Tiene un nmero" }
/\.$/ { print "Termina con punto" }
# Esto es un comentario
{ print "--------------------------------------" }
END { print "...y colorn colorado este cuento se ha
acabado." }

Ahoraeditamosunsegundofichero'/tmp/expreg.dat':

Lnea nmero 1.
Lnea nmero 2

....
Fin de los datos

Ahoraejecutelosiguiente:

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

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

Erase una vez...


Tiene un nmero
Termina con punto
--------------------------------------
Tiene un nmero
--------------------------------------
Linea vaca
--------------------------------------
Termina con punto
--------------------------------------
--------------------------------------
...y colorn colorado este cuento se ha acabado.

Vemosquecadalneadedatospuedecumplirmsdeunareglayque
cuandonoponemosunaexpresinregularsiempreseejecutarlaaccin.
Enestecasotodaslaslneasprovocanlaescrituradeunalneadeguiones
''.

Elusodeexpresionesregularespuedeayudarnosaeliminarcabeceras,
lneasvacasoincompletasocosasasquenodeseamosprocesar.

Delimitadoresdecampos

No hemos tratado aun los campos de una lnea. Una lnea que tenga
distintoscamposdebeusaralgunasecuenciaparadelimitarloscampos
entresi.

Lomismoparadefinirundelimitadorqueencualquierotrocasodondese
usencadenasdecaracteres podemosencontrarnoslanecesidaddeusar
caracteresespecialesquenopuedenserintroducidosdirectamente.Para
elloexistendeterminadassecuenciasqueempiezanporelcarcter'\'yque
tienensignificadoespecial.

Caracteresdeescape
\a Produceunpitidoenelterminal
\b Retroceso

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

\f Saltodepgina
\n Saltodelnea
\r Retornodecarro
\t Tabuladorhorizontal
\v Tabuladorvertical
\ddd Carcterrepresentadoenoctalpor'ddd'
\xhex Carcterrepresentadoenhexadecimalpor'hex'
\c Carcter'c'

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 ddd eee


111 222 333 444

Enlaprimeralneadebeintroducirunblancoparasepararlosprimeros
blancosyunasecuencienciade',,,'parasepararlosdosltimoscampos.
Es importante que lo edite de esta forma porque el resultado de los
ejemplospodravariar.

Ahoraejecutelosiguiente:

$ awk -f /tmp/delim1.awk /tmp/delim1.dat


+ aaa + bbb + ccc + ddd +
+ 111 + 222 + 333 + 444 +

Editeelsiguientefichero'/tmp/delim0.awk'

{ print "+", $3, "+", $4, "+", $1, "+", $2, "+" }

Ahoraejecutelosiguiente:

$ awk -f /tmp/delim0.awk /tmp/delim1.dat


+ ccc + ddd + aaa + bbb +
+ 333 + 444 + 111 + 222 +

Conellohemosconseguidovariarelordendeaparicindeloscampos,
perotodavanohemosespecificadoningndelimitador.Porellohemos
asumidoeldelimitadorpordefecto.(unoomsblancosytabuladores).

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

Paraespecificarundelimitadordistintotenemosqueasignarsuvalorala
variable FS y adems tenemos que hacerlo antes de leer el primero
registro por lo cual se incluir la instruccin en la seccin inicial
precedidadeBEGIN.

Editeelsiguientefichero'/tmp/delim2.awk'

BEGIN { FS = "\ " }


{ print "+", $1, "+", $2, "+", $3, "+", $4, "+" }

Estamos definiendo un nico carcter blanco como separador. Ahora


ejecutelosiguiente:

$ awk -f /tmp/delim2.awk /tmp/delim1.dat


+ aaa + bbb + ccc + +
+ 111 + 222 + 333 + 444 +

Vamos a cambiar de delimitador. Edite el siguiente fichero


'/tmp/delim3.awk'

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

Estamosdefiniendounnicocarctertabuladorcomoseparador.Ahora
ejecutelosiguiente:

$ awk -f /tmp/delim3.awk /tmp/delim1.dat


+ aaa bbb ccc + + ddd + +
+ 111 222 333 444 + + + +

Seleccinderegistrosporcampo

Vamosaeditarunficheroquesimularlasalidadedatosobtenidadesde
unabasededatosrelacional.Usaremosestosdatosenvariosejemplos.

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

Puede corresponder a una contabilidad de un alquiler de un piso. Lo


llamaremos'contabil.dat'.

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

Loprimeroquevemosesquetieneunacabeceradedoslneasintilesy
unfinaltambinintil.Podemosasegurarquelaslneasquedeseamos
procesarcumplirnunpatrndedosnmerosguindosnmerosguin

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

cuatro nmeros y lnea vertical. Vamos a editar un programa que


llamaremos'contabil1.awk'

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

Vamosaejecutaresteejemployvamosaversusalida

$awkfcontabil1.awk<contabil.dat
3 , 01-01-1999 , - , 96
4 , 16-12-1999 , AGUA , -14650
5 , 05-01-2000 , LUZ , -15797
6 , 24-01-2000 , GAS , -34175
7 , 27-01-2000 , INGRESO , 141200
8 , 01-02-2000 , MENS , -96092
9 , 25-02-2000 , LUZ , -12475
10 , 01-03-2000 , MENS , -96092
11 , 06-03-2000 , INGRESO , 101300
12 , 01-04-2000 , MENS , -96092
13 , 06-04-2000 , AGUA , -15859
14 , 07-04-2000 , INGRESO , 134000
15 , 01-05-2000 , MENS , -98975
16 , 02-05-2000 , LUZ , -11449
17 , 09-05-2000 , INGRESO , 95000
18 , 23-05-2000 , GAS , -21428
19 , 25-05-2000 , GAS , -16452
20 , 01-06-2000 , MENS , -98975
21 , 07-06-2000 , INGRESO , 130000
22 , 01-07-2000 , MENS , -98975
23 , 04-07-2000 , LUZ , -12403
24 , 07-07-2000 , AGUA , -5561
25 , 10-07-2000 , INGRESO , 99000
26 , 24-07-2000 , GAS , -11948
27 , 01-08-2000 , MENS , -98975
28 , 10-08-2000 , INGRESO , 122355
29 , 04-09-2000 , LUZ , -12168
30 , 10-09-2000 , INGRESO , 129000
31 , 19-09-2000 , AGUA , -10529
32 , 28-09-2000 , GAS , -2620
33 , 01-10-2000 , MENS , -98975

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

34 , 10-10-2000 , INGRESO , 112000

Podemosapreciarvariascosas.NResunavariabledelsistemaquetoma
elvalordelnmeroderegistroqueseestprocesando.Podemosverque
lasdosprimeraslneasylaltimahansidodescartadas.Tambinvemos
quelasprimeraslneasusanunsolodgitoparaelnmeroderegistroy
luegousandosdgitos.Estoquelascolumnasnoquedenalineadas.

Vamosamodificarelprogramaparaquemuestrelosregistroscompletos
($0)cuandonosecumplalacondicinanterior.Paraelloeditaremosun
ficheroquellamaremos'contabdescarte.awk'.

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

Vamosaejecutaresteejemployvamosaversusalida

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

Formatodesalidaconprintf

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

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

Hayquetenerencuentaqueen'awk'laconcatenacindecadenasseusa
poniendounacadenaacontinuacindeotraseparadaporblancos.Por
ejemplo:

#cad="(unodos)"cad="uno""dos";cad="("cad")"

Especificacindeformatodedatospara'printf'
%c CarcterASCII
%d Enterorepresentadoendecimal
%e Comaflotante(exponente=e[+]dd)
%E Comaflotante(exponente=E[+]dd)
%f Comaflotantesinexponente
%g Equivalealmscortodelosformatos'e'o'f'
%G Equivalealmscortodelosformatos'E'o'F'
%o Enterorepresentadoenoctal
%s Cadenadecaracteres
%x Enterorepresentadoenhexadecimalconminsculas
%X Enterorepresentadoenhexadecimalconmaysculas
%% Carcter'%'

Enestosformatossepuedeintercalarinmediatamenteacontinuacindel
'%' primero un signo '+' o un '' que son opcionales y significan
respectivamentealineacinaladerechaoalaizquierda.Ensegundolugar
y de forma igualmente opcional se puede intercalar un nmero para
indicarunanchomnimo.(Sieldatoocupamsqueeldatoespecificado
se muestra el dato completo haciendo caso omiso de la indicacin de
anchura).Enelcasodecomaflotantesepuedeindicarelanchototaldel
campoylaprecisin(anchura)delapartedecimal.

Veamosunospocosejemplos.

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

$ echo | awk '{ print "Hola mundo" }'

Hola mundo
$ echo | awk '{ printf "Hola %s\n", "mundo" }'

Hola mundo
$ echo | awk '{ printf "#%d#%s#\n", 77, "mundo" }'

#77#mundo#
$ echo | awk '{ printf "#%10d#%10s#\n", 77,
"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 '{ printf "#%04d#%+4s#\n", 77,
"mundo" }'

#0077#mundo#
$ echo | awk '{ printf "#%010.5f#%E#%g\n",
21.43527923, 21.43527923, 21.43527923 }'

#0021.43528#2.143528E+01#21.4353
$ echo | awk '{ printf "#%10.5f#%E#%g\n", 2140000,
2140000, 2140000 }'

#2140000.00000#2.140000E+06#2.14e+06

Practique un poco investigando con ms detalle el funcionamiento de


estosformatos.

Usodevariablesoperadoresyexpresiones

En'awk'podemosusartodaclasedeexpresionespresentesencualquier
lenguaje. Cualquier identificador que no corresponda con una palabra

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

reservadaseasumirqueesunavariable.Paraasignarunvalorseusael
operador'='

Vamosaeditarunficheroquellamaremos'ejemplexpr.awk'conalgunas
expresionesaritmticas.

{
contador = 0; # Pone a cero la variable contador
contador ++; # Incrementa en 1 la variable contador
contador +=10; # Incrementa en 10 la variable contador.
contador *=2 # Multiplica por 2 la variable contador
print contador
contador = ( 10 + 20 ) / 2 ;
print contador
contador = sqrt ( 25 ) ; # Raiz cuadrada de 25
print contador
}

Loejecutamosyobservamoselresultado.

$ echo | awk -f ejemplexpr.awk

22
15
5

Nopodemosexplicarendetalletodoellenguaje'awk'.Setratadeque
comprendasuutilidadydequeseacapazdeutilizarloparadeterminadas
tareasenlascualesresultaextremadamentetil.

AlgunasexpresionespareceninspiradasenellenguajeC.Otrasparece
quehanservidodeinspiracinparaellenguajePerl.Enrealidadmuchos
lenguajesusanexpresionesparecidas.

Porellovamosaresumirenformadetablaunaseriedeelementosque
intervienen enlasexpresionesque'awk'escapazdemanejar.Perono
vamos a explicar en detalle cada cosa. En lugar de eso daremos una

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

descripcinresumidayprocuraremosquelosejemplosposteriorestengan
unpocodetodo.

Operadoresaritmticos
+ Suma
Resta
* Multiplicacin
/ Divisin
% Mdulo(resto)
^ Potenciacin
Operadoresdeasignacin.
var=expr Asignacin
var++ Incrementalavariableenunaunidad
var Decrementalavariableenunaunidad
var+=
Incrementalavariableenciertacantidad
expr_aritm
var=
Decrementalavariableenciertacantidad
expr_aritm
var*=
Multiplicalavariableporciertacantidad
expr_aritm
var/=
Dividelavariableporciertacantidad
expr_aritm
var%= Guardaenlavariableelrestodesudivisinpor
expr_aritm ciertacantidad
var^=
Elevaelvalordelavariableenciertacantidad
expr_aritm
Operadoreslgicosyderelacin.
expr_aritm==
Comparacindeigualdad
expr_aritm
expr_aritm!= Comparacindedesigualdad

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

expr_aritm
expr_aritm<
Comparacinmenorque
expr_aritm
expr_aritm>
Comparacinmayorque
expr_aritm
expr_aritm<=
Comparacinmenorigualque
expr_aritm
expr_aritm>=
Comparacinmayorigualque
expr_aritm
expr_cad~
Seajustaalpatrn
expr_regular
expr_cad!~
Noseajustaalpatrn
expr_regular
expr_logica||
OperadorlgicoAND(Y)
expr_logica
expr_logica&&
OperadorlgicoOR(O)
expr_logica
!expr_logica OperadorlgicoNOT(NO)
Funcionesaritmticas.
atan2(y,x) Retornaelarcotangentedey/xenradianes
cos(x) Retornaelcosenodexenradianes
exp(x) Retornaelexponencialdex(e^x)
Retornaelvalorenterodextruncadolaparte
int(x)
decimal
log(x) Retornaellogaritmoneperianodex
Retornaunvalorseudoaleatoriocomprendidoentre
rand()
0y1
sin(x) Retornaelsenodexenradianes
sqrt(x) Retornalaraizcuadradadex
Inicializalasemillaparagenerarnmeros
srand(x)
pseudoaleatorios

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

Funcionesparausarconcadenasdecaracteres
Sustituye's'globalmenteentodo't'cadavezquese
encuentreunpatrnajustadoalaexpresinregular
gsub(r,s,t)
'r'.Sinoseproporciona't'setoma$0pordefecto.
Devuelveelnmerodesustitucionesrealizado.
index(cadena, Retorna la posicin de la 'subcadena' en 'cadena'
subcadena) (Primeraposicin=1)
Devuelvelalongituddela'cadena'.Tomar$0por
length(cadena)
defectosinoseproporciona'cadena'
Parte'cadena'enelementosde'array'utilizando'sep'
split(cadena,
comoseparador.Sinoseproporciona'sep'seusar
array,sep)
FS.Devuelveelnmerodeelementosdelarray
Sustituye's'en't'laprimeravezqueseencuentreun
patrnajustadoalaexpresinregular'r'.Sinose
sub(r,s,t)
proporciona't'setoma$0pordefecto.Devuelve1si
tienexitoy0sifalla
Devuelveunasubcadenade'cadena'queempiezaen
substr(cadena, 'beg' con una longitud 'len'. Si no se proporciona
beg,len) longituddevuelvehastaelfinaldelacadenadesde
'beg'
tolower(cadena) Pasaaminsculas
toupper(cadena) Pasaamaysculas
Algunasotrasfunciones
match(cadena, Indicasi'cadena'seajustaonoalaexpresinregular
expr_reg) 'expr_reg'
system(comand
o)
sprintf(formato
Paraobtenersalidaconformato.
[,exprlist])

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 , -15797, -15797
9, 2, 25-02-2000, LUZ , -12475, -28272
16, 3, 02-05-2000, LUZ , -11449, -39721
23, 4, 04-07-2000, LUZ , -12403, -52124
29, 5, 04-09-2000, LUZ , -12168, -64292
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, 01-01-1999, - , 96, 96
4, 16-12-1999, AGUA , -14650, -14554
5, 05-01-2000, LUZ , -15797, -30351
6, 24-01-2000, GAS , -34175, -64526
7, 27-01-2000, INGRESO , 141200, 76674
8, 01-02-2000, MENS , -96092, -19418
9, 25-02-2000, LUZ , -12475, -31893
10, 01-03-2000, MENS , -96092, -127985
11, 06-03-2000, INGRESO , 101300, -26685
12, 01-04-2000, MENS , -96092, -122777
13, 06-04-2000, AGUA , -15859, -138636
14, 07-04-2000, INGRESO , 134000, -4636
15, 01-05-2000, MENS , -98975, -103611
16, 02-05-2000, LUZ , -11449, -115060
17, 09-05-2000, INGRESO , 95000, -20060
18, 23-05-2000, GAS , -21428, -41488
19, 25-05-2000, GAS , -16452, -57940
20, 01-06-2000, MENS , -98975, -156915
21, 07-06-2000, INGRESO , 130000, -26915
22, 01-07-2000, MENS , -98975, -125890
23, 04-07-2000, LUZ , -12403, -138293
24, 07-07-2000, AGUA , -5561, -143854
25, 10-07-2000, INGRESO , 99000, -44854
26, 24-07-2000, GAS , -11948, -56802
27, 01-08-2000, MENS , -98975, -155777
28, 10-08-2000, INGRESO , 122355, -33422
29, 04-09-2000, LUZ , -12168, -45590
30, 10-09-2000, INGRESO , 129000, 83410

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

31, 19-09-2000, AGUA , -10529, 72881


32, 28-09-2000, GAS , -2620, 70261
33, 01-10-2000, MENS , -98975, -28714
34, 10-10-2000, INGRESO , 112000, 83286

Sentenciascondicionalesybucles

'awk'esunlenguajemuycompletoynopodafaltarlassentencias de
ejecucincondicionalydeejecucinenbucle.

Algunos de los conceptos que vamos a comentar ya los hemos visto


cuandohablamosdelaprogramacinenbashynovamosaexplicarcon
demasiadodetallecadatipodesentencia.Lasintaxisqueusaawknose
parecealasintaxisqueyahemosvistoparabash.Separecemsala
sintaxisdellenguajeC.Detodasformaslosconceptosyanosresultan
familiaresyusaremosalgunosejemplosparailustrarlos.

Empezaremos describiendo la sintaxis de cada tipo de sentencia.


Denominaremos accin a una sentencia simple o a una sentencia
compuestadelaforma'{sentencia1;sentencia2;...}'

Sentencia condicional 'if'

if ( expresin_lgica )
accion1
[ else
accion2 ]

Sentencia condicional con los operadores '?' y ':'

expresion_lgica ? accion1 :accion2

Bucle 'while'

while(expresin_lgica)

accion

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

Bucle 'do' 'while'

do

accion

while ( expresin_lgica )

Bucle 'for'

for ( inicializar_contador ; comprobar_contador ;


modificar_contador )

accion

Dentrodelosbuclespodemosusarbreakparaforzarlasalidadeunbucle
ocontinueparasaltaralasiguienteiteracin.

Veremosdemomentotansolounejemploparalasentenciacondicional
'if'.

Editeelsiguienteficheroquellamaremos'contabil4.awk'

BEGIN { FS="\|" ; }

/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
if ( $3 >= 0) {
printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3);
}
}

Vamosaejecutaresteejemployvamosaversusalida

$awkfcontabil4.awk<contabil.dat
3, 01-01-1999, - , 96
7, 27-01-2000, INGRESO , 141200
11, 06-03-2000, INGRESO , 101300
14, 07-04-2000, INGRESO , 134000
17, 09-05-2000, INGRESO , 95000

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

21, 07-06-2000, INGRESO , 130000


25, 10-07-2000, INGRESO , 99000
28, 10-08-2000, INGRESO , 122355
30, 10-09-2000, INGRESO , 129000
34, 10-10-2000, INGRESO , 112000

Pasarvaloresalscriptawk

Enocasionespuederesultarinteresantepoderpasaralgnvaloralscript
awk. Vamos a modificar el programa anterior para que muestre los
registros con un importe superior a un valor que pasaremos por
parmetro.

Editeelsiguienteficheroquellamaremos'contabil5.awk'

BEGIN { FS="\|" ; }

/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
if ( $3 >= minimo && $3 <= maximo ) {
printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3);
}
}

Vamosaejecutaresteejemplopasandoyvamosaversusalida

$awkfcontabil5.awkminimo=100000maximo=120000<
contabil.dat
11, 06-03-2000, INGRESO , 101300
34, 10-10-2000, INGRESO , 112000

Hayqueadvertirqueelpasodeparmetrosequivaleadefinirunavariable
yaasignarunvalorperoestovalornoseraccesiblehastadespusdeleer
el primer registro. Si el valor pasado como parmetro tuviera que ser
accesibleenlaseccinBEGINhabraqueusarlaopcinvprevioalpaso
delparmetro.

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

Repetiremoselejemplopasandoeldelimitadordelregistroqueusaremos
enlaseccinBEGIN.

Editeelsiguienteficheroquellamaremos'contabil6.awk'

BEGIN { FS = delimitador ; }

/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
if ( $3 >= minimo && $3 <= maximo ) {
printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3);
}
}

Vamosaejecutaresteejemplopasandovaloresyvamosaversusalida

$ awk -f contabil6.awk minimo=100000 maximo=120000


deliminador='|' < contabil.dat

Vemosquenohemosobtenidoelresultadoesperado.

Vamosavolveraejecutaresteejemplopasandoelvalordeldelimitador
conlaopcinvyvamosaversunuevasalida

$awkvdelimitador='|'fcontabil6.awkminimo=100000
maximo=120000<contabil.dat
11, 06-03-2000, INGRESO , 101300
34, 10-10-2000, INGRESO , 112000

Declaracindefunciones

Comoeslgico'awk'permiteladeclaracindefunciones.Normalmente
se recurre a implementar una funcin cuando necesitamos una
funcionalidad que el lenguaje no proporciona de forma predefinida o
cuando queremos estructurar el cdigo de un programa grande en
fragmentosmspequeosyportantomsmanejables.

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

Lasintaxisesmuysencilla.

function nombre_de_la_funcin ( lista_de_parmetros ) {


sentencias
}

Porejemploparadeclararunafuncinqueretorneunnmeroaleatorio
entre1y6.

Editeunficheroconnombre'dado.awk'.

function aleatorio ( minimo, maximo ){


return ( ( ( maximo - minimo + 1 ) * rand () ) +
minimo ) ;
}

END{
for (i=0; i<20; i++){
printf ("%3d) Entre 1 y 6 = %3d
Entre 5 y 15 =%3d\n",
i, aleatorio (1, 6),
aleatorio(5, 15));
}
}

Ahoraloejecutamos

$echo|awkfdado.awk
0) Entre 1 y 6 = 5 Entre 5 y 15 = 12
1) Entre 1 y 6 = 6 Entre 5 y 15 = 7
2) Entre 1 y 6 = 6 Entre 5 y 15 = 7
3) Entre 1 y 6 = 5 Entre 5 y 15 = 13
4) Entre 1 y 6 = 3 Entre 5 y 15 = 8
5) Entre 1 y 6 = 3 Entre 5 y 15 = 6
6) Entre 1 y 6 = 4 Entre 5 y 15 = 7
7) Entre 1 y 6 = 6 Entre 5 y 15 = 7
8) Entre 1 y 6 = 5 Entre 5 y 15 = 6
9) Entre 1 y 6 = 3 Entre 5 y 15 = 10
10) Entre 1 y 6 = 6 Entre 5 y 15 = 14
11) Entre 1 y 6 = 5 Entre 5 y 15 = 10
12) Entre 1 y 6 = 6 Entre 5 y 15 = 11

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

13) Entre 1 y 6 = 4 Entre 5 y 15 = 12


14) Entre 1 y 6 = 5 Entre 5 y 15 = 15
15) Entre 1 y 6 = 2 Entre 5 y 15 = 9
16) Entre 1 y 6 = 1 Entre 5 y 15 = 9
17) Entre 1 y 6 = 3 Entre 5 y 15 = 14
18) Entre 1 y 6 = 2 Entre 5 y 15 = 14
19) Entre 1 y 6 = 2 Entre 5 y 15 = 7

Funcinsystem

Estaesunafuncinfcildeusarquenospermiteejecutaruncomandodel
sistemaoperativo.Encasodexitoretorna0,yencasodeerrorretornar
unvalordistintodecero.

$ awk ' BEGIN { if (system("ls") !=0) printf ("Error


de ejecucin\n"); }'

Por ejemplo si quisiramos verificar la existencia de un fichero


almacenadoenlavariable'nombre_fich'tendramosquehacer

if (system("test -r " nombre_fich)) {


fprintf ("%s no encontrado\n", nombre_fich);
}

Lafuncingetlineyotrasfuncionesavanzadas

Esteesesunapartadoenelquemsqueexplicarcosasnosvamosa
limitaramencionarciertasposibilidades.Nopodemosdedicardemasiado
espacioaestetipodecuestionesavanzadasperosiconloqueeneste
apartadocontemosconseguimosponerlelosdienteslargosnosdaremos
porsatisfechosaunquenoentiendaunapalabra.

En primer lugar hay que advertir que 'getline' que al igual que otras
funcionesdevuelveunvalorperosusintaxisnoesunatpicasintaxisde
funcin.Noseusacomo'getline()'sinocomounasentencia.

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

Estafuncinretorna1sileeunalnea,0sialcanzaelfindelaentradade
datosy1siseproduceunerror.

Usadasimplementecomo'getline'sinnadamsleelasiguientelineadela
entradaasignando$0ydesglosandoloscamposen$1,$2,$3,etc..

Sepuedeasignarelvalorcompletodelalnealedaaunavariablecon
'getlinevariable'evitandodeestaformaalterarelvalorde$0.

Sepuedeleer deunficherousandoeloperadorredireccin. 'getline <


"fichero"'.Sepuedesimbolizarlaentradaestndarcomo""

Sepuedeleerdesdeunpipe.'"whoami"|getlineusuario'.

Editeunficherollamado'tipo_usuario.awk'.

BEGIN {
"whoami" | getline usuario
if ( usuario ~ /root/ ) {
printf ("Soy superusuario\n");
}
else{
printf ("Soy usuario normal\n");
}
}

Ejecutelocon

$ awk -f tipo_usuario.awk

Nopretendemos conestesencilloejemploqueseacapazdeusarestas
funciones.Elmanejodeestasredireccionesescomplicadoyenocasiones
sehacenecesarioforzarelcierredeunaentradaodeunpipe.Paraeso
existe la funcin 'close'. Se usa haciendo 'close ("fichero")' o 'close
("whoami")'.

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

Porelmomentonosconformamosconloexplicadoyveremosunpoco
msadelanteelusodegetlinetomandolaentradadeunficherocuando
expliquemoslosarraysasociativos.

Arrays

Los array permiten el almacenamiento de una serie de elementos que


puedenseraccedidosmedianteunndice.Enrealidadlosarraysdeawk
son ms potentes que los arrays que vimos cuando estudiamos la
programacin de la bourneshell donde los ndices de un array eran
siemprenmerosenteros.Vamosausarenprimerlugarlosarraysdeesta
forma. Es decir nos vamos a limitar en los primeros ejemplos a usar
nmerosenteroscomondices.

Vamos a usar awk para procesar la salida obtenida con 'ps'. Primero
vamosasuponerqueobtenemosunlistadocompletodelosprocesosdel
sistema en formato largo. Si intenta realizar este ejemplo obtendr un
resultadonecesariamentediferente.

$psaxl>psaxl.out;catpsaxl.out

FLAGS UID PID PPID PRI NI SIZE RSS WCHAN


STA TTY TIME COMMAND
100 0 1 0 0 0 756 0 do_select SW
? 0:03 (init)
40 0 2 1 0 0 0 0 bdflush SW
? 0:18 (kflushd)
40 0 3 1 0 0 0 0 kupdate SW
? 0:18 (kupdate)
840 0 4 1 0 0 0 0 kpiod SW
? 0:00 (kpiod)
840 0 5 1 0 0 0 0 kswapd SW
? 0:15 (kswapd)
140 0 186 1 0 0 900 200 do_select S
? 0:00 /sbin/sys
140 0 188 1 0 0 1016 0 do_syslog SW
? 0:00 (klogd)
140 1 193 1 0 0 780 0 do_select SW
? 0:00 (portmap)
140 0 195 1 0 0 860 0 do_select SW
? 0:00 (inetd)

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

140 0 200 1 0 0 764 108 nanosleep S


? 0:00 /usr/sbin
140 0 210 1 0 0 908 0 do_select SW
? 0:00 (lpd)
40 31 226 1 0 0 3784 0 do_select SW
? 0:00 (postmast
140 0 237 1 5 0 1728 316 do_select S
? 0:00 sendmail:
140 0 241 1 0 0 1292 184 do_select S
? 0:01 /usr/sbin
40 0 244 1 0 0 1544 56 do_select S
? 0:00 /usr/bin/
40 1 254 1 0 0 840 96 nanosleep S
? 0:00 /usr/sbin
40 0 257 1 5 0 860 164 nanosleep S
? 0:00 /usr/sbin
140 0 262 1 0 0 1780 60 do_select S
? 0:07 /usr/sbin
100 0 268 1 0 0 1964 616 read_chan S
1 0:00 -bash
100 0 269 1 0 0 836 0 read_chan SW
2 0:00 (getty)
100 1001 270 1 0 0 2096 724 wait4 S
3 0:00 -bash
100 0 271 1 0 0 836 0 read_chan SW
4 0:00 (getty)
100 0 272 1 0 0 836 0 read_chan SW
5 0:00 (getty)
100 1001 273 1 0 0 2088 1408 wait4 S
6 0:00 -bash
140 33 274 262 0 0 1792 0 wait_for_co SW
? 0:00 (apache)
140 33 275 262 0 0 1792 0 flock_lock_ SW
? 0:00 (apache)
140 33 276 262 0 0 1792 0 flock_lock_ SW
? 0:00 (apache)
140 33 277 262 0 0 1792 0 flock_lock_ SW
? 0:00 (apache)
140 33 278 262 0 0 1792 0 flock_lock_ SW
? 0:00 (apache)
0 1001 916 270 0 0 3536 1640 do_select S
3 0:00 vi awk1.d
0 1001 1029 273 0 0 1916 668 wait4 S
6 0:00 xinit /ho
100 0 1034 1029 12 0 8824 3280 do_select S
? 0:02 X :0 -bpp
0 1001 1037 1029 0 0 4620 2748 do_select S
6 0:01 mwm
40 1001 1042 1037 0 0 1728 924 wait4 S
6 0:00 bash /hom
40 1001 1045 1037 0 0 1728 924 wait4 S

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

6 0:00 bash /hom


0 0 1050 1042 0 0 2976 1872 do_select S
6 0:00 xterm -ls
0 1001 1058 1045 0 0 2320 1220 do_select S
6 0:00 xclock -d
100 1001 1051 1050 14 0 2080 1400 wait4 S
p0 0:00 -bash
100000 1001 1074 1051 17 0 1068 528 R
p0 0:00 ps axl

Para dar una idea de la situacin de parentescos entre los distintos


procesosmostramoslasalidaobtenidaconelcomando'pstree'ejecutado
desdelamismasesindextermqueenelcasoanterior.

$pstreep>pstreep.out;catpstreep.out
init(1)-+-apache(262)-+-apache(274)
| |-apache(275)
| |-apache(276)
| |-apache(277)
| `-apache(278)
|-atd(254)
|-bash(268)
|-bash(270)---vi(916)
|-bash(273)---xinit(1029)-+-XF86_S3V(1034)
| `-mwm(1037)-
+-.xinitrc(1042)---xterm(1050)---bash(1051)---
pstree(1068)
|
`-.xinitrc(1045)---xclock(1058)
|-cron(257)
|-getty(269)
|-getty(271)
|-getty(272)
|-gpm(200)
|-inetd(195)
|-kflushd(2)
|-klogd(188)
|-kpiod(4)
|-kswapd(5)
|-kupdate(3)
|-lpd(210)
|-portmap(193)
|-postmaster(226)
|-sendmail(237)

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

|-sshd(241)
|-syslogd(186)
`-xfs(244)

SolovamosaprocesarloscamposPIDyPPID.$3y$4respectivamente.
Losmeteremosenunpardearraysllamadospidyppid.

BEGIN { ind=0; }

function padre(p){
for (i=0; i <ind; i++){
if (pid[i]== p)
return ppid[i];
}
}

! /FLAGS/ { pid[ind]=$3 ; ppid[ind]=$4 ; ind++ ; }

END {
do {
printf ("%d->", proc);
proc= padre(proc);
} while ( proc >= 1 )
printf ("\n\n");
}

Ahoraejecutamospasandoelpiddelprocesodelcualdeseamosaveriguar
sudescendencia.

$ awk -f ancestros.awk proc=1051 < ps-axl.out

1051->1050->1042->1037->1029->273->1->

Con un nmero realmente reducido de lneas de cdigo acabamos de


procesarlasalidadeuncomandoquenoestabaespecialmentediseado
paraserprocesadosinoparaentregarunresultadolegible.

No se emocione todava porque solo hemos utilizado los arrays con


indicesnumricos.Lociertoesquelosarraysde'awk'adiferenciadelos

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

arrays de otros lenguajes son arrays asociativos. Eso significa que


podemos usar como ndice una cadena de caracteres. Por ejemplo
podemos hacer lo siguiente: nombre_cli["5143287H"]="Luis, Garca
Toledano"

Noesnecesariodaruntamaoalarray.Unarrayasociativonoestablece
unordenentresuselementos.Hayqueaclararqueelmanejodeunarray
conndicesnumricoscorrespondeaunmecanismomuysimpleyaquese
usan porciones consecutivas de memoria del ordenador y se accede
directamente por posicin. Por el contrario un array asociativo de las
caractersticasde'awk'sevacreandodinmicamente.Internamente'awk'
gestionaelaccesomedianteunatcnicadehashqueusatablasauxiliares
amododetablasdendicesyfuncionesauxiliaresqueobtienevalores
numricosapartirdevaloresdeunacadena.Todoellopermiteunacceso
muyrpidoenestetipodeestructurashacindolasadecuadasparasuuso
enbasesdedatos.

FTLSUSE |CURSOS |FTLinuxCourse para SuSE


| 11800
FTLREDH |CURSOS |FTLinuxCourse para RedHat
| 11800
ASUSCOM |HARDWARE|Asuscom ISDNLink 128k Adapter (PCI)
| 6865
RAILROAD|JUEGOCOM|Railroad Tycoon (Gold Edition)
| 7700
CIVILIZ |JUEGOCOM|Civilization: Call to power
| 7700
MYTHII |JUEGOCOM|Myth II
| 7700
LIAPPDEV|LIBROS |Linux Application Development (537
Pginas) | 11000
CONECT01|LIBROS |Gua del Usuario de Linux (413 Pginas)
| 5300
CONECT03|LIBROS |Gua del Servidor (Conectiva Linux 437
Pginas) | 5300
CONECT02|LIBROS |Gua del Administrador de redes (465
Pginas) | 5300
LIUSRESU|LIBROS |Linux User's Resource (795 Pginas)
| 12000
RH70DLUX|LINUXCOM|RedHat Linux 7.0 Deluxe en espaol
| 9600

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

RH70PROF|LINUXCOM|RedHat Linux 7.0 Profesional en Espaol


| 20000
SUSE70 |LINUXCOM|Suse Linux 7.0 (6CDs)(Version espaola)
| 6850
RTIME22 |LINUXCOM|RealTime 2.2 (1CD)
| 13000
CONCT50E|LINUXCOM|Conectiva Linux 5.0 Versin Econmica
Espaol (6CDs) | 5200
CITIUS22|LINUXCOM|Linux Citius 2.2
| 7750
TRBLIW60|LINUXCOM|Turbolinux Workstation 6.0
| 6500
MOTIF |LINUXCOM|Motif Complete
| 22000
CONCTSRV|LINUXCOM|Conectiva Linux Ed.Servidor (Espaol
3CDs + 4 Manua | 27500
RHORA8I |LINUXCOM|RedHat Linux Enterprise Edition optimized
for Oracle8i |270000
MANDRA72|LINUXCOM|Mandrake 7.2 (7CDs) PowerPack Deluxe
(versin espaola| 8300
PINGUINO|SUSEPROM|Pingino de peluche
| 6000

BEGIN {
FS="[\ \t]*\|[\ \t]*" ;
while ( getline < "articulos.dat" > 0) {
artic[$1]= "(" $4 " Ptas + Iva) " $3;
printf ("%s ", $1);
}
for (;;){
printf ("\n\nIntroduzca un cdigo de artculo o
solo para terminar: ");
getline codigo ;
if (codigo == "" )
break;
printf ("\n<%s>\n%s", codigo, artic[codigo]);
}
}

$ awk -f articulos.awk

FTLSUSE FTLREDH ASUSCOM RAILROAD CIVILIZ MYTHII


LIAPPDEV CONECT01 CONECT03
CONECT02 LIUSRESU RH70DLUX RH70PROF SUSE70 RTIME22

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

CONCT50E CITIUS22 TRBLIW60


MOTIF CONCTSRV RHORA8I MANDRA72 PINGUINO

Introduzca un cdigo de artculo o solo para


terminar: RH70PROF

(20000 Ptas + Iva) RedHat Linux 7.0 Profesional en


Espaol

Introduzca un cdigo de artculo o solo para


terminar: CITIUS22

(7750 Ptas + Iva) Linux Citius 2.2

Introduzca un cdigo de artculo o solo para


terminar:
$

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 ficheros en los cuales disponemos de permiso de


lectura =
Nmero de ficheros en los cuales disponemos de permiso de
escritura =
Nmero de ficheros en los cuales disponemos de permiso de
ejecucin =
Nmero de ficheros en los cuales carecemos de permiso de
lectura =
Nmero de ficheros en los cuales carecemos de permiso de
escritura =
Nmero de ficheros en los cuales carecemos de permiso de
ejecucin =

Nmero de ficheros regulares encontrados =


Nmero de directorios encontrados =

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

Nmero de dispositivos de bloques encontrados =


Nmero de dispositivos de carateres encontrados =
Nmero de fifos encontrados =

---- ## gen_menu2.txt ## ----

Programar un shell-script que admita como argumentos


parejas formadas
por 'comando' y 'descripcion' y que construya con todo ello
un menu
de opciones donde cualquiera de los comandos pueda ser
ejecutado
seleccionando la descripcion correspondiente.

Es decir si dicha shell-script se llamara 'gen_menu2.sh' un


ejemplo
de uso sera:

./gen_menu2.sh \
Listar ls \
'Quien est conectado' who \
'Fecha actual' date \
Ocupacion du \
'Quien soy' whoami \
'Memoria libre' free \
'Calendario' cal \
'Nombre mquina' hostname

Con ello se obtendra un menu de la forma:

0 Terminar
1 Listar
2 Quien est conectado
3 Fecha actual
4 Ocupacion
5 Quien soy
6 Memoria libre
7 Calendario
8 Nombre mquina

Elija opcin.

---- ## grafica.txt ## ----

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

Realizar un shell-script que reciba como argumentos numeros


comprendidos
entre 1 y 75. Dara error en caso de que algun argumento no
este
dentro del rango y terminar sin hacer nada. En caso
contrario
generar una linea por cada argumento con tantos asteriscos
como
indique su argumento.

---- ## incr.txt ## ----

Hacer un shell-scritp que utilice dos funciones 'incr1()' e


'incr2()'
las cuales ejecutaran un simple bucle iterando 1000 veces.
La funcin
'incr1()' solo usara un contador IND1 que sera
incrementado de uno en
uno usando un comando de tipo 'let' y la funcion 'incr2()'
solo usara
un contador IND2 que se incrementar de uno en uno
calculando su siguiente
valor mediante el uso del comando expr.

Hacer una tercera funcin 'PruebaDiezSegundos()' que


aceptar como argumento
el nombre de la funcin de prueba (incr1 o incr2). Primero
informara del
tiempo real, de cpu de usuario y de cpu del sistema que
consume dicha
funcin y luego deber ejecutar dicha funcin tantas veces
sea posible
en el transcurso de 10 segundos (aproximadamente, basta
usar date '+%s')
obteniendose el nmero de veces que se ejecuto en esos diez
segundos.

Compare los resultados obtenidos con ambas funciones y


explique los
resultados.

---- ## lista_fich.txt ## ----

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

Hacer un shell-script que acepte como argumentos nombres de


ficheros
y muestre el contenido de cada uno de ellos precedido de
una cabecera
con el nombre del fichero

---- ## media.txt ## ----

Hacer un shell-script que calcule la media aritmtica de


todos los argumentos pasados como parmetros con una
precisin de 40 digitos decimales despues de la coma.

---- ## mi_banner.txt ## ----

Localice en su sistema la utilidad 'banner' para consola.


Puede haber
mas de una utilidad para esto y algunas estn pensadas para
su uso
con impresora. Nos interesa la utilidad 'banner' para
terminal de
forma que el comando 'banner hola' genere la siguiente
salida:

# # #### # ##
# # # # # # #
###### # # # # #
# # # # # ######
# # # # # # #
# # #### ###### # #

Partiendo de esta utilidad realice un shell-script


'mi_banner.sh' que
admita hasta tres argumentos de tamao mximo de cuatro
caracteres
tal que el comando './mi_banner.sh hola jose luis' obtenga:
ooooooooo
oooooooo _/ _/ _/_/_/_/ _/ _/_/
ooooooo _/ _/ _/ _/ _/ _/ _/
oooooo _/_/_/_/_/_/ _/ _/ _/ _/ _/
ooooo _/ _/ _/ _/ _/ _/_/_/_/_/_/
oooo _/ _/ _/ _/ _/ _/ _/
ooo _/ _/ _/_/_/_/ _/_/_/_/_/_/ _/ _/

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

oo
ooooooooo
oooooooo _/ _/_/_/_/ _/_/_/_/ _/_/_/_/_/_/
ooooooo _/ _/ _/ _/ _/
oooooo _/ _/ _/ _/_/_/_/ _/_/_/_/_/
ooooo _/ _/ _/ _/ _/
oooo _/ _/ _/ _/ _/ _/ _/
ooo _/_/_/_/ _/_/_/_/ _/_/_/_/ _/_/_/_/_/_/
oo
ooooooooo
oooooooo _/ _/ _/ _/ _/_/_/_/
ooooooo _/ _/ _/ _/ _/
oooooo _/ _/ _/ _/ _/_/_/_/
ooooo _/ _/ _/ _/ _/
oooo _/ _/ _/ _/ _/ _/
ooo _/_/_/_/_/_/ _/_/_/_/ _/ _/_/_/_/
oo

---- ## mi_cal1.txt ## ----

Realizar un shell-script 'mi_cal1.sh' que utitilzando la


salida del
comando 'cal' filtre su salida para resaltar entre
corchetes
el da actual. Ponga atencin a los das a principio de
lnea,
los das a final de lnea.

La salida para el da 5 de Mayo de 2002 debera ser la


siguiente:

./mi_cal1.sh

May 2002
S M Tu W Th F S
1 2 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

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

May 2002
S M Tu W Th F S
[1] 2 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

---- ## 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 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06
07 07 07 07 07 07 07
08 08 08 08 08 08 08 08
09 09 09 09 09 09 09 09 09
10 10 10 10 10 10 10 10 10 10
11 11 11 11 11 11 11 11 11 11 11
12 12 12 12 12 12 12 12 12 12 12 12

---- ## proceso.txt ## ----

Hacer un shell-script llamado 'proceso.sh' para ser lanzado


en background
que como maximo permanecera vivo 30 segundos.

Podra ser lanzado varias veces en background y cada vez


generara un
shell-script distinto 'stop_proceso.sh.' que al ser
ejecutado matara el proceso lo origino y despues se borrara
a si
mismo.

---- ## vigila.txt ## ----

Realizar un shell-script que escriba en el fichero


'/tmp/usuarios'

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

una linea con la fecha y otra con el nmero de usuarios


distintos
que estn conectados en ese momento cada dos minutos.

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

PARTE(II)USUARIOAVANZADODELINUX

INTRODUCCINALASEGUNDAPARTEDEL
CURSO

Llevamos ya algunos captulos enlos cuales estamos tocando muchos


temasquepodranconsiderarsepropiosdeuncursodeadministracino
de un curso avanzado de Linux. Ya no hacemos tantas bromas y
suponemosqueyahaperdidosuinseguridadinicial.

Consideramos que ya a estas alturas del curso tampoco es necesario


recordarle a cada momento las precauciones de trabajo. Tambin
asumimosqueconlaconfianzaquedaelsaberdelporquedelascosasya
habrpracticadoporsucuentaalgunasotrascosasqueespecficamentele
interesaban.

Paralosqueusenordenadorpersonalyquetenganaccesoaunacuentade
rooteselmomentodedaralgnconsejoporqueesprobablequecadavez
tenganmasganasdeprobarcosasdistintasparaaprenderporsucuenta.
Paraelloslesdiremosqueexisteunamximaparatodoadministrador.

Nomodifiquesnadaquenopuedasvolveradejarcomoestaba.

En otras palabras. Siempre, siempre, antes de hacer algo asegurate la


posibilidaddepoderretrocederfcilmentealasituacininicial.

Porejemplosivasatocarunficherodeconfiguracindelsistemasaca
antesunacopiadeesefichero.Oquizslasimpleprecaucindeanotaren
unpapelunpardecosillasantesdecambiarlaspuedaevitarundisgusto.

Muyimportante.Hazregularmentecopiasdeseguridad.Nomantengas
tuscopiasenelmismodiscoquelainformacinoriginal.Comomnimo

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

usatrescopiasdeseguridadestableciendounsistemaderotacinentre
ellas.

Usaremoselusuariorootlomenosposiblenoparaevitarerroressinopara
evitarqueloserroresseconviertanenHorrores.

LinuxesunSOquenoimponerestriccionesarbitrariasalosusuarios.Si
una cosa no puede ser realizada por un usuario normal es porque no
suponeunaamenazaalaseguridaddelsistemaysiemprequesepuedaes
mejornousarroot.

AdmitimosqueunusuariodeLinuxqueloinstaleensupropiosistema
necesita realizar tareas deadministracin, perorootes unusuario que
debeusarselomenosposible.Errareshumanoperoeldesastretotales
cosaderoot.Porellovamosaapurarlasposibilidadesdeapreenderdesde
unacuentadeusuarionormalita

Tambin hay que advertir que no todos los sistemas son igual de
permisivos dependiendo de las necesidades reales de seguridad del
sistema o del grado de paranoia del administrador. Por ejemplo una
mquinaquedispongadeunelevadonmerodecuentasparaestudiantes
deberseradministradaconmanofirmeporquesiemprehabrmsdeun
estudiantejuguetnconganasderersedeladministrador,ybastaunode
estosparatenerunproblemaseriosinosetomanprecauciones.

Si est realizando este curso en una mquina de esas caractersticas


posiblemente no pueda hacer muchos de los ejercicios propuesto
simplemente por limitaciones impuestas desde root. El aumento de la
seguridaddeunsistemasueleresultarenunaumentodelaincomodidad
paralosusuarios.

Elpreciodelaseguridadeslaincomodidad.Elpreciodelacomodidades
lainseguridad.

Enparticularelaccesoadistintosdispositivoshardwarepuedeestarms
omenoslimitado.Nosotrosparaestasegundapartevamosasuponerque

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

lasrestriccionesdelsistemadondeustedvaapracticarnosonexcesivas
enestesentido.Encualquiercasoyahabrnotadoqueenlasprcticas
mostramosycomentamoslosresultadosdelasmismas.Porellonose
desanimesinopuederealizarahoraalgunasdelasprcticaspropuestas,
pero tambin sealamos que Si esta usando un ordenador personal o
disponedeunacuentaenunsistemadondelaconfianzaenlosusuarios
porpartedeladministradoreselevadapodrseguramentesacarlemayor
provechoaestasegundapartedelcurso.

COPIASDESEGURIDAD

Porquededicamosuncaptulocompletoaesto.

Este captulo trata de las Copias de Seguridad, tambin llamados


respaldosoeningls Backupsyvamosenprimerlugarajustificar la
razndededicarunampliocaptuloaestetemaquepodraparecerms
apropiadoparauncursodeadministracin.

Evidentementegarantizarlaintegridaddelainformacindeunsistemaes
untemaqueesderesponsabilidaddeladministradordelsistemapero,
comoyahemosmencionadoanteriormente,elobjetivodeestasegunda
partedelcursoincluyelasnocionesmsnecesariasparaadministrarsu
propio ordenador personal con Linux. El objetivo es que sea
autosuficiente.

Laseguridadfrenteaataquesintencionadosquedafueradelospropsitos
deestecursoperonohaydaoquenopuedaserreparadositenemosuna
copiadeseguridaddetodalainformacinquenosinteresa.

Un buen sistema de respaldo es la mejor forma de evitar perdidas de


informacin. Estas deben ser prevenidas dentro de lo posible pero
dependiendodelascausasnosiempreresultaposiblehacerlo.

Lasposiblescausasparaunaperdidadeinformacinson:

Deteriorooborradoaccidentalporpartedeunusuarioautorizado.

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

Ataqueintencionadoporpartedepersonasnoautorizadas.
Fallodelsoftware.
Fallodelhardware.
Virus.
Incendio,robos,ydesastresnaturales,etc.

La peor de todas es el borrado accidental por parte de un usuario


autorizado,porqueestotalmenteimposibledeprevenir.

Algopuedehacerse.PorejemploenLinuxhaysustitutosparaelcomando
'rm' que dejarn los ficheros borrados en una papelera. Tambin se
puedenseguirciertasrecomendacionesdeprudenciaqueminimicenlos
riesgosmediantedeterminadasprcticasperosiemprecabrlaposibilidad
deunfallohumano.Eltemaesamplsimoynosvamosalimitaratratar
solodeRespaldosoCopiasdeseguridad.

/===============/

Borradoaccidentaldeficheros

Debe saber que la operacin normal de borrado no destruye toda la


informacindelosficheros.Sialgunavezborraalgomuyimportanteen
unsistemadeficherosynotienecopiadeseguridad.Deberevitarvolver
atrabajarsobreesesistemadeficherosenmodolecturaescritura.Porel
contrariodebermontaresesistemadeficherosenmodosololecturay
confiarenquequedealgorecuperableenalgnlado.Hayprogramasque
puedenayudarenestassituacionessiemprequelainformacinnoest
machacadaconposterioresoperacionesdeescriturasobreesaparticin.Si
nosabequehacernohaganadaypregunteantesdeintentarcosasque
podran destruir definitivamente toda la informacin. Este tipo de
recuperacionessonsolounltimorecursoylasposibilidadesdexitono
sonmuygrandes.

Unacosaquesepuedeintentarenmodoreadonly(sololectura)esleer
directamente del dispositivo intentando filtrar cadenas de ficheros

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

presentes en los ficheros borrados. Por ejemplo usando grep. Si las


cadenasaparecenessealdequenosehadestruidotodalainformacin.

/===============/

Caractersticasdeunbuensistemaderespaldo

Un sistema de respaldo debe de estar perfectamente planificado. Su


planificacin deformaautomticanosiempreesposibledebidoaque
requierenconfrecuenciaintervencinhumana.Especialmentelacopias
quenocabenenunasolacinta(multivolumen).Loidealesorganizarsu
propiosistemaderespaldoenfuncindelasnecesidadesdesusistema.
En un sistema es conveniente clasificar las diferentes partes de la
informacinatendiendoasuimportancia.Loidealserahacerrespaldode
todoregularmentemanteniendodistintascopiasenrotacin.Esdecirsi
tenemostrescintasparaalmacenarrespaldos(CintaA,CintaB,yCinta
C)deberemosirgrabandosiguiendounasecuenciacircularA,B,C,A,B,
C,... La frecuencia de los respaldos se determina en funcin de lo
importantequeseanlosdatos.Generalmenteesbuenohacerunacopia
diariaalmenosdelapartedelsistemaquesupongamayorperdidade
horasdetrabajoencasodeincidente.Detodasformashayqueteneren
cuentaqueestesistemasolonospermitemantenercopiadelosltimos
tresocuatrodas.Estonoessuficienteporquemuchasvecesnosinteresa
recuperarunainformacindehaceunasemana,unmes,oinclusoms
tiempo.Porelloalgunasvecesseusanrotacionesdesietecintas(unapara
cadadadelasemana)yunavezalmessesacaotracopiaenunacinta
distinta que se conserva por un espacio de tiempo ms largo segn
convenga.

Una prctica comn es guardar regularmente copias en otro edifico


distinto para protegerse de esa forma de incendios, inundaciones,
terremotos,robos.Sidespusdeundesastreconservamoslosdatosvitales
de nuestro negocio quizs podamos resurgir de nuestras cenizas ms
tarde.

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

Algunasvecesnoesposiblehacerdemasiadascopiasdetodoelsistema
condemasiadafrecuencia.Porellosepuedendelimitarareascondistinto
gradodenecesidadderespaldo.Elsistemaoperativoylasaplicacionesno
suelen variar y pueden ser recuperadas desde CDs de instalacin. Es
importantesiempremantenercopiasdetodoelsistema.Encualquiercaso
siemprehadeusarserotacindecintasporqueusarunasolacopiaesmuy
arriesgado.

Lascintassonrazonablementesegurasperosepuedenromperconeluso.
De todas formas es importante que la planificacin de respaldo del
sistema no resulte complicada. Trabajar con demasiados conjuntos de
cintasdistintosnoesbueno.

Enlacopiageneraldetodoelsistemaseguramenteseguardarncosas
quevaranpocoperoquequizscostaronmuchotrabajoconfigurar.Por
tantoesunacopiaquenonecesitahacerseconfrecuenciaperodeberemos
disponersiempredealgunascopiasenbuenestadoaunquenoseanmuy
recientes.

Todaslascopiasdebensersometidasdeformaautomticaaunproceso
deverificacin queenelcasomssencilloconsisteenleerlalistade
ficherosquecontiene.Noesmuyfiableperoalmenosdetectaremoslos
fallosmsimportantes.Enelmejordeloscasoslacomprobacinsehace
sobreelcontenidocompletocomparndoloconeloriginal.Enestecaso
cuandolacopiaterminaeloriginalpuedehabercambiadoyporellola
deteccindediferenciasentreoriginalycopiapuededeberseauncambio
eneloriginalenlugardeunerrorenlacopia.

Una cosa que se usa mucho son las copias globales combinadas con
posteriorescopiasincrementales.Esunsistemacuyaprincipalventajaes
lacomodidad.

Copiaincrementalsignificaquesolosalvamosloltimoquehacambiado
desdelaltimacopiaglobal.Poresocadanuevacopiaincrementalresulta
generalmentedemayortamaoquelaanterior.

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

Si la copia global ocupa varias cintas. Podemos hacer copias


incrementaleshastaquedebidoasuprogresivoaumentodeocupacinno
quepanenunasolacintaporejemplo,momentoenelquesepuedehacer
una nueva copia global. En general podemos hacer una nueva copia
globalcuandolaincrementalempiecearesultarincomodadebidoasu
progresivoaumentodetamao.

Estesistemadecopiahacerecaerdemasiadaresponsabilidadenunasola
cinta.Laltimacopiaglobalsuelesermuyvoluminosaypuedecontener
informacinquenoseencuentreenningunaotracinta.

Hay actividades que pueden generar enormes ficheros de datos y eso


incrementarmucholaocupacindenuestrasiguientecopiaincremental.
Porejemplosiestamosgenerandounaimagenanimadadegrantamaoo
siestamosdescargadodeInternetimgenesdeCDsenterasdeberamos
guardaresosdatosenunsistemadeficherosespecialmentededicadoa
ello.Deestaformacuandohagamosrespaldopodemosdesmontarantes
esa particin para poder realizar respaldos independientes con la
frecuenciaqueconvengaencadacaso.

Siemprequeseaadanpaquetes,aplicaciones,seconfigurealgoconviene
volverasacarunanuevacopiaglobaldetodoelsistema.

/===============/

Lossoportesdelainformacin

Elsoportemsadecuadosonlascintas. Esunsistema quesuponeun


fuertedesembolsoinicialperoalalargaresultamsrentableymsseguro
que los dems. Adems cuando cambiemos de ordenador podremos
conservarlo.

En cualquier caso cada cinta debe de estar perfectamente etiquetada


(Identificador clave de la cinta, Tipo de copia, mquina, contenido,
formato,periodicidad,etc...)

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

Despus en un papel habr que registrar cada copia realizada con


identificadordelacintayfechadelacopiaquecontiene.

Es muy importante tenerunsistema bienpensadoparaqueofrezca el


mximodeseguridadconelmximodecomodidad.Hayqueestablecer
unbuenplanquedeberconvertirseenunarutinadetrabajo.Considerela
incomodidad como un gravsimo peligro porque puede derivar en
incumplimientodeesaimportanteobligacin.

Eldaquenocumplamosnuestraobligacindehacercopiaderespaldo
sereldaqueelsistemaelijaparadarleundisgusto(leydeMurphy).
Pararesultarcmododebemosautomatizarconscriptsnuestrosistemade
respaldoylascopiasnodebentardarmsdelonecesario.

Los discos duros extraibles son una buena alternativa para sistemas
caseros.Loquenotieneningnsentidoeshacercopiasdeseguridadenel
mismodiscoduroquecontienelosdatosaunqueseutiliceunaparticin
diferente. Recuerde que los discos duros pueden perder toda su
informacindeformarepentina.

Para guardar datos de inters histrico que deban conservarse durante


aossuelesermuyinteresanteusarCDs.

Losdisquetessonunmediomuypocofiableycabepocacosa.

/===============/

Respaldoporpartes

Antesquenadadebeplantearsesirealmentenecesitahacerrespaldopor
partes.Recuerdequenoconvienecomplicarmuchoelplanderespaldoy
nohaynadamssencilloquehacerrespaldodetododeunavezsiempre
queeltamaodelosdatoslopermitan.

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

Para determinar la necesidad de respaldo de las partes del sistema


convienequerepaselaleccinde'SistemadeFicherosIII'Concretamente
elprrafodedicadoala'Estructuraestndardelsistemadeficherosde
Linux'.Estoleayudaracomprenderlanaturalezadelosdatosenlas
distintaspartesdelsistema.

Recuerdequepuedenexistirvariaciones,enfuncindecadadistribucin.

Cadasistemadependiendodelaactividadalaqueseadedicadotendr
unasnecesidadestotalmenteespecialesderespaldo.

Laspartesdemayorintersconvistasarespaldosfrecuentessuelenser
/home/,/root/,y/usr/local/Enalgunoscasos/var/logoundirectorioque
contenga unabasededatospuedensermuyimportantes peroesoson
cosasquecadacualdebedeterminar.Siloimportanteocupamsdel50%
delsistemalomssencilloseraporcopiasglobaleseincrementalesde
todoelsistema,peroenunordenadordeusopersonalcongrancantidad
depaquetesinstaladoslaparteimportantealahoradehacerrespaldono
suelesertangrande.

La parte ms variable del sistema est en /var/ y concretamente en


/var/logesdondeseregistranloslogsdelsistemaquesonficherosque
informan de todo tipo de cosas que van sucediendo en el mismo. En
algunossistemasestoslogstienenunaimportanciamayorqueenotros.
Porejemplosiexistealgunaaplicacinquetomaestoslogsparaelaborar
estadsticas. En otros sistemas no resultar demasiado crtico que la
ltimacopiade/var/noseamuyrecienteperoqueexistaalmenosuna
copiasiesfundamental.

Hacerlascosasenunsolopasonoessiemprebuenaidea.Loprincipales
darpasosquepuedandeshacersesinosequivocamos enalgo,poreso
siempre que sea posible conviene recuperar en un lugar distinto al
original. Luego si todo ha ido bien podemos trasladar las cosas a su
destinodefinitivo.Losquesepreguntanparaquetantasprecaucionesson
losquemstardesepreguntarnasmismocosasbastantelamentables.

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

Cuando se pierde toda la informacin de un sistema tendremos que


recuperarlotodopartiendodelosdiscosdeinstalacinydelacopia.

/===============/

Programasdeutilidadpararealizarrespaldos

Pararealizar copiasdeseguridadpodemosusaraplicacionescompletas
pensadasparaelloofabricarnosalgoamedidacombinandounaseriede
utilidadesdelascualeslamayorayahansidomencionadasalgunavezen
captulosanteriores.Estoltimoesloquevamosahacernosotrosporque
as podr disear algo personalizado y tambin porque resulta ms
didctico.

Nosotros solo vamos describir todas estas utilidades de forma muy


enfocadaalusoquevamosahacerdeellas.Puedeusarelmanualpara
consultarloquenonecesite.

Losprogramasmstilessonaquellosquesirvenparaempaquetardentro
deunsoloficherounagrancantidaddeficherosydirectorios,comopor
ejemplo 'tar', 'cpio', y 'afio' pero de ellos hablaremos en el siguiente
captulo. Antesvamosacomentarotraseriedeprogramasquepueden
combinarconestosempaquetadoresoquesuusopuedeserinteresanteen
tareasrelacionadasconelrespaldo.

find(1)Seusarparaelaborarunalistadeficherosquedeseamossalvar.
Suversatilidadesenorme.Laopcinnewerresultardeespecialinters
enelcasodedesearhacercopiasincrementales.Observequenosotrosnos
situaremos previamente en un directorio adecuado y luego usaremos
'find.'parapasarafindnombresqueempiezancon'.'.Esdecirusaremos
caminos relativos en lugar de caminos absolutos. Esto tiene su
importancia porque de ese modo luego podremos recuperar la
informacinsitundolaenotrolugardistintoaloriginalsifueranecesario.

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

egrep(1) Seusaparaintercalarloentrelasalidade'find'ylaentradade
'cpio'deesaformaseaumentalaflexibilidaddeuso.Sepuedeusarpara
incluirdeterminadosficherosquecumplandeterminadaexpresinregular
y/o para excluir determinados ficheros que cumplan determinada
expresinregular.Paraexcluirseusalaopcinv.

gzip(1) Es el compresor de uso ms frecuente en Linux. Esta muy


probadoyesmuyfiable.Cuandosecolocauncompresorcomogzipo
bzip2alasalidade'cpio'ode'tar'sepierdelaposibilidaddehacercopia
multivolumen porque el compresor es el que est escribiendo en el
dispositivo en lugar de hacerlo 'cpio' o 'tar'. Afortunadamente 'afio' si
puedehacerlo.

bzip2(1)Esmseficienteenelsentidodequepuedecomprimiralgoms
peroacostadetardarmuchoms.

diff(1)Detectadiferenciasdecontenidoentredosficheros.Especialmente
adecuadoparaficherosdetexto.

md5sum(1)Permiteasociaruncdigodecomprobacinalcontenidode
unficheroodispositivo,etc..

dircomp(1) Permite comparar dos directorios analizando su contenido


recursivamente.

dirdiff(1) Permite comparar dos directorios analizando su contenido


recursivamente.Esmselaboradoqueelanterior.

mt(1) Es la utilidad que se usa para controlar las cintas magnticas.


Permiteoperacionesderebobinado,retension,lecturadeestado,etc.

dd(1) Sirveparacopiaroleerdispositivosusandoeltamaodebloque
quesedesee.Tambinpermiterealizarciertasconversiones.

Porejemploparacopiarundisquete:

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

$ dd if=/dev/fd0 of=fichero
$ dd of=/dev/fd0 if=fichero

touch(1) Sirve para actualizar la ficha de modificacin de un fichero


crendolo en caso de que no exista y se puede usar para guardar el
instanteenqueserealizaunacopiaparaluegotomaresemomentocomo
referenciaencopiasincrementales.

Por ejemplo para modificar la fecha de modificacin de un fichero


ajustndolaconlahorayfechaactualharamoslosiguiente:

$ touch fichero

Paramodificarlafechademodificacindeunficheroajustndolaconla
fechadeayerharamos:

$ touch -t yesterday fichero

Paramodificarlafechademodificacindeunficheroajustndolaconla
mismafechaqueladeunficherodereferenciaharamos:

$ touch -r fich_ref fichero

Entodosloscasossielficheronoexistesecrearcontamaoiguala
cero.

tee(1)Permitebifurcarunasalidaendos.Deesaformapodemosguardar
lalistadeficherosqueestamosentregandoa'cpio'oa'afio'conobjetode
podercompararlasluegoporejemplo.

mount(1)Montaunsistemadeficheros.

umount(1)Desmontaunsistemadeficheros.

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

/===============/

Programasparaempaquetarficheros'tar','cpio',y'afio'

Vamosaverahoraunaseriedeprogramascapacesdeempaquetarvarios
ficherosenunosolo.

tar(1)Essimilaracpioenelsentidodequesirvetantoparasalvarcomo
pararecuperarficheros.Lasalidapuedeseradispositivo,ficherooaun
procesoigualquecpio,peronoaceptaporsuentradaestndarunalistade
ficheros.Hayquepasarloscomoargumentos.

'tar' admite nombres de ficheros y directorios como argumentos. Los


directoriosserntratadosrecursivamente.salvandoyrecuperandotodosu
contenido. En Linux 'tar' tiene opciones para obtener una salida ya
comprimida.Paraespecificarelficherooeldispositivodondeseguardar
lacopiaseusafarchivo.

Enlugardearchivosepuedeespecificarundispositivo(/dev/dispositivo)
otambinsepuedeusarentradasalidamediante'f'.

Paracrearlacopiaseusac,paraleerlalistadeficheroseusat,ypara
extraerlosficheroseusax.Sepuedeusarcompresinconlaopcinz.

Veamosalgunosejemplos:

$ # Salvar el directorio actual completo en


'fichero.tar'
$ tar -cf fichero.tar .

$ # Lista abreviada (solo nombres de ficheros) del


contenido
$ # de la copia 'fichero.tar'
$ tar -tf fichero.tar

$ # Lista detallada del contenido de la copia


'fichero.tar'

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

$ tar -tvf fichero.tar

$ # Extraccin completa del contenido de la copia


'fichero.tar'
$ tar -xf fichero.tar

cpio(1) Sepuedeusarparasalvarorecuperarunaseriedeficheros.Su
salidapuedeserenviadaaundispositivoaunficherooauncompresor.
Lalistadeficherosdeunpaquetecpiopuedeobtenerseconlaopcint.
Estalistadeficherossoloincluyelosnombresdelosmismos.Guardando
esta lista en un fichero, editndolo despus de forma que eliminemos
todos menos aquellos que queramos recuperar podremos usarlo para
recuperarconlaopcini.Laopcintcombinadaconvobtienenosolo
losnombressinotambinpermisos,fechastamaosdeficheros,etc..Es
decir'cpiot'actacomoun'ls'y'cpiotv'actacomo'lsl'.Laopcind
combinada con 'i' permite la creacin de directorios'. La opcin 'm'
conserva la fecha de modificacin de los ficheros. La fecha de
modificacin de los directorios no siempre se conserva pero no suele
considerarseimportante.Seguramenteelpropio'cpio'alcopiarficheros
dentrodeldirectoriocreadoseprovocalaalteracindeestafechayla
nicaformaderespetarlafechademodificacindelosdirectoriossera
hacer una segunda pasada una vez que todos los ficheros estuvieran
creados.Puedequealgunautilidadoalgunaversindecpiosilohaga.Si
tienedudascompruebelo.Laopcin'p'decpiopermitecopiarestructuras
enterasdesdeunlugaraotro.Larecuperacindeficherosconcpioadmite
uso de patrones. Es interesante comprobar que aqu el operador '*'
tambin expandir caracteres '/' cosa que por ejemplo el bash y otros
programasnohacen.

Algunosejemplossencillos:

$ #Salvar un fichero
$ echo fichero | cpio -o > fich.cpio

$ #Salvar varios ficheros

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

$ cpio -o > fich.cpio < cat lista_ficheros'

$ #Lista detallada de los ficheros contenidos en la


copia
$ cpio -itvc < fich.cpio

$ #Recuperacion de los ficheros creando directorios


cuando sea
$ #necesario (-d) y conservando la fecha de
modificacin los ficheros
cpio -ivcdm < fich.cpio

Parausarundispositivoenlugardeunficherobastaraconsustituirenel
ejemplo'fich.cpio'por'/dev/dispositivo'.

Para evitar conflictos en sistemas de ficheros con nmero de inodos


elevadoseusalaopcin(Hnewc).Recomendamosquelausesiempre.

LaopcionBusarbloquesde5120bytesenlugardebloquesde512
bytes.

Vamosausarestaopcinenlossiguientesejemplosyademsusaremos
entradasalidaacintaconcompresindedatos.

$ # Salvar todo el rabol de directorios desde el


directorio actual
$ # en formato comprimido.
$ find . | cpio -ovBH newc | gzip > /dev/st0

$ # Listado detallado del contenido de la copia


$ gzip -d < /dev/st0 | cpio -itvBH newc

$ # Guardar listado sencillo (solo nombres de


ficheros) en
$ # el fichero 'contenido.txt'
$ gzip -d < /dev/st0 | cpio -itBH newc >
contenido.txt

$ # Suponemos que editamos el fichero anterior


'contenido.txt'

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

$ # y dejamos solo aquellos ficheros que deseamos


recuperar en
$ # el fichero 'seleccin'.
$ # Recuperamos de la siguiente forma:
$ gzip -d < /dev/st0 | cpio -ivudmBH newc `cat
seleccion`

Conlaopcionppodemoscopiartodoelcontenidodeundirectorioaotro
directamentesinpasarporunasalidaintermediaempaquetadaenformato
'cpio'.Estoesmuyutilparatrasladardirectoriosenteros.

$ cd $DIR_ORIGEN
$ find . | cpio -pdm $DIR_DESTINO

afio(1)Esunainteresantsimavariacindecpio.Tieneentreotrascosasla
posibilidaddecomprimirlosficherosdeunoenuno.Estoleproporciona
mayorseguridad,yaqueunacopiadecpioodetarcomprimidatieneel
graveproblemadequeencasodeunpequeoerrorenlacopia,todala
copiaquedainutilizada.Conafiosoloquedardaadoelficherodonde
ocurraenerror.Ademscon'afio'esposiblehacercopiasmultivolumen
comprimidas.'afio'reconocelasextensionesdeaquellosficherosqueno
interesacomprimirporqueyaloestn:(.Z.z.gz.bz2.tgz.arc.zip.rar
.lzh.lha.uc2.tpz.taz.tgz.rpm.zoo.deb.gif.jpeg.jpg.tif.tiffy.png).
Unaventajamsde'afio'esquepermiteverificarlacopiaconeloriginal.
(Opcinr)

Parahacerpruebascon'afio'situeseeneldirectorio/tmp.Generealgunos
ficherosgrandesparapoderhacerluegopruebasdecopiasdeseguridad
usando disquetes.Porejemplo paragenerarunficherode2Mbytes de
perfectabasurapuedeusarlosiguiente:

$ cd /tmp
$ mkdir pruebafio
$ cd pruebafio
$ echo 1 > fich1

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

$ gzip --fast < /dev/zero | head --bytes=2m > fich2


$ echo 3 > fich3
$ mkdir dir1
$ echo 4 > dir1/file4
$ cp fich2 fich5.gz
$ ls -lR

.:
total 4116
drwxr-xr-x 2 root root 4096 abr 8
13:06 dir1
-rw-r--r-- 1 root root 2 abr 8
13:05 fich1
-rw-r--r-- 1 root root 2097152 abr 8
13:05 fich2
-rw-r--r-- 1 root root 2 abr 8
13:06 fich3
-rw-r--r-- 1 root root 2097152 abr 8
13:33 fich5.gz

./dir1:
total 4
-rw-r--r-- 1 root root 2 abr 8
13:06 file4

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 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

$ # Volver a colocar el primer disquete de la copia


$ # Para obtener la lista de ficheros de una copia
comprimida en disquete
$ afio -t -v -s 1440k -F -Z /dev/fd0

drwxr-xr-x 1 root root Apr 8


13:33:23 2001 .
-rw-r--r-- 1 root root 2 Apr 8
13:05:24 2001 fich1
-rw-r--r-- 1 root root 2097152 Apr 8
13:33:11 2001 fich5.gz
afio: "/dev/fd0" [offset 1m+416k+0]: Input limit
reached
afio: Ready for disk 2 on /dev/fd0
afio: "quit" to abort,"f" to format, anything else to
proceed. >
afio: "/dev/fd0" [offset 1m+416k+0]: Continuing
-rw-r--r-- 1 root root 2 Apr 8
13:06:00 2001 fich3
drwxr-xr-x 1 root root Apr 8
13:06:18 2001 dir1
-rw-r--r-- 1 root root 2 Apr 8
13:06:18 2001 dir1/file4
-rw-r--r-- 1 root root 4939 Apr 8
13:05:48 2001 fich2 -- compressed

$ # Creamos un segundo directorio y nos situamos en


el
$ mkdir ../pruebafio2
$ cd ../pruebafio2
$ #
$ # Para recuperar una copia comprimida en disquete
$ # Volver a colocar el primer disquete de la copia
$ afio -i -v -s 1440k -F -Z /dev/fd0

. -- okay
fich1 -- okay
afio: "/dev/fd0" [offset 1m+416k+0]: Input limit
reached

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

afio: Ready for disk 2 on /dev/fd0


afio: "quit" to abort,"f" to format, anything else to
proceed. >
afio: "/dev/fd0" [offset 1m+416k+0]: Continuing
fich5.gz -- okay
fich3 -- okay
dir1 -- okay
dir1/file4 -- okay
fich2 -- uncompressed

$ # Vamos a comparar los dos directorios


$ cd ..
$ dircomp pruebafio pruebafio2

< 3241346245 6 ./fich3


> 4164007125 2 ./fich3

$ #
$ # Un anlisis ms detallado de las diferencias de
ambos directorios
$ # Se puede hacer con dirdiff
$ dirdiff pruebafio pruebafio2
2 d d - > =
2 d d - > = dir1
= r r = = = dir1/file4
= r r = = = fich1
= r r = = = fich2
1 r r X < = fich3
= r r = = = fich5.gz
^ ^ ^ ^ ^ ^
| | | | | \__ POG
| | | | \____ DAT
| | | \______ CKS
| | \________ FI2
| \__________ FI1
\____________ FI2

$ # Para comprobar dos ficheros podemos usar md5sum


$ md5sum pruebafio/fich1 pruebafio2/fich1
pruebafio/fich3 pruebafio2/fich3

md5sum pruebafio/fich1 pruebafio2/fich1


pruebafio/fich3 pruebafio2/fich3
b026324c6904b2a9cb4b88d6d61c81d1 pruebafio/fich1
b026324c6904b2a9cb4b88d6d61c81d1 pruebafio2/fich1

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

75894c2b3d5c3b78372af63694cdc659 pruebafio/fich3
6d7fce9fee471194aa8b5b6e47267f03 pruebafio2/fich3

Laspginasmande'afio'contienenalgunosejemplosinteresantes.Por
ejemplovienecomohacerunacopiasobreunaunidaddecdrom.

find.|afioob2048s325000xv'!cdrecord..'

Sindudaalgunaafioesunexcelenteprogramaparasusrespaldosyle
recomendamosquelopongaapruebaysefamiliariceconl.

Resumiendo Conviene conocer tanto 'cpio' como 'tar' porque son dos
clsicosdelossistemasoperativostipoUnixyambossonmuyutilizados.
Cadaunotienesusventajasysusinconvenientes.Porotraparte'afio'es
mucho ms reciente yporlotantosuusonoestanamplio, peroeso
podracambiar enunfuturogracias asusindudables mejorastcnicas
respectoalosdosclsicosantesmencionados.

Elnicomotivoquesemeocurreporelcualsepodradesaconsejarel
usode'afio'esportemasdeportabilidadentredistintasmquinas,con
distintosSO.Enesecasoparagarantizarquelacopiatengaunformatolo
ms universal posible,lorecomendable serausar'tar'sincompresin,
pero eso no justifica dejar de usar 'afio' para las copias de seguridad
rutinariasrenunciandoasusindudablesventajas.

Observequelasalidadeinformacinsiemprequeresultaposiblesehace
a salida estandar. En caso que se generen dos salida se usa la salida
estandar como salida principal. La salida estandar de errores se usar
comosalidasecundariamezcladaconposiblesmensajesdeerror.

Concretamentelaopcinten'tar'y'cpio'entreganasalidaestandarel
resultadoperolaopcionoylaopcinvde'cpio'juntashacenquela
salidadelacopiasedirijaasalidaestandarylalistadelosficherosse
dirijirentoncesalasalidaestandardeerrores.

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

Encualquiercasolasposibilidadesdecualquieradeestostresprogramas
sonmuyvariadas.Esimprescindibleacudirvalaspginasmandecada
unodeellosparatenerunavisincompletadesusposibilidades.Nosotros
nos hemos limitado explicar con ayuda de ejemplos algunas de sus
posibilidades.

/===============/

Unprogramacompletokbackup(1)

Es un programa muy completo para hacer backups. Es 100% libre


(LicenciaArtistic)yestescritoenlenguajeshellscript.Lainterfazde
usuario a base de un completo sistema de mens est programado
haciendo uso de 'dialog'. Permite usar encriptacin pgp. Compresin
mediante doble buffering para para optimizar la escritura en cintas y
como herramienta de empaquetado de ficheros usa 'afio' o 'tar' segn
convenga.

Esaltamenteconfigurableyverstil

Permitealmacenardistintasconfiguracionesparadistintostiposdecopias.

Sinoquiererealizarunsistemaasumedida,puedeusar'kbackup'para
suscopias.

/===============/

Recuperacintotaldesdecero

Muchas veces tener un disquete o CDROM de rescate con las


herramientas necesarias simplifica mucho las cosas. Realmente todo
podraresultartansencillocomoarrancarconesesistemaderescatey
recuperarlacintasobreelsistemadeficherosadecuadamentemontado.

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

Siusaprogramasespecficoscomo'kbacup'deberinvestigarlaformade
recuperarunacopiade'kbacup'sinusar'kbacup'.Ensudefectodebera
tener un disquete o cdrom de rescate (autoarrancable) que contenga
'kbackup'.

Lascopiasdekbacuppuedensermanejadaspor'afio'o'tar'.Porejemplo
encasodeperdidadetodoelsistemaquizsnotengamosformadehacer
funcionar'kbackup'perosi'tar'o'cpio'.Enestecasoesimportantesaber
quelascopiasde'kbacup'escribenenprimerlugarunficherodecabecera
queincluyeinformacinsobreelformatoqueseusoparaesacopia.

Encualquiercasodebedetenerclarocualserlarecuperacindeuna
cintadeseguridaddetodoelsistemadesdecero,ysitieneposibilidades
de hacer pruebas sin comprometer datos importantes hagalo. Use por
ejemplounsegundoordenadorsininformacinimportante.

/===============/

CopiausandodispositivodecintaSCSI

Elusodetodoslosdispositivos decintaSCSIesbastante similar.Lo


usaremos como para nuestro ejemplo. Estos dispositivos tienen varios
controladoresynosfijaremosahoraendosdeellos.

/dev/st0DispositivodecintaSCSIConautorebobinado.
/dev/nst0DispositivodecintaSCSISinautorebobinado.

El autorebobinado significa que el cierre del dispositivo provoca el


rebobinadoautomticoalprincipiodelacinta.Nosotrosusaremosparala
copia de seguridad /dev/st0 (Con auto rebobinado) Solo usaremos
/dev/nst0pararebobinadoyretensiondelacinta.Elretensionadodela
cinta es una operacin muy necesaria y en principio el programa de
ejemploprovocarsiempreunretensionadodelacinta.Lascintasqueno
sonretensionadasdevezencuandopuedellegararomperseoatascarse.

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

Loscontrolesquevamosausarsobrelacintason:

mtf/dev/nst0rewind
mtf/dev/nst0retension
mtf/dev/st0status

Los dos primeros ya han sido mencionados y el ltimo proporciona


informacinsobreelestadodelacinta.

Vamosaproporcionarunscriptparahacerrespaldosbasadoenelusode
afio.Deberestudiarloparaadaptarloasusnecesidades.

Estpensadoparausarcintasscsi.Sepuedeadaptarfcilmenteparaotros
dispositivosoparacopiasobrefichero.Siestonolegustasiemprepuede
usarunprogramacompletodebackupcomo'kbackup'ysilegustapero
lo encuentra incompleto puede encontrar solucin a sus necesidades
concretasinspeccionandoelcdigode'kbackup'queestescritoenshell
script.

Unprogramadebackupmsqueverstilhadesercmodo.Yalodijimos
antes.Elbackupesunatarearutinariaymuyimportante.Interesatenerun
sistemaquepermitameterlacinta,dardosotresteclazosydejarqueel
restolohagaelordenador.Deesaformaeldaqueestemoscansadosno
tendremosexcusaparanohacerlacopia.

Loquevieneacontinuacinesunejemploylosejemploshandeser
sencillos,peroestamossegurosqueleresultarmuyfciladaptarloasus
necesidades.

Enesteejemplonosotrosexcluimos/mntporqueesundirectoriodonde
suponemosquehaymontadosdispositivosquenodebenserrespaldados.

Parahacerunrespaldosobreunficheroconvieneusarundiscodistinto
montadoenunlugarquequedeexcluidodelacopia.Ennuestroejemplo
podramossituarelficheroderespaldodentrode/mnt.

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

Analiceelscriptaconciencia.Acudaalmanualonlineparacadaunode
loscomandosquerepresentenalgunadudaysiapesardeeso,algosale
malinsistimosenrecordarlequetodalaresponsabilidadenelusodeesto
odecualquierotromaterialdelcursoessolosuya.

#!/bin/bash
#####################################################
################
testTape(){
echo "## Inserte la cinta ${DATOS} ##"
echo ".... pulse <Intro> para continuar"
read
echo
mt -f /dev/nst0 rewind
mt -f /dev/st0 status
echo
afio -rvZ -b ${BLOCK} -s ${CAPCINTA} < /dev/st0 |
more
}

#####################################################
################
preparar(){
REF_INCR=""
if [ "$TIPO" = "I" ]
then
REF_INCR=T_${DATOS}
fi
if [ "$TIPO" = "i" ]
then
REF_INCR=I_${DATOS}
fi

T_DATOS=${TIPO}_${DATOS}
FECHA=`date +%y%b%d`
PREOUT="${BACKUP}/history/${FECHA}${T_DATOS}"
PRELAST="${BACKUP}/last/${T_DATOS}"
T_REF_INCR="${BACKUP}/last/${REF_INCR}.time"
FIFO3=/tmp/FIFO_salva_lst.$$
FIFO3OUT=${PREOUT}.lst

echo

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

echo '############ ' ${FECHA} ${T_DATOS} '


############'
echo
'----------------------------------------------------
----------'
df
echo
'----------------------------------------------------
----------'
if [ "$TIPO" = "i" ] || [ "$TIPO" = "I" ]
then
echo "Se recuperar informacin posterior
a ..."
ls -ld $T_REF_INCR | cut -c 42-
fi
echo
echo "desde=$DESDE, incluir=$INCLUIR,
excluir=$EXCLUIR, datos=$DATOS"
echo "!! Compruebe que los dispositivos montados
coinciden para $DATOS !!"
echo ".... pulse <Intro> para continuar"
read
echo "## Inserte la cinta. Asegurese que est
desprotegida ##"
echo "....Espere a que est lista y pulse <Intro>
para continuar"
read
echo
mt -f /dev/nst0 rewind
mt -f /dev/st0 status
echo "Espere. Realizando prueba de escritura ...."
if ! echo "____ Prueba de grabacion OK ____" |
blockout > /dev/st0
then
echo " !!! Imposible escribir !!!"
exit
else
blockout < /dev/st0
fi
mt -f /dev/nst0 rewind
echo
echo -e '\7\c' sleep 1
echo -e '\7\c' sleep 1
echo -e '\7\c' sleep 1
echo "## Compruebe estado de la cinta ##"
echo ".... pulse <Intro> para continuar"

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

read
}

#####################################################
################
salva(){

RETENS="S"
clear
echo "############ !! Backup en marcha !!
############## $T_DATOS"
COMIENZO=`date`
if [ "$RETENS" = "S" ]
then
echo "Retension de la cinta ............."
mt -f /dev/nst0 retension
sleep 5
fi
cd $DESDE
touch ${PRELAST}.time
chmod 400 ${PRELAST}.time
echo "Salidas en ${PREOUT}."

INI=`date "+%d %b %Y %r"`


echo "Grabando en cinta la copia de
seguridad ............"

mknod --mode=600 $FIFO3 p


cut -b 3- < $FIFO3 | egrep -v '^$' | sort >
$FIFO3OUT &
rm ${PRELAST}.lst 2> /dev/null
ln -s $FIFO3OUT ${PRELAST}.lst

### Comienza realmente la copia ##


if [ "$TIPO" = "T" ]
then
nice find . -print | egrep -v $EXCLUIR | egrep
$INCLUIR | \
tee $FIFO3 | afio -ovZ -b ${BLOCK} -s $
{CAPCINTA} /dev/st0
else
nice find . -newer $T_REF_INCR -print | egrep
-v $EXCLUIR | \
egrep $INCLUIR | tee $FIFO3 | afio -ovZ -b $
{BLOCK} \
-s ${CAPCINTA} /dev/st0

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

fi
### Fin ###
FIN=`date "+%r"`
echo "$INI ======> $FIN"
mt -f /dev/st0 status
echo "Copia en cinta terminada ......."
echo "Iniciando comprobacin ........."
afio -tZ -b ${BLOCK} -s ${CAPCINTA} /dev/st0 | sort
> ${PREOUT}.tape
diff $FIFO3OUT ${PREOUT}.tape > ${PREOUT}.diff
echo
"****************************************************
**************"
echo "******************* F I N B A C K U P
*************************"
echo
> ${PREOUT}.log
echo "******* ${PREOUT}.log "
>> ${PREOUT}.log
echo "******* Comenz $COMIENZO"
>> ${PREOUT}.log
echo "******* Finaliz `date`"
>> ${PREOUT}.log
echo "******* Diferencias `cat ${PREOUT}.diff | wc
-l` " >> ${PREOUT}.log
echo "******* DiferenciasHead `head -n 8 $
{PREOUT}.diff` " >> ${PREOUT}.log
echo " ...."
>> ${PREOUT}.log
echo "******* DiferenciasTail `tail -n 8 $
{PREOUT}.diff` " >> ${PREOUT}.log
echo "bzip2 $FIFO3OUT ${PREOUT}.tape ${PREOUT}.diff"
bzip2 $FIFO3OUT ${PREOUT}.tape ${PREOUT}.diff
echo "rm $FIFO3"
rm $FIFO3
echo
"****************************************************
**************"
cat ${PREOUT}.log
echo
"****************************************************
**************"
}

##(1)#######################################
salva_tmp(){

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

DESDE='/tmp'
INCLUIR=$INCLUIR_TODOS
EXCLUIR=$EXCLUIR_NINGUNO
DATOS="tmp"
preparar
salva
}

##(2)#######################################
salva_root(){
DESDE='/'
INCLUIR=$INCLUIR_TODOS
EXCLUIR="\.netscape/cache/|\/core$|^./tmp|^./proc|^./
mnt|^./mount"
DATOS="root"
preparar
salva
}

##(3)#######################################
salva_home(){
DESDE='/home'
INCLUIR=$INCLUIR_TODOS
EXCLUIR=$EXCLUIR_NINGUNO
DATOS="home"
preparar
salva
}

#####################################################
###################
################################ MAIN
##################################
#####################################################
###################
CAPCINTA=3700m
BLOCK=10k
INCLUIR_TODOS="^."
EXCLUIR_NINGUNO="^./tmp|^./proc"
BACKUP="/backup"
mkdir $BACKUP 2> /dev/null
mkdir ${BACKUP}/history 2> /dev/null
mkdir ${BACKUP}/last 2> /dev/null
cd ${BACKUP}/history
clear
echo "################ BACKUP `date` ###############"

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

echo
ls -rt *.log
echo
sleep 2
RETRY=TRUE
while [ "$RETRY" != "FALSE" ]
do
echo
echo '0) Comprobar contenido de una cinta'
echo '1) salva_tmp (/tmp) para pruebas)'
echo '2) salva_root (menos /mnt y /mount)'
echo '3) salva_home (/home)'
echo
echo 'Introduzca la opcion deseada.'
read OPT1
case "$OPT1" in
[0123]) RETRY=FALSE
;;
*) echo "Opcion invalida. Reintentar"
;;
esac
done

if [ "$OPT1" != "0" ]
then
RETRY=TRUE
while [ "$RETRY" != "FALSE" ]
do
echo 'Introduzca en primer lugar el tipo de
copia deseado'
echo
echo 'T) TOTAL'
echo 'I) INCREMENTAL DESDE ULTIMO TOTAL'
echo
read TIPO
case "$TIPO" in
[TI]) RETRY=FALSE
;;
*) echo "Opcion invalida. Reintentar"
;;
esac
done
fi

case "$OPT1" in
0) testTape ;;

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

1) salva_tmp ;;
2) salva_root ;;
3) salva_home ;;
esac
echo Copia finalizada.

Los mens de esta aplicacin pueden hacerse ms vistosos usando


dialog(1), tambin puede intentar opciones para salvar y recuperar
configuraciones. Ambas cosas estn resueltas el 'kbackup' que est
realizadoigualmenteenshellscript.

/===============/

Ejemplosderecuperacindecopias

Enelejemploanteriornohemosincluidoningunaopcinderecuperacin
porquecadacasoesdistintodependiendodeloquesequierarecuperar.

Un error en la recuperacin puede suponer perdida de informacin.


Siempre que sea posible conviene recuperar en un lugar distinto al
originalysolosedebenrecuperarlosficherosnecesarios.

Generalmente los programas de propsito general permiten la


recuperacin de todoel contenido obiensacan unalista detodos los
ficherosparasealaraquellosquedeseamosrecuperar.

Alcontrarioqueelrespaldolarecuperacinnoesunatarearutinaria.Por
esaraznyporquecadarecuperacinhadehacersebajounossupuestos
distintoslosprogramasdepropsitogeneralnosiempreproporcionanla
flexibilidadnecesaria.

Conociendobienlasherramientassencillastipo'find','cpio','tar','afio',
etc y combinndolas para recuperar solo lo que deseamos lograremos
muchaflexibilidad.

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

Lasdistintasposibilidadessonimposiblesdecomentaryyavimosalguna
cosaalexplicar'cpio'yenrealidadbastaconsabercomosacarlalistade
ficherosdeunacintaycomopoderusaresalistapararecuperarloque
queramos.

Ahoranosvamosaverejemplosconcretoscentrndonosexclusivamente
enlarecuperacindecopiasrealizadascon'afio'enformatocomprimido,
para nocambiar porquedealgunamaneravenimosmostrandonuestro
favoritismopor'afio'entodaestaleccin.

Sepuedeconfeccionarunalistadelosficheroscontenidosenlacopia
haciendolosiguiente.

$ afio -tZ /dev/st0 > listafich

Supongamosqueennuestralistadeficherosaparecenlossiguientes.

./var/lib/postgres/data/pg_variable
./var/log/apache/access.log
./var/log/apache/error.log
./var/log/auth.log

Sihacepruebassitueseen/tmp.Paraunarecuperacindeinformacin
realtampococonvienerecuperardirectamentesobreeloriginalasque
/tmp puede ser igualmente un buen lugar si hay espacio para ello.
Recuerdequealgunossistemaslimpian/tmpalarrancaroregularmente
cadaciertotiempo.

Continuandoconnuestroejemplo,pararecuperarporejemplo'auth.log'
haramoslosiguiente.

$ afio -iZ -y '*auth.log' /dev/st0

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

Para recuperar los que ficheros que contengan 'log/apache' pero no


'access'haramoslosiguiente.

$ afio -iZ -y '*log/apache*' -Y '*access*' /dev/st0

Enestecasohabramosrecuperadosolo'./var/log/apache/error.log'.

ParacasosmscomplejosseusarlasopcioneswoWconficherosque
contendrnunnombredefichero,ounpatrnporcadalnea,ydonde
cada una de ellas serconsiderada como sifueraunaopcin yoY
respectivamentepara'wfichero'opara'Wfichero'.

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

LAMEMORIAVIRTUALENLINUX

Introduccin

Estecursonotratadelaadministracindelsistemaperoenestecaptulo
sevanaexplicaralgunascosasquesonmateriadeadministracindel
sistemaperoqueunusuariotambindebeconocer.

Muchas veces un administrador tiene dificultades para gestionar los


escasosrecursosdeunamquinaporquelosusuariosnolosutilizandel
modomsracional.

Enunsistemaconmuchosusuariosestosdebencompartirlosrecursosde
modoracional,perogeneralmenteocurrelocontrario.Elnocomprender
como funcionan las cosas y la avaricia de recursos puede conducir a
conductasabsurdas.

Porejemplounusuarioquetienequecompilar500programassabeque
tendrqueesperarmucho.Siesteusuarioessuficientementeignorantey
egosta puede pensar que lanzando las 500 compilaciones
simultneamentecausarunretrasoalosdemsperoelterminarantes.
Lo cierto es que los recursos del sistema se desperdician en trabajos
internos totalmente intiles para el usuario cuando el sistema est
sobrecargado.

Tantosisepersiguecompartirlosrecursosdeformarazonableconlos
demsusuarios,comosiloquesepretendeesusarlosrecursosdetodoel
sistemaparasacarelmayorbeneficiopersonal,senecesitacomprender
comofuncionanalgunascosas.

Estaleccin sertotalmenteterica porqueparaunusuarionormalno


resulta prudente cierto tipo de experimentos que podran provocar

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

incomodidades o incluso algunos problemas en el sistema. De todas


formassielsistemaempiezaatenerproblemas,siqueesbuenotenerlos
conocimientossuficientesparaaveriguarsiesotienequeverconalgoque
estemos haciendo nosotros. Quizs podamos incluso advertir a algn
compaeroquetrabajeenelmismoequipoqueelproblemaenelsistema
tienequeverconloqueelhace.

Limitarelusoderecursos

Enunsistemasesuelellamarrecursosaciertoselementosquenopueden
serutilizadosdeformailimitada.Porejemplo.'yes'esunprogramaque
genera una salida infinita y no es buena idea redirigir su salida a un
ficheroporquellenaremosnuestroespaciodedisco.Enalgunossistemas
eladministradorestableceunlimitedeespacioparacadausuario.Sino
fueraelcasollenaramoseldisco.Silasalidade'yes'laredirigimosa
/dev/null no pasar nada. El nmero de ficheros que podemos tener
abiertos simultneamente tambin tiene un lmite. Lo mismo puede
decirsedeotrasmuchascosas.

La cantidad de memoria es limitada peroexisten distintos limites que


afectanalusodelamemoria.Paralimitarelusodeciertosrecursosexiste
uncomandointernodelashellllamado'ulimit'.

Porejemplo'ulimitc'seusaparalimitareltamaodelosficheroscore
producidoscuandounprocesomuerebajodeterminadascircunstancias.
Unusuarionormalitonoutilizarparanadaestosficherosasquepodra
usarse'ulimit0'paraevitarlaaparicindeficheroscore.

TambinsepuedenlimitarotrasmuchascosascomolacantidaddeCPU
porsegundo,tamaomximodeunfichero,mximonmerodeprocesos,
mximo numero de ficheros abiertos, cantidad mxima de memoria
virtual,etc...

Para ver las limitaciones con las que estamos trabajando haremos lo
siguiente:

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

$ulimita
core file size (blocks) 0
data seg size (kbytes) unlimited
file size (blocks) unlimited
max locked memory (kbytes) unlimited
max memory size (kbytes) unlimited
open files 1024
pipe size (512 bytes) 8
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes 256
virtual memory (kbytes) unlimited

Buenoenesteejemplovemosqueestamosenunasesinconmuypocas
limitaciones.Esoessealdequeeladministradorconfaennosotrosy
nosconcedemuchalibertad.

'ulimit'permiteestablecerdosclasesdelmites.Lmitesduros(solose
puedenponerunavezygeneralmenteestolohaceroot)ylmitesblandos
quesepuedencambiarvariasvecesperonosepermitesobrepasarlos
valoresestablecidosenellmiteduro.rootestableceestoslmitesenalgn
fichero de configuracin y los usuarios pueden tener en su
$HOME/.bashrc alterar los limites blandos. Para ms informacin
consultelapginamande'ulimit'.

Multitarea

Yahemoshabladoalgodeellacuandoestudiamoslosprocesos.Queda
claroqueenunsistemaenelqueseestnejecutandoenaparienciavarios
procesossimultneamenteloqueocurrerealmenteesqueeltiempodela
CPU se va repartiendo entre los distintos procesos concediendo
rpidamente sucesivas rodajas detiempoacadaunoenfuncindesu
prioridadydelapolticaderepartodeesetiempo.Estapolticanonos
interesa ahora. Se supone que las cosas estn pensadas para que el
funcionamientoglobaldetodoelsistemaseaelmsadecuado.

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

Volvamosalcasodelusuarioignoranteyegostadelcaptuloanterior.El
delas500compilacionessimultneas.Elsistemanecesitapararcadauno
delosprocesosqueusanlaCPUunavezquehanconsumidosurodajade
tiempoparatomarelsiguienteprocesoenesperadeCPU.

Cuandounprocesonecesitausaralgoyeneseinstantenoestdisponible
pasaaunestadodeinactividad.Sedicequequedadormido.

Estecambiodeunprocesoaotronoesgratuitoporqueunavezparadoel
proceso hay que anotar la situacin en la cual ese proceso ha sido
detenidoparaluegopodervolveracontinuarexactamenteenelmismo
puntocuandolevuelvaatocaryquizspartedelcdigoodelosdatosdel
proceso ya no estn en memoria RAM (tambin la llamaremos
indistintamentememoriafsica.Vermsadelantepaginacin).Todoesto
consumemuchosrecursosysepuedealcanzarlasituacinenlacualel
SO consume la mayor parte del tiempo en esta gestin de procesos
intercambiando datosentre memoria ydiscoconstantemente porquela
memoriafsicanopuedecontodoporelcontrariolosprocesosquesonla
parterealmentetilapenasdispondrnderecursos.Enestasituacinel
sistemasevuelvemuylentoylosdiscosdelsistematienenunaactividad
altsima.Enrealidadesunasituacindeautnticoagobioparaelsistema
ysucomportamientosevuelvetorpe.Escomosielsistemaactuaraala
desesperada.

Poresarazndecimosqueelusuariodelcaptuloanteriorademsdeser
egostaesignoranteporqueestprovocandounenormeretrasonosoloa
losdemsusuarios(cosaqueyasabe)sinotambinasimismo.

Sialgunaveznotamosqueelsistemavamuylentoysospechamos la
causa tendremos que parar en primer lugar el proceso que est
provocando la sobrecarga. Si no sabemos cual es o si se trata de un
proceso que no es nuestro podemos investigar con el comando 'top'.
Tengaencuentaquedeestecomandosesalecon'q'.

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

Estecomandosacaencabeceraunresumendelasituacingeneraldel
sistema y luego saca solo la informacin de los procesos que mayor
consumoderecursosestnprovocandoenelsistema.

Tengaencuentaque'top'sirveparadiagnosticar elusoderecursosy
permiteidentificarprocesosqueconsumendemasiadoperoensimismo
'top' tambin consume bastantes recursos. Por eso en situaciones de
sobrecargadelsistemaconvienenoabusardesuuso.'top'refrescacada
ciertotiempolainformacindelapantalla.Pordefectolohacecada5
segundos.Podemosaumentara15segundos.Paraellousaremos'topd
15'. Esto consumir menos recursos y nos permitir mirar con ms
tranquilidadlainformacindetop.

Vamosaverunejemplodelusode'top'quecorrespondeaunsistemacon
muy poca actividad. Solo 5 usuarios. La CPU est ociosa 99.6% del
tiempo,lacantidaddememoriadisponibleesaltaynoseestusandola
swap.

$top
12:17pm up 2:06, 5 users, load average: 0.00,
0.00, 0.00
55 processes: 54 sleeping, 1 running, 0 zombie, 0
stopped
CPU states: 0.0% user, 0.3% system, 0.0% nice,
99.6% idle
Mem: 258100K av, 93320K used, 164780K free, 66800K
shrd, 7652K buff
Swap: 393552K av, 0K used, 393552K free
40744K cached

PID USER PRI NI SIZE RSS SHARE STAT LIB %CPU


%MEM TIME COMMAND
1002 root 11 0 1312 1312 700 R 0 0.3
0.5 0:00 top
1 root 0 0 464 464 404 S 0 0.0
0.1 0:05 init
2 root 0 0 0 0 0 SW 0 0.0
0.0 0:00 kflushd
3 root 0 0 0 0 0 SW 0 0.0
0.0 0:00 kupdate

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 2:16, 5 users, load average: 0.00,


0.00, 0.00

Coincideconlaprimeralineade'top'.Losdatossonhoraactualtiempo
transcurridodesdeelarranquedelsistema,nmerodeusuariosylastres
ltimas cifras se corresponden con promedios de carga en el ltimo
minuto,5ltimosminutosy15ltimosminutosrespectivamente.

Memoriavirtual

Vamosaexplicarenprimerlugarquesignificaesodememoriavirtual.
EnmuchossistemasoperativoselSOofrecealosprogramasunespacio
de memoria superior al que realmente existe. La memoria fsica es la
memoriaRAM.LaCPUnopuedehacernadaconlosdatossiantesno
pasan ala RAM.Apesardeestounsistema con64Mbytes deRAM
puedeejecutar porejemplounprogramausevariablesconeldoblede
tamaoqueeldelamemoriaRAMdisponible.Sielprogramaaccediera
muchoydeformaaleatoriadentrodeestaenormevariable,seproducira

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

una fuerte sobrecarga en el sistema. Si alguien se pregunta si una


barbaridadcomoesta,puedehacerlaunusuarionormalitosinprivilegios
especiales,larespuestaes,usuarionormalsi,peroautorizado.

Esonosignificaqueestemosburlandolaseguridaddelsistemanique
seamosmslistosqueeladministrador.

Sieladministradorconfiguraelsistemadeformaparanoicaparaevitar
cualquier posible riesgo, los usuarios se vern sometidos a unas
restriccionesbastanteincmodasparatrabajar.

Por eso lo normal es que el administrador asuma que los usuarios


autorizadosutilizaranlosrecursosdeformarazonable.

Paragestionarlamemoriavirtualloquesehaceesrecurriralespaciode
discoparaampliaresteespacio.LamemoriaRAMtieneunavelocidadde
accesomuchomsrpidaqueundiscoduroyparaconseguirquetodo
funcione de forma transparente y de forma eficiente se utilizan unas
tcnicasdesegmentacinypaginacinquedescribiremosacontinuacin.

Segmentacindelamemoria

Lamemoriadeunordenadoresunaespeciedeenormecasillero.Cada
casillacontendrciertainformacinperounprocesonopuedeaccedera
todalainformacindelsistema.Cadacasillatieneunadireccinycada
procesopuedeusarciertasdireccionesparaalmacenarinformacin.De
esta forma se evita que un proceso interfiera accidentalmente o
intencionadamentealainformacindeotroprocesodistinto.

Lascasillassonlasposicionesdememoriayapesardelodichoexisten
posiciones de memoria compartidas. Por ejemplo el cdigo de un
programaqueseestejecutandoenvariosprocesossercompartidoen
modo exclusivo de lectura por los procesos que estn ejecutando ese
programa.Esdecirquesiporejemplohayvariaspersonasejecutandoel
editor'vim'elcdigodeeseprogramanoestarrepetidoenmemoria.
Seraundesperdicioporqueelcdigoeselmismo,nosepuedealterary

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

laCPUselimitaaleerlainformacinconsistenteeninstruccionesparala
CPU.

Todoestetipodeinformacinesloquesedenominasegmentodetexto.
Losprocesomanejanotrostiposdeinformacindistintasyparaellose
organizaensegmentosdedistintotipo.Porejemplohaysegmentosde
datosdesololectura,segmentosdedatosdelecturaescritura,segmentos
dedatosdepila,segmentosdatosdememoriacompartida,segmentosde
memoriadinmica.Novamosaexplicarestascosasporqueexcedeen
mucholospropsitosdeestecaptuloperosiqueremosdejarunaidea.
Losprocesostienenlamemoriaorganizadaensegmentosdedistintotipo.
Gracias a esto se consigue utilizar la memoria RAM de forma muy
eficiente.

PeseaqueelcdigodeunprogramapuededesaparecerdelaRAMpara
dejarespacioaotrosprogramas,nosernecesariosalvarlainformacina
disco. Si fuera necesario volver a cargarlo en RAM bastar acudir al
ficheroquecontienesucdigoejecutable.

Esto hace que los ficheros que contienen programas que se estn
ejecutandonopuedanserborradosnimodificadospornadie,nisiquiera
porroot.

Copie el ejecutable 'top' en el directorio /tmp (Seguramente estar en


'bin/top'ysinodeberisercapazdeencontrarlo).Ejecutelocomo/tmp/top
ydesdeotrasesinintenteborrarelfichero.Sencillamenteleresultar
imposiblepeseaqueesustedesdueodeesacopia.

Cuidado.Estonoesaplicablealosscriptsdebashoaotrosscriptsporque
en realidad estos programas son datos que se ejecutan dentro de un
programaquelosinterpretaenlugardehacerloenlaCPU.

Paginacin

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

LainformacinseorganizaenbloquesylosbloquesquelaCPUusase
mantienen el mayor tiempo posible en RAM. A estos bloques de
informacinselesllamapginas.

Seintentareducirelnmerodelecturasyescriturasadisco.Paraellose
acta en base a suposiciones de uso de la memoria. Las pginas
recientementeutilizadastienenmayorprobabilidaddevolveraserusadas
pronto que aquellas que ya hace tiempo que no han sido accedidas.
Intentaremosexplicarporque.

Los programas se comportan generalmente usando pequeas partes de


cdigodurantelamayorpartedeltiempomientrasqueotraspartesse
ejecutarndeformamuyocasional.

Ademslosprogramasusanpartescomunesdecdigoquepertenecena
libreras compartidas. El aprovechamiento de la RAM se consigue
manteniendounasolacopiadeesecdigocompartidoenmemoriaRAM.

Losaccesosaestas pginasdememoria quecontienencdigopueden


sern para leer informacin. En el caso de datos de lectura escritura
tambinpodrnseraccedidasparasumodificacin.Cuandounapgina
hasidomodificasemarcaparaescribirsucontenidoendiscoenelcaso
dequesenecesiteelespacioqueocupaparaotrapginadistinta.

El area de disco que se utiliza para ello se llama swap (tambin se


denomina memoria de intercambio) y un usuario normal no puede
modificarlaaunquerootsipuedehacerloparaaumentarlaodisminuirlade
tamaoporejemplo.

Lamemoriavirtualeslasumadelamemoriafsica(RAM)mselswap
(areadeintercambio)menosalgunaspginasdereserva.Laspaginasde
reserva estn limpias de informacin para poder cargar en ellas
informacinnuevadesdelaswapcuandosenecesita.

Alprocesodetraerunapginadelaswapamemoriafsicaselellama
(swap in). Esto necesita un tiempo y normalmente el proceso espera

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

dormido.Alprocesodevolcarunapginadememoriafsicaaswapsele
llama(swapout)ygeneralmenteelprocesoyaestdormidocuandoesto
ocurre.

Cuandoseagotalamemoriafsica(RAM)seempezarausarlaswap.

Cuandolamemoriavirtualseagotaelkernelempezaramatarprocesos.
Dichodeotromodounprocesoqueintentausarmemoriavirtualcuando
estagotadaterminarrecibiendounasealdelkernelqueprovocarsu
muerte.

Utilidadesparamonitorizarelusodememoriavirtual

Yavimoselusode'top'.Nossirviparaintroducireltema.Setratadeun
comando realmente buenoparalocalizar losprocesos responsables del
mayorconsumodeCPUymemoria.

Lainformacindelestadodencleodelsistemaseencuentraen/proc/Ya
comentamos en captulos anteriores parte de su cometido y tambin
resultamuytilparaobtenerinformacinsobreelusodelamemoriaen
elsistema.

$cat/proc/meminfo
total: used: free: shared: buffers:
cached:
Mem: 264294400 103956480 160337920 58118144 10465280
53153792
Swap: 402997248 0 402997248
MemTotal: 258100 kB
MemFree: 156580 kB
MemShared: 56756 kB
Buffers: 10220 kB
Cached: 51908 kB
SwapTotal: 393552 kB
SwapFree: 393552 kB

Tambin'psv'puededarnosinformacinsobreelconsumodememoria
virtualdeprocesos.Contopsolosalalainformacindelosprocesosque

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

ms consumen pero quizs necesitemos informacin de determinados


procesos.Porejemploparasacarlainformacindelosprocesosasociados
al nuestro terminal bastar usar 'ps v'. Si necesita precisar otras
condicionesconsultelasopcionesdepsensupginaman.

$psv
PID TTY STAT TIME MAJFL TRS DRS RSS
%MEM COMMAND
301 tty3 S 0:00 600 420 1743 1300
0.5 -bash
1640 tty3 S 0:00 326 518 1829 1568
0.6 vi recursyst.dat
1665 tty3 S 0:00 194 420 1451 832
0.3 /bin/bash -c (ps v) >/tmp/vok2gkuv 2>&1
1666 tty3 R 0:00 240 55 2844 1176
0.4 ps v

Sisolodeseamossabercuantamemoriaquedalibrepodemosusar'free'.
Estecomandotambinindicasiseestusandolaswap.

$free
total used free shared
buffers cached
Mem: 258100 101668 156432 56800
10248 51988
-/+ buffers/cache: 39432 218668
Swap: 393552 0 393552

Con'vmstat'podemostenerinformacindelusodememoriavirtual,cpu,
ydelconsumodeentradasalida.

$vmstat
procs memory swap
io system cpu
r b w swpd free buff cache si so bi
bo in cs us sy id
0 0 0 0 156404 10252 52000 0 0 2
1 141 132 1 0 98

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

Con'memstat'podemosverelusodememoriavirtualdelosprocesosy
delaslibrerascompartidas.

$memstat
44k: PID 1 (/sbin/init)
60k: PID 98 (/sbin/portmap)
80k: PID 156 (/sbin/syslogd)
468k: PID 158 (/sbin/klogd)
40k: PID 165 (/sbin/kerneld)
52k: PID 170 (/sbin/rpc.statd)
140k: /lib/libreadline.so.4.1 228
24k: /lib/libwrap.so.0.7.6 98 271
72k: /lib/ld-2.1.3.so 1 98 156 158 165 170 178
179 180 181 182 188 193 ...
864k: /lib/libc-2.1.3.so 1 98 156 158 165 170 178
179 180 181 182 188 19...
20k: /lib/libcrypt-2.1.3.so 228 292 295 306 307
308 309 310 311 461 966...
...: .........................
...: .........................
...: .........................
--------
3768092k

Para mostrar solo la informacion del proceso 271(en nuestro caso es


sendmail)haramoslosiguiente:

$memstat|grep271
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
306 307 308 309 310 31...
76k: /lib/libnsl-2.1.3.so 98 228 271 284 287 292
295 299 300 301 303 30...
40k: /lib/libnss_compat-2.1.3.so 228 271 284 287
292 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
271 292 295 306 307 308...
48k: /lib/libresolv-2.1.3.so 271
308k: /usr/sbin/sendmail 271

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

Conestovemoslobienaprovechadoqueestelsistemayaquemuchas
delaslibrerasaparecencompartidasconunmontndeprocesosquese
estnejecutando.

Hemosconseguidoverlaslibrerascompartidasqueestausandoycuanto
ocupanenmemoriaperolautilidadparasaberusaousarunejecutable
es'ldd'.Estecomandononecesitaqueelprogramaseestejecutando
porquesacalainformacinanalizandoelcdigodelejecutable.

$ldd/usr/sbin/sendmail
libdb.so.3 => /lib/libdb.so.3 (0x40019000)
libwrap.so.0 => /lib/libwrap.so.0
(0x40054000)
libnsl.so.1 => /lib/libnsl.so.1 (0x4005b000)
libresolv.so.2 => /lib/libresolv.so.2
(0x40071000)
libc.so.6 => /lib/libc.so.6 (0x40081000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2
(0x40000000)

Actuacinconprocesosconflictivos

Llegados a este punto conviene explicar que se puede hacer con un


procesoconflictivo.Evidentementelasolucinmsdrsticaesmatarlo.
Paraelloseusarprimeroun'kill15PID'.Laseal15esunSIGTERM
quepermitealprocesopararordenadamenteperosielprocesoignoraesta
sealhabrquematarloconun'kill9PID'.Laseal9esunSIGKILL
quenopuedeserignorado.

Detodasformaspuedeocurrirquenosdepenamataraunprocesoquese
haba comportado razonablemente durante bastante tiempo y que est
llevandoacabounastareasquenosinteresan.

Lomssuavequesepuedehaceresbajarlelaprioridadcon'renice'por
ejemplo'renice20PID'.Bajarlaprioridaddeunprocesonoperjudicaen
nadaal procesocuandolaCPUest ociosaporfaltadetrabajo. Siel
procesocontinuaconsumiendodemasiadosrecursosynopodemosbajar

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

ms su prioridad podemos pararlo sin matarlo. Para ello se enva al


procesounasealSIGSTOPmediante'kill19'Paravolveraarrancarlo
podemoshacerlomandandounasealSIGCONT'kill18'

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

LAPRIMERAINSTALACIONDELINUX

Introduccin

NotodoslosusuariosqueempiezanconLinuxpartendelmismopunto.
UnosyatienenconocimientosdeUnix,otrosnotienenconocimientosde
Unixperosideinformticaengeneral,otrosdisponendealgnamigo
quelespuedeayudar,yotroshanledocosaspreviamente.Nosotrosno
asumiremos nada de eso. Solo asumiremos que ya ha estudiado las
leccionesanteriores.

Quizassepregunteporqueestaleccinnoseexplicantes.Laraznes
que durante la instalacin de Linux se manejan una gran cantidad de
conocimientosyenestemomentoyadisponemosdeunoscuantos.

Lainstalacinesunprocesoquesehasimplificadobastanteylasguasde
instalacinpuedenserdegranayuda.Apesardeestocuandosepresenta
unadificultad,muchasvecesserequieretenerunabasedeconocimientos
ampliaparapodersuperardichasdificultades.

He conocido a bastantes personas que deseosas de probar Linux me


confesabanquenodeseabanrealmenteperdernadadetiempoenaprender
cosas sobre Linux. Se conformaban con aprender a instalar Linux y
configurarlascuatrocosasquenecesitanusar.

Siempre asumimos que ha leido las lecciones anteriores y por ello


tambinasumiremosqueestenoessucaso.

Nosotros antes de llegar a este captulo hemos realizado un amplio


recorrido formativo. Conceptos como sistema de ficheros, ncleo del
sistema, proceso,memoria virtual, etc..ya hansidotratados. Tambin
sabeusaryaeleditorvi,yyatieneprcticaconelinterpretedecomandos.

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

La principal utilidad de todo ello es que nunca se sentir totalmente


perdido.

DetodasformashaymuchascosasinteresantesdecaraainstalarLinuxy
quenohansidotratadasnivamosatratarenprofundidad.Noloharemos
porque desbordara los propsitos de este curso. Por ejemplo unos
conocimientos sobre hardware de PC's vendran muy bien pero nos
apartaramosdemasiadodelospropsitosdeestecurso.

LafacilidadodificultaddelainstalacindeLinuxpuedevariardesdeser
algotrivial,oporelcontrariopuederesultarmuydifcildependiendode
las circunstancias. Debe tener esto muy presente y conformarse con
objetivossencilloslaprimeravezqueintenteinstalarLinux.

Sielprimerdaconsigueinstalarunsistemacapazdearrancarydeabrir
unasesinaunqueseaenmodoconsolatendrunabuenabaseparair
aadiendo mejoras a su sistema poco a poco. No decimos que no se
puedanhacermscosaslaprimeravezperonohayqueobsesionarsecon
ello.

Cuandoinstaledeberteneramanotodaladocumentacindesuequipoy
desusperifricos.Quizsnuncaleyesospapeles,peropuedequeahora
silosnecesite.

Nodebeintentaravanzardemasiadodeprisa.DebedeirasimilandoLinux
poco a poco. Cuanto menores son los conocimientos tcnicos ms
despaciohayqueempezarporquecuestams.

Sisolodisponedeunordenadorlomejorseradejarunapartedeldisco
duroparaWindowsyotraparaLinux.Deesamaneraalarrancarpodr
elegirconqueSOquieretrabajarynoseverforzadoahacerlotodoen
unSOqueinicialmenteleresultarextraoyquizasinclusohostil.

ConfiamosenqueconelpasodeltiempoWindowsleresulteanms
extraoymuchsimomshostilqueLinux.

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

/===============/

Consideracioneshardware

Linuxadmiteunaamplsimavariedaddehardwareperolaautodeteccin
de hardware est disponible principalmente en algunas distribuciones
comerciales como SuSE, Mandrake y RedHat. La autodeteccin de
hardware nunca es tan completa como enWindows. Ellos juegan con
ventajaenesto.

Es importante comprobar que la tarjeta grfica est soportada por la


distribucinquevaausar,encasocontrarioesprobablequesoloconsiga
unaresolucinVGA.EnlascajasdeSuSE,RedHatoMandrakeviene
unarelacinbastanteampliadetarjetasgrficassoportadas.

Paraempezarresultamssencillousarunordenadorbaratosinelementos
degrandesprestacionesyaserposiblenodemasiadonuevo.

LosprocesadorescompatiblesconIntel386oPentiumestnsoportados
aunqueseandeotrasmarcas.Lasplacasprincipalesyeltipodememoria
tampocosoncrticos.Encuantoalosdiscosdurosycontroladorasque
funcionenbajobajoMSDOSsuelenfuncionarensumayoraconLinux.
Algunas controladoras SCSI no estn soportadas y otras controladoras
SCSI que si estn soportadas pueden suponer una dificultad para una
primerainstalacindebidoaquepuedennoestarincluidasenelncleo
(kernel)dearranquedelainstalacin.

/===============/

Eleccindesudistribucin

Puedequeaunnotengadecididoquedistribucinusar.Siustedquierela
mximafacilidaddeinstalacinquizsdeberausarMandrake,SuSE,o
RedHatperodadoqueestoformapartedeuncursodeLinuxnosotrosle
recomendamosDebian.Debianeslaquetienemayorinterseducativo.

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

Quizs le cueste algo ms empezar con ella pero tambin aprender


muchoms.

Evidentemente hay otras consideraciones para le eleccin de su


distribucin de Linux. Compararlas en trminos de mejor o peor no
resultaadecuado.Nosotrosnovamosabasarelcursoenningunadeellas
enparticular.PerovamosahacerunpocodepropagandadeDebian.

Alser100%libreeslamsadecuadaparaaprender.Tcnicamenteesla
distribucin ms robusta que existe. La actualizacin de los distintos
componentesatravesdelaredesmuchomscmodayeficazqueen
ningunaotradistribucin.LacomunidaddeusuariosdeDebianestmuy
bienorganizadaydanmuybuensoporte.

Debian no es para comodones. Hay que leer bastante y hay que


molestarseenbuscarlascosas.GnomeyDebiansellevanmuybieny
Debianestevolucionandoenelsentidodequecadavezresultarms
intuitivayfacildeusar.

/===============/

UtilidadesMSDOS

EnmuchasdistribucionesencontrarunosprogramitasensuCDdeLinux
que son herramientas para usar desde MSDOS. Son software libre y
puedenvenirmuybienparadeterminadascircunstancias.

fips20.zip Se usa para dividir una particin en dos sin perder los los
datos.Seusamuchoparacrearunhuecoenundiscoparapoderinstalar
enelLinux.EstaversinpuedetrabajarconFAT32.

gzip124.exeSetratadeunaversindelpopularcompresor'gzip'deLinux
paramsdos

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

lodlin16.zip PermitearrancarLinuxdesdemsdos.Sepuedeusardesde
disqueteodesdediscoduro.

rawrite1.zipyrawrite2.zip.Secorrespondenconrawriteversin1.3y
conrawrite2.0.Permitencrearundisquetedesdemsdosapartirdeun
ficheroquecontengalaimagendeesedisquete.Algunasdistribuciones
incluyenunavariedaddeimgenesdedisquetesdearranquescadauno
pensado para poder arrancar en distintos tipos de mquinas pero
lgicamenteparacreareldisquetedearranqueenunamquinadondeno
conseguamos arrancar Linux necesitamos que este programa funcione
bajomsdos.Seproporcionanamenudoestasdosversionesporsibienla
versin2.0esmsrpidapuedebloquearseenalgunosequipos.

unz512x3.exe Estamos poniendo ficheros con extensin .zip. Son


ficheroscomprimidosenunformatomuyutilizadoenmsdos.

/===============/

ProgramasdeutilidadparainstalarLinux

Lasdistribucionessuelenusarunsistemademensyunosasistentesque
leayudanainstalaryconfigurarelsistema.Muchosdeestosprocesos
podranrealizarsemanualmentedesdeelinterpretedecomandosyaque
selimitanausarunosprogramasqueestninstaladosencualquierLinux.

Ahoranoslimitaremosasealarsuexistenciaycomentarparaquesirven.
Convienequeconsultelaspginasdelmanualdecadaunodeellos.

fdisk(1): Se usa para particionar. Advierta que en msdos existe un


programa que tambin se llama fdisk y que sirve igualmente para
particionareldisco.

mkswap(1):Paraformatearunaparticindeswap

swapon(1):Paraactivarlaparticindeswap

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

mke2fs(1):ParaformatearunaparticinLinux

mount(1):ParamontarelsistemadeficherosElconceptodemontajede
ficheroslovimosmuydepasadaeneltercercaptulodedicadoalsistema
deficherosyhemospracticadopococonlporquerequerausodela
cuenta de root en un momento que no pareca prudente. Repase este
captulo si ya no se acuerda. Puede consultar en las pginas man los
comandosmount(1),umount(1).

Tambinesmuyinteresantequemireelcontenidodesu/etc/fstab.Esun
fichero que indica al kernel que es lo que debe montar durante el
arranque.Consultelapginamancorrespondientefstab(5).Sieditaeste
ficheropuedeespecificarnuevospuntosdemontajeperounerrorpodra
hacerqueelsistemanovuelvaaarrancar.

Siemprequemodifiquealgodelsistema,dejeunacopiadelficherosin
modificarenalgnlado.

Porejemplopuededejarcopiasoriginalesficherosterminadasen'.seg'.
De esa forma si algo deja de funcionar luego puede recuperar
exactamente la situacin original. Lo hemos dicho muchas veces.
Asegureseentodomomentolaposibilidaddedeshacercualquiercambio.

Conociendotodosestosprogramastendrunaideabastantebuenadelas
cosasquevansucediendoduranteelprocesodeinstalacinaunquelos
asistentes de instalacin demuchas distribuciones los usarn demodo
transparente(demodonoperceptible)mientrasinstalan.

/===============/

Discoderescate

Se llaman as a los CDs o disquetes que pueden arrancar Linux


directamenteydejanunsistemafuncionandoconunaseriedeutilidades
parapodersubsanarproblemasenequiposqueporejemplohanperdidola

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

capacidad de arrancar o que no deseamos que arranquen sin subsanar


antesalgnproblema.

Muchos de los primeros CDs o disquetes de instalacin de muchas


distribucionespuedenserusadoscomodiscosderescateenlugardedisco
deinstalacin.

LosdiscosderescatesonensimismosunSOLinuxenminiaturaycomo
es lgico arrancan un kernel predeterminado y montan un sistema de
ficherosraz.

Dado que se necesita permiso deescritura ynopodemos usarningn


discoduroparaelloporquepodranoexistirespacioadecuadoparaello,
loquesehaceesmontarelsistemadeficherosrazenundispositivo
RAM.DeestaformatenemosunsistemaminiaturaLinuxconmnimos
requisitosdehardware.

Loquehadehacersemuchasvecesparaarreglarproblemasesmontarlas
particionesdeldiscodurodondeseencuentraelficheroquedeseamos
modificarygeneralmenteconunsimpleeditorsecorrigeelproblema.Por
ejemplo si se olvida uno de la password de root se edita el fichero
/etc/passwd eliminando el campo de la password, y de esa forma no
pedir password.Essolounaformadehacerlo ylocomentamos solo
comoejemplodeusodeunsistemaderescate.

Tambin comentamos antesqueuncambio desafortunadoen/etc/fstab


podahacerqueelsistemanovolvieraaarrancar.Sugeriamosentonces
que dejara una copia del fichero original en algn lado. En este caso
despusdemontarlaparticin raizdelsistemaquenoarrancadeber
sobreescribir elficheromodificado conlacopia original deseguridad.
Despus de cada cambio hay que acordarse siempre de desmontar el
sistemadeficheros.

Sinodisponetodavadeundisquetederescateytampocodisponedeun
CDderescate,deberacrearunocuantoantes.Nuncasesabecuandovaa
sernecesariorecurrirael.

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

ParaellolocalizeenlosCDsdesudistribucinlaimagendeunodeellos
quesellamarseguramente'rescue.img','rescue.bin','rescue.raw',oalgo
parecido. Puede hacerlo desde MSDOS usando rawrite, o desde linux
usandodd.

Antesdebermontarlaunidaddecdrom.Generalmentesesuelemontar
en'/cdrom/',en'/mnt/cdrom/' oen'/mount/cdrom/'.Vienedeterminado
en/etc/fstab.Porelloparamontarlobastarhacer:

$ mount /dev/cdrom
$ df

ParaRedhatsera:

$ dd if=/mnt/cdrom/images/rescue.img of=/dev/fd0
bs=1440k

ParaDebianpotatosera:

$ if=/mnt/cdrom/dists/potato/main/disks-
i386/2.2.16-2000-07-14/images-2.88/rescue.bin of=/dev/
fd0 bs=1440k

/===============/

Lilo

Liloesuncargadorquepuedeserinstaladoendisqueteoendiscoduro.
En disco duro puede ser instalado en una particin o en en el MBR
(Master Boot Record). El MBR es una zona especial del disco muy
pequeareservadaparaelarranque.

Se puede especificar arranques alternativos para distintos SO como


Windows98,Linux,etc...ParaLinuxpodemosespecificararranquescon
distintosncleos,yarranquesquemontenelsistemadeficherosrazen

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

distintasparticionessiemprequeefectivamenteobtenganunsistemade
ficherosrazvlido.Porellosepodraespecificararranquesparadistintas
distribucionesdeLinuxinstaladasendistintossitios.

Durante el arranque se espera un tiempo para que el usuario pueda


especificarelarranquedeseadoypasadoesetiemposearrancalaopcin
dearranquequefigurepordefecto.

Lilo ofrece muchas posibilidades. Los asistentes de instalacin lo que


hacenescrearunficherodeconfiguracindeLilo/etc/lilo.confyluego
ejecutanLilo.

Si decide intentar alguna modificacin manual de este fichero de


configuracindeberejecutardespusLilo.Siolvidahacerlolaprxima
vezelsistemanoarrancar.Lomismopasarsitocacualquieradelos
elementosqueintervienenenelarranque.

PiensequeLiloseinstalaenunlugarmuypequeoenelcualsesitan
apuntadoresaunaseriedeficheroscomoelkernel,el/etc/lilo.conf,etc.
Sialgunodeestosficherossemuevedesitioosemodificasucontenido,
losapuntadoresdeLiloquedarnsealandounlugarequivocadodonde
yanoexistelainformacintil.

Ejecutando Lilo se vuelve a reconstruir todo y se actualizan esos


apuntadores. Esos apuntadores o punteros son datos numricos que
expresan posiciones fsicas en el disco en forma de cilindro, sector,
cabeza,ydispositivo.

PrecisamenteestosapuntadorestienenlimitacionesenmuchasBIOSysi
laparticindearranquedeLinuxnoestcontenidantegramentedentro
de los primeros 1023 cilindros de su disco duro el sistema puede no
arrancar.

LinuxsepuedeinstalarenelMBR.Sideseavolveradejarelarranque
originaldemsdosqueestabasituadoenelMBRpuedearrancarmsdosy
hacer'FDISK/MBR'.

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

Linuxtambinsepuedeinstalarenunaparticindeldiscoduro.Sipor
errorinstalaLiloenunaparticindondetenanWindowsposiblementese
pierdalainformacindelosficherosdelsistemadeWindowsydeber
transferirelsistemanuevamentearrancandodesdeundisquetemsdosy
tecleando'SYSC:'siendoC:launidadquedesearecuperar.

/===============/

Loadlin

LoadlinesunejecutableMSDOScapazdecargarLinux.

Convieneconocerestaotraformadearrancar.Esunaalternativaalusode
Lilo. Para ilustrar su uso pondremos como ejemplo la creacin de un
disquetedearranqueconLoadlin.

1. Formatee un disquete desde msdos o Windows incluyendo los


ficherosdelsistema.(FORMAT/S).
2. CopieelejecutableLOADLIN.EXEyunkernelenestedisquete.
Porejemplovamosasuponerquedichokernellometemosenun
ficherollamado'kr3'.
3. Supongamosquenuestrosistemadeficherosrazestsituadoen'/
dev/hda9'.
4. IncluyaunficheroAUTOEXEC.BATquecontengalosiguiente:
loadlinkr3root=/dev/hda9rovga=3

Buenosimplementeconestotieneundisquetedearranquequenousar
LilosinoLoadlin.Susistemadeficherospodrestarencualquierparte
deldiscodurosinlalimitacindelos1023cilindros.

/===============/

LaSwap

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

Unadelascosasquetendrquedeterminareslacantidaddeswap.Ya
hemos vistoenlaleccin anteriorelconceptodememoria virtual.La
swapeslapartedeldiscodestinadaalintercambiodepginasdememoria
deRAM.

Generalmentesesueledimensionarlaswapconeldobledetamaoquela
cantidad de RAM disponible. De esta forma la memoria virtual
funcionar sin detrimento de velocidad. En el casode que el total de
memoriaresultanteRAM+SWAPnoalcanceparapoderejecutaralguna
de las aplicaciones necesarias sepodrsobredimensionar la SWAP a
costadereducirunpocosurendimiento.

Enelcasodetenervariosdiscos,convienerepartirapartesigualesla
swapentreellosparaquetodoslosdiscoscolaborenporigualalproceso
depaginacin.Estonoesimprescindibleperoesteprocesoesunodelos
quemsrepercuteenlacapacidaddetrabajodetodosusistema.

Laparticindeswapserlapartedesusistemaquetengamayornmero
deaccesosyporellotampococonvieneponerlaenunextremodeldisco
alejada de los sistemas de ficheros en uso. Esdto obligara a hacer
desplazamientosmayoresalascabezasdeldiscoyseperderavelocidad.

Enrealidadtodoestosoncosasquenotienenexcesivaimportanciaenun
ordenadorquenovaatenerdemasiadacarga.Ensuprimerainstalacin
no debe preocuparle demasiado estas cosas. Ya dijimos que no
pretendemos hacer un curso de administracin sino un curso de
autosuficienciaparausuariosdeestacionesdetrabajo.Paraequiposcon
muchosusuariosograndesservidoressiserconvenienteafinarloquese
puedaalahoradeestablecerlacantidadylalocalizacindelaswap.

/===============/

Particionado

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

Esposiblequesudistribucinlefacilitelalabordeparticionadodeldisco
duroperonoestdemsunpocodeinformacinsobreesto.

Cadatipodedispositivousauncontroladorqueenelcasodelosdiscos
durosson'/dev/hda'paraelprimerdiscoIDE'/dev/hdb'paraelsegundo
discoIDE,'/dev/sda'paraelprimerdiscoSCSI,etc..

ConcretamentelosdiscosIDEserndelaforma'/dev/hd[ah]',losdiscos
SCSIsern'/dev/sd[ap]',losESDIsern'/dev/ed[ad]',paralosXTsern
'/dev/xd[ab]'.

Lasparticionesseusanaadiendoelnmerodelaparticinaldispositivo.
Porejemplo'/dev/hda1/'serlaprimeraparticindelprimerdiscoIDE.

Comomximosepodrntenercuatroparticionesprimariasenunmismo
disco. Si fueran necesarias ms,habra queusarunaparticin detipo
extendida.Sobreestasepuedenestablecervariasparticioneslgicas.

Laprimeraparticinlgicaserlanmero5porqueloscuatroprimeros
nmeros de particin se reservan para su posible uso en particiones
primarias.Tampocosepuedeusarmsdeunaparticinprimariadetipo
extendidoaunquepuedesercualquieradela1ala4.

Porejemplopodramostenerenunaprimeraparticinprimariaunsistema
operativoWindowsyunasegundaparticinprimariadetipoextendido,
particionadaasuvezen5partes.Deellasunadeberserparamontarel
sistemadeficherosraz(root,'/')queconvieneseadetipoLinuxyotra
paraelreadeintercambio(swap).

Elrestodelasparticionessepuedenusarparaloqueguste.Porejemplo
para montar '/usr', '/var', '/boot', '/tmp' o '/home', etc. Estos cinco
directorios son buenos candidatos para ser separados en particiones
distintas,perodarunasindicacionesgeneralesparadeterminarelespacio
necesarioresultacomplicadoyaquedependedeltipodeusoquetengael
sistema.

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

Por el contrario tambin se puede optar por montar todo en una sola
particin queserlaparticinraz.Porsusencillezdeberaconsiderar
hacerloasensuprimerainstalacin.Noesloidealperotampocohayque
serambiciososlaprimeravez.

Por otra parte con una sola particin se aprovecha mejor el espacio
cuandotenemospocodisco.Laprincipaldesventajaesquelaparticin
razquedarmuygrandeyesoaumentaelriesgodeproblemasenuna
particinqueconvienesealomsseguraposible.

Paraminimizaresteefectoesparaloqueseusaeldirectorio/bootquese
destinaacontenernicamentealgunosdeloselementosmsimportantes
que intervienen durante el arranque como por ejemplo el kernel.
Idealmente sera una particin muy pequea con unos 20MB que no
crecernuncayqueharmenosprobablequequeunerrorenelsistema
deficherosrazafectealarranquedelsistema,locualsupondraunmayor
esfuerzopararecuperarelsistema.

El tema del particionado se puede dejar en manos de los distintos


asistentes que usan algunas distribuciones los cuales ya sugieren las
particionesylostamaosmsomenosadecuadosenfuncindeltipode
instalacin, pero es mejor tener las ideas claras y partir ya con una
situacinadecuadaantesdemeterundisqueteoCDdeinstalacinde
Linux.Nosreferimos adejarlibrelosespaciosadecuados ensudisco
duro,yrepartidosenlasparticionesquepensemosusarantesdeempezar
ainstalarLinux.

Vamosaresumirloscasosmsfrecuentessimplementeparaquetenga
unaideageneral.

InstalarLinuxenunPCconunsolodiscoduroenteropara
Linux.Eslomssencillo.Puedeempezarcontodoeldiscolibrey
sinparticionar.

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

InstalarLinuxenunsegundodiscoduroenteroparaLinux
dejandoelprimerdiscoparaWindows.Estansencillocomoel
casoanterioraunquedeberidentificarlosdispositivos.

Lanomencaturadelosdiscoseslassiguiente:

o hdaprimercanalmaestro.
o hdbprimercanalesclavo.
o hdcsegundocanalmaestro.
o hddsegundocanalesclavo.

Sinosabecomoestconfiguradosuhardware.Puedearrancarun
discoderescateLinuxydesdeunaconsolateclear'fdiskl'Con
ello obtendr un listado completo de los discos y particiones
presentesensusistema.

Instalar Linux en un disco duro que ya tiene instalado


Windows. Entre en Windows. Desactive cualquier tipo de
antivirusporquesueleninstalarsealfinaldeldiscoynosepuede
mover compactando. Compacte el sistema de ficheros con la
opcindemximacompresin.Estodejartodoslosficherosenla
primerapartedeldiscoduroyelrestoquedalibre.Obtengael
programafipsparaWindowsdesdealgnCDdeLinux.Esuna
utilidadquedivideunaparticinexistentepordondeindiquemos.
Antesdeusarloconvienesalvarelcontenidodeldiscoporsilas
moscas.Useunaversinmodernadefips.Leaconatencinlas
indicaciones.CuandoterminetendrunaparticinconWindows
deltamaoqueustedindiqueyotraparaLinux.Entreenelfdisk
deWindowsyborrelaparticindondedeseeinstalarLinuxyya
puedeprocederainstalarLinux.
Instalar Windows y Linux en un PC que no tiene nada
instalado. Haga una particin para Windows dejando espacio
libre para Linux. Instale primero Windows y luego contine
instalandoLinux.

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

/===============/

CompatibilidaddelhardwareconLinux

Generalmenteparainstalartodaslasdistribucionesincluyenunooms
ncleos para arrancargeneralmente bastante grandesymuycompletos
para poder soportar una variedad de hardware suficientemente amplia
parasoportar unagranvariedaddedispositivos hardwareyasnodar
problemasenlainstalacin.

Noobstantelaextraordinariavariabilidaddecomponenteshardwarepara
PC disponibles en el mercado hacen imposible contemplar todas las
situacionesposibles.Elsoportedeestosdriversporelmomentonosuele
serfacilitadoporlosfabricantestalcomoocurreenWindowssinoquees
producto del trabajo desinteresado de mucha gente que colabora
desarrollando estos drivers para Linux muchas veces con la gran
dificultaddenodisponerinformacindelfabricante.

Prcticamentesevenobligadosaunalabordeinvestigacinmuycostosa.
Todo eso explica que los dispositivos ms sofisticados y los ms
modernosseanlosquetienenpeorsoporteenLinux.Estasituacinest
cambiando y ya hay algunos fabricantes que empiezan a dar la
informacin necesaria para desarrollo de drivers no desarrollados por
ellosgeneralmenteparaWindows.

SialgnelementodesuhardwarenofuncionaconLinuxpuededebersea
queestmalconfiguradoycambiardedistribucinpodranoservirde
grancosa.Cuandoalgoasocurrapiensequeestoleofrecelaoportunidad
deaprendercosasnuevas.

Tendr que investigar el tema y cuando consiga dar con la solucin


posiblementehabraprendidounaseriedecosasdegranintersparauna
variedaddesituacionesdistintas.Losprimerospasossonsiemprelosms
costosos.

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

Linuxnoestsiendousadoexclusivamenteporgursyhackers.Linux
est siendo usado por una cantidad enorme de personas que han
compensado su carencia de conocimientos tcnicos con tan solo un
poquitodepaciencia.AdiferenciadeWindowsnohaysecretos.Todala
informacinqueustedpuedallegaranecesitarestasualcance.Cada
distribucinvieneconsumanualdeinstalacin.

EnelcasodeDebianyotrasesemanualvieneenformatoelectrnico
pero conviene sacarlo a papel y dedicar algo de tiempo a su estudio.
Tambinsuelevenirenesemanualoenlamismacajadeladistribucin
una relacin del hardware soportado. Piense que el soporte para el
hardwareescasisiempreindependientedeladistribucinysolodepende
delaversindelkernelqueseestusando.EnelcasodeDebianlos
primeros captulos son de inters general con independencia de la
distribucinqueuseytambinestdisponiblegratuitamente.

1. QueesDebian(yqueesGNU/Linux)
2. Requerimientosdelsistema
3. Antesdeempezar
4. Particionadodeldiscoduro

TambinpuedeconsultarelmanualdeLinuxPrimerospasos.Quepuede
obtenerdesdeLuCAS,lugarqueanteriormenterecomendamos.

/===============/

ElKernel

ParaqueLinuxreconozcatodoslosdispositivosdelsistemadeberestar
compiladoconlasopcionesadecuadas.EnelcasodeLinuxelkerneles
ungranprogramayloquellamamosdriverssolosontrozosdecdigode
estegranprograma.Estediseosedicequeesunkernelmonoltico.

Linux permite que partes de este gran programa no estn


permanentementeenmemoriaRAM.Estaspartessonlosmdulosyse

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

corresponden con drivers que se cargan en el momento que el kernel


necesita su uso. Esta carga y descarga es muy rpida y por ello
dispositivosquenoseusancontinuamentecomo,impresoras,lectorasde
CDs,disqueterasetc..convienenestnconfiguradascomomdulos.

ParaconfigurartodohadecompilarseelncleoenunsistemaLinuxque
ya est funcionando y nosotros no vamos a tratarlo ahora. Si un
dispositivonofuncionahabrquecomprobarenprimerlugarsihasido
correctamentereconocidoporelkernel.Estoocurreduranteelarranquey
elkernelvamostrandolainformacindetodoslosdispositivospresentes
en el sistema que es capaz dereconocer. Paravolver aconsultar esta
informacindespusdearrancarsepuedeusarelcomando'dmesg|less'.
Nosocuparemosdelacompilacindelkernelenotrocaptulo.

/===============/

Consejosfinales

No resulta razonable empezar instalando una gran cantidad de cosas


distintas.Empieceinstalandolospaquetesimprescindibles.Luegopodr
iraadiendootrascosas,pocoapocoysacandocopiasdeseguridadantes
deaadiroquitarpaquetes.Piensequeunospaquetespuedendependerde
otrosoentrarenconflictosconotrosyquizsnosedecuentadequeest
modificandoalgoquenecesita.

Una vez obtenida una primera instalacin que funcione aunque falten
cosas por configurar deber avanzar despacio pero seguro. Es decir
recurra a las copias de seguridad estableciendo puntos a partir de los
cualespodrrecuperarlasituacinparanotenerqueempezarcadavez
desdecero.

Tambin es bueno ir apuntando las cosas que se van instalando y


configurandolaresolucindeproblemas,etc..Todoelloparafacilitarlas
cosasencasodetenerquevolveraempezar,delocontrarioelesfuerzo
enconfigurarsusistemasepuedeperder.

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

LaprimeravezqueinstaleLinuxnodebepensarenellocomounmero
trmiteparaempezarahacercosas.Piensequeesunprocesofraccionado
endistintasetapasyquecadaetapatienecomopremioelpoderdisfrutar
deunsistemacapazdehacercadavezmsymscosas.

/===============/

Documentacinadicional

Este documento fu pensado para ayudar a los usuarios con menos


conocimientos y menos recursos tcnicos a tener xito en su primera
instalacindeLinux.Eltemaesamplsimoyhaymuchadocumentacin
alrespecto. Porellonos hemos limitado ahacerunasconsideraciones
generales.Noobstantehayunagrancantidaddedocumentacindegran
utilidadparatemasdeinstalacinyconfiguracindeLinux.

Paraobtenerdichainformacinlerecomendamosquevisite.Laspginas
deLuCAScongrancantidaddedocumentacinenespaololaspginas
de LDP (LinuxDocumentatinProject)destinadasacentralizartodala
documentacindeLinuxentodoelmundo.

Enelcasodequetengaunadificultadespecficaconalgndispositivoo
conalgunaconfiguracinconcretadealgnsusbsitemapuedeencontrar
granayudaenunaseriededocumentoscortosmonogrficosdeenfoque
prcticodenominados"Howtos"o"Comos"quepodrencontrarenlos
lugaresqueacabamosdeindicarle.

Paraalgunoscasosconflictivosrelativosalhardwaredesuequipopuede
consultarladocumentacindesukernel.'/usr/src/linux/Documentation/'

/===============/

Asistenciagratuitaenlistasdeusuarios

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

Existen listas de correo en las cuales podr obtener respuesta a sus


preguntas sobre Linux. Realmente funciona en la prctica como un
serviciodeasistenciagratuitodegrancalidad.

Nodebetenerreparoapreguntarsiemprequecomprendaquehayque
respetarlasnormasdelalistayqueeltiempodelosdemsesvalioso.Por
ellonodeberanuncapreguntarcosassinconsultaranteslaspginasdel
manualyotradocumentacinadicionalqueacabamosdemencionar.

Seasumequenovaapreguntarporsimplecomodidad,sinoporqueha
buscadoynoaencontradolarespuesta.

EnEspaalalistadeconsultastcnicassobreLinuxengeneralesllinux.
Parasuscribirseodesuscribirseseenviaruncorreoelectrnicoconun
comandoqueserrecibidoporunservidorperonoserledoporninguna
persona sino interpretado por un programa que en este caso se llama
Majordomo.

$ # Para suscribirse
$ echo subscribe l-linux | mail
majordomo@calvo.teleco.ulpgc.es

$ #
$ # Para borrarse
$ echo unsubscribe l-linux | mail
majordomo@calvo.teleco.ulpgc.es
FIM

Recibir una contestacin automtica y con ello


recibir todo el

correo de la lista. Cada vez que alguien enva un


correo a la lista

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

todos los miembros recibirn una copia del mensaje.

La lista l-linux se modific hace poco y desde


entonces hay que estar

suscrito para poder enviar mensajes. Esto se hizo


para combatir en lo

posible el uso de SPAM y el envo de mensajes


annimos molestos.

Desde entonces la calidad de la lista ha mejorado


bastante.

Otras listas pueden tener un

funcionamiento ms abierto admitiendo cualquier


mensaje, y otras por

el contrario pueden tener un comportamiento ms


restrictivo.

Concretamente algunas

se llaman listas moderadas y solo se admite un


mensaje si una persona

llamada moderador considera que es un mensaje


oportuno.

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

Conviene leer atentamente las normas de uso de la


lista y atenerse

a ello. Hay gente que no respetan las normas. Incluso


hay algunos

que envan un mensaje admitiendo que est fuera de la


temtica de

la lista en tono de disculpa anticipada, pero estas


cosas se suelen

considerar abusos y pueden provocar fuertes


discusiones en la lista.

Concretamente l-linux es una lista que recibe y enva


muchos mensajes.

Hay otras listas especficas para otras


distribuciones o para temas

mucho ms especializados.

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

TERMINALES

Queesunterminal

En Linux y otros SO similares se considera la posibilidad de que un


ordenadortengavariosusuariostrabajandosimultneamente.

Cadadispositivoquepermiteaunusuariointeractuarconunamquinase
lellamaterminal.Hayterminalesdeentradacomoporejemplounlector
de cdigo de barras, los ya obsoletos lectores de tarjetas perforadas,
terminales salida como por ejemplo una impresora, y terminales de
entradasalidacomolosclsicosterminalesdepantalla.

Hayotrasmuchasclasesdeterminales.Porejemplohayterminalespara
personasciegas,peroeltipomsutilizadoeselformadoporpantallay
teclado. Dentrodeestacategora haycientos demodelos distintos.En
LinuxyenotrosSOtipoUnixsecontemplalaposibilidaddetrabajarcasi
concualquiertipodeterminal.

La palabra tty usada para designar los dispositivos que controlan los
terminales viene de TeleTYpe (teletipo). Los primeros terminales no
tenanmonitor.Eransimplesyprimitivosteletipos.

EnunPClapantallayeltecladosonperifricosqueseconectandeforma
independientealordenador,peroenordenadoresgrandeslosterminales
depantallaytecladosonuntodoquesecomunicaconelordenadorpor
unnicocable.Porejemploatravsdeunpuertoserie.Porestoscables
lo que circulan bytes correspondientes a los caracteres intercambiados
entreelterminalyelordenador.Antesdequesurgieranlosordenadores
personaleslonormaleraqueelordenadorestuvieraenuncuartocercano
alasaladeterminalesdondelosusuariossesentabanatrabajar.

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

Podemosverenla
figuraunconjunto
formado por
oordenador
centralyunaserie
de ordenadores
conectadosal.

Estos terminales
que acabamos de
mencionar aun se
usanhoyenday
no son simples
conjuntos de
tecladoymonitor.
Tienen cierto gradodeautonomalocualpermiteliberaralordenador
centraldeunapartedeltrabajoyaqueenlugardeatenderlasentradas
tecla a tecla, lo har lnea a lnea. La pantalla de un terminal no es
simplementeunmonitoryaquesuelectrnicaesmscompleja.Entresus
circuitos electrnicos dispone de una memoria. Esta guarda la
informacinhastatenerlalneacompletaqueademspuedesereditada
sinqueenesointervengaelordenador.Lapantallaencambiomuestralos
caracterestecleadosamedidaquesevanintroduciendo.Poresoloque
vemosenelterminalquizsnohasidotransmitidoanalordenador.En
realidadlamemoriadelterminalcontendrnosoloelbufferdelteclado
sinotodoelcontenidodelapantalladelterminal.Estoesnecesariopor
variasrazones.Unadeellaseslaposibilidaddehacerscrollverticalyotra
pararecuperarlainformacindetodalapantallaencasonecesario.

Terminalesvirtuales

Sihapasadoloanteriorporaltopensandoquenotienequeverconsu
casoportrabajarconPCs,vuelvaaleerlosprrafosanterioresporqueen
unPCqueuseLinuxunasesindeconsolacomolasqueestamosusando

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

enestecurso,funcionardeformamuysimilarporserunasimulacinde
estetipodeterminales.

En Linux existe una emulacin de varios terminales sobre un nico


monitor.Sedenominanfrecuentementeterminalesvirtuales.Paracambiar
de un terminal virtual a otro pulsaremos <Alt><F1>, <Alt><F2>,
<Alt><F3>,etc.Conellotendremos accesoalosterminales /dev/tty1,
/dev/tty2,/dev/tty3,etcrespectivamente.Encadaunodeestosterminales
puedemantenerseunasesindetrabajodistinta.

Escomosituviramosvariosterminalesfsicosdistintosformadospor
monitor, teclado, altavoz, memoria, ycable deconexin al ordenador,
pero solo pudiramos usar uno de ellos en un momento dado. La
informacin de cada terminal virtual se encuentra almacenada en
dispositivos/dev/vcsperonoesaccesibleparausuariosnormalitos.

Dispositivoscontroladoresdeterminales

Cadaterminalvirtualestgestionadoporuncontroladordedispositivo.Si
ejecuta el comando 'tty' obtendr el nombre del controlador que est
usando.

$ tty
/dev/tty3

Bueno/dev/tty3seraelnombredelterminal.Ustedpuedeobtenerotra
cosaperovamosasuponerquesuterminalfueraeste.

$ echo "hola" > /dev/tty3

Sacarelmensaje"hola"enlapantalladesuterminal.Siintentahacer
estomismosobreotrodispositivo,porejemplo/dev/tty2deberaaparecer
elmensajeenlapantalladeotroterminal.Normalmenteestonosucedea

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

noserque/dev/tty2tambinestfuncionandoconsuusuario.Conestose
evitaqueunusuariopuedamolestaraotro.

Losterminalesvirtualesestnnumeradosdel0al63.Paravercualesel
nmerodelterminalactualtambinsepuedeusar'fgconsole'

Hayotrostiposdeterminales.Sondispositivosdetipocarcteryhayun
montndeellosdisponibles.

$ ls /dev/*tty*

Existeundispositivoespecialqueparacadausuariosecomportacomosi
fuerasupropiocontrolador.

$ echo "hola" > /dev/tty

Estosacaunmensajeenlapantalladesupropioterminalexactamente
igualqueelelcasoanterior.Estopuedesertilparausarloporejemplo
en scripts que pueden tener ambas salidas (estndar y de errores)
redirigidas a ficheros pero deseamos que determinado mensaje salga
siempreporlapantalla.

Existe otro dispositivo especial llamado consola /dev/console. Este


dispositivo suele encontrarse prximo alamquina yporelsalen los
mensajesdelsistema.Seasumequeestepuestodetrabajoesusadoporel
administradordelsistema.

Laconsolaestasociadaa/dev/tty0quealigualque/dev/ttyesunalias
determinalvirtualactualperopuedentenerpermisosdistintos.

Vamos a hacer algunas pruebas y vamos a suponer que su sesin de


trabajo con bash utiliza el tty3. Compruebe cual es su caso con el
comando'tty'yencasodeserdistintatngaloencuentacadavezque
hagamos referencia al tty3 o a <Alt><F3>. Usted deber usar lo que

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

correspondaensucaso.Tambinpuedepasarsealtty3paracontinuarla
leccin.

Primerovamosacomprobarladisponibilidadylospermisosdeunttyque
casisiemprequedalibre.Eltty12.

$ ls -l /dev/tty12
crw-rw-rw- 1 root tty 4, 12 ago 29 2000
/dev/tty12

Aquloimportanteescomprobarquepodemosusareseterminalyque
tienepermisosdelecturaescritura.

Siesto no esashabraquemodificarlospermisos oinclusocrearel


dispositivoparapoderhacerlaprcticaperoesorequiereprivilegiosde
rootynossaldramosdelospropsitosdeestecurso.

Vamosaprobarsipodemosescribireneltty12.

Siustedhace'echoxxxxx>/dev/tty12'yluegopasaalterminaltty12con
<Alt><F12>verquenopuedehacernadaenlperolas'xxxxx'aparecen
enlapantalla.

Vamosaprobarsipodemosleerdeltty12.

Haga'cat</dev/tty12'desdesusesindetrabajoyluegopasealterminal
tty12con<Alt><F12>eintroduzcaunacadenasinusarlatecla<Intro>.
Porejemplo'yyyyyyyyyyyy'.

Sivuelvealtty3con<Alt><F3>comprobarqueelcomandocatcontinua
esperandorecibirdatosperoaunnoharecibidoningncarcter.Larazn
esquelacadena'yyyyyyyyyyyy'seencuentratodavaenlamemoriadel
terminaltty12ytodavanosehaenviadounsolocarcteralordenador.

Elmodonormaldefuncionamientodelosterminalesdetextoeseste.En
lugardeenviarcaracteresaisladosenvanchorrosdecaracteres.

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

Vuelaaltty12con<Alt><F12>ypulse<Intro>.Inmediatamentevuelvaa
tty3con<Alt><F3>ycomprobarquecatacabaderecibirlacadenade
caracteres.Parafinalizarcatinterrmpalocon<Ctrl+C>.

Sialgunadeestasdospruebasdelecturaoescrituranohafuncionado
posiblemente se deba a unos permisos demasiado restrictivos o a una
diferenteconfiguracinensuequipoyesosuponequetendrdificultades
parapracticarestaleccinperonosotrosvamosairexplicandotodolo
quesucedeencadaprctica.

Sesindetrabajoenunterminal(getty)

Repasemosunpococosasqueyacomentamos enleccionesanteriores.
Hay un fichero de configuracin '/etc/inittab' que durante el arranque
activar un programa llamado 'getty'. Este mandar un mensaje a la
consola en espera de que alguien introduzca su nombre de usuario.
Cuandoestosucede'getty'haceunexecalprograma'login'conelnombre
de usuario obtenido y login solicitar la password. Si la password es
correctaloginharunexecalashell.

Estoyalovimoscuandohablamosdelosprocesosysirecuerda'exec'es
unallamadaalsistemaquecambiaelcdigodelprogramaqueseest
ejecutandosincambiarsuPID.Cuandolashelltermine,elproceso'init'
detectarlamuertedesuprocesohijoyarrancarunnuevo'getty'porque
en'/etc/inittab'estosprocesosfiguranenmodorespawn.Tambinfigura
elnombredeldispositivoylavelocidaddecomunicacin.

Los terminales que no tengan entrada en este fichero /etc/inittab no


estarndisponiblesparaunasesindetrabajoenmodoconsolaperoeso
no quiere decir que sean intiles. Por ejemplo si en /etc/inittab solo
aparecenlosterminalesquevandesdetty1atty6solopodrabrirestos
seisterminalesvirtualesperosisearrancanlasXwindowsloharnenel
primerterminaldisponiblequeenestecasosereltty7.

Esteesuncursodeusuarioyapesardequeaestasalturasdelcursose
explicancosasalgoavanzadasnopretendemosensearleaadministrarel

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

sistema. En particular le advertimos que no debe intentar modificar


/etc/inittabaunquedispongadecuentaderootsinosabeexactamentelo
queesthaciendo,porquesusistemapodranovolveraarrancar.

'getty'esunprogramanormalquenorequiereprivilegiosespecialespara
serejecutado.

Laprcticaqueponemosahorasoloserposiblesisupuestodetrabajoes
unPCconLinux.Siesttrabajandoen unterminal independiente del
ordenador central no podr hacerlo. Si la prueba de enviar 'xxxxx' al
terminaltty12nofuesatisfactoriatampocopodrhacerestaotraprueba.

Localicegettyconelcomandolocateporejemplo.Supongamosquelo
encuentraen'/sbin/getty'.

Mireen/etc/inittablapartedondeaparecegetty.

$ cat /etc/inittab

# <id>:<runlevels>:<action>:<process>
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

Supongamosquefiguraloqueacabamosdeponer.respawneslaaccin
realizadaporinit.Significaenestecasoejecutaryvolveraejecutarcada
vez que termine. /sbin/getty es el programa que abrir el terminal. El
primerparmetrodespusdegettyeslavelocidaddetransmisin(eneste
caso38400),yelltimoparmetroeselterminal.

Nosbasamosenestainformacinparalanzargettysobreeltty12:

/sbin/getty 38400 tty12

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

Comprobarqueaparentementeelprogramanotermina.Paseahoraal
terminaltty12con<Alt><F12>

Ver que 'getty' ha abierto una sesin en ese terminal. 'getty' esta
funcionando sin ningn problema. Introduzca su nombre de usuario y
ver que login no es tan permisivo. Dar un mensaje de error no
reconociendo a su padre como un padre legtimo. Para evitar usos
extraosdeloginseterminasuejecucin.Volviendoalasesindonde
arrancogettyverqueestetambintermin.

Esteintentofracasadonoquieredecirquenosepuedaabrirunasesinde
trabajoenunaconsolaquenoestcontroladapor'getty'.Solosignifica
que'login'esunvigilantecelosodelaseguridaddelsistema,yhemos
intentadousarlodeunamaneranoconvencional.

Nosolosepuedeabrirunasesindetrabajoenunaconsolaquenoest
controlada por 'getty' sino que adems es muy fcil y no requiere
permisos especiales. Para abrir una sesin en el /dev/tty12 basta con
ejecutar 'openvt c 12 bash' y esto lo comentamos simplemente como
curiosidadparaquelopruebesiquiereperonomerecemsexplicacin
enestemomento.

Todaestaprcticaunpocorarapretendequecomprendacomofuncionan
lascosas.Eltemadelosterminalesesbastanteamplio.

Lalibrerancurses

Novamosaaprenderausarestaslibrerasporqueestenoesuncursode
programacinperoesunalibreramuyimportanteyencontrarmontones
de referencias en el manual de Linux a estas pginas. Resulta
imprescindible comentar algo de ncurses para comprender el
comportamientodealgunasaplicaciones.

Yahemosdichoquehaymuchasclasesdeterminalesyqueinclusoun
determinadotipodeterminalfsicopuedefuncionardeformasdistintas,
emulandounosterminalesaotros.Cadaterminaltienesupropiolenguaje

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

decomandosquenosonotracosasdesecuenciasdecaracteresasociadas
adeterminadasacciones.Porellounaaplicacindebeconocerconque
terminalesttratando.

Las aplicaciones hacen esto usando una librera intermedia que se


encargardetraducircadaaccinalasecuenciadecaracteresadecuada.
Estalibrerasellama'curses'osuversinmodernallamada'ncurses'.La
aplicacindebedeserinformadadeeltipodelterminalconelcualest
trabajandoyesosehaceatravsdelavariableTERM.

Siustedconsulta(hgalo)elvalordeestavariableseguramenteobtendr
'linux' que es el nombre del terminal que linux usa por defecto. Hay
muchostiposdeterminalesycadaunotienesunombre.Porejemplosi
ustedejecutaTERM='vt100';exportTERM;Laaplicacinqueseejecute
acontinuacinpuedepensarquetienequedialogarconunterminaltipo
'vt100'.

Bueno algunas aplicaciones no hacen esto. Directamente asumen que


funcionarnenundeterminadotipodeterminalyporellonousannila
variableTERMnilalibreracurses.Porejemplolscolor=autoasumir
siemprequeelterminalesunterminal'linux'yenviardirectamentelas
secuenciasdecaracteresapropiadasparaunterminal'linux'aunqueexiste
unficherodeconfiguracinmsquenadaparapoderponerelcolorque
uno quiera a cada cosa. Puede probar a cambiar la variable TERM y
comprobarqueloscoloressalenperfectamente.

Porelcontrariolautilidad'less'siusa'ncurses'selaponiendolavariable
TERM=att4424ycomprobarquelaaplicacinsecomportadeunmodo
extrao.EncambiosiusalavariableTERM=vt100.Secomportarde
formacasinormalporqueelterminal'vt100'yelterminal'linux'tienen
algunassimilitudes.Enrealidadvt100(DEC)esuntipodeterminalmuy
conocido,yelterminaldelinuxderivadel.

Hemoselegido'ls'y'less'porquenosuponenunpeligroencasodeuso
incorrectoperosiintentahacerestoconotroprogramacomoporejemplo

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

uneditorpodradestruirunficherodebidoaldesconciertoorganizadoen
supantalla.

Lalibreracursesaccedeaunabasededatosdeterminales (terminfo)
dondeseestablecenlacapacidadesdecadaterminal.

Siustedesttrabajandoconlinuxenunterminalquenoesdetipo'linux'
notarquealgunasaplicacionesnovanbien.Laformadearreglarloes
cambiarlavariableTERMconelvalorapropiadoasuterminalyaspor
lo menos las aplicaciones que usen curses volvern a funcionar
perfectamente.

ElterminaldeLinux

Las capacidades del terminal de linux son muy variadas. Manejo del
cursor,borradodepartesodelatotalidaddelapantalla,coloresyotros
atributos, pitido del terminal, configuracin de la pantalla en filas y
columnas, guardar posicin del cursor, etc.. Las pginas del manual
anteriormente mencionadas tratan de todo esto y la cantidad de
posibilidades es tan grande que nos limitaremos a poner algunos
ejemplos.

Paraconocereljuegodecaracterescompletoycaracteresdecontrolque
tieneunterminallinuxconsulteenlaseccin7delmanuallaspginasde
ascii(7)eiso_8859_1(7).Paraunarelacindelassecuenciasdecontrol
consultelapginaconsole_codes(4).

Antesquenadaconvienesaberqueelterminalpuedequedarenunestado
que resulte muy difcil de usar. Si eso llega a ocurrir teclee
'<Intro>reset<Intro>' y con un poco de suerte todo volver a la
normalidad.Pruebeahoraestecomandoparaasegurarsedequedispone
deelantesdehacerlapruebasiguiente.

$ reset

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

Erase is delete.
Kill is control-U (^U).
Interrupt is control-C (^C).

Semuestralaconfiguracinpordefectodealgunosparmetrosqueluego
explicaremoscuandohablemosdestty.

Vamosahacerunapruebaalgodelicada.Vamosaenviaruncarcterde
controlalterminalquelodejarenunestadobastantelamentablepara
trabajarconl,paravercomosepuederecuperarunasituacindeeste
tipo.

Vamosaenviarun<Ctrl+N>peroparaellohayqueusarunasecuencia
de escape idntica a la que se vio en el captulo del editor 'vim'.
Concretamente la secuencia para introducir el <Ctrl+N>, ser
<Ctrl+V><Ctrl+N>.Estoaparecercomo^N.Antesquenadacmbiese
aldirectorio'/tmp'dondenopodremoshacermuchosdestrozos.Despus
deenviar el'^N'alterminal nopodremos verloquehacemos porque
saldrncaracteressemigrficosenlugardeletras.

$ cd /tmp
$ echo '^N''
$FIN

Ahoraolvidesedelmonitorporunmomentoyhaga<Intro>reset<Intro>.
Sesuponequehabrfuncionadobien.Encasocontrarionoseaceptan
reclamaciones.Disponeusteddeotrosterminalesvirtualesenotrosttys
as que si un terminal noserecuperapuedeusarotros.Convieneque
aprendaarecuperarestassituaciones.

Vamos a hacer un programita que usa las secuencias de escape del


terminaldelinux.Laexplicacinlapuedeconsultarenconsole_codes(4).

Editeunficheroquellamaremos'pru_console_codes.bash'.

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

function muestra(){
# echo -e "\033[${POSY};${POSX}H" # Manda el
cursor a $POSY $POSX
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[30mNegro\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[31mRojo\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[32mVerde\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[33mMarron\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[34mAzul\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[35mRosa\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[36mCeleste\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[37mBlanco\c'
}

typeset -i POSY ; typeset -i POSX


echo -e '\033[2J\c' # Borrar pantalla

echo -e '\033[1m\c' # Atributo Brillo


POSY=1 ; POSX=16 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Brillo*\c'; muestra

echo -e '\033[2m\c' # Atributo Semi brillo


POSY=1 ; POSX=31 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Semi Brillo*\c'; muestra

echo -e '\033[0m\c' # Atributo normal


echo -e '\033[5m\c' # Atributo Intermitente
POSY=1 ; POSX=46 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Intermitente*\c'; muestra

echo -e '\033[0m\c' # Atributo normal

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

echo -e '\033[7m\c' # Atributo Inverso


POSY=1 ; POSX=61 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Inverso\c'; muestra

echo -e '\033[0m\c' # Atributo normal


POSY=1 ; POSX=1 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Normal*\c'; muestra

echo -e '\033[5m\c' # Atributo intermitente


echo -e '\033[7m\c' # Atributo Inverso
POSY=12 ; POSX=1 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Inverso+Intermitente\c'; muestra

echo -e '\033[0m\c' # Atributo normal


echo -e '\033[5m\c' # Atributo intermitente
echo -e '\033[1m\c' # Atributo brillo
POSY=12 ; POSX=26 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Brillo+Intermitente\c'; muestra

echo -e '\033[0m\c' # Atributo normal


echo -e "\033[25;1H\c"

Elprogramaterminaponiendoelatributonormalperorecuerdequesi
algosalemalyelterminalquedaenunestadopocooperativodeber
recuperarloconelcomandoreset.Unavezdichoestopongapermisode
ejecucinaesteficheroyejecutelo.

Podr comprobar como sale la informacin con distintos colores y


atributos.Paraellohemosusadosecuenciasdecaracteresespecificasde
losterminaleslinuxyquepodrannofuncionarenotrosterminales.

Controldeunterminal(setterm)

Paracambiarlosatributosdeunterminalcualquieraseusasetterm(1)que
utilizar la variable TERM para identificar el terminal y usar las
secuenciasdecaracteresadecuadas.

setterm admite el nombre de un terminal para enviar los cdigos de


controlaeseterminalenlugardeenviarlosalterminalactual.

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

Vamosacambiarelsonidodelpitidodenuestroterminal.

$ setterm -bfreq 100 -blength 500

Ahoratendremosunpitidomsgravedelonormaldemediosegundo.
Antes de volverlo a su situacin normal cambie a otro terminal y
compruebe que el cambio de sonido no ha tenido efecto sobre ese
terminal.Nopiensequesuordenadortieneunnicoaltavozporquees
como si existiera un altavoz para cada terminal solo que no puede
funcionarmasqueunodeellosenunmomentodado.Enesoconsistela
emulacindelosterminalesvirtuales.Esunsoloterminalfsicoperose
comportacomovarios.

Paradejarelsonidocomoalprincipioharemoslosiguiente:

$ setterm -reset

Ahoravamoshacerunprogramaquesacardistintossonidos.

sound(){
setterm -bfreq $1 -blength $2
echo -e '\a\c' > /dev/console
}

sound 2000 900


sleep 1
sound 700 400
sleep 1
sound 150 300
sleep 1
sound 70 200
sleep 1
sound 40 1000
sleep 1
setterm -reset # Volver a la situacin normal
echo -e '\a\c' > /dev/console

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

settermcursoroffsettermcursoronsettermrepeaton

Configuracindeunterminal(stty)

El programa stty(1) sirve para comprobar o alterar el estado de un


terminal.

$ stty

speed 38400 baud; line = 0;


-brkint ixoff -imaxbel
-iexten

Esto solo muestra los parmetros ms importantes. Para mostrar la


totalidaddelosparmetrosquecontrolannuestroterminalharemos

$ stty -a

speed 38400 baud; rows 25; columns 80; line = 0;


intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D;
eol = <no definido>;
eol2 = <no definido>; start = ^Q; stop = ^S; susp =
^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time =
0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal
-crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr icrnl ixon ixoff
-iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel
nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh -
xcase -tostop -echoprt
echoctl echoke

Cuandoejecutamosresetnosmuestralaconfiguracindelossiguientes
tres parmetros. ( erase = ^? , kill = ^U , intr = ^C ) que son
respectivamenteelcaracterqueelterminalinterpretarcomoelcaracter

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

para borrar el ltimocaractertecleado,elcaracterparaborrarlalnea


actual,yelcaracterparamandarunasealdeinterrupcin.

Enlapginamanstty(1)vienelainterpretacindetodoslosparmetros
usadosparaconfigurarunterminal,Lonormalesquesuvalorpermitaun
usonormaldelterminalyporellotocarlospodraafectaralaoperatividad
delterminal.

sttytambinpermiteguardarlaconfiguracinactualdeunterminalenun
ficheroconlaopcingenunformatoquepermitiralpropiosttyajustar
todos los parmetros de un terminal usando uno de estos ficheros
generadosconlaopcing.

Enlaprticaquesiguedeberecordardeparaintroduciruncaracterde
controldebervenirprecedidode<Ctrl+V>

$ # Guardamos la configuracin
$ stty -g > /tmp/stty.out
$ cat /tmp/stty.out
1500:5:4bf:a3b:3:1c:7f:15:4:0:1:0:11:13:1a:
0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
$ stty werase ^A # Ojo usar <Ctrl+V> <Ctrl+A>
$ stty -a
$ # Comprobamos que ahora werase = ^A;
speed 38400 baud; rows 25; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D;
eol = ;
eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^A; lnext = ^V; flush = ^O; min = 1; time =
0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal
-crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr icrnl ixon ixoff
-iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel
nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh -
xcase -tostop -echoprt
echoctl echoke
$ stty `cat /tmp/stty.out` # Recuperamos la

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

configuracin anterior

Losresultadosdeestaprcticapuedenvariardeunsistemaaotro.Lo
importanteesquecompruebecomohemossalvadolaconfiguracinaun
ficheroantesdealterarlaconfiguracindelterminalycomopodemos
recuperaresaconfiguracindesdeesefichero.Usamossolowerasepara
elloynovamosaproponermsejerciciossobreesto.Losterminalesen
Linuxnoemulansiemprealaperfeccinalosterminalestradicionales.
Loexplicamosenelsiguienteapartado(verreadline).

Lalibrerareadline

Nuevamente tenemos que comentar la existencia y propsito de una


libreraespecialnoparaaprenderamanejarlasinoparacomprenderuna
situacin bastante especial de los terminales en Linux. Los terminales
virtualesenLinuxnosecomportancomolosterminalesotrossistemas
tipoUnix.Porejemplopodemoscambiarelcaracterdecontrolde'erase'
consttyyparecerquenotieneningnefecto,cosaquesecontradice
totalmente con lo que dijimos antes. Esto se debe a que muchos
programas de linux usan la librera 'readline' que tiene sus propias
funcionesdeedicindelineaetc..yactansobreescribiendolasfunciones
delterminal.Estodeterminadostiposdeusosdistintosdelterminalydos
comportamientosdistintos.

Elbashymuchos delosprogramasdeGNUusarnlalibrera
readline. Los programas que usen readline usaran
$HOME/.inputrc para la configuracin de ciertos caracteres de
edicin de lnea. En caso de no existir este fichero se usa
/etc/inputrc.Porelloelcaracterdeborradodeultimocaractery
otrosnorespondernalomostradoporsttysinoalficheroinputrc.
Por el contrario un programa C que use gets() para leer
directamentedeltecladonousarlalibrerareadlineyporellolo
quefuncionarserloquedeterminenlosparmetrosdestty.

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

Escomosiexistierandosclasesdedispositivos.Unoserattyyelotrolo
podramosllamartty>readline.

Noescuestindeprofundizarenestostemasquesonmsadecuadospara
un curso de administracin o de programacin. Con esto se pretende
simplementedarunaexplicacinlgicaaestetipodecomportamiento
muyespecficodelosterminalesLinux.

Terminalesypseudoterminales

Yahemosvistocomopuededirigirseentradasalidaaunterminalperoun
procesopuedetenerprevistodoscomportamientosdistintosparaelcaso
quesusalidaestconectadaaunterminaloaunfichero.Porejemplola
opcin'color=auto'para'ls'resultamuytilyaqueproducirdostipos
desalidasdistintosdependiendodequeestconectadabienaunterminal
bienaotracosatipoficheropipeetc...Enelcasodeestarconectadoaun
terminal,sacarlainformacinencolor,perosidetectaotracosasacarla
informacin sin color para evitar volcar un montn de caracteres de
extraos. En otras palabras 'ls' y muchos otros programas pueden
averiguarsisusdescriptoresdeentradasalidaestndarestnconectadoo
noaunterminal.Lasalidaaunterminaldeterminaunusointeractivocon
unapersonayporellolosprogramasseadaptanaello.Algunasveces
queremosqueelcomportamientodeunprogramaseacomosiestuviera
conectadoaunterminalpeseaquenoseaciertoyporvelloalgunasveces
hayqueusarunterminalficticioopseudoterminal.

Un pseudoterminal esuncomponente softwaredestinadoasimularun


terminal.Seimplementanusandounaparejadedispositivosespecialesy
distintos denominados esclavo y maestro. Un proceso que use un
pseudoterminalpensarqueestconectadoaunterminalautnticoyno
notardiferenciaalguna.

Porejemplounaventanade'xterm'enwindowsfuncionadeesamanera.

Unejemplodepseudoterminal(script)

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

Scrip es un comando que funciona creando un pseudoterminal y


arrancando unasubshell que nonotarque laentrada salida noes un
autentico terminal. Script se usa para grabar una sesin completa de
trabajoconbashenunficherosiseterminaalfinalizarlaejecucindela
shellconexit.

Pruebelosiguiente:

$ script /tmp/script.out
$ ls --color=auto /

$ ls --color=auto / > /tmp/ls.out


$ exit

Elprimer'lscolor=auto/'mostrarelcontenidodeldirectoriorazen
colores.Elsegundo'lscolor=auto/>/tmp/ls.out'guardarlasalidaen
un fichero '/tmp/ls.out'.La sesindescriptsefinaliza abandonando la
shellconexit.Cuandomiremoselcontenidode'/tmp/ls.out'coneleditor
'vi'comprobaremosquenohaycoloresnicaracteresextraos.Simiramos
lasesincompletagrabadaconscriptenelfichero'/tmp/script.out'con'vi
comprobaremos que est llena de caracteres extraos. Los retornos de
carroaparecencomo'^M'(representa<Ctrl+M>yloscdigosdecolores
con secuencias del tipo '^[[0m...' o similares que responden a las
secuencias de controlparamodificar atributos ycolores enlapantalla
segnsedescribeenlapginaconsole_codes(4).Sienvaelcontenidode
esteficheroapantallaporejemplousando'cat/tmp/script.out'aparecern
loscolores.

scriptcapturaabsolutamentetodoyporellograbarunasesinconscript
enunficheropuederequeriruntratamientodefiltrarciertascosasantes
de darle determinado uso a esa salida, pero resulta muy til si solo
deseamosregistrarunasesindetrabajoparanotenerqueirapuntandolo
quevamoshaciendooloquevamosobteniendo.

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

PROGRAMACIONDETAREASENELTIEMPO

Introduccin

Enestepuntodelcursopodemosasumirqueyasabeprogramaralgunos
scriptsparahacercosasqueleinteresan.Silepreguntramoscomohacer
paraqueunprogramaseejecutedentrodetreshorasusaraelcomando
'sleep 10800'. Y efectivamente eso sera una solucin sencilla que
funcionaramuybienyaquesleepnoconsumenadadecpuytreshoras
son10800segundos,peroprobablementesehabrpreguntadocomohacer
paraqueunatareaseejecuteenundeterminadomomentoocomohacer
paraqueunatareaseejecuteperidicamente.

Paraesodisponemosdeloscomandos'at','batch'y'cron'.A'batch',ya
'at'hayquepasarleselcomandoporlaentradaestndar,ycon'batch','at',
ya'cron'lasalidadelcomandoserdirigidaalacuentadecorreodel
usuario.Poresoconvieneredirigirlassalidasconvenientementeyresulta
evidentequedeestaformanosepuedenejecutarprogramasinteractivos.

procmeter3unaherramientaparamonitorizarelsistema

Esteesunprogramaquenosresultardegranutilidadparacontrolarla
carga del sistema y en general para vigilar cualquier aspecto de la
actividadenelsistema.Lamayorpartedeestainformacinesobtenidaa
partirde/procyesaltamenteconfigurable.

ParaestaprcticadeberactivarloselementosparaCPUyparaLOADen
modogrficorepresentadoporunalneaquebrada.Adviertaqueestetipo
degrficaposeenunasrayashorizontalesyunnumeritoentreparntesis
enlaparteinferior.Esenumeritoindicalaunidadcorrespondiente.Por
ejemplo para CPU aparece (20%) y para LOAD aparece (1). Esto
significaqueenlaprimeragrficacadarallahorizontalsuponeun20%de

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

usodeCPU.EnLOADcadarallasignificaunacargade1.Estosvalores
sonlosestablecidospordefectoyaunqueestoyotrascosaspuedenser
configuradasdeformadistintanosotroslousaremosas.

Lasutilidadesat,atqyatr.

Permite programar una tarea para que se ejecute en un determinado


momento.'at'usaunajerarquadecolasycadaunadeellasserefiereaun
nivel'nice'queeselvalorqueotorgalacantidadderecursodecpuque
puedeocuparelprocesoendetrimentodeotrosqueseestnejecutando
simultneamente.Losnivelessenombranconunnicocarcterquevade
la'a'ala'z'odela'A'ala'Z'.Lasprimerasletrasdelalfabetoestn
asociadas con alta capacidad para usar CPU y las ltimas todo lo
contrario.Pordefectoelcomando'at'ejecutarconelnivel'a'.

Existeuncomandollamado'batch'quesirveparaejecutarcomandosde
formano inmediata perosinespecificar elmomento. Loexplicaremos
msadelanteyvieneaserloequivalentea"ejecutaestocuandonoests
muyocupado".Locomentaremosluegoperoresultaqueelcomando'at'
tambinpuedefuncionardeestaforma.

Siseusa'at'especificandoelniveldeejecucinconunamaysculael
programanoseejecutarobligatoriamenteenelmomentoindicadosino
queesperaraquelacargadelsistemaseainferioralvalorestablecido
paralosprocesosbatch.

echo'echoHola>/dev/console'|atnow+2minutes

Podrcomprobarqueelsistemadevuelveinformacinrelativaalatarea.

jobat

Paracomprobarlastareasplanificadasejecute'atq'paraeliminarunatarea
planificadaqueaunnosehaejecutado'atrm'

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

Por ejemplo si su usuario fuera pepe y quiere enviarse asi mismo un


mensajederecordatorioparaelmediodadelSbadopuedehacerqueel
sistemaaesahoraleenveuncorreoelectrnico.

echo"mails'Recordatorio.LlamaraJaime'pepe"|atNOONMON

Lasespecificacionesdetiempoutilizanunasintaxisespecialperoquizs
resultemsintuitivoymsprcticoponeramododechuletaunaspocas
reglassiguiendounanotacinarbitrariaqueponerlagramticacompleta
enformatoyaccoenformatoBNF.Estonosllevaraatenerqueexplicar
cosasquesesalendelpropsitodeestecursoyqueseranmsapropiadas
parauncursodeprogramacin. Porelloybasandonosenunresumen
arbitrariodeesagramticaincluimoselsiguientecuadroresumen.

timespec = time | time date | time increment


| time date increment | time decrement
| time date decrement | nowspec

nowspec = NOW | NOW increment | NOW decrement

time = hr24clock | NOON | MIDNIGHT |


TEATIME

date = month_name day_number


| month_name day_number ','
year_number
| day_of_week | TODAY | TOMORROW
| year_number '-' month_number '-'
day_number

increment = '+' inc_number inc_period

decrement = '-' inc_number inc_period

hr24clock = INT 'h' INT

inc_period = MINUTE | HOUR | DAY | WEEK | MONTH |


YEAR

day_of_week = SUN | MON | TUE | WED | THU | FRI |


SAT

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

month_name = JAN | FEB | MAR | APR | MAY | JUN |


JUL
| 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 | .....


time = NOON | .....
date = day_of_week | ....
day_of_week = MON | .....

Ejemplos:

at9amTUE
atnow+2minutes
at9amFeb18
at4pm+3days
at10amJul31
at1amtomorrow

EnDebianlaespecificacindetiempoenformatoyaccseencuentraenel
fichero '/usr/doc/at/timespec' que nose corresponde conlo que hemos
puestoporquehemospretendidosimplificarestainformacin.

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

'atq'solodainformacindelnmerodetareaydelmomentoenqueseva
aejecutarperolatareaensimismano.EnDebianlastareaseguardanen
'/var/spool/cron/atjobs/' y resulta interesante como se guardan. Son
simplementeunscripquelanzaelcomandoindicadoperoantesdeello
recuperatodoelentornodesdeelcualselanzysesituaeneldirectorio
desde el cual se lanz. En el fichero '/var/spool/cron/atjobs/.SEQ' se
guardauncontadordesecuenciaparalostrabajosperoenhexadecimal.

Si existe el fichero '/etc/at.allow' solo los usuarios contenidos estarn


autorizados a lanzar trabajos con 'at'. Si no existiera '/etc/at.allow' se
permitir el acceso a todos los usuarios salvo que exista un fichero
'/etc/at.deny'encuyocasolosusuarioscontenidosenelnopodrnusar
'at'.

Lautilidadbatch

Yahemoscomentadoquesirveparainstruiralsistemaqueejecuteun
comandocuandolacargadelsistemanoseaaltayademsloharconuna
prioridadbaja.Silacarganodesciendepordebajodelvalorestablecido
paralastareasbatch,elprogramanoseejecutarnunca.

Amododeorientacinpodemosdecirqueparasistemasmonoprocesador
sueleusarsevaloresde0.7a1.5yparasistemasmultiprocesadorser
superioryestarenfuncindelnmerodeCPUs.

VamosaprogramarunshellscriptqueconsumamuchaCPUyquedeje
unatrazaquenospermitasabercuandoarrancaycuandopara.

# piloop
if [ $# -ne 1 ]
then echo "Uso piloop10 "
else
for i in 0 1 2 3 4 5 6 7 8 9
do
echo "$$ $i `date`" >> /tmp/piloop.out
echo "scale=$1; 4*a(1)" | bc -l >>
/tmp/piloop.bc

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

done
fi

Elvalordelaescalasepasacomoparmetroydeberprobarprimerocon
valoresbajoshastaqueconsumaunoodosminutosparapoderhacerla
prcticaconcomodidad.Ennuestroequipoelclculodelnmeropicon
1000cifrasdecimalesresultaunvaloradecuado.

1. procmeter3
2. nice19piloop1000&
3. Esperaraquesubalacarga
4. echopiloop1000|batch

Los procesos planificados con 'at' y 'batch' son gestionados por 'atd'.
Muchos de los procesos de este tipo que estn permanentemente
funcionando terminan en 'd' de 'daemon'. En ingles daemon significa
duende.Siporcualquieranomalaatddejaradefuncionarnosepodra
usar 'at' ni 'batch'. Curiosamente hay un proceso que se encarga de
gestionar tareas peridicas y que igualmente est permanentente
funcionandoperonosellamacrondsino'cron'.

Usodecronycrontab

Elcomando'cron'permitenejecutarperidicamenteunaseriedetareas
queestarnprogramadasenunosficherosespeciales.

La planificacin de tareas para usuarios no se hace directamente sino


pasandounficheroa'crontab'oeditndolodirectamentecon'crontabe'.
Esto generar un fichero en /var/spool/cron/crontabs/ Para verificar el
contenidodelficherocrontabdeunusuariobastaconusar'crontabl'y
paraeliminarlo'crontabr'.

Ponersiemprecomomnimo2minutosmsalactualparaprobaryaque
encasocontrariopuedenofuncionar.

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

Elformatoconsisteenunaseriedelineasconelformatosiguiente:

minutohorada_del_mesmesda_de_la_semana

Campo ValoresPermitidos

minuto 059

hora 023

da_del_mes 131

mes 112onombres

07onombres
da_de_la_semana
0o7esDomingo

Losnombresdemesesydasdelasemanadependendelidiomaquese
use(variableLC_TIME).Puedeprobarconelcomando'date'paraver
cualesseestnusandoensusistema.

Dos valores con un guin en medio indica un rango de valores que


incluiran los valores extremos indicados. Un asterisco (*) equivale al
rango de valores que van desde el primero al ltimo. Y se pueden
especificarunalistadeelementosoderangosseparndolosporcomas.
Porejemplo"2023,03"equivalea"20,21,22,23,0,1,2,3"

Comoveremosacontinuacinhayunaformadeagruparlasaccionesque
sehandeejecutarenelmismoperiodo.

A parte de las tareas peridicas que cada usuario pueda programarse


usando'crontabe'parasuspropiasnecesidades,elsistematendruna
seriedetareasprogramadasyestasseespecificanen/etc/crontab.

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

EnelcasodeDebiancronincluyenosololastareasde/etc/crontabsino
cadaunadelastareas queseincluyaenlosficheroscontenidosenel
directorio/etc/cron.d

Lautilidadrunparts

Enmuchasdistribuciones(yDebianesunadeellas)lastareasquesehan
deejecutarenunmismomomentoseagrupanenunnicodirectoriopara
ser procesadas. En Debian estos directorios son /etc/cron.daily,
cron.weekly,ycron.monthly.

De esta forma en crontab podemos indicar como accin runparts


directorio. La accinexpresadadeesaformaejecutara todosaquellos
scriptscontenidosenesedirectorio.Todosestosscriptsdeberncomenzar
forzosamentepor#!/bin/interprete_de_comandos.

Deestaformaaadirunanuevaaccinresultamuysencilloynorequiere
tocarelficherodeconfiguracindecron/etc/crontabquenormalmentese
limita a contener la programacin de tareas genricas para ciertos
periodos.Severmsclaroconunejemplo.Elejemploquesigueest
tomadodeunaDebian:

# /etc/crontab: system-wide crontab


# Unlike any other crontab you don't have to run the
`crontab'
# command to install the new version when you edit
this file.
# This file also has a username field, that none of
the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb
in:/usr/bin
# (mon = 3,6 = Miercoles,Sabado)
# m h dom mon dow user command
25 6 * * * root test -e /usr/sbin/anacron ||
run-parts --report /etc/cron.daily
50 6 * * 7 root test -e /usr/sbin/anacron ||
run-parts --report /etc/cron.weekly

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

55 6 1 * * root test -e /usr/sbin/anacron ||


run-parts --report /etc/cron.monthly
#

Cadaaccinconsisteenunacomprobacin.Sinoexisteanacronquees
un programa que explicaremos seguidamente se ejecutarn los scripts
contenidosenlosrespectivosdirectorios.Encasocontrarionosehace
nadayaqueseasumequeanacronseencargardeello.

Mejorarelcomportamientodecronconanacron.

Elcomandocronfuncionamuybienenunsistemaquefuncionedemodo
ininterrumpido. Si un sistema permanece un mes apagado y lo
encendemos,cronactivarsimultneamentetodaslastareaspendientes.
Estasseguramenteconsistirnentareasdiarias,semanales,ymensuales
entreotras.Elcomando'anacron'permitecorregirlosproblemasclsicos
quepresentaelusode'cron'ensistemasquenoestnfuncionandode
forma continua. Para ello se establece en el fichero /etc/anacrontab el
periodoyelretrasoparaactivarlastareasperidicas.

PorejemploenDebiantenemospordefectolosiguienteenelfichero/etc/
anacrontab:

# /etc/anacrontab: configuration file for anacron


# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb
in:/usr/bin
# These replace cron's entries
1 5 cron.daily nice run-parts
--report /etc/cron.daily
7 10 cron.weekly nice run-parts
--report /etc/cron.weekly
30 15 cron.monthly nice run-parts --report /
etc/cron.monthly

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

Quesucederusandotodoestoenunsistemaquearranquedespusde
unlargoperiododeestarapagado?Puesquealos5minutosarrancarlas
tareasdiarias,alos10lassemanalescasodeestarpendientes,yalos15
minutoslasmensuales,casodeestarpendientes.Deesaformaelsistema
reparteeneltiempolacargadetrabajodeformaescalonada.

Uncasoprctico.Tareasdosvecesporsemana

Enelcasoanteriorpodemosincluirunatareaparaqueseejecuteunavez
cadasietedasounavezaldaperonodisponemosdeunaprogramacin
intermedia.Vamosasuponerelsiguientecontenidoenlosdirectoriosde
tareasperidicos.

# ll /etc/cron.daily/

-rwxr-xr-x 1 root root 238 mar 15


1999 man-db
-rwxr-xr-x 1 root root 51 sep 13
1999 logrotate
-rwxr-xr-x 1 root root 592 feb 27
2000 suidmanager
-rwxr-xr-x 1 root root 2259 mar 30
2000 standard
-rwxr-xr-x 1 root root 3030 abr 29
2000 apache
-rwxr-xr-x 1 root root 427 abr 30
2000 exim
-rwxr-xr-x 1 root root 157 may 19
2000 tetex-bin
-rwxr-xr-x 1 root root 311 may 25
2000 0anacron
-rwxr-xr-x 1 root root 1065 jun 8
2000 sendmail
-rwxr-xr-x 1 root root 450 jul 18
2000 calendar
-rwxr-xr-x 1 root root 660 ene 9
2001 sysklogd
-rwxr-xr-x 1 root root 485 ene 9
2001 netbase
-rwxr-xr-x 1 root root 41 ene 9
2001 modutils
-rwxr-xr-x 1 root root 57 feb 29

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

2000 htdig
-rwxr-xr-x 1 root root 277 ene 9
2001 find

# ll /etc/cron.weekly/

-rwxr-xr-x 1 root root 210 nov 28


1998 man-db
-rwxr-xr-x 1 root root 540 nov 2
1999 isdnutils
-rwxr-xr-x 1 root root 217 ene 9
2000 lpr
-rwxr-xr-x 1 root root 116 feb 28
2000 man2html
-rwxr-xr-x 1 root root 1302 mar 22
2000 cvs
-rwxr-xr-x 1 root root 653 mar 23
2000 dhelp
-rwxr-xr-x 1 root root 312 may 25
2000 0anacron
-rwxr-xr-x 1 root root 781 ene 9
2001 sysklogd

# ll /etc/cron.monthly/

-rwxr-xr-x 1 root root 129 mar 30


2000 standard
-rwxr-xr-x 1 root root 313 may 25
2000 0anacron

Imaginemos que 'htdig' y 'find' resultan para nosotros tareas


excesivamente pesadas para realizarlas diariamente pero tampoco
deseamosdejarpasartodaunasemanasinejecutarlas.

Lasolucinseraincluirunanuevacategoradetareasqueseejecutaran
porejemplounpardevecesporsemana.

Paraello:

1. Crearemos un directorio que llamaremos por ejemplo


/etc/cron.2_weekly/.

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

2. Moveremoslosscripts'htdig'y'find'aesedirectorio.
3. Incluiremosen/etc/crontabunanuevaentradaparalastareasque
handeejecutarsedosvecesporsemanaypuestoquelastareas
semanales estn programadas para activarse los Domingos
usaremoslosMircolesylosSbadosafindequenocoincidany
quedenmejorrepartidaseneltiempo.

# /etc/crontab: system-wide crontab


# Unlike any other crontab you don't have to run the
`crontab'
# command to install the new version when you edit
this file.
# This file also has a username field, that none of
the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb
in:/usr/bin
# (mon = 3,6 = Miercoles,Sabado)
# m h dom mon dow user command
25 6 * * * root test -e /usr/sbin/anacron ||
run-parts --report /etc/cron.daily
40 6 * * 3,6 root test -e /usr/sbin/anacron ||
run-parts --report /etc/cron.2_weekly
50 6 * * 7 root test -e /usr/sbin/anacron ||
run-parts --report /etc/cron.weekly
55 6 1 * * root test -e /usr/sbin/anacron ||
run-parts --report /etc/cron.monthly
#

4. Incluiremosen/etc/anacrontabunanuevaentrada

# /etc/anacrontab: configuration file for anacron


# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb
in:/usr/bin

# These replace cron's entries


1 5 cron.daily nice -19 run-parts

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

--report /etc/cron.daily
3 10 cron.2_weekly nice -19 run-parts
--report /etc/cron.2_weekly
7 10 cron.weekly nice -19 run-parts
--report /etc/cron.weekly
30 15 cron.monthly nice -19 run-parts
--report /etc/cron.monthly

Yconelloyatendramosmodificadalaplanificacintalycomolahemos
descrito.Amododecomprobacinpodemosincluiralgnscriptenlos
directoriosdetareasperidicasparavercuandoseejecutan.

En/etc/cron.daily/trazapondremos:

#!/bin/sh
echo "daily `date`" >> /var/log/traza_cron.log

En/etc/cron.weekly/trazapondremos:

#!/bin/sh
echo "weekly `date`" >> /var/log/traza_cron.log

En/etc/cron.2_weekly/trazapondremos:

#!/bin/sh
echo "2_weekly `date`" >> /var/log/traza_cron.log

En/etc/cron.monthly/trazapondremos:

#!/bin/sh
echo "monthly `date`" >> /var/log/traza_cron.log

Pasados unos das comprobaremos /var/log/traza_cron.log que deber


mostrar la ejecucin de cada parte en los momentos adecuados. Se

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

muestralatrazaenunordenadorquesueleencenderseunosminutosantes
delas8delamaanatodoslosdas.

daily Wed Nov 28 08:00:24 CET 2001


2_weekly Wed Nov 28 08:19:09 CET 2001
daily Thu Nov 29 07:45:38 CET 2001
daily Fri Nov 30 07:48:29 CET 2001
daily Sat Dec 1 08:30:52 CET 2001
2_weekly Sat Dec 1 08:49:23 CET 2001
daily Sun Dec 2 07:37:13 CET 2001
daily Mon Dec 3 07:46:48 CET 2001
weekly Mon Dec 3 07:50:28 CET 2001
daily Tue Dec 4 07:53:11 CET 2001
2_weekly Tue Dec 4 08:12:19 CET 2001
daily Wed Dec 5 07:45:44 CET 2001
daily Thu Dec 6 08:21:58 CET 2001

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

INTRODUCCIONAREDES

Introduccin

Estedocumentopretendeaclararlosconceptosbsicosrelativosaredes
en general y a redes Linux en particular. De todos los protocolos
existentesnoscentraremosenelTCP/IP.

ElTCP/IPeslafamiliadeprotocolosmsampliamenteusadaentodoel
mundo.ElloesdebidoaqueeselprotocolousadoporInternet(laredde
redes)yporquesuusoestamuyextendidodesdehacemuchotiempo
entrelossistemasdetipoUnix.ElxitodeInternethacontribuidode
formadecisivaensuampliousoentodotipodesistemasyredes.

Estecaptuloleayudaracomprenderlosaspectosbsicosderedes.Sin
estos conocimientos instalar y configurar una red aunque sea pequea
resultara complicado porque existe mucha terminologa tcgnica
necesaria porque no siempre se pueden explicar todo con pocas y
sencillaspalabras.

Historia

En 1969, el departamento de Defensa de los Estados Unidos se vi


obligado a dar solucin a los problemas de comunicacin electrnica
internaqueusabansistemasinformticosvariados.Porelloseencargal
ARPA(AvancedResearchProjectsAgency)quedesarrollara,juntocon
las principales universidades yfabricantes deequipos informticos, un
protocoloestandardecomunicaciones.Estodilugaradosredes.Unade
usoexclusivamentemilitarMILNETyotraconfinesexperimentalesde
investigacinARPANETqueen1970incorporalosprotocolosTCP/IP.
MILNetseescindicomotalenlosaos80.

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

Topologa

Latopologadeunaredvieneaserelaspectofsicoquepresentanlos
nodosdeunaredysuinterconexinentreellos.Porejemplosilosnodos
seconectanaunalargalneaqueconstituyenelmediodecomunicacin
quetodoslosnodoscompartenporigualdiremosqueesunaredenbus.
Silosnodosseorganizanconectandoseexclusivamenteatravsdeun
gran nodo central y con total independecia entre los restantes nodos
diremosqueesunaredenestrella.Silosnodosseconectanorganizando
un crculo donde cada nodo solo tiene relacin directa con un nodo
predecesoryunosucesordentrodelcrculo,diremosqueesuna reden
anillo.Enlaprcticacualquierredsepuedeconectaraotraoriginando
modelosmixtos.

Protocolosdeaccesoared

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

Abajonivelsonnecesariasunaseriedereglaspreestablecidasparapoder
intercambiar paquetes de informacin. El uso de la palabra protocolo
tambinseusarcuandohablemosdeotrosnivelesdecomunicaciny
ellonodebeconfundirnos.(Elnivelqueestamostratandoeseldeacceso
aredenterminologaTCP/IP,yagrupalosnivelesfsicoydeenlacede
datosenterminologaOSI.)

Cuandonosreferimos atopologanosreferimos aunniveltotalmente


fsicoycuandonosreferimosaprotocolosdetransmisindedatosnos
referinos a un nivel totalmente lgico que establece las reglas de
comunicacin.

En teora la Topologa de una red no determina su protocolo de


transmisin de datos y efectivamente son posibles casi cualquier
combinacin de topologa y de protocolo, pero en la prctica cada
topologisueleusarsepreferentementeconunosdeterminadosprotocolos
porquenacendeundiseoconjunto.Pondremosunospocosejemplosde
protocolosdetransmisindedatosysealaremosenquetopologasuelen
usarseconmayorfrecuencia:

Csma(CarrierSenseMultipleAccess)

Las estaciones comparten un mismo canal y quedan a la escucha


respondiendounicamentecuandounmensajevadirijidoaellos.Esto
sedetectagraciasaunadireccinnicaqueconsisteennmerosde6
bytes asociados a cada tarjeta de red grabado generalmente por el
fabricante.Esdecirunacolisinseproducecuandolaidentificacin
MACdelreceptorquevaenlatramadeunmensaje,coincideconla
direccinfsicadeladaptadorderedunicaparacadatarjeta.Enel
casodequedospuestosintentenusarsimultaneamenteelcanalpara
transmitirlosmensajestransmitidosenformadeimpulsoselectricos
sufrirn distorsionesylainformacindelasealsepierde.Aeste
fenmeno se le llama colisin. En la practica ser necesario
retransmitirlospaquetescolisionados.

(Generalmenteestemtodoseasociaatopologaenbus).

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

Csma/CD(CarrierSenseMultipleAccesColisionDetect

Es una variacin de la anterior que minimiza la probabilidad de


colisindetectandoantesdeemitirsielbusestenuso,peroestono
impidetotalmentequeseproduzcancolisiones.Hayotrasvariaciones
basadasenCsmasiempreintentandominimizarlascolisiones.

(Generalmenteseasociaatopologaenbus).

Polling(Llamadaselectiva)
Existeunnodocentralqueestableceelturnodecadanodo.Para
ellohaceunallamadaselectivaquesoloserrecibidaporelnodo
pertinente.

(Generalmenteseasociaatopologaenestrella).

TokenPassing(Pasodetestigo)

Estatecnologaconsisteenquecadapuestovapasandounmensaje
quehaceelmismopapelqueuntestigoenunacarreraderelevos.
Unicamenteelnodoquetieneeltestigopuedeenviarelmensajey
generalmentelosmensajespasanalnodosiguientesiguiendotodos
ellosunasecuenciacircularaunquehayvariacionesdeestemodelo.
Cuando el mensaje original vuelve al nodo que lo origin este lo
elimina de la circulacin del anillo. Se trata de un modelo muy
estricto que ofrece un altsimo grado de control. No existe
posibilidadesaleatoriascomoenelcasodelascolisionesdelmodelo
Csma.Elpasodetestigo,permideconocercontotalseguridadcuales
eltiempoqueseinvertirenhacerqueunmensajealcancesudestino
ypermitequeelusointensivodelarednoafecteasufuncionamiento.

(Generalmenteseasociaatopologaenanillo).

Ethernet

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

Es una de las arquitecturas de red local ms conocidas y populares.


Cuandosehabladeethernetnosreferimosaunatecnologadeenlacede
datos.

EthernetfudesarrolladaporXeroxenloslaboratoriosdePaloAltoen
California. Utilizaron el protocolo CSMA/CD y los nodos de la red
conectadosmediandecablecoaxial,usabandireccionesde48bits.Estas
caractersticapermitanreorganizarlaredsintenerqueefectuarcambios
en el SO, lo cual tiene mucho que ver con su enrme xito en la
actualidad.

ConsiderandolasdesventajasdeCSMA/CDsecomprendequeestaforma
defuncionarofrezcadificultadescuandoenelcanaldecomunicacinse
produceunusointensivo.Lasinevitablescolisionessetraducenenuna
perdida de rendimiento ensituaciones desobrecargadelared.Enla
prctica la mayora de los nodos de una gran red intercambian
informacin entre ellos de forma ocasional y las redes se dividen en
subredes para minimizar colisiones de mensajes. El modelo de la
arquitecturaEthernetesantetodomuyflexibleyfacilitalacreaciny
gestinderedesderedesmuygrandessingrandesproblemas.

En la actualidad hay una amplia variedad de formas de interconectar


mquinas en una LAN. Incluso se pueden utilizar los puertos serie o
paraleloparaelloperolomsfrecuenteesusarEthernet.Unatarjetaa10
Mb/s(10Megabitsporsegundo)cuestasolounas5000Ptas(30Euros)y
elcablecuestaunas300Ptas/metro(2Euros/metro).Porlotantomontar
una pequea red casera no supone mucho gasto. Se puede usar cable
coaxial generalmente negroqueseterminan enlosextremosmediante
terminadoresespecialesyadmitenenlacesenformadeTparaconectar
tantospuestoscomoseanecesariosintenerqueadquirirun'hub'.

Un 'hub' esundispositivoconcentradorquedisponedevariasbocasde
conexin.Resultarimprescindiblesuusocuandoseusaenunaredde
msdedosordenadoresconcable10base2.Estecabletieneconectoresde
plsticoRJ45similaresalosconectoresdelostelfonos.

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

Con este cable se puede prescindir de 'hub' solo en el caso de


interconectardosordenadores,yparaelloelcablehadeserespecial,ya
que la posicin dealgunos delos 8pines quetiene elconector RJ45
debarnircruzados.Concretamenteelpin1(cableblanconaranja)seha
decruzarconelpin3(cableblancoverde)yelpin2(cablenaranja)seha
decruzarconelpin6(cableverde).

Lastarjetasa100Mb/stampocosonmuycarasysondiezvecesms
rpidas. Cuestan unas 12.000 Ptas (72 Euros).Hay tarjetas quepuede
funcionar tanto a 100 como a 10 Mb/s pero en una red no pueden
mezclarsetarjetasfuncionandoadistintasvelocidades.

ModeloOSIyTCP/IP

Los protocolos TCP/IP se crearon y normalizaron en los 80, es decir


muchoantesdequesedefinieraelmodelodereferenciaOSIdelaISO
cuyaarquitecturaseimpusoenlos90.Losgobiernosapoyarondesdeun
principiolosestandaresOSIquerepresentaunmodelobiendefinidoy
estructurado.Portodoellosepensqueestemodelotriunfarasobreel
modeloTCP/IPqueenrealidadnisiquierarepresentaunmodelonico
sinounafamiliadeprotocolosquesehanidodefiniendoanarquicamente
yqueaposteriorisehanestructuradoencapas.Alfinalloquerealmente
ha triunfado ha sido Internet que usa TCP/IP. En el modelo OSI se
describen perfectamente siete distintos niveles. En el modelo TCP/IP
realmentenosedescribeunaestructuratanprecisadenivelescomoenel
modeloOSIaunquesepuedenasimilarycompararambosmodelosdela
formasiguiente.

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

En todos estos niveles podemos hablardesus respectivos procolos de


comunicacin. El trmino protocolo indica un conjunto de reglas
perfectamenteestablecidasquepermitenygarantizanelintercambiode
informacin.Encadaniveldelmodelolacomunicacintienesupropio
protocoloysupropiocometido.

LosprotocolosTCPestnorientadosaconexinconloque,sepodra
hablardesesinasimilandosealnivel5OSIperoUDPnoestorientado
a conexin y por ello no sepuede hablar propiamente de sesin. Las
corespondenciasdenivelesentreOSIyTCP/IPnosonperfectas.

TCPestorientadoaconexin.Enunaprimerafaseseestablececonexin
yconellosemantieneunasesindetrabajoquefinalizarconuncierre.
UDPutilizadatagramas.Esdecirqueenlugardeabrirunaconexincon
eldestinoparaestablecerundialogo,funcionasimplementeenviandoala
red fragmentos de informacin denominados datagramas. FTP, HTTP,

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

SMTP,yTELNETsonserviciosmuypopularesysonunbuenejemplode
protocolos orientados a conexin. SMNP, y NFS son ejemplos de
serviciosorientadosadatagramas.Msadelanteampliaremostodoesto
hablandodelModeloCliente/Servidor

ElnivelTCPyelnivelUDPdeleganenelnivelIPlatransmisindela
informacinperonoasumenqueIPtengaxito.Esdecirsupervisanla
transmisinyseocupandereenviarlospaquetesencasonecesario.

ElniveldeIPgestionaladireccindelmensajeparaquealcancesunodo
destino.ElprotocoloIPsepuedeasimilaralnivel3OSI.Enestenivel
existen tambin los protocolos siguientes: ICMP (Internet Control
MessageProtocol)ARP(AddressResolutionProtocol)RARP(Reverse
AddressResolutionProtocol).

Existenunaspginasdelmanualonlinequeestntraducidasqueexplican
unpocotodoesto.ip(7),udp(7),tcp(7),socket(7).

Enelnivel1OSIllamadonivelfsicosedefinencomosonloscables,los
conectoreslosniveleselectricosdelasseales,latopologa,etc.Peroen
elmodeloTCP/IPlosniveles1y2quedanasimiladosaunniconivelde
interfaz hardware que pasamos a describir. Tampoco aqu la
correspondenciadenivelesesperfectayaqueenenniveldeInterfazno
sedefinencablesniconectores,etc.

A diferencia de otros SO tipo Unix, en Linux no se usan disposivos


especiales tipo /dev/... sino que se crean interfaces dinmicamente
medianteifconfig.

EnelncleodeLinuxsepuedenincluirdistintostiposdeinterfaceso
controladores.Algunosdeellosson:

lo

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

Interfaz de bucle local (loopback). Se utiliza para pruebas aunque


algunaaplicacinpuedenecesitarlaigualmente.Notienesentidotener
msdeuninterfazdeestetipo.

eth

EslainterfazgenricaparatarjetasEthernetdeusomuyfrecuente.

sl

InterfazSLIPparapuertoserie.Montarunaredmedianteunpuerto
serieespocoeficienteperolaposibilidadexiste.

ppp

InterfazPPPparamodem.

ippp

InterfazIPPPparaISDN(RDSI).

plip

Interfaz PLIP para puerto paralelo. Montar una red mediante un


puertoparaleloespocoeficienteperolaposibilidadexiste.

Para cada uno de estos controladores se requiere la correspondiente


opcinenenncleodeLinux.

ModeloCliente/Servidor

Cadaservicioseinstalaasociadoaunpuertoygeneralmenteseusanlos
servicios ms comunes en puertos previamente establecidos y
universalmenteconocidos.Cadaserviciohadetenerunpuertodistinto
perolosserviciosTCPylosUDPnoentranenconflictoalusarelmismo
puerto.

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

Los servicios en general (no solos los servicios de red) se pueden


configurarenlosSOtipoUnixdedosformasdistintas.

ModoStandalone:Enestemodoparaqueelservicioestactivoel
servidordeberestarpermanentementearrancadoyescuchandosu
puertoparapoderatendercualquierpeticindeservicio.
Modosupeditadoalservidordeserviciosinetd:

En este modo los servidores estarn parados y ser inetd(8) quien


estarpermanentementearrancadoyalaescuchaentodoslospuertos.
Paraellousarelfichero/etc/servicesquedeterminaquepuertostiene
queescucharyqueserviciosestnasociadosacadapuerto.Deesta
formaencasonecesarioarrancarunservidordeunservicioconcreto
cuandodetecteunapeticindeservicioensupuertoasociado.Mireel
contenidode/etc/servicesparasabercomoestconfiguradosuinetd.
Veaseservices(5).

Ensusistemaprobalmentetendrsimultaneamenteserviciosactivosen
modoStandaloneyotrossupeditadosmedianteinetd.Estodependedel
tipodeservicioydeltipodeusoquetenga.Estclaroqueunservicio
utilizado de forma espordica no es bueno tenerlo permanentemente
arrancadoconsumiendorecursosmientras permaneceinactivolamayor
parte del tiempo. Por el contrario un servicio que recibe un autntico
bombardeodepeticionesdeserviciosnoesbuenoquetengaquearrancar
ypararacadapeticin.

Sidetieneelservidordeinetd,dejaratodoslosserviciossupeditadossin
posibilidad de activarse. Los servicios se pueden asociar a puertos
distintos de aquellos que por convenio se suelen usar pero si usa un
servicio en un puerto distinto del preestablecido los clientes de ese
servicionopodrnusarloanoserqueantesaveriguenelpuerto.

LasredesenLinuxutilizanporlotantosoncapacesdeusarservicios
siguiendoelmodelocliente/servidormedianteelcualunodelosprocesos
escapazdeaceptardeterminadotipodepeticionesygenerardeterminado
tipoderespuestasdeacuerdounprotocolopreestablecidoqueestablece

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

lasreglasdecomunicacinentreambos.Unservidoryunclientesonpor
tanto procesos independientes que generalmente aunque no
necesariamenteresidirnenmaquinasdistintas.

SustituiraunprogramaclientequehablausandoelprotocoloSMTPcon
unservidoroaunprogramaclientequehablaPOP3conunservidores
muy fcil. SMTP usa elpuerto 25yPOP3usael puerto110.Sinos
conectamosportelnetaunservidorusandoalgunodeestospuertosse
iniciar una conversacin de acuerto al protocolo y de esta forma
mediantetelnetpodremosenviarcorreomedianteSMTPobajarcorreo
porPOP3,oborrarunmnsajeennuestroservidordecorreo,etc.Basta
para ello conocer el protocolo que en estos dos caso se limita a un
reducidonmerodecomandossencillos.

SisumquinatieneactivoelserviciodeSMTPpuedeprobarlosiguiente.

telnet127.0.0.125
HELP
HELO127.0.0.1
QUIT

Lo queacaba dehaceresdialogarenSMTPconsuservidorlocal de
SMTPasociadoalpuerto25.Estoesaplicableamuchosotrosservicios.

ElinterfazdellamadaPPP

ParaconectarainternetprimerosumodemtelefonearasuProveedorde
ServiciosdeInternet(ISP)yparaestablecerconexinsenegocialaforma
deenviaryrecibirpaquetesporlalneaenfuncindelascapacidadesde
ambos extremos. Es decir que tienen que ponerse de acuerdo en la
velocidadausar,formadecompresindelosdatosymscosas.Paraello
apppd,oensucasoaipppd(elsegundoesparaRDSI)hayquepasarle
algunosparmetrosenformadeargumentosenlalneadecomandoso
bienatravsdeunficherodeconfiguracin(/etc/ppp/options)yconestos
datoslanegociacinsehacedeformaautomticaytransparente.Tambin
sesolicitalaidentificacindelusuarioqueharealizadolallamada.Ano

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

serquecontratelaobtencindeunadireccinIPfijayreservadapara
ustedobtendrencadaconexinunadireccinIPdistinta.Alaprimerase
lallamatambindireccinIPestticaporqueessiemprelamsmayala
segunda direccin IP dinmica. De todos estos detalles se ocupa el
protocoloPPP(PointtoPointProtocol)

ElaccesoaunISPmediantemodemmerecerauncaptuloenteropero
suponemos que con lo explicado ya habr comprendido que funciona
comouninterfazderedpppensusistemaenelcualpuedenexistircomo
yahemosmencionadootrosinterfaces.

Unavezlogradalaconexindispondrdeuninterfazderedqueledar
accesoainternet.Paracomprobarsitieneconexinpruebeahacerpinga
unservidorconocido.

pingwww.altavista.com

PROTOCOLOSTCP/IP

Introduccin

Estecaptuloesenrealidadunasegundapartedelanteriorenelcualyase
comentaronalgunascosas.SedijoqueelprotocoloTCP/IPesunodelos
protocolosmasampliamenteusadosentodoelmundo,yporestarazn
merecelapenaprofundizarenesteprotocoloenparticular.

OSI y TCP/IP son pilas de protocolos distintos y el intento bien


intencionado que se hizo el el captulo anterior solo era una t
aproximacinnecesariamenteimprecisadeambosmodelosdificilmente
comparables. En el caso de TCP/IP es mejor utilizar OSI slo como
modelo de referencia terico y estudiar en profundidad el verdadero
modeloTCP/IPqueesloqueharemosahora.

Este captulo contiene fragmentos de un anterior trabajo en el cual


participLuisColoradoUrcolayporelloaprovechoparaagradecersu
aportacin. (En la actualidad desconozco su direccin de correo

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

electrnico)Convieneaclararunaseriedeconceptosyempezaremospor
explicarqueesunadireccinIP.

Direccionesip

ElprincipalbeneficiodeIPesqueescapazdeconvertirunconjuntode
redes fsicamente distintas en una sola red aparentemente homognea.
UnainternetesunaredIPaparentementehomognea.LaInternet(con
mayscula) es la red de redes. En realidad solo es una internet muy
grande y que se exitende por todo el planeta. La caracterstica de
cualquierinternetesquecadaunodelosnodostieneunadireccinIP
nica y distinta a la de cualquier otro nodo. Las direcciones IP son
cadenasdetreintaydosbitsorganizadascomounasecuenciadecuatro
bytes. Todas las tramas (paquetes) IP llevan una direccin de origen
(dondeseoriginolatrama)yunadireccindestino(adondevalamisma).
Bsicamenteestoestodoloquehayquesabercuandoseconectaunoala
redyladireccinIPtelaasignaunadministradordered.

Estasdireccionestienenunarepresentacincomocuatronumerosenteros
separadosporpuntosyennotaciondecimal.Lasdireccionesrepresentan
elinterfacedeconexindeunequipoconlared.Asi,unhostqueest
conectado a varias redes como regla general, no tendr una nica
direccindered,sinovarias(normalmenteunaporcadaredalaqueesta
conectado).Perointernamente,Estonoesdeltodocierto.Lasdirecciones
IPsedividenendospartes(cadaunaconunciertonumerodebits)cuyo
significadotienequeverconelsistemadeenrutadodetramas.Laprimera
parte (cuya longitud no es fija y depende de una serie de factores)
representa la red, y debe ser igual para todos los hosts que esten
conectadosaunamismaredfsica.Lasegundaparterepresentaelhost,y
debeserdiferenteparatodosloshostsqueestanconectadosalamisma
redfsica.

ElmecanismodedecisindeIPquehacequetodaslastramaslleguena
su destino es el siguiente: Cuando la direccin origen y la direccin
destinoestanambasenlamismared(estosesabeporquesudireccinde

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

redesigualenambas,ladireccinderedserlaconsecuenciadesustituir
porcerostodalapartedehostenladireccinconsiderada)IPsuponeque
existeunmecanismodenivelinferior(enestecasoEthernet,TokenRing,
etc.)quesabecomohacerllegarlatramahastaelhostdestino.Cuandola
direccinnderedorigenyladedestinonocoinciden,entonceshayque
enrutar.

Paraenrutar,sedisponedeunatablaquecontieneentradasparacadauna
delasredesalasquesequierenhacerllegartramas,quenoseanlocalesa
estehost(unhost,engeneral,estaconectadoavariasredes,delasque
hacedegateway(pasarela),siladireccindestinodelatramatieneuna
direccin de red que coincide con alguna de las direcciones de red
propiaslasqueresultandesustituirporceroslapartedehostencada
unodelosinterfaces,entoncesnohacefaltaenrutar).Estatablatiene
msomenosentradasenfuncindelacomplejidaddeunainternet(ored
deredes)yladireccindelsiguientehostenelcaminohastalaredde
destino.

Porotrolado,lapartequecorrespondearedylapartequecorrespondeal
host,serealizausandoestemodelo(salvoparaelsubnetting,queaade
algodecomplejidad).

Clasesderedes

Existen5tiposdedireccionesIP.Acadatiposeleasignaunaletra,asi,
existendireccionesdeclasesA,B,C,D,E.Lasdireccionespertenecena
estasclasesenfuncindeloscuatrobitsmssignificativosdelprimer
byte.

ClaseA
0nnnnnnn hhhhhhhh hhhhhhhh hhhhhhhh
7Bitsred+24bitshost
ClaseB
10nnnnnn nnnnnnnn hhhhhhhh hhhhhhhh

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

14bitsred+16bitshost
ClaseC
110nnnnn nnnnnnnn nnnnnnnn hhhhhhhh
21bitsred+8bitshost
ClaseD
1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx
(multicasting)
ClaseE
1111xxxx xxxxxxxx xxxxxxxx xxxxxxxx
(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

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 B C D
IP.ADR 172.22.22.21 172.22.22.22 172.22.23.21 172.22.23.22
N.MASK 255.255.255.0 255.255.255.0 255.255.255.0 255.255.255.0
BROADK 0.0.0.255 0.0.0.255 0.0.0.255 0.0.0.255
NETWRK 172.22.22.0 172.22.22.0 172.22.23.0 172.22.23.0

Hay dos gateways, con dos direcciones cada uno, y su configuracon


sera:

GW1 GW2
IP.Addr 172.22.22.2/172.22.21.2 172.22.23.1/172.22.21.1

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

N.Mask 255.255.255.0(ambas) 255.255.255.0(ambas)


Broadc 172.22.22.255/172.22.21.255 172.22.23.255/172.22.21.255
NetAddr 172.22.22.0/172.22.21.0 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: 0.0.0.0(default)>172.22.22.2
HostB: 0.0.0.0(default)>172.22.22.2
HostC: 0.0.0.0(default)>172.22.23.1
HostD: 0.0.0.0(default)>172.22.23.1
GW1: 172.22.22.0 >172.22.21.2
GW2: 172.22.23.0 >172.22.21.1

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

Sinosfijamos,podemosverquelarutapordefectoeselgatewaypor
defectoqueapareceenlaconfiguracindemuchasmquinasLinux,pero
paralosgatewaysnoapareceningungatewaypordefecto.Estoesuna
caractersticadelasredesquetienenbackbones.

Backbon

Literalmente, backbone significa columna vertebral. Las tramas se


canalizanhaciaelbackbone,peroeste,alfinaldebedecidiradondevana
pararlastramas.Comoconclusindeestaltimafrasesedesprendeque
entodobackbone(reddeniveljerrquicosuperiordondenohayninguna
redmasimportante.p.ej.elbackbonedeInternet,olaredprincipaldeuna
empresa que no tiene conexiones con el exterior) los gateways que
formanelbackbonedebentenerrutasatodaslasredesynoapareceruna
rutapordefectoensustablasderutas,mientrasqueparaelrestodelas
redes,larutapordefecto(yparaloshosts)sersiemprelaquellevehacia
elbackbon.

Configuracindeunpuesto

Unavezcomprendidoslosconceptospasemosacalcularlasdirecciones.
ConladireccinIPylamscaraderedsepuedenobtenerlasdems.
Tomando como ejemplo el nodo A observamos que se cumplen las
siguientesrelacioneslgicasusandolosoperadoreslgicos(AND,NOTy
OR)sobrelosbitsqueloscomponen:

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

Mscara
255.255.255.000
deRed
Direccin
172.022.022.021
IP
AND
Direccin
172.022.022.000
deRed

NOT(Ms
000.000.000.255
caradeRed)
Direccin
172.022.022.021
deRed
OR
Direccin
172.022.022.000
deBroadcast

ObservequeconladireccinIPylamscaraderedsepuedededucirlas
restantesdirecciones.Porlotantositienequeconectarseaunaredlocal
bastarconpreguntaraladministradordelamismaesosdosnicosdatos.

Criteriosparasubnetearunared

Vamosacomentarloscriteriosquesepuedentenerencuentaalahorade
decidirsubnetearunagranredenvariasmspequeas.

Subnetear una red no sirve unicamente a criterios topolgicos


relacionadosconlainstalacinfsicadelared.Estclaroquelaredes

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

topolgicamente distintas o que usen diferentes protocolos de


transmisin, deberan tener direcciones distintas para no mezclar
artificialmentecosasdistintasperotambinsepuededividirunagranred
envariasporotrosmotivos.Porejemploparafacilitarlaadministracin
delareddelegandoacadaadministradorlagestindedireccionesdeuna
subred. Quizs las estructura de una empresa aconseje separar redes
disintasparadistintosdepartamentosporejemplo.Esdecirlassubredes
pueden facilitar la adaptacin de la red a la estructura de una
organizacin.Tambinpuedenservirparaaislarredescontrficointerno
abundanteyfacilitareldiagnsticodeproblemasenlared.

Entehorasepuededividirunasolaredfsicaenvariaslgicasperosila
separacin fsica fuera posible conviene hacerla uniendolas con un
gatewayporqueaumentaremoselanchodebandatotalenlared.Hayque
tenerencuentaqueunaredethernetesunbusconacesoCsma/CDypor
lotantoenuninstantedetiempodado,variospuestospuedenescuchar
simultaneamenteperonuncapuedenhablardosusandoelmismobusala
vez porque origina la colisin de los paquetes y estos debern ser
reenviadosdeformanosimultnea.

Los trminos Pasarelas (Gateways), Routers (Routers) y Puentes


(Bridges)serefierenaunaseriededispositivosparainterconectarredes.
Muchas veces estos dispositivos son un PC con un par de tarjetas de
comunicaciones para conectarse simultaneamente a dos redes
funcionando con un software apropiado. Un puente conecta dos redes
parecidas(porejemplopuedenserdistintasensuvelocidad)sincambiar
laestructuradelosmensajesquecirculanporellas.UnRouterconecta
dos redes que son iguales (o parecidas). No hay traduccin de un
protocoloaotroperositraduccindedirecciones.Unapasarelapuede
conectar redes distintas (por ejemplo una ethernet y una token ring)
realiza la conversin de protocolos y la traduccin de direcciones. Si
recordamoslosmodelosOSIyTCP/IPexplicadosanteriormentevemos
queenlosdistintosdispositivosmencionadosactuaranadistintonivel
delmodelodecomunicaciones.

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

Puestoqueunrouterincluyelafuncindepuente,ylapasarelaengloba
lasfuncionesderouterydepuente.Porqueentoncesnoseusasiempre
unapasarela(gateway)?

Cuandotodoslosnodosdeunareddebenalcanzartodoslosnodosdeotra
red, se provoca una sobre carga de la red debido a los protocolos de
rutado.Enestecasoycuandoambasredesutilizenelmismoprotocolode
red,lamejorsolucionesunpuente.

Existeotrotipodedispositivoquesirveparaconectardosredesyquese
llamaFirewall.Setratadeundispositivolgicoquesirveparaconectar
deformaseguralaparteprivadadeunaredconlapartepblica.Estos
dispositivos pueden establecer una poltica de restricciones a la
informacinquecirculaporellos.

Para determinar una ruta como la mas idonea, se utiliza el siguiente


criterio.Elprotocolodeinformacinderutado(RIP)esunprotocoloque
estbasadounicamenteenelcoste.

Acadarutaseleasociauncosteenfuncindelrendimientodelared,tipo
delalinea,etc.Estopermitedeterminardeentrevariasrutasposiblescual
es la de menor coste.
Cadarouterdeunaredenvayrecibeinformacinderutadoquepermite
actualizarlastablasderutadocada30segundos.Cuandoelcostedeuna
rutasuperaelvalor16elsistemaseconsiderafueradealcance.Lacaida
deunnododelaredsueleprovocarlaperdidadealgunosmensajeshasta
quelastablasderutadodetodoslosrouterssereajustan.

ServidoresdeNombres

Las direcciones IP son muy adecuadas para las mquinas pero son
dificiles de recordar. Por esta razn se usan nombres de dominios.
AdemsusandosolounadireccinIPsinnombretendramosquecambiar
de direccin cada vez que nos alojemos en un servidor distinto. Si
asimilamos una direccin a un nombre podemos mantener nuestra
presenciaeninternet cambiandodeservidorsinqueapenassenoteel

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

cambio.Enlaprcticaelcambionosucedeinstantaneamenteporquetiene
quepropagarselainformacindelcambiodenombreengranpartedela
red.

Para una red pequea nos bastara usar un fichero /etc/hosts que sea
comnatodoslosnodosdelared.Silaredesmsgrandecadacambio
ha de ser propagado a los dems lo antes posible y controlar que la
informacin se mantiene coerente o usar un sistema de base de datos
compartidocomoNIS,etc.

Apesardeellotodoestoresultainsuficientecuandohablamosderedes
muygrandes.Elfichero/etc/hostsoequivalenteseraenormeasiquelo
quesehaimplementadoparaqueeninternetexistaunserviciodenombre
esqueesunprotocolollamadoDNSquepermitetenerestainformacin
distribuida adecuadamente mediante un sistema de dominios que se
reparten la carga de gestionar estos nombres organizados de forma
jerrquicageneralmentehastatresnivelesdeloscualeselprimerosuele
indicareltipodeactividad.Porejemplo:

com:Empresascomerciales
org:Organizacionesnocomerciales.
edu:Universidadesycentrosdeinvestigacin.
net:Pasarelasynodosadministrativosdelared.

Conelfindeaumentarlaeficienciaylatoleranciaafalloscadazonatiene
unservidordenombresautorizadoomaestroycadaunodeestostiene
variosservidoressecundarios.Laszonassedefinencomosuperconjuntos
deredesIPredondeadasaniveldeunocteto.

Estructuradepaquetes

Lospaquetesotramassonsecuenciasdebitsquecontienennosololos
datosconinformacindeusuariosinodatosdecabeceraydecolaquese
estructurandeformaquelosnivelesinferioresdetransmisindedatos
vanencapsulandoalosnivelessuperiores.ParaformarunpaqueteUDP
habraqueenvolverlodelaformasiguiente.

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

Datos
Nbytes
UDP Datos
20bytes Nbytes
IP UDP Datos
20bytes 20bytes Nbytes
Ethernet IP UDP Datos Ethernet
14bytes 20bytes 20bytes Nbytes 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 Datos
20bytes Nbytes
IP TCP Datos
20bytes 20bytes Nbytes
Ethernet IP TCP Datos Ethernet
14bytes 20bytes 20bytes Nbytes 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. TamaoTotal
Desplazamientodel
Identificacin Flags
Fragmento
TiempodeVida Protocolo 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 Ventana
datos GKH I NN
Checksum 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 Datos Ethernet


14bytes 20bytes 20bytes Nbytes 4bytes
Ethernet IP TCP Datos Ethernet
14bytes 20bytes 20bytes Nbytes 4bytes

PUENTE(BRIDGE)

Unpuenteactatraduciendoocontrolandolacirculacindepaquetesa
niveldeInterfazdered.EnnuestrocasoeslacapaEthernet.Ambasredes
debernsermuyparecidasyaquecualquierdiferenciaenlosprotocolos
superiores hara imposible la conexionde ambas redes.En laprctica
pueden permitirconectarredescondiferentes velocidades,peroambas
redesfsicassecomportarancomounamismaredlgica.

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

Ethernet IP UDP Datos Ethernet


14bytes 20bytes 20bytes Nbytes 4bytes
Ethernet IP TCP Datos Ethernet
14bytes 20bytes 20bytes Nbytes 4bytes

ENRUTADOR(ROUTER)

UnRouteractuatraduciendoocontrolandolacirculacindepaquetesa
niveldered.Podemosvereneldibujosiguientecomounrouterpuede
actuaraniveldeInterfazdered(EnnuestrocasoEthernet)yanivelde
red(ennuestrocasocapaIP).

Ethernet IP UDP Datos Ethernet


14bytes 20bytes 20bytes Nbytes 4bytes
Ethernet IP TCP Datos Ethernet
14bytes 20bytes 20bytes Nbytes 4bytes

PASARELA(GATEWAY)

Unapasarela(Gateway)actuaraniveldetransportequeennuestrocaso
puedeserTCPoUDP.Tambinenglobalosnivelesinferiores.

Ethernet IP UDP Datos Ethernet


14bytes 20bytes 20bytes Nbytes 4bytes
Ethernet IP TCP Datos Ethernet
14bytes 20bytes 20bytes Nbytes 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 UDP Datos Ethernet


14bytes 20bytes 20bytes Nbytes 4bytes
Ethernet IP TCP Datos Ethernet
14bytes 20bytes 20bytes Nbytes 4bytes

En la siguiente ilustracin se muestra a que nivel se comunican dos


equiposintercomunicadosporunodeestosdispositivos

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

ELARRANQUEENLINUXYCOMOSOLUCIONAR
SUSPROBLEMAS(PrimeraParte)

Introduccin

Enestecaptulointentaremosdescribirlasposiblescausasporlascuales
unsistemaLinuxpuedetenerproblemasparaarrancaroparafuncionar
correctamenteylaformadesolucionarlo.

Estos problemas pueden aparecer durante la instalacin con relativa


frecuencia perotambin puedenpresentarsepordistintas causasenun
sistema que lleva tiempo funcionando. En estos ltimos casos suele
tratarse de un descuido cometido desde root o bien por un fallo del
hardware.Algunasvecesseconviertenenautnticaspesadillas parael
usuarioquelaspadece.

Paradefendersedetodoestotenemosqueaprenderbastantescosassobre
el sistema y su funcionamiento. Trataremos primero de describir el
procesodearranque.

Este tema ha sido dividido en dos partes. La primera describe


principalmente los diferentes cargadores de arranque, y la segunda el
procesodeinicializacin.

Cargadoresdearranqueengeneral

Uncargadordearranqueesunsoftwareencargadodecargarenmemoria
elsistemaoperativo.Setratadealgocuriosoyaquebienmiradoesun
softwareencargadodecargarenmemoriaotrosoftware.Peroentoncesel
astutolectorsepreguntarquiencargaalcargador?Larespuestaesmuy
sencilla.LaBIOS.(BasicInputOutputSistem).Esunsoftwarequereside
enunamemoriaespecialnovoltildelordenador.Novoltilquieredecir

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

queseconservainclusonoelordenadorapagado.Estamemoriaesde
solo lectura. Denominada por ello ROM (Read Only Memory) por
contraposicinalaRAMqueesmemoriatotalmentevoltil.

No se pretende explicar el hardware del PC pero para no dejar esto


incompletomencionaremosqueexisteotrocomponentehardwarequea
diferenciadelaROMydelaRAMadmitelaalteracindeciertosvalores
de configuracin que no se perdern cuando el ordenador se apague,
aunqueparaelloserecurreaunapequeapila.Estamoshablandodela
CMOS.

LaBIOS esperaencontrar uncargador enalgndispositivo.Conviene


tener presente que la CMOS debe configurarse de modo que intente
arrancarexplorandolosdistintostiposdedispositivos,(disquete,cdrom,o
discoduro,etcenlasecuenciaqueanosotrosnosinterese).

Existen distintas alternativas para arrancar en Linux. Nosotros


comentaremosLilo,Loadlin,yGrub.Nosepuedeafirmartajantemente
que uno sea superior a otro. Son muy distintos en su filosofa y ello
presenta ventajas e inconvenientes para cada uno dependiendo de las
circunstancias.Todoselloscomopasofinalpasanelcontrolalsistema
operativo.Algunoscargadoresofrecenlaposibilidaddeelegirarrancar
condistintossistemasoperativos.

LaBIOSdebercargarunaseccinespecialdeldiscoodisquetequeno
se localiza en ninguna particin pues se encuentra en una pequea
localizacinpreviaalaparticiones.Estaseccineselregistromaestrode
arranqueabreviadamenteMBR(MasterBootRecord).Unavezcargadoel
MBRyasepuedelocalizarlaparticindonderesideelkerneloncleo
del sistema operativo y cargarlo. Tambin podr localizar la particin
donde reside el sistema de ficheros raz que no tiene porque ser
necesariamentelamisma.

Undisquetenoposeeparticiones.nicamentedisponedeunsectorde
arranquede512bytesyunazonadedatos.

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

UndiscodurotieneunMBRyhastaunmximodecuatroparticiones
primarias.Sisenecesitanmsparticionessetomaunadelasparticiones
primariasysesubdivideenparticioneslgicasperoentonceslaparticin
primariatratadadeestaformapasaallamarseparticinextendida.

Resumiendotodoelprocesodearranqueseraalgoas:

1. La seal elctrica de reset o la de establecimiento de la


alimentacin elctrica instruyen a la CPU para ejecutar las
instruccionesdelaBIOSdesdesupuntoinicial.
2. LaBIOSbasndoseenlaconfiguracindelaCMOSlocalizael
dispositivodearranqueycargaelMBR.
3. ElMBRpasaelcontrolalsectordearranqueenlalaparticin
adecuada.
4. ElsectordearranquecargaelSOylecedeelcontrol.

Discosyparticiones

RecordamoslanomenclaturadelosdiscosylasparticionesenLinux.

(/dev/hd[ah]paradiscosIDE,/dev/sd[ap]paradiscosSCSI,/dev/ed[ad]
para discos ESDI, /dev/xd[ab] para discos XT, /dev/fd[01] para
disquetes).

Estos nombres de dispositivo se refieren siempre al disco entero. El


dispositivo puede ser un disco duro no removible, un disco duro
removible, una unidad lectora o lectora/grabadora de cdrom, o de
cdrom/dvd,unidadeszip,uotrascosas.

Imaginemos un PC con tres discos duros IDE, dos discos SCSI, una
disquetera y unlector de CDROM IDE conectado al controlador IDE
primarioesclavo

/dev/hda controlador IDE primario maestro


/dev/hdb controlador IDE primario esclavo

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

/dev/hdc controlador IDE secundario maestro


/dev/hdd controlador IDE secundario esclavo
/dev/sda primer dispositivo SCSI.
/dev/sdb segundo dispositivo SCSI
/dev/fd0 disquetera
/dev/cdrom -> /dev/hdb (link simblico para unidad
cdrom conectado al
controlador IDE primario esclavo

ComomximocadadiscopodrtenercuatroparticionesprimariasPara
un primer disco IDE (/dev/hda) las particiones primarias seran
/dev/hda1 ... /dev/hda4. Las particiones lgicas se nombran siempre a
partirdela/dev/hda5enadelante.

Por ejemplo vamos a suponer que deseamos disponer de cuatro


particionesdistintas.Vamosasuponerqueusamos2particionesprimarias
yunaterceraextendidasobrelacualsehandefinido2particioneslgicas
elresultadoseraelsiguiente.

+-------------------------------------+
| Tabla de particiones /dev/hda |
| +-----------------------------------|
| | Particin 1 /dev/hda1 |
| | |
| |-----------------------------------|
| | Particin 2 /dev/hda2 |
| | |
| |-----------------------------------|
| | Particin extendida /dev/hda3 |
| | +---------------------------------|
| | | Tabla de particiones extendida |
| | |---------------------------------|
| | | Particin 3 /dev/hda5 |
| | | |
| | |---------------------------------|
| | | Tabla de particiones extendida |
| | |---------------------------------|
| | | Particin 4 /dev/hda6 |
| | | |
+-------------------------------------+

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

Es decir tenemos /dev/hda1, /dev/hda2, /dev/hda5, y /dev/hda6. La


particin /dev/hda3 extendida no se usa directamente. Es un mero
contenedordeparticioneslgicas.(Nosedebeformatear).

SeguramenteleresulteextraoporqueenlosSOoperativosdeMicrosoft
nosesueleusarmsdeunaparticinprimaria.Realmentesepodrahaber
usadounaparticinprimariayunaextendidacontresunidadeslgicas.
Es decir podramos haber usado /dev/hda1, /dev/hda5, /dev/hda6, y
/dev/hda7dejando/dev/hda2comoparticinextendida.

Tambinpodramoshaberusadolascuatroparticionescomoparticiones
primarias/dev/hda1,/dev/hda2,/dev/hda3,/dev/hda4.

ParavercualeslasituacinactualensuPC.Hagalosiguiente:

$
fdisk -l

Conviene sacar esta informacin por impresora y guardarla. Si


accidentalmentesepierdelainformacindelatabladeparticiones,por
ejemploporescrituraaccidentalenelprimersectordeundiscopodra
volver a recuperarla usando ese listado. Tambin se puede guardar la
informacin del primer sector de un disco duro salvndolo a disquete
mediante:

$ dd if=/dev/hda of=/dev/fd0 count=1 bs=512

Pararecuperarestesectorbastahacer:

$ dd of=/dev/hda if=/dev/fd0 count=1 bs=512

Puede valer si solo usa particiones primarias, pero esto no salva la


informacindelasparticioneslgicas.Lomejoresconservarlasalidade

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

'fdisk l'. No cuesta nada volver a particionar todo igual que estaba
nuevamenteusandofdisk.

CompartirelarranqueconotroSO

InstalarLinuxenundiscoqueyatieneotroSOtipoWindows.Daremos
unarecetamuysimplesuponiendoquepartedeunsistemaconunsolo
discoduroyconunasolaparticinqueyatieneotroSOtipoWindows.

1. Desinstale antivirus y otros programas que pueda residir en


posicionesfijasalfinaldeldiscoduro.
2. Desfragmentar el disco duro con la opcin de mxima
descompresin.
3. Asegresedequetodalainformacinquedaagrupadaytomenota
decuantoespacioquedalibre.
4. Dividir la particin con fips cortando por una parte donde no
existainformacin.
5. Eliminarlasegundaparticin.Puedehacerloconelpropiofdisk
deLinux.
6. Aadir una particin pequea para swap. y el resto la para la
futuraparticinrazdeLinux.Paralaswappuedeusaruntamao
deunos150Mbytes.
7. PorltimoinstaleLinux.

Lilo

LiloesprobablementeelcargadormsutilizadoenLinuxperosepuede
usarparacargarunagranvariedaddesistemasoperativos.

ElcargadorLilopuedeubicarseendistintoslugares.

SectordearranquedeundisqueteLinux.boot=(/dev/fd0,...)
MBR de la primera unidad de disco duro. boot=(/dev/hda,
/dev/sda,...)

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

Sector de arranque del primer sistema de ficheros Linux en el


primerdiscoduro.boot=(/dev/hda1,...)

Lilotambinpermitearrancardesdeunaparticinextendidaaunquenoes
frecuentetenerquerecurriraesto.

Nodebeconfundir/dev/hday/dev/hda1.Comoacabamosdeexplicarson
cosasbiendistintas.

SiustedtieneunSOdistintodeLinuxen/dev/hda1yusaboot=/dev/hda1
deteriorarelsistemadearranquedeeseotroSO.EnMSDOSsepuede
regeneraresaprdidamediantelatransferenciadelosficherosdelsistema
dearranquedesdeundisquetedelsistemamedianteelcomandosys.

Siutilizoboot=/dev/hdaLilosegrabarenelMBR.Sidesearecuperarel
MBR de MSDOS oWindows use desde undisquete dearranque que
contengaelcomandofdiskdeMSDOSelcomandofdisk/MBR.Setrata
deuncomandonodocumentadodeMSDOS.

PorlotantocadavezqueustedejecutaelcomandoLilodeLinuxpuede
estar afectando el proceso de arranque de otros sistemas operativos
instaladosensumquina.AMicrosoftnolegustacompartirdemasiado
su sistema de arranque con otros sistemas operativos. Durante la
instalacindeWindowsnoserespetaelMBRyporellosidebeinstalar
WindowsyLinuxconvieneinstalarLinuxensegundolugar.Paraello
dejeunapartedeldiscolibreconsuficienteespaciooreserveundisco
completoparasuLinux.

Liloseconfiguramedianteelfichero/etc/lilo.conf.Semuestraunejemplo
deconfiguracinbsica.Constadetrespartes:

Seccingeneraloglobal.
SeccindeentradasLinux(image=<kernel>)
SeccindeentradasnoLinux.(other=<particiondearranque>)

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

Existe una parte general previa yluegopara cada opcindearranque


etiquetadaconunidentificadorlabel=<etiqueta>.Paracadaopcinde
arranque se puede definir cosas nuevas o redefinir ciertas cosas
previamentedefinidasenlapartegeneral.

boot = /dev/hda
delay = 40
vga = normal
root = /dev/hda1
read-only
image = /zImage-2.5.99
label = kern2.5.99
image = /zImage-1.0.9
label = kern1.0.9
image = /boot/vmlinuz
label = linux
vga = ask
root = /dev/hdb2
other = /dev/hda3
label = dos
table = /dev/hda

Salvoquesendicecualeslaentradapordefectoconlaopcindefault=,
laprimeraentradaseconsideralaentradapredeterminadapordefectoy
encasodenointervencinelsistemaarrancarusandoestaentrada.Antes
deesoesperaruntiempo(delay=<dcimasdesegundo>)paradar
tiempoainterveniryelegirelarranquedeseado.Sinoserecuerdacuales
son las opciones para poder arrancar basta usar la tecla de cambio a
maysculas <Shift> y se mostrarn la lista de las distintas opciones
disponibles.Tambinsepuedeusarparalomismolacombinacindelas
teclas<Alt>+<Ctrl>.Sisequiereforzarlaaparicindeestalistasintener
queusarlasteclasusaremoslaopcinprompt.

Elkernelausarseestablecemedianteimage=<ficherodelkernel>La
variablerootpermiteespecificarcualserlaparticinraz.Denoexistir
estavariablelilotomarelvalordeterminadoenelpropiokernel,locual
puedealterarseconlautilidadrdev.

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

Ennuestroejemplohemosdefinidounaparticinrazparalossistemas
linuxmedianteelusoderoot=/dev/hda1enlaseccinglobalperoestose
puedealterarylaentradalabel=linuxusarroot=/dev/hdb2yvga=
ask.Estoltimopermiteelegirduranteelarranqueelmododepantallaa
usar.Laopcinreadonlyhacequeelsistemadeficherosrazsearranque
inicialmente en modo de solo lectura. Esto es lo normal pero
posteriormenteduranteelarranquecambiaraamodolecturaescritura.

Se puede incluir un mensaje durante el arranque mediante message =


<fichero>. La opcin compact permite una carga ms rpida y es
recomendableporellosuusoendisquetes(boot=/dev/fd0)peropuede
serincompatibleconlaopcinlinear.Buenohaymuchasopcionesmsy
convienemirarladocumentacindelilo.

Unavezeditadoelfichero'lilo.conf'hayqueejecutarelcomando'lilo'
parainstalarelcargadordearranque,queseactivarlaprximavezque
searranqueelsistema.Elmsmnimocambioqueafecteaalgunodelos
ficherosqueintervienenenelarranqueharqueestefalle.Porejemplosi
sacaunacopiadelkernel,borraeloriginalyrenombralacopiaconel
mismonombrequeeloriginaltodoparecerqueestigualqueantespero
lasposicionesendiscoyanosonlasmismasyelarranquefallar.Para
evitarestodespusdelarecompilacindeunkernelodecualquierotro
cambioencualquieradeloselementosinvolucradosduranteelarranque
deberreconstruirelcargadorvolviendoaejecutarelcomandolilo.

LILO puede informar de la limitacin de la BIOS para acceder por


encimadelcilindro1024.Silaparticindearranquesuperaestelmite
cabelaposibilidaddequeelkerneluotroelementonecesarioduranteel
arranqueresidaporencimadeeselmiteyresulteinaccesibleparaLilo
impidiendo elarranquedelsistema.Laopcinlinearpuedeevitareste
problema.

Comonormadeprecaucindejesiempreunaentradaconelltimokernel
defuncionamientocomprobadoparapoderarrancardesdelencasode
queelnuevokernelgeneradofalle.

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

Siustednopuedearrancarporqueolvidejecutarlilodespusdealgn
cambio, deber arrancar desde un disquete y recuperar el arranque.
Vamos a suponer que su sistema usaba la particin raz montada en
/dev/hda1.(Esunasuposicinnadams).Enesecasoysidisponedeun
disquete de arranque que ya est preparado para arrancar usando la
particin raz /dev/hda1 el problema ser fcil de solucionar. Bastar
ejecutar'lilo'unavezquearranquedesdedisquete.Undisqueteaspuede
obtenersedevariasformas.Unadeellasessiustedcompilelkernel
usando'makezimage'.(Veremosenposteriorescaptuloslacompilacin
del kernel). Tambin podemos usar un disquete o CD de rescate que
arranqueconunaparticinrazcualquierasiemprequeelkernelutilizado
seacompatibleconnuestrosistema.Encualquiercasosepuedesiempre
intentar.Unavezarrancadocondisquetederescatecreamosundirectorio
paramontarenlnuestraparticinraz.

mkdir /hda1
cd /hda1
mount -t ext2 /dev/hda1 /hda1
chroot /hda1
lilo
shutdown -r now

Laclavedeesteprocedimientoesten'chroot'.Setratadeuncomando
queobtieneunasesinbasholanzauncomandocambiandoeldirectorio
razactualporunodiferente.Evidentementeelnuevodirectoriodebede
tener la estructura adecuada y los ficheros adecuados a cualquier
directoriorazquesepreciedeserlo.Eldirectoriorazeslacajadonde
ocurrecualquiercosaenelsistema.Hacer'chroot'equivaleacambiarde
caja.FueradelanuevacajaescomosinadaexistieraparanuestroSO.
Nosotroslousamosparaquelilofuncionedesdelaparticinrazquenos
interesa.

Tambinpuedeobtenerundisquetedearranquequeuselaparticinraz/
dev/hda1. Introduzca un disquete virgen formateado en la disquetera.
Tendrquesaberdondeseencuentrasukernel.Puedemirarelfichero

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

/etc/lilo.confpararecordarlo.Esteeselficherodeconfiguracindelilo.
Vamosasuponerqueelkernelfuera/hda1/boot/kernel.

mkdir /hda1
cd /hda1
mount -t ext2 /dev/hda1 /hda1
dd if=/hda1/boot/kernel of=/dev/fd0
rdev /dev/fd0 /dev/hda1
shutdown -r now

Conellocrearundisquetedearranqueparasuparticinraz.Despusde
arrancardesdeelnuevodisquete,ejecuteliloparapoderarrancardesdeel
discoduroenocasionesposteriores.

Sonmuchaslascosasquesepuedendecirsobreliloyalgunosdetalles
tcnicossoncomplicadosdeexplicar.Generalmenteesfcilconfigurar
una arranque bsicoquefuncioneyencasodefallodaremos algunas
indicacionessobrelasposiblescausas.

Mensajesdeprogresodelcargadordearranquelilo.

AmedidaqueLilovaprogresandovamostrandolasletras'L','I','L','O'.y
sisedetieneenalgnpuntoserporquehasurgidoalgnproblemaquele
impideprogresar.

1. Sinoapareceningunaletraduranteenarranquesignificaqueel
cargador Lilo no pudo encontrarse. Quizs olvid ejecutar el
comandolilo.
2. SisoloapareceLprobablementeexistaalgnproblemahardware.
3. Sisoloaparece LI elkernelnofuelocalizado.Aadalaopcin
linearparaversisesolucionaelproblema.Estaopcingenera
direccioneslinealesdesectoresenlugardedireccionesutilizando
cilindros, cabezas y sectores. Esto permite direccionar sin
necesidaddeusarlageometradeldisco.Porellotambinpuede
servirparasolucionarellmitedelos1024cilindrosimpuestopor
algunasBIOS.Estaopcinnodebeusarseconlaopcinlba32son

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

mutuamenteexcluyentes.Laopcinlineartambinpuedeentrar
enconflictoconlaopcincompact.
4. SisoloapareceLILsignificaquenosepuedenleerlosdatosdel
ficherodemapaypuedetratarsedealgnproblemahardware.
5. SiapareceLILOsignificaquelilofinalizcorrectamente.

Loadlin

SetratadeuncargadordelinuxqueactadesdeunsistemaDOS.Loadlin
hadeejecutarsedesdeunsistemaDOSquepodrserundisquetecon
autoarranqueoundiscoduro.

Estecargadorpuedevenirbienenalgunascircunstancias.Hayquetener
encuentaquelosPCssuelenestarpensadosparaarrancarsistemasDOSy
algunavezpuedenincluiruncomponentehardwarequedependadeun
controlador DOS para configurar unos pocos registros en el hardware
antesdearrancarelSO.

Elprocesodearranqueconloadlinsedivideendosetapas.Unaesel
arranquedelpropiosistemaDOSyposteriormenteseejecutaloadlin.exe
comounprogramaDOSnormalycorrientepasandocomoargumentosel
kernelyalgunascosasms.

Compararemos la secuencia de arranque con lilo o con loadlin en el


siguientegrfico:

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

Vamosacomentarunarecetaparaconstruirundisquetedearranquecon
loadlin.

FormateeundisquetedesdeDOSincluyendolosficherosdelsistemade
arranque.Esdecir'formata:/s'

DesdeLinuxcopieaesedisqueteelkernel.Porejemplo

$ mcopy /boot/kern24 a:

Editeunficheroautoexec.batparaquecontengalosiguiente:

$ loadlin kern24 root=/dev/hda3 ro vga=3

Copieloaldisquete.'mcopyautoexec.bata:'Tambincopieloadlin.exe,
'mcopyloadlin.exea:'Esunficheroquepuedevenirenalgnpaquetede
su distribucin oenelCDdeinstalacin. Antesderetirar eldisquete
asegurequesegrabarontodosesosficherosusando'sync;sync'

Grub

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

GRUB Es un cargador que ofrece algunas ventajas sobre LILO pero


tambin algunas desventajas. GRUB no es sensible a cosas como la
sobreescrituradeunkernelantiguoporotronuevoconelmismonombre
ninecesitavolveraejecutarelcargadorsinohaycambiosanivelde
ficherosenloselementosqueparticiparanenelarranque.Estossuelen
encontrarse localizados generalmente en /boot/grub/. La linea de
comandos del cargador es ms compleja en GRUB. El fichero de
configuracindeGRUBes/etc/grub.conf

Unejemplodegrub.confparaunaconfiguracinbsicasera:

root (hd0,2)
install /boot/grub/stage1 (hd0,2) /boot/grub/stage2
0x8000 (hd0,2)
/boot/grub/menu.1st
quit
############
(fd0) /dev/fd0
(hd0) /dev/hda
############
timeout=7
splashscreen = (hd0,1)/boot/messages.col24
default=0

title=Linux
root=(hd0,2)
kernel=/boot/vmlinuz.2.4 noapic nosmp
root=/dev/hda3

title=Windows
chainloader=(hd0,0)+1

El timeout viene expresado en segundos (en Lilo eran decimas de


segundos).Eldefaultsealaconunnmerolaopcindearranquepor
defecto.Enestecasoporvaler0tomarlaprimeraqueestitle=Linux
dondetitlehacelasvecesdelabelenLilo.root=(hd0,2)indicaquela
particinrazseencuentraenelprimerdiscoduro,terceraparticin.La
lineadelkernelenGRUPmezclacosasqueirancomoappend=ycosas
queenLiloaparecanenotraslneasdelilo.conf

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

Montarydesmontarparticiones(mount)

Lautilidadparamontarydesmontarparticionesesmount(8).

Graciasamountlosdistintosdispositivosoparticionessepuedencolgar
enalgnpuntodelgranarboldelsistemadeficherosraz.

Elficherodeconfiguracinqueutilizamountparasabercomodonde,y
cuando debe montar las particiones es fstab(5) que se localiza en
/etc/fstab.

Cada linea de fstab representa un registro donde se describe un


determinadosistemadeficherosdelsistema.

Loscamposencadalneaestnseparadosportabsoespacios.Elordende
losregistrosenfstabesimportanteporquefsck(8),mount(8),yumount(8)
recorren fstab secuencialmente a medida que trabajan. Los distintos
camposdefstabson:

1. fs_spec)Describeeldispositivoasermontado.
2. fs_file)Describeelpuntodemontajeparaelsistemadeficheros.
Para particiones de intercambio (swap), este campo debe decir
``none''
3. fs_vfstype) Describeeltipodelsistemadeficheros.(minix,ext,
ext2,msdos,

vfat,autofs,iso9660,nfs,swap,...etc)

4. fs_mntops) Opciones de montaje. Es una lista de opciones


separadasporcomas.Estaspuedenser:
o defaults Resumetodaslasopciones(rw,suid,dev,exec,
auto,nouser,atimeyasync).
o rw,ro Respectivamente montaenescritura lectura oen
sololectura

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

o 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.

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. # The default runlevel.
9. id:2:initdefault:

EnestenivelenDebiansearrancaelentornogrficodeventanas
mientrasqueenotrossistemasestoocurreenelnivel5.Los
nivelesdeejecucin(runlevel)puedenvariardeunsistemaaotro
peroentrminosgeneralesestnorganizadosdelaforma
siguiente:

o 0Detieneelsistema.
o 1Entraenmodomodousuario.
o 25Entraenunavariedaddemodosmultiusuario.
o 6Provocaelrearranquedelsistema.
10. Despusdeejecutarlosscriptsdelrunlevelpredeterminado,'init'
procedeaarrancarmediante'getty(8)'unaseriedeterminaleso
seudoterminalesconectadosalsistema.

'getty'presentasobreelterminalunintroductor'login:'quetomar
elnombredeusuario.Unavezintroducidoelnombredeusuario
esteprocesosetransformaenelprocesologinpormediodeuna
llamadaexec.(Estoyaseexplicenlapartedelcursodedicadaa
losprocesos).Elprograma'login(8)'solicitarunapasswordyen
casodequeestaseavlidasetransformarmedianteunnuevo

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

exec en la shell destinada a ese usuario mediante su


correspondienteentradaen'/etc/passwd'.

Cuandolashellmuere,initlodetectacomosielprocesogettyque
arranchubieramuerto.(Enrealidadelpidnovaraalhacerlos
sucesivosexec).Dadoquelosgettysearrancanenmodorespawn,
'init'losrearrancacadavezquemueran.

Explicacindeinittab

Primero consute la pgina man inittab(5). Luego examine su fichero


'/etc/inittab'. Tiene quetener claro quelamodificacin deestefichero
conduce con enorme facilidad a situaciones donde el sistema no ser
capazdevolveraarrancar.

Porelmomentoesmejorqueselimitealeerinittabsinmodificarlo.Las
lneasqueempiezanpor'#'sonsimplescomentarios.Lasdemslneas
constarndecuatrocamposseparadospor':'

1. IdentificadorGeneralmenteelidentificadoradmiteunmximode
doscaracteresquedebersernicoparacadalnea.
2. Niveles de ejecucin Contiene los niveles de ejecucin en los
cuales la accin resulta adecuada. Si no aparece ninguno se
entiendeadecuadaparacualquiernivel.
3. TipodeaccinHayunascuantostiposdeacciones(once,sysinit,
boot, bootwait, wait, off, ondemand, initdefault, powerwait,
powerfail,powerokwait,ctrlaldel,kbrequest)Puedeconsultarla
pginamandeinittab(5)dondevienenexplicados.
4. ProcesoProgramaaejecutar.

Elcomandorunlevel(8)devuelvelosdosltimosnivelesdeejecucin.

Encasodenoexistirunniveldeejecucinprevioalactualserepresentar
conlaletraN.

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

Pruebeapasarmodomonousuarioconelcomandoinitotelinit.

# init 1

Ocon

# telinit 1

Recuerdequeenestemodonadiemsqueessuperusuariopodrusarel
sistemaynopodrusarningnserviciodelsistema.Estosehacepara
reforzarelcontrolderootsobretodoelsistema.

Ensituacionesdelicadaslepermiteasegurardequeensistemanoesta
ocurriendoabsolutamentenadasalvolasordenesque'root'vaejecutando.
Ofreceunabsolutocontroldeoperacinparaeladministracinfrentea
todotipodeproblemasincluidoslosataquesintencionados.

Lamejormaneradesalirdelmodomonousuarioesrearrancarcon

# shutdown -r now

Ocon

# init 6

Ocon

# telinit 6

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

Losscriptsrc

Lainformacinsobrelosscriptsrcosobreinittabpermitecomprenderel
proceso completo del arranque de Linux. Gracias a esta informacin
podr con un poco de suerte diagnosticar una enorme variedad de
problemasysolucionarlos,peroexperimentarporpurojuegoconestas
cosaspuedeocasionarproblemasconunagranfacilidad.

Los scripts rc o el fichero inittab son fciles de interpretar pero su


funcionamientoesbastantecrticoparaelbuenfuncionamientodelresto
delsistema.

Nuncadeberatocarnadasinasegurarsequepuedellegadoelcasodar
marchaatrsydejarlotodocomoestaba.Porejemplosieditaalgunode
estosficherossaquepreviamenteunacopiadeloriginalyguardelaporun
tiempo.

Existeunaopcinparaarrancarelprocesoinitsinqueejecuteningunode
losficherosdescript.

# init -b

Esto est especialmente indicado para ciertos problemas de arranque.


Como veremos luego ficheros deconfiguracin del tipo quesean que
impidan unarranquepuedenserrecuperados montandolaparticin en
modolecturaescritura.

Losscriptsrcsonficherospresentesenlosdirectorios/etc/rc.d#.ddonde
# es el runlevel . Cada script rc suele implementarse como un link
simblicoqueempiezaporSoK(start)o(kill)seguidodedosdgitosy
queapuntaaunficheroconelmismonombreperosinSniKnilosdos
dgitos.

Hagalosiguiente:

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

# cd /etc
# ls -l rc*.d/*cron* init.d/*cron*

Obtendralgoparecidoalosiguiente:

init.d/anacron
init.d/cron
rc0.d/K11cron -> ../init.d/cron
rc1.d/K11cron -> ../init.d/cron
rc2.d/S20anacron -> ../init.d/anacron
rc2.d/S89cron -> ../init.d/cron
rc3.d/S20anacron -> ../init.d/anacron
rc3.d/S89cron -> ../init.d/cron
rc4.d/S20anacron -> ../init.d/anacron
rc4.d/S89cron -> ../init.d/cron
rc5.d/S20anacron -> ../init.d/anacron
rc5.d/S89cron -> ../init.d/cron
rc6.d/K11cron -> ../init.d/cron

Losservicioscronyanacronsonserviciosqueyahemostratadoenun
captulo anterior. Observe que estos servicios de forma similar a la
mayora de los servicios se arrancan y paran desde 'init.d/cron' y
'init.d/anacron' respectivamente.Observequelosenlacessimblicosde
arranqueapuntanalmismoscriptquelosenlacessimblicosdeparada.

Cualquier servicio puede arrancarse o detenerse de forma individual


haciendo: '/etc/init.d/servicio start' o '/etc/init.d/servicio stop'
respectivamente.

Elproceso'init'procesaloscontenidosdelosdirectorios'rc#.d/'parair
arrancandoyparandolosserviciosadecuados.

Comopuedeverseen'/etc/inittab'elencargadodeprocesarlosscripts'rc'
es '/etc/init.d/rc' que se usa pasndole el nivel de ejecucin como
argumento.Elscript'rc'eselqueusalaletrainicialdelenlacesimblico

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

paralanzarelscriptaadiendounargumento'start'o'stop'segnresulte
laletrainicial.

ElordendeejecucindelosdiferentesscriptsdelsistemaenDebianeses
siguiente:

1. Comopuedeverseeninittab(si::sysinit:/etc/init.d/rcS)desde'init'
searranca'/etc/init.d/rcS'.
2. Desde'/etc/init.d/rcS'sonarrancadoslosscriptsqueseajustanal
patrn'/etc/rcS.d/S[09][09]*'
3. Desde '/etc/init.d/rcS' se arranca los scripts en '/etc/rc.boot/*'
usando'runparts/etc/rc.boot'.
4. Desde '/etc/init.d/rcS' se arranca '/sbin/setup.h' (Esto en Debian
Potato,enSlinkera'/root/setup.sh')
5. Comopuedeverseeninittab(5)desde'init'searrancalosscripts
delniveldeejecucinpasadocomoargumentoainitoencasode
ausencia los scripts correspondientes al nivel de ejecucin por
defecto. (En Debian es el 2). Para ello se usa '/etc/init.d/rc'
pasndoleelniveldeejecucincomoargumento.

Como hemos visto hay una serie de scripts destinados a procesar un


conjuntodescriptscontenidosenundirectorio.Estatcnicaseusaen
varioscasos:

Enelcasode'/etc/init.d/rc'seprocesalosscriptsdeldirectorio
correspondienteaeseniveldeejecucinaadiendounargumento
startostopdependiendodequeelnombreempieceporSoporK.
En el caso de '/etc/init.d/rcS' solo se procesan los scripts
encontradosqueempiecenporSaadiendolaopcinstart.
Enelcasode'runparts(8)'soloseprocesalosscriptsdeldirectorio
pasado como argumento sin aadir argumentos al script. Ya
habiamos visto que 'runparts', es utilizado con frecuencia para
procesar las tareas peridicas con 'cron(8)' organizando en
directorios las distintas tareas dependiendodequeseandiarias,
semanales,mensuales,anuales,etc.

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

Personalizandoelprocesodearranque

Nodecimosqueestosscriptsdearranquenosepuedantocarperohacerlo
esarriesgado.Porejemplounscriptquenoterminesuejecucincolocado
en'/etc/rc.boot'detendrelprocesodearranque.

Siintentaaadirunservicioquedebaestarpermanentementeactivolo
mejoresincluirloenelpropioinittabasociadoalaopcinrespawnpara
queen caso demorirelprocesoinit lorearranque. Sinembargosiel
proceso muere nada ms arrancar init lo rearrancara continuamente
creandounproblemaenelsistema.Afortunadamenteinitdetectareso.Si
init detecta que un proceso rearranca ms de 10 veces en 2 minutos
suspenderdurantecincominutoselnuevointentodearranque.Tiempo
quetendrqueaprovecharsolucionarelproblemadealgunaforma.

Por ejemplo. Puede intentar editar directamente '/etc/inittab'. Si no se


ponenerviosodisponede5minutosantesdequeseproduzcanotros2
minutosdelocuradelsistema.

Siedita'/etc/inittab'desdeelpropiosistemaelprocesoinitnotomaren
cuentaloscambiosmientrasnosearranqueomientrasnoseleinformede
ellomediante:

# init q

Siestonoleconvenceonoseleocurrenadamejorpuederearrancar
desdeunsistemadedisqueteparaeliminarlaentradaeninittabmientras
el problema no est solucionado. Ms adelante se explica como
solucionarunproblemadeolvidodepasswordderootybsicamenteen
estecasohabraquehacerlomismoperoenlugardeeditar'/etc/passwd'
habrqueeditar'/etc/inittab'.

Recuerdequelamodificacinde'/etc/inittab'esunaoperacincrticaque
puedeafectaralacapacidaddearranquedesusistema.

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

EnDebiansepuedeaadirunscriptasociadoaunniveldeejecucin
deseado. Paraellosecolocaelscripten/etc/init.d/ yluegoseejecuta
'updaterc.d(8)' con los argumentos adecuados que crear los enlaces
simblicoscorrespondientes.

Porejemplo:

# update-rc.d mi-script defaults 88

CrearalosenlacessimblicosS88miscriptyK88miscriptparatodoslos
runlevels.

# update-rc.d mi-script stop 83 1 2 3 5 6 start 85 2 3 5

CrearaK83miscriptparalosniveles1235y6,yS85miscriptparalos
niveles23y5.

ParaeliminarserviciosinnecesariosenDebianpuedehacerlosiguiente:

1. Creeundirectorioporejempo'/etc/services_off/'
2. Guarde la informacin actua siguiente: 'ls l d rc*/* >
/etc/services_off/lsl.out', y despus mueva los scripts
correspondientesalosserviciosinnecesariosdesde'/etc/init.d/'a'/
etc/services_off/'.(Sepuedenenlugardeesoeliminarlosscripts
perodeestaformapodemosdarmarchaatrsconmsfacilidadsi
fueranecesario).
3. Para cada unos de los servicios eliminados hacer 'updaterc.d
nombre_servicioremove'.Conelloseeliminarnselectivamente
todos los links simblicos que apunten a
'/etc/init.d/nombre_servicio'desdelosdirectorios.

Continuamosconladescripcindelprocesoderranque.Cuandoarranca
elsistemaaparecenunosmensajesquepuedenseralteradoseditando'/etc/

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

motd','/etc/issue',y'/etc/issue.net'Quizslesorprendaverunoscaracteres
extraos pero son secuencias de escape destinadas a la consola. Si le
interesacomprenderlasconsultelapginamandeconsole_codes(4).

Recordemos que existen otros scripts que se ejecutan previamente al


establecimientodeunasesindeintrpretedecomandos.

Elprimeroqueseejecutaenelcasodeinterpretesdecompatiblesconsh(
sh(1),bash(1),ksh(1),ash(1),..)ser'/etc/profile'

En el caso de abrir una sesin con bash desde login se ejecutar


'~/.bash_profile' que a su vez ejecutar '~/.bashrc'. Si la sesin no se
arrancadesdelogin,(Porejemplosiarrancamosunasubshelldesdeun
editor.),soloseejecutar'~/.bashrc'.

HayotrosscriptsqueseejecutanparaarrancarsesionesdeXWindow
mediantexdm(1)ostartx(1).Paraconfigurarelarranquedexwindows
mediante el arraque de una serie de procesos en background que
personalizanelarranqueenmodogrficoseusa'~/.xinitrc'ensudefecto
seusar'/etc/X11/xinit/xinitrc'.

Paraestablecerelservidorseusar'~/.xserverrc'ensudefectoseusar
'/etc/X11/xinit/xserverrc'.Arranquedirectoconshsinusarinit

Existeunaformadearrancarusadaenemergenciasquepuedesalvaren
casodeapuroperodebeusarseconlamximaprecaucin.

Consisteenarrancarusandoenlugardelprocesoinit,hacerloarrancando
directamenteunashell.Esosepuedehacerpasandolealkernellaopcin
'init=/bin/sh'.Estosepuedehacerdesdeliloporejemplo.Deestaformase
podra montar la particin raz en modo lectura/escritura y modificar
nuevamente el fichero daado, cambiar una password olvidada, o
cualquierotracosa.

Silohacemos ashayquetenerencuentaquenoestamos usandoun


mododefuncionamientonormal,yporelloantesderearrancarconviene

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

asegurarse que el sistema de ficheros queda perfectamente escrito sin


operacionesdeentradasalidapendientesenmemoria.Paraellohagalo
siguiente.

# sync
# sync
# shutdown -r now

Por el contrario si apaga de cualquier manera, el dao podra ser


considerableeinclusopodraverseobligadoareinstalarlotodo.

Algunasvecessearrancadeestaformacuandosesospechaqueelfichero
correspondiente al ejecutable 'init' pudiera estar daado impidiendo
totalmente el arranque pero podra ocurrir que arrancanco con 'sh'
tampocologremosnada.Tanto'init'como'sh'usanlibrerascompartidas
comunes y un dao en alguna de estas librera impedir el arranque
usandocualquieradelasversionesnormalestantode'init'comode'sh'.

Unalibreradinmicacompartidaconsisteenunconjuntodefunciones
que pueden cargarse en memoria una sola vez y ser aprovechadas y
compartidasporvariosprocesosfuncionandosimultaneamente.

Porejemplo'libc.so.6','/lib/ldlinux.so.2'sonlibrerascomunesamuchos
programasen Debian2.2.Puedecomprobarloconsultandolas librerias
compartidasusadaspor'init'y'sh'.Paraellohagalosiguiente:

# ldd /bin/sh /sbin/init

Obtendrlosiguiente:

/bin/sh:
libncurses.so.5 => /lib/libncurses.so.5

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

(0x40019000)
libdl.so.2 => /lib/libdl.so.2 (0x40057000)
libc.so.6 => /lib/libc.so.6 (0x4005b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2
(0x40000000)
/sbin/init:
libc.so.6 => /lib/libc.so.6 (0x40019000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2
(0x40000000)

LalibccontienetodasfuncionesdelaconocidsimalibreraestandardeC
yalgunasfuncionalidadesaadidasporGNU.estecursonoestenfocado
alaprogramacin.Dedotasformassinecesitainformacinsobreesta
librerapuedeconsultarlousando:

# info libc

Hayquienmantieneunaversincompiladaestticamentedeinitosh.En
realidad no es necesario. En caso de que el sistema tenga deteriorada
libreras dinmicas lo apropiado es partir de un disco de rescate y
recuperardesdecopiasdeseguridadantiguastodoelsistema.

QueesunCDderescateyparaquesirve

Unsistemapuedesufriralgnaccidenteoataquequeleimpidavolvera
arrancar. La prdida de informacin de un sistema se puede subsanar
mediantecopiasdeseguridadcomolasqueyasecomentaronenlecciones
anteriores.Sisehaperdidoabsolutamentetodoresultaevidentequehabr
querecurriralaltimacopiadeseguridadglobalperounacopiaglobal
resultamuycostosayquizsnosehagacondemasiadafrecuencia.Por
ellogeneralmentesehaceocasionalmenteysecomplementanconcopias
incrementalesposteriores.

Apesardeellosiserecuperaunsistemaapartirdelaltimacopiapuede
haberinformacinnorespaldadaporserdemasiadoreciente.

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

Afortunadamentelaprdidadelacapacidaddearrancarnosignificaque
setratedeundesastrequeobliguearecuperartodoelsistemadesdelas
copiasdeseguridadovolviendoainstalar,etc.

Generalmente se puede recuperar el arranque interviniendo


exclusivamentedonderesideelproblema.

Deestaformalarecuperacinresultarmascompleta,msrpidaypuede
quenossirvaparapreveniruncasosimilarenelfuturo.

Parapoderarrancardeformaindependienteypoderiniciarlareparacin
delsistema,esparaloqueseusanlosdisquetesoCD'sderescate.

Evidentemente en caso del CD es importante que nuestro sistema sea


capaz de arrancar desde CD. Para ello las opciones de arranque
correspondientesdebendeestarhabilitadasenlaCMOS.

Si nuestro sistemanopuedearrancarenmodoalgunodesdeCDROM
habrqueconformarseconelusodeundisquetederescateperoenun
disquetederescatenocabendemasiadasutilidadesdeayuda.

Puede darse el caso que unsistema quearranca necesite serreparado


desdeunsistemaderescate.Porejemplosielsistemadeficherosest
deterioradoynopodemosusardemodofiablelasutilidadesdelsistema
paraautorrepararseusaremoselCDderescate.

Muchas distribuciones permiten que alguno de los CDs de instalacin


puedaserusadoparaarrancarenmodorescate.Unavezqueunsistema
derescatehaarrancadotenemos unpequeosistemaLinuxarrancado.
Unadelasformasenlasqueundiscoderescatepuedearrancaresde
formatotalmenteindependientesinnecesidaddeusarningndiscoduro
parafuncionar.

Generalmente se recurre a usar ramdisk para montar la particin raz


aunquegeneralmentemenosadecuadotambinpodrausarseparaesoun
disquete.

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

EnDebiantambinpodemosintroducirelCDdeinstalacinyprogresar
hastaseleccionareltecladoyelidiomaparapodertrabajarcmodamente.
Despusdeestosepuedeabandonarlainstalacinycontinuarabriendo
unasesinnuevaenunseudoterminal.Porejemploycontinuarcomosi
estuviramosenmodorescateotambinsepuedearrancardesdeesteCD
usando distintas modalidades. Por ejemplo indicando la particin raz.
Desde un sistema Debian tambin se puede montar el cdrom de
instalacin y crear con ello un par de disquetes de rescate. Para ello
montamoselcdromen/cdromyponemosundisqueteformateadoenla
disqueterayluegohacemos:

# dd if=/cdrom/install/rescue.bin of=/dev/fd0 bs=1k


count=1440

Estocreaelrescuedisk,conelquesearrancaelequipo.

# dd if=/cdrom/install/root.bin of=/dev/fd0 bs=1k


count=1440

Conestootrosecreaelrootdiskquepedirmientrasarranque.

Siusamoslaparticinrazendiscodurosoloservirparacasosenlos
queelproblemasoloafecteaelementosmuyconcretosdelarranquetales
como kernel, cargador de arranque, etc. Pero no para casos donde la
propiaparticinrazestcomprometidaporalgnproblema.

En cualquier caso un disco de rescate deber incluir un conjunto de


herramientasadecuadasparasolucionartodotipodeemergencias.

EnDebiancomoyahemosdichoelprimerCDesmultipropsito.Por
defectoempezaraelprocesodeinstalacinperoleyendoatentamenteen
las primeras pantallas de arranque con lilo descubrir las distintas
posibilidadesparaarrancar.

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

Sisevaausarunaparticinrazindependienteporejemploenramdiskse
podrusarunCDderescatedeunadistribucincualquierapararescatar
unsistemadeotradistribucindistinta.Unadministradordesistemascon
varios sistemas LinuxasucargosolonecesitaunCDderescatepara
solucionarunagrancantidaddeemergenciasencualquiersistemaLinux.
AlgunosdeestosCDsespecialmentediseadospararescateseofrecenen
suversinminiaturadeltamaodeunatarjetadecrdito.

Unavezarrancadoelsistemaconvienecomprobarquelosdiscosestn
perfectamentereconocidosporelkerneldelsistemaderescate.Paraello
haga:

# fdisk -l

Obtendr la informacin de los discos presentes en su sistema y sus


diferentes particiones. Esta es una informacin que usted debera
conservarenpapelporsiacasoalgndaseborraporaccidentelatabla
de particiones. La perdida de la tabla de particiones no es un fallo
frecuente pero puede ser muy grave ya que provoca la prdida de
absolutamente toda la informacin salvo que se vuelva a particionar
exactamentetodoigualqueestaba.Elparticionadosehaceconfdisk(8)
queesunadelasutilidadesquenodebefaltarenundiscoderescate.La
listadelasherramientasmsimportantesquedebecontenerunCDde
rescateson:

Unkernelcapazdereconocerunagranvariedaddesistemasde
ficherosydedispositivosdediscos.
Todo tipo de herramientas de diagnstico, exploracin,
manipulacinyreparacindesistemasdeficheros,ydediscos.La
listaseramuylarga.Casitodassonmuyimportantes.
Uneditorsencillodetexto.
Siquedaespacio,otrasmuchasutilidadesdeusofrecuentepueden
venirmuybien.

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

IMPRESCINDIBLE.Compruebequesusistemaderescatecontienelas
utilidadesadecuadaspararecuperarlascopiasdeseguridaddelsistema.
Empaquetadoydesempaquetadodeficheros(afio,cpio,tar)compresory
descompresor(gzip,unzip,bzip2,etc),otroscomo(find,etc)driverspara
losdispositivosdediscoydeunidadderespaldo.

Asegurese haciendo copias pequeas de prueba y recuperandolas


arrancandodesdeelCDodisquetederescate.Tengamuchocuidado.La
recuperacin de un backup es una operacin que exige la mxima
prudencia. Un errorpuedeserfatal. Repaseelcaptulo dedicadoalas
copias de seguridad. Dedique tiempo a estudiar y dominar sus
herramientasdecopiayrespaldo.

Eltiempogastadoendominarestostemasestiempoganado.Lonormal
enpersonasqueadministranellosmismossusequiposyquenodominan
estostemasesquetardeotempranopierdanunmontndedasosemanas
devaliosotrabajo.

LomejoresilustrarelusodelosdisquetesoCDsderescatemediante
medianteunejemploqueestodounclsico.Olvidarlapasswordderoot.
Olvidar la password de root
Nosepreocupe.

Este es un problema relativamente frecuente. Afortunadamente no es


grave.Algoquemuchospreguntanes:Siunolvidodelapasswordde
root puede ser solucionado fcilmente entonces que utilidad tiene la
passwordderoot?

La password noimpedir quealguien seacerque a suordenador ylo


destroceamartillazos,olorobe.Tampocoevitaqueotraspersonascon
accesofsicoasuordenadorpuedancambiarlapassword.Seasumeque
ustednovaapermitiraccederfsicamenteallugardondeseencuentrasu
equipoacualquierpersona.

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

boot: alias_arranque init=/bin/bash

Esto hace que se arranque una sesin shell sin necesidad de poner
password. Es una operacin bastante delicada repase las instrucciones
relativasaArrancarconinit=/bin/bash.Unavezarrancadobastacambiar
lapassword.usaremoselcomandopasswd(1).

# passwd root

Otraformaseraarrancardesdeundiscoderescatequenousenuestra
particinrazparaarrancar.

Debercrearundirectoriotemporalquenosotrosllamaremosmnttmpy
montarenlnuestraparticinrazenmodolecturaescritura.Repaseel
comando'mount(8)'.

Despusdeesoentramosen'/mnttmp/etc/passwd'yeliminamoselcampo
delaclave.Enestefichero'passwd(5)'

cuenta:contrasea:UID:GID:GECOS:directorio_home:intrprete

Bastausaruneditoreneseficheroparacambiarporejemplo:

root:x:0:0:root:/root:/bin/bash por
root::0:0:root:/root:/bin/bash

Por

root::0:0:root:/root:/bin/bash por
root::0:0:root:/root:/bin/bash

Siexisteunfichero'/mnttmp/etc/shadow'debereliminarigualmenteel
segundocampoenesteotrofichero.Muyimportante.Antesderearrancar
desmonteelsistemadeficheroshaciendolosiguiente.

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

# sync
# sync
# umount /mnttmp
# shutdown -r now

Conello laprximavezquesehagalogin:rootnolepedirninguna
password.Nodebeolvidardardealtaunapasswordusandoelcomando
passwd.

Recuperarunsistemadeficherosdaado

Puedeocurrirqueunsistemadeficherosdaadonopuedaserreparadode
formaautomticaduranteelarranque.Enelcasodequeelsistemadetect
lanecesidaddechequeoenalgunadelasparticiones'fsck'laschequeary
en caso necesario las reparar. El ordende los registros en'/etc/fstab'
(vease'fstab(5)'esimportanteporque'fsck(8)','mount(8)',y'umount(8)'
recorrenfstabsecuencialmenteamedidaquetrabajan.Elsextocampo,
(fs_passno),lousaelprogramafsck(8)paradeterminarelordenenelcual
sevanachequearlossistemasdeficheroscuandoelsistemaarranca.El
sistema de ficheros raz debera llevar fs_passno igual a 1, y otros
sistemas de ficheros deberan llevar fs_passno igual o superior a 2.
Sistemas de ficheros en un mismo disco sern chequeados
secuencialmenteysitienenelmismovalorde(fs_passno)elordenserel
orden de los registros en '/etc/fstab', pero sistemas de ficheros en
diferentesdiscosconelmismovalorparafs_passno,sernchequeadosal
mismo tiempo para utilizar el paralelismo disponible en el equipo. Si
fs_passno (sexto campo) no est presente o tiene un valor de 0, fsck
asumirqueesesistemadeficherosnonecesitaserchequeado.

Encasodequelaparticinconelsistemadeficherosraznotermine
satisfactoriamente no se prosigue con el montaje de otros sitemas de
ficherossinoqueelsistemasolicitarlacontraseaderootparaejecutar
fsckmanualmente.

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

Siestoleocurrealgunavezynoesustedunexpertolimiteseachequear
la particin con la opcin y que en lugar de preguntar cosas quizs
incompresiblesparaustedasumircontestacinafirmativapordefecto,ya
que es la contestacin menos comprometida en estos casos. Una vez
finalizado el chequeo deber hacer 'shutdown r now' para rearrancar.
Mientrastantodebercruzarlosdedos.(Generalmentetienexito).

Noesposiblechequearunsistemadeficherossiesteestmontadocon
opciones de lectura/escritura. Si se llegara a forzar tal posibilidad de
alguna manera, la destruccin de todo el sistema de ficheros sera
inevitableperoafortunadamentefscksedacuentadeelloynolointentar
chequearsisedatalcircunstancia.

fscknormalmentenohacenadasilaparticinpareceestarcorrectaperosi
ustedquiereforzarunchequeoapesardetododeberusarlaopcinf.
Enelsupuestoquenoseaunexpertocontineusandolaopciny,Es
decir

# fsck -fy /dev/....

fsck(8)actualmenteestimplementadocomounintermediarioqueasu
vez usar algn fsck especfico para el tipo de sistema de ficheros
detectado sobre esa particin. La nomenclatura para estos comandos
especficos es fsck.tipofs. Por ejemplo fsck.ext2(8) que puede usarse
directamente en lugar de fsck. Debera consultar las pginas man de
ambos comandos si est usando sistema de ficheros linux ext2. El
comando mount(8) usado sin argumentos le puede informar sobre los
tiposdeficherosqueactualmenteestnmontadosensusistema.

Lainformacinclavedeunsistemadeficherossesitaenelsuperbloque.
Estaestructuraestduplicadapormotivosdeseguridad.Sialgunavez
obtieneunerrorindicandoquenosepuedemontarelsistemadeficheros
debidoaqueelsuperbloqueestdaadointentehacerlosiguientesin
olvidarlaopcinS.Tambindebeirseguidadeunchequedetodoel
sistemadeficheros.

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

# mke2fs -S /dev/...
# e2fsck -fy /dev...

Estaoperacinnogarantizalarecuperacindesussistemadeficheros

La informacin del superbloque puede ser obtenida mediante


dumpe2fs(8)perosiustednoconoceenprofundidadlaestructuradesu
sistema de ficheros no le resultar demasiado til. A pesar de ello
encontraralgunacosaquesilepuedeinteresar.Porejemplolepermitir
sabercualeselmximonmerodevecesquesepuedemontarsusistema
deficherosantesdeestimarnecesariounchequeoycuantasveceshasido
montado desde el ltimo chequeo y en que fecha tuvo lugar. Lo que
queremosdeciresquetampocoesnecesarioentenderlotodoparasacarle
algnprovechoaestecomando.

Recuperarundiscodurodaado

Puedeocurrirqueunsistemasevuelvainestableysoliciteconfrecuencia
elchequeodealgunaparticin.Puedequeapesardequeaparentemente
el fsck solucione el problema este reaparezca nuevamente con mucha
frecuencia,oinclusoacadanuevoarranque.

Esto se debe generalmente a un dao en su disco duro. Los motivos


pueden ser varios. Puede ser una avera grave o puede ser que algn
sectorcomoconsecuenciadeuncortedeluzduranteunaescriturafsicaa
discotengadeficienciasdeformatoabajonivelenlossectoresgrabados,
escomosiquedarangrabadosdeformaincompletadebidoalcortede
suministroelctricoenelprecisoinstantedeesaoperacin.

Estetipodedaospuedeafectaracualquierparticinylasituacinnoes
equivalente.Sepuedeverafectadalaparticinraz,algunaotraparticin
dedatosoprogramas,ounaparticindeintercambioswap.

Unaparticindeswapdaadaprovocarcuelguesdelsistemadeforma
msomenosaleatoria.

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

Sialgnprogramaolibreradinmicacompartidaestadaadapuedeque
el sistema no pueda arrancar normalmente y deba arrancar desde un
sistemaderescate.Encualquiercasoenestetipodesituacionespuede
que los elementos destinados a reparar su sistema estn igualmente
daadosyporellolomejoresarrancardesdeundiscoderescateyhacer
unchequeoatodaslasparticionesincluidaslasparticionesdeswap.

Deestaformasecercioraunodelaamplituddeldao.

Puede intentar usar badblocks(8) pero si no funciona adecuadamente


puedequealgnbloquedefectuosoestafectandoalpropiobadblocksoa
algunadelaslibrerasdinmicas.

Usebadblocksdesdealgndiscoderescate.LosprimerosCDsdelas
distribucionessuelenofrecerlaopcindearrancarenmodorescue.

badblocks es independiente deltipodesistema deficheros queusela


particin.Puedeserext2,ext3,reiserfs,linuxswap,umsdos,vfat,etc.

NoesnecesariousarunCDderescatedelamismadistribucin.Vale
cualquiera.Lonicoquesenecesitaespasarbadblocksyluegosepueden
hacer variascosas.Laopcinodebadblocks produceunasalidaque
puedeserusadapore2fsck(8)opormke2fs(8)ambosconlaopcinl.
Estosprogramastambinadmitenlaopcincparahacerquee2fscko
mke2fs usen a su vez badblocks. Realmente es muy sencillo y
convenientesinembargolerecomendamoslosiguiente.

1. Pasebadblocksatodoslossistemasdeficherospresentesenel
disco afectado uno a uno y anote o guarde lo resultados. (Por
ejemploredirigiendosalidaaundiscosano).
2. Pasee2fsckconlaopcincenlasparticionesdaadas.Deesta
formalossectoresdefectuososyanoseusarn
3. Si el problema persiste saque una o dos copias de seguridad.
Quizstengaqueolvidarsedesusutilidadesynecesiterecurrira
lasutilidadesdesudiscoderescateparaeso.
4. Verifiquemuybiensuscopiasdeseguridad.

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

5. formateeprimeroabajonivelusandoalgunautilidaddelaBIOSu
otraproporcionadaporelfabricantedeldiscoduro.
6. Formateeusandomke2fsc.
7. Recuperesuscopiasdeseguridad.
8. Antesdeusarelsistemavuelvaapasarbadblocks.Sielproblema
continuaovuelveaapareceralpocotiempoytieneunmnimode
aprecioasusdatos,considereseriamentetirareldiscoduroala
basura.

Conestoterminamosestedensocaptuloyllenodesugerenciasdeltipo
mireustedtalcosaoconsulteustedtalotra.Paralaasimilacindeeste
captuloseexigemsdeunalecturayunacantidaddetrabajopersonal
curioseandoafondounmontndecosas.Quizsaustedlebasteconocer
superficialmente estas cosas para en caso de apuro poder localizar el
remedioadecuadoperoenesecasoguardeestematerialenmsdeun
ordenador,osaqueunacopiaporimpresora.

Quizscuandomslonecesitenopuedaaccederalprecisamentepor
tenerunserioproblemaensuequipo.

Si,si...yalos,perolosiento.EstecursosoloseeditaenformatoHTML
ynoquedamuyestticoalimprimir.(Actualmenteesten*.doc,*.odty
*.pdf).

No obstante existe la libertad para que aquel que lo desee adapte el


formatosegnsusnecesidades.Entalcasonoestarademscompartirel
frutodesuesfuerzodelamismaformaenqueyoloestoyhaciendo,al
publicarestecurso.

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

CONSEJOSGENERALESPARACOMPILAR
KERNELS

Introduccin

Comodecostumbrenovamosaprofundizarenaspectostericossinoque
vamosarealizarunenfoqueprcticodeestetema.Vamosahablardel
ncleo(kernel)porqueconmuchafrecuenciaresultanecesariorecompilar
elncleoparaadaptarloalasnecesidadesdenuestrohardware.

ParaunapersonaquenicamentepretendeusarLinuxenunounospocos
ordenadoressimplementeconpropsitospersonalespuedequetodoesto
lesueneaalgomuycomplicadoonoaptoparasimplesmortales.

Lasdistribucionesporreglageneralproporcionanunncleoconamplias
capacidadesparaabarcarunagrancantidaddehardwaredisponible.Esto
conduceancleospocooptimizadosporestarsobredimensionados.Para
agravar el problema algunas distribuciones comerciales desaconsejan
recompilarelkernelsinosetienesuficienteexperienciayadviertenque
en caso de recompilar el ncleo, se pierde el derecho a la asistencia
gratuitaenperiododeinstalacin.

Haymuchagentequecreequelarecompilacindelkernelesunatarea
paraexpertos.Unacosaestclaro.Cuandoserecompilaunnuevoncleo
resulta una temeridad no contemplar la posibilidad de arrancar con el
ncleoantiguoporsialgofallaenelnuevo.Enrealidadesmuyfcil
olvidaralgoygenerarunncleoquenoseacapazsiquieradearrancar
peroesonoesunproblemasimantenemoselantiguo.

Locierto esquelacompilacindeunkernelenLinuxesmuchoms
simplequeenotrosSO.Confrecuenciaseconsideralarecompilacinde
unkernelamedidacomounatareaobligadayaqueconellosepuede

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

obtenerunncleomsreducidoypersonalizadoanuestrasnecesidades.
Estoresultaespecialmenteinteresanteenloscasosdeordenadorescon
pocaRAM.

Las primeras versiones del kernel de Linux residan ntegramente y


permanentementeenlaRAMfsicadelordenador.

EnlaactualidadlosncleosdeLinuxsonmodulares.Esdecir,haypartes
delkernelquepuedenresidirendiscoysolosecarganenelmomentoque
resultenecesario.Sellamanmduloscargables ygeneralmentehayun
programallamado'kerneld'encargadodesucargaydescarga.

Lasversionesdelkernel

Haydoslneasdefuentesdelncleo.Lasdeproduccinquesonestables
ylasdedesarrolloquenoloson.Lasdedesarrollosonadecuadasparalos
programadoresquedeseanexperimentarconfuncionalidadesnuevasdel
kernel,oparalosusuariosquecompraronhardwarequenoestsoportado
deunamaneratotalmentesegurayprobadaenelkernel.

La nomenclatura de las versiones del ncleo utiliza tres nmeros


separadosporpuntos.Porejemplosihacemos'cat/proc/version'podemos
obtenerlaversindelkernelqueestamosusandoyquepodraseralgodel
tipo'Linuxversion2.2.17'.

Elprimernmeroennuestrocasoesun'2'yrepresentaelmximo
niveldecambioposible.Deunkernel'1.x.x'auno'2.x.x'hayun
enormesalto.
El segundo nmero debe considerarse de forma totalmente
independientesiesparosiesimpar.Laserieparcorrespondeala
serieestableylaserieimparaladedesarrollo.Porelloala2.2.x
laseguirala2.4.xyala2.3.xlaseguirala2.5.x.Elniveldeeste
cursohacesuponerqueustednodeberasiquieraintentarusarla
serie impar reservada para desarrolladores con ganas de probar
cosas nuevas, para lo cual se suele usar un ordenador
especialmentereservadoparaesoysininformacinvaliosa.Los

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

cambios en este segundo nmero 2.0.x, 2.2.x, 2.4.x realmente


representan un importante cambio en el SO y por ello no se
aseguralacompatibilidaddetodoslosprogramasconlaversin
anterior.Esdecirlosprogramasdesarrolladospara2.4.xpueden
nofuncionarparalaversin2.2.xyloqueespeorlosprogramas
desarrollados para 2.2.x pueden dejar de funcionar para las
versiones 2.4.x. Lo cual significa que debe acompaarse de
numerosasactualizacionesdelsoftware.Lasdistribucionessuelen
facilitarestoscambioscuandosecambiaaunaversinsuperiorde
esadistribucin.
Eltercernmerorepresentageneralmenteunaversinmejoradade
la versin anterior manteniendo total compatibilidad. Suele
corregir fallos detectados y aadir algo de soporte para nuevo
hardwaremanteniendolacompatibilidad.

Quizsalgodeloqueacabamosdedecirseatotalmenteexactoperosi
que le permite entender bastante bien todo lo que significa esta
nomenclatura.

Cuandoconvienesubirlaversindeunkernel?

En un servidor dando servicio en Internet puede resultar necesario


actualizarloregularmenteparacorregirlosproblemasdeseguridadque
aparezcan, pero nosotros estamos tratando temas bsicos de
administracin para sistemas de uso personal ya sea profesional o
domstico. Por lo tanto si su sistema operativo est funcionando
correctamenteysuhardwareestperfectamentesoportadonohaymotivo
paraactualizarlo.Laideaesquesialgofuncionanohayquearreglarlo.

Otracosaesrecompilarlamismaversindelkernelsimplementepara
cambiaralgunascosasaefectodeoptimizarlo.Detodasformassitiene
ustednoticiadequeciertoproblemaocarenciasesolucionausandouna
versin superior del kernel recuerde que mantener los dos primeros
nmerosdelaversindelkernelesmuchomssencilloquepasarauna

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

seriesuperiorenlaqueelsegundonmeroessuperioryrecuerdeusar
siempreversionesparesestables.

Cuandoconvieneusarmdulos

Alahoradeconfigurarelkerneltendrqueirleyendodetenidamenteel
significado decadaopcinyverqueparaalgunas opciones resultar
posiblenicamenteincluirlasonoincluirlasdeformaesttica.Esdecir
solopodrnestarenelkerneldeformapermanenteonoestar.Porel
contrario otras opciones admiten una tercera posibilidad que es su
inclusincomomduloyaquvienelapreguntainteresante.Cualesla
mejor formadeincluirlo ?Larespuestaesquetodoloquepuedaser
puestocomomduloestarmejorcomomduloanoserqueincluirlode
formapermanenteresulteimprescindibleparaarrancaroquesuusovaya
asercasicontinuo.Tengaencuentaquesisukernelesporejemploun
2.2.17losmdulosserncargadosdesde'/lib/modules/2.2.17/'peropara
esolaparticinrazdebedeestarmontadaysiustedtienesuparticin
raz en un disco ide necesitar que las opciones correspondientes a
BLK_DEV_IDE,BLK_DEV_IDEDISKdebendeestarenmodoesttico
(permanente)porquesiestncomomduloscargableselsistemajams
podra arrancar desde un disco ide. Hay otras opciones que tambin
pueden ser necesarias en modo esttico EXT2_FS, BINFMT_ELF,
VT_CONSOLE,PROC_FS,etc

Porelcontrarioestaclaroquelaunidaddecdrom,laimpresora,sistemas
de ficheros que se usen de forma ocasional, etc. pueden y deben ser
configuradoscomomdulos.Sitienedudasdeberleerparaquesirven
intentandodeducirsisonnecesariosparaarrancarono.EXT2_FSespara
sistemadeficherosLinuxylgicamenteesimprescindible.PROC_FSes
un sistema deficheros que se monta en /proc yque es usado porun
montn de programas de forma casi continua. BINFMT_ELF permite
ejecutar la inmensa mayora de los binarios de Linux y por ello es
imprescindible,etc.Sinoescapazdellegaraunaconclusinsobresies
imprescindible,convienequelopongacomoestticolaprimeravezque
lointente,ysitodovabienpuedeenunfuturoprobaraponerlocomo

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

mduloperosiendoconscientedequequizsnoarranque.Todosestos
cambiosdebenhacerseteniendomuyclarocomovolveralasituacin
anteriorusandoelkernelantiguo.

Primeraprueba

Suponiendo que usted est usando arranque desde disco duro con el
cargadorLILOleproponemospracticarlosiguiente:

1. Repaselasleccionesanterioresquetratansobreelarranque.
2. Localicesukernelactualmirando/etc/lilo.conf.
3. Saqueunacopiadesukernelconotronombredistinto.
4. Editesu/etc/lilo.confaadiendounaentradaparausarlanueva
copiadelkernel.
5. !!Importante!!.Ejecuteelcomando'lilo'.
6. Rearranqueusandoalternativamenteunacopiadelkerneluotra.

En realidad estar usando el mismo kernel para arrancar pero de esta


formayapuedecomprobarquepuedearrancarasueleccinusandodos
ficheros de kernel que notendran porque haber sidoiguales. Cuando
obtengaunnuevokerneldebedeasegurarsequeencasodequeesteno
arranquepodrusarelantiguo.

Encualquiercasonolerecomendamoscompilarelncleosinhaberledo
detenidamenteelcaptulocompleto.

Instalacinapartirdelasfuentes

1. Loprimeroquetendrquehaceresdescargarlo.Parabajarlos
fuentes del kernel existen muchos sitios enInternet parapoder
hacerlo. Por ejemplo ftp://ftp.us.kernel.org. Puede consultar en
http://mirrors.kernel.org para localizar otros lugares adecuados.
Vamosasuponerquedeseamosinstalarunkernel2.4.10.Unavez
descargado tendremos un fichero empaquetado y comprimido.

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

Probablemente algo similar a linux2.4.10.tar.gz o


linux2.4.10.tar.bz2.
2. Creeundirectorio2.4.10(mkdir2.4.10)
3. Conviene engancharlo a un link simblico /usr/src/linux.
Compruebesien/usr/srcexisteundirectorioounlinksimblico
'linux'.
1. Sinoexisteundirectorioounlinksimblico'linux'.
1. Cree un link simblico 'linux' mediante: 'ln s
2.4.10linux'
2. Siexistaundirectorio'linux'.
1. Renombrarlo con el nombre de la versin
correspondiente.Porejemplo2.4.2mediante:'mv
linux2.4.2'
2. Cree un link simblico 'linux' mediante: 'ln s
2.4.10linux'
3. Siexistaunlinksimblico'linux'.
1. Borreellinksimblicomediante:'rmlinux'.
2. Cree un link simblico 'linux' mediante: 'ln s
2.4.10linux'
4. Despeshayquedescompactar.
1. Paralinux2.4.10.tar.gzusar'tarxzvflinux2.4.10.tar.gz'
2. Paralinux2.4.10.tar.bz2usar'bzcatlinux2.4.10.tar.bz2|
tarxv'

Estoexpandeelficherocomprimidovolcandosucontenidoenun
directoriolinuxperocomonosotroslohemospreparadolometer
en2.4.10graciasallinksimblico,sinafectaralkernelanterior.

5. Situeseahoradentrodeldirectoriolinux>2.4.10.Comprobar
queexisteunMakefile.Esteficheroeselquedeterminalaforma
ysecuenciaenquesecompilarelkernelascomootrasacciones
depreparacinyconfiguracin.
6. Laprimeravezquesecompilaunnuevokernelconvienehacer:
'makemrproper'ynosernecesariovolverloahacercadavezque
serecompileaunqueseaconunaconfiguracindistinta.Tengaen

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

cuenta que 'make mrproper' eliminar el fichero que guarda la


configuracin de la ltima compilacin del kernel.
'/usr/src/linux/.config' y generar un '.config' con valores por
defectoloscualespretendenresultaradecuadosparalamayorade
loscasos.
7. Paraconfigurarelkerneldesdeconsolaelmtodomscmodoes
usar 'make menuconfig'. Para X Window se puede usar 'make
xconfig' ms amistoso pero requiere tener bien configurado el
entornogrfico.Laconfiguracindelkernelesunalabordelicada
quetrataremosenunaseccinposterior.
8. Para compilar el kernel habr que ejecutar una serie de pasos
secuencialmente.'makedep;makeclean;makebzimage'Esto
dejar un kernel en el fichero
'/usr/src/linux/arch/i386/boot/bzimage'Sitienedudasporqueleha
parecidoveralgnerror,compruebelafechadecreaciondeeste
ficheroparaasegurarsedequeeselqueacabadecrear.Parausar
estekernelhabrqueaadirloalficherodeconfiguracindeLILO
odelcargadorqueestusando.Lasimplesustitucindelkernel
antiguonolepermitiraarrancarconelkernelantiguosialgofalla.
Tambin se puede generar directamente el kernel de arranque
sobreundisquetedesdeelcualelsistemasercapazdearrancar.
Para eso en lugar de 'make bzimage' use 'make bzdisk'. Otra
alternativamsquenovamosaexplicaresusarbzlilo.Esms
fcil equivocarse y no poder arrancar o sobreescribir el kernel
antiguonopudiendovolverausarlo.EnDebiansepuedeconstruir
un disquete de arranque mediante el comando 'mkboot' que
necesitacomoparmetrolarutaalkernel.
9. Si la compilacin fall leer el README para saber si el
compiladoreseladecuadoparacompilaresencleo.ErrorSignal
11Lacompilacindelkernelesunprocesomuyexigenteyresulta
una verdadera prueba de fuego para la gestin de la memoria.
Algunasvecesunamemoriaaparentementesana,fallayprovoca
unerror'signal11'durantelacompilacindelncleo.Estopuede
ocurrirporejemplosiloschipsusadosparalamemoriaRAMno

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

tienenexactamentelamismavelocidaddeaccesooporalgunos
otrosproblemasensuhardware.
10. Salvoqueelkernelfueracompiladoenmodoesttico,quegenera
un kernel enorme poco eficiente y solo se usa para casos
especiales,lomshabitualesquetengaquegenerarlosmdulosy
quetengaqueinstalarlos.Siestrecompilandolamismaversin
desukernelperoconopcionesdistintasestarmodificandocosas
que anteriormente seusabanconelkernel antiguo(elqueest
actualmente funcionando) y por lo tanto dar marcha atrs para
dejarlo todo como estaba puede serms complicado. Si porel
contrario est compilando una versin distinta de la actual los
mdulosseinstalarnenunlugardiferente.Paralacompilacine
instalacindelosmduloshagalosiguiente:(makemodules&&
makemodules_install).Porlotantoleaconsejamosusarunkernel
diferente al que ya usa para mantener una versin antigua sin
problemas.
11. Hay varias formas de arrancar con un determinado kernel. Si
arrancaporejemplodesdeundisqueteMSDOSconloadlin.exe
bastar duplicar el disquete y sustituir el kernel. Si us bzlilo
bastargenerarundisquetenuevo.Enamboscasosconserveel
antiguo disquete de arranque durante algn tiempo. Etiquete
correctamentelosdisquetes.Recuerdequecon'rdev(8)'sepuede
retocarlaimagendeunkernelyaseaendisqueteoendiscoduro
porejemploparaestablecereltamaodelaramolaparticinraiz,
oelmodovideodeconsola.

Para arrancar desde disco duro tambin hay varias formas.


Dependiendodelcargadorcomoyahemosexplicadotendrque
copiarelnuevokernelallugaradecuadoparaqueelcargadorlo
use.ComentaremosnicamenteelcasodeusarelcargadorLILO
queeselmsutilizado.

1. Copie el kernel '/usr/src/linux/arch/i386/boot/bzimage' a


'/boot/bzimage2.4.10'.

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

2. Copieelnuevofichero'/usr/src/linux/System.map'creado
durantelacompilacina'/boot/System.map2.4.10'
3. EsimportantequesepautilizarLILOqueseexplicenun
captuloanterior.LaconfiguracindeLILOseguardaen/
etc/lilo.conf.Partiremosdeunejemplo:

boot = /dev/hda
delay = 40
vga = normal
root = /dev/hda1
read-only
image = /boot/bzimage.2.4.2
label = linux.2.4.2
other = /dev/hda3
label = dos
table = /dev/hda

4. Tenemos elkernel antiguoen'/boot/bzimage.2.4.2',para


aadir una nueva entrada para '/boot/bzimage2.4.10'
haramoslossiguiente:

boot = /dev/hda
delay = 40
vga = normal
root = /dev/hda1
read-only
image = /boot/bzimage.2.4.2
label = linux.2.4.2
image = /boot/bzimage.2.4.10
label = linux.2.4.10
other = /dev/hda3
label = dos
table = /dev/hda

5. Lgicamente los nombres (label) pueden ser diferentes.


Solo deben ser distintos entre ellos y que sirvan para
recordarquekerneles.Esmuyimportanteunavezeditado

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

y salvado '/etc/lilo.conf' no olvidarse de ejecutar el


comando'lilo'yaquedeotraformaelsistemanoarrancar
laprximavez.
12. Laprimeravezquearranqueconunnuevokernelconvieneque
ejecuteelcomando'depmoda'.Estochequealasdependenciasde
losmdulosusandoelfichero'etc/modules'.Esteesquemaresulta
sencilloyeselqueseutilizaenDebianperootrasdistribuciones
usanunesquemadiferenteparapoderarrancardiferenteskernels
con diferentes conjuntos de mdulos. Por ejemplo en RedHat
existeunarchivo'/etc/rc.d/modules'quesirveparadeterminarla
ubicacin de los diferentes conjuntos de mdulos. Vease
depmod(8)ymodules(5).Paralacargaydescargamanualdelos
diferentesmdulosconsultemodprobe(8),insmod(8),rmmod(8),
ylsmod(8).Ningunodeellosefectuacambiospermanentesensu
sistema. Para determinar cuales son los mdulos que deben
cargarsedeformaautomticaexistendistintasherramientaspara
las distintas distribuciones. Concretamente para Debian existe
'modconf'queesunaherramientadiseadaabasedemensyes
muy fcilyagradabledeusar.Permitedeterminarlosmdulos
queserncargadosdeformaautomtica.

Documentacin

Ladocumentacinespecficadesuncleoseencuentraeneldirectorio
'/usr/src/linux/Documentation/' Si tiene dudas sobre el soporte de
determinadoHardwareosuconfiguracinenelkernelesenestelugar
dondetienequebuscar.Usegrepparabuscar.

/usr/src/linux/Documentation/Changeslepermitirsaberlosrequisitosdel
nuevokernel.Contieneunlistadoconlasversionesmnimasnecesarias
dedeterminadosprogramascompatiblesconesekernel.Silaversindel
kernelsolodifiereenelltimonmerodeversinlacompatibilidadcon
kernelsanterioresdeesamismaserieestgarantizada.

Configuracin

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

Esrecomendablesalvarel'.config' conunnombredistintoparaevitar
perderloalhacer'makemrproper'oalhacer'makemenuconfig'etc.De
esaformasigeneramosunnuevokernelconmuchasopcionesdistintasy
noconseguimosquefuncionenisabemosqueopcionessonlasqueestn
malelegidaspodremosvolveralaconfiguracininicialyapartirdeella
irgenerandonuevoskernelvariandocadavezpocascosasparadetectar
cualeslaopcinquedaproblemas.Convieneusarunnombrelargoy
descriptivo como por ejemplo '.config.original.distribucion' o
'.config.sinsoporte.sonido',etc.yguardarloporuntiempo.

Sinolohamiradonuncamiresu'.config'mediante'less.config'. Podr
veralgodeltipo:

....
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
# CONFIG_SYSCTL is not set
CONFIG_BINFMT_AOUT=m
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
....

Esdecirqueelresultadodeunaconfiguracineslacreacindeunfichero
conunalistadeopcionesysusvalores.Lasopcionesquenoseincuiran
aparecencomentadasconun'#'aprincipiodelnea.

Evidentemente las opciones para configurar un kernel son las mismas


independientemente del procedimiento make lo_que_sea_config
empleado.

Vamosasuponerqueconfiguramosdesdeconsoladetexto.Lasopciones
puedenaparecerendistintoestado:

'[*]' Opcinestticaseleccionada.
'[]' Opcinestticanoseleccionada.
'<*>' Opcincargableseleccionadaenmodoesttico.

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

'<M>' Opcincargableseleccionadacomomdulocargable.
'<>' Opcincargablenoseleccionada.

Paraalterarelestadodelasdiferentesopcionesseusanlateclas'N','M',
'Y',ylabarradeespacio.Estaltimapermiteirvariandolasopcionespor
las diferentes posibilidades. Las otras determinan las siguientes
transicionesdeestados.

'[*]' (N)> '[]'


'[]' (Y)> '[*]'
'<*>' (N)> '<>'
'<>' (Y)> '<*>'
'<*>' (M)> '<M>'
'<>' (M)> '<M>'
'<M>' (N)> '<>'
'<M>' (Y)> '<*>'

Usando 'make menuconfig' desde /usr/src/linux. Aparecer el siguiente


men:

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

Puedeusarlasteclasdeflechasverticalespararecorrerlasopcionesdel
men.Laspocionesquedisponendelaindicacin'>'sonaquellasque
acceden aun submen.Seleccione laprimerayaparecer el siguiente
submen:

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

Puedeverqueapareceunasolaopcin.Siestseleccionada'[*]'conviene
generalmentedeseleccionarla,'[]'.Paraellopulselatecla'N'.Conelloel
presentemenocultartodaslasopcionesconsideradasexperimentales.
Dependiendodelhardwarepuedeverseobligadoausarestaopcin.Lo
lgico es que la documentacin del fabricante mencione tal necesidad
pero algunos fabricantes de hardware no ofrecen mucha informacin
sobreelusodesusproductosenLinux.Generalmenteestainformacinse
obtienebuscandoenlaweb.

Sinecesitaincluirlaopcindeberusarlatecla'Y'.Enestecasoesta
opcinnoestdisponibleparaserincluidacomomdulo.Sifueraasen
lugarde'[*]'o'[]'figurara'<*>',''o'<>'paraindicarrespectivamente
opcinincluidaestticamenteenelkernel,(seseleccionacon'Y')opcin
seleccionadacomomdulocargable,(seseleccionacon'M')uopcinno
seleccionada. (se deseleciona con 'N') en este caso no es aplicable el
concepto de mdulo a esta opcin ya que solo estamos eligiendo una
formadefuncionamientodemenuconfigparaquemuestremsomenos
opcionescomodisponibles.Lasprimerasvecesqueseusamenuconfig
todo es muy nuevo y estamos obligados a leer gran cantidad de

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

informacin en ingls generalmente. Para acceder a la informacin


relativaaunaopcinbastasituarseenesaopcinypulsarlatecla'?',o
hacerclickenelbotn'Help'.

Sinoentendemosnadadeloqueponeynotenemosniideadeloquenos
convienehacerlomejoresvolveraleerlaltimapartedeesaexplicacin
donde se explica cual es la opcin ms recomendable en caso de no
tenerloclaro.

Vuelvaalmenprincipalusandolatecla'ESC'opulsandoelbotn'Exit'.
Seleccioneacontinuacinlasegundaopcin:

Este men muestra varias opciones para distintas familias de


procesadores.Siustedseleccionaunaopcinparaunprocesadorinferior
alquerealmente tieneseguramenteelkernelfuncionaraunquepuede
quenolohagaaprovechadotodaslascapacidadesdesuprocesador.En
cambiosiseleccionaunaopcincorrespondienteaunprocesadorsuperior
alsuyoelkernelnofuncionar.Suponiendoqueeligieralaopcinrelativa
alprocesadorPentiumaparecerunnuevomen:

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

Seleccionelaopcinadecuadaypulse<Enter>.Unavezseleccionadala
opcinretrocedahastaelmenprincipal.

Unavezenelmenprincipal,seleccioneacontinuacinlaterceraopcin:

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

Recomendamosqueelijalasopcionesquemostramosenlaimagencomo
seleccionadas '[*]'. En cualquier caso ya sabe que puede acceder a la
ayudadelasdiferentesopciones.Unavezrealizadalaseleccinretroceda
almenprincipalmedianteelbotn'exit'.

Sipulsalatecla<ESC>desdeelmenprincipalaparecerunapantalla
que preguntar si quiere guardar la configuracin actual. Si contesta
afirmativamente la configuracin actual se guardar en '.config'
perdindoselaconfiguracinanterior.

Elnmerodeopcionesaconfigurarsonmuchasynopodemosdetallar
todoelprocesoperoyatieneunaidea.Recuerdequemuchasopcionesdel
ncleodependiendodesusistemasernobligatoriasparaqueelkernel
puedafuncionar.

Amododeguaseresumirnunaspocasindicacionescrticasrespectoa
lacapacidaddearranquedeunkernelquepermitatrabajarconel:

Procesortypeandfeatures(ProcesorFamily)

Comoyahemosdichosuordenadornofuncionarsieligeunaopcin
correspondienteaunprocesadorsuperioroincompatible.

Generalconfiguration
o PCIsuport

ObligatoriaensistemasconPCI

o Sysctlsuport

Activela ya que solo interesa desactivarla en sistemas


especialesllamadosincrustados.

o Kernelcore

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

DebeserELF

o kernelsuportforELFbinaries

Incluyalacomoparteestticausando'Y'.Nodebeestarcomo
mdulo.

Blockdevices

Cualquierdispositivoqueresultenecesarioparaarrancarymontarla
particinrazdebesercompiladoestticamente.Sinosecompilaoso
compilacomomdulonoarrancar.

Characterdevices

Sernnecesarioscomomnimolassiguientesopciones:

o Virtualterminal
o Suportforconsoleonvirtualterminal
o UNIX98PTYsuport
Filesystems

Comomnimodeberincluirsoporteparaelsistemadeficherosdel
sistema de ficheros raz que generalmente es ext2, y sea cual sea
deberestarincluidoestticamenteynocomomdulo.

Consoledrivers
o VGAtextconsole

InstalarunnuevokernelpersonalizadoenDebian

TodolodichosirvetambinparaDebianperoenDebianexisteunaforma
alternativamuyinteresante.

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

AntesdelaaparicindelkernelmodularenLinuxunkernelcompletoera
unsimplefichero.Estasencillezpermitaporejemplomigrarunkernelde
unamquinaaotrasimplementecopiandoestefichero.Esloquesucede
ahora si compilamos un kernel en modo totalmente esttico. Es decir
obtenemosungranypesadokernel,totalmentecompletoyfuncionalpero
sinsoporteparacargarmdulos.

Parapodermigrarunkernelcompletoenelcasogeneraldequetenga
soporte para mdulos habra que trasladar como mnimo el fichero
compiladoestticamenteycomomnimotodossusmdulos.

Por ello existe enDebian unmakekpkgcapaz degenerarunpaquete


Debian'mi_kernel.deb'conelbinariodelkernelysusmdulos.Sepuede
por ejemplo copiar ese'mi_kernel.deb' aotra mquina ybastarhacer
"dpkgi'mi_kernel.deb'"parainstalarelkernelenesamquina.Para
usarestesistemadeberinstalar'kernelpackage'yalgunosotrospaquetes
quedependendelyquenoestntodavainstalados.

Lasprimerasvecesquecompileunkernelnonecesitausarestesistema
peroesteprocedimientoresultaespecialmenteindicadoenlainstalacin
dekernelspersonalizadosenmsdeunamquinaodediversoskernels
personalizadosenunamismamquina.

Paraterminar

Soloustedpuedesaberqueotrascosassonnecesariasoconvenientesen
funcin del ordenador utilizado. Las primeras veces le costar trabajo
porquetendrqueleerlaayudadecadaunadelasopcionesperomuchas
deellasrecordarsusignificadolaprximavez.Lomejorespartirdeun
kernelquefuncioneyeliminartodasaquellasopcionesquesabemoscon
certezanonecesitaremosusarnuncaennuestroequipo.Recuerdequelas
opcionesqueestncomomdulosapenassuponenunahorroprescindir
totalmentedeellas.Porelcontrariounaopcinquefigurecomoesttica
innecesariamente est sobrecargando la parte esttica del kernel y eso

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

reducesueficiencia.Unkernelpequeoessensiblementemsrpidoque
unogrande.

Sitienedificultadesparaarrancarconelnuevokernelintentehacerlocon
el antiguo y si esto tampoco resulta repase el captulo dedicado a las
dificultadesconelarranqueenLinux.

No olvide que lo primero que hace cualquier kernel al arrancar es


informardetodosaquellosdispositivosqueescapazdesoportar.Estolo
puedevisualizarnuevamentecon'dmesg(8)'.Sialgncomponentedesu
hardwarenoapareceytampocoestdisponiblecomomdulosignificar
queesedispositivonoestasoportado.Tambinpuedeaccedera'/proc'
para comprobar una amplsima variedad de capacidades de su kernel
actual.

476

También podría gustarte