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.

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

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

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

CopyrightMadrid(Enero2000).

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

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

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

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

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

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

implicaraciertoriesgoyaquesetratadeunusuarioconpermisos
enelsistemaparahacercosasdetodotipo.

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

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

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

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

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

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

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

usuario normalito y podr utilizar el potentsimo lenguaje shellscript.


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

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

bastante distintos de otros conceptos que forman parte de la cultura


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

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

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

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

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

11

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

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

12

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

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

Libertaddedistribucin

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


necesariopagarderechosdeningntipo.

Cdigolibre

Seconsideraqueelcdigoeslibrecuandolosfuentessondedominio
pblico.

Integridaddelosfuentes

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

Nodiscriminacinparagruposopersonas

Lalicencianoconsideradistincinalgunaparaningntipodepersona
ogrupo.

Nodiscriminacinparaactividadopropsito

Por ejemplo no se distingue entre uso comercial, domstico,


educativo,etc.

Distribucindelalicencia

13

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

Lalicenciaafectaralassucesivasdistribucionesdelosprogramasde
formaautomticasinnecesidaddetrmitealguno.

LalicencianodebedeserespecficadeDebian

EsdecirDebiannoadmitiraunalicenciaqueimpidaelusodeun
programafueradeladistribucinDebian.

Lalicencianodebecontaminarotrosprogramas

Lalicencianodebeimponerrestriccinalgunaaotrosprogramas.Por
ejemplonoseraadmisibleobligaraqueelprogramasolosepueda
redistribuirenunmedioquenocontengasoftwarecomercial.

Ejemplosdelicenciaslibres

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

14

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

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

15

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

Cada distribucin tiene sus propias caractersticas quela hacenms o


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

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
login:contrasea:UID:GID:nombre:dir:intrprete

formato.

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

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

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

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

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

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

62

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

Siemprequesemencioneuncomandopuedeconsultarlapginamandel
mismo.Enelcasode'ps'selorecomendamosyaqueesuncomandomuy
tilconunagrancantidaddeopciones.Nosotrosmencionaremosalgunos
ejemplosperoseaconsejaprobar'ps'probandolasdistintasopcionesque
semencionanenlapginadelmanual.
Ejemplos:
$ # Para ver todos sus procesos que estn
$ # asociados a algn terminal.
$ ps
PID TTY STAT TIME COMMAND
.......
$ # Para ver todos sus procesos y los de otros
$ # usuarios siempre asociados a algn terminal.
$ ps a
PID TTY STAT TIME COMMAND
.......
$ # Para ver todos sus procesos estn asociados o
$ # no a algn terminal.
$ ps x
PID TTY STAT TIME COMMAND
.......
$ # Para ver todos los proceso asociados al
$ # terminal 1
$ ps t1
PID TTY STAT TIME COMMAND
.......
$ # Para ver todos los procesos del sistema.
$ ps ax

63

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

Estosejemplosqueacabamosdeverobtienenunmismoformatodedatos.
Explicaremoselsignificadodeestosatributos.
PID

Eselvalornumricoqueidentificaalproceso.

TTY

Eselterminalasociadoaeseproceso.Losdemoniosdel
sistemanotienenningnterminalasociadoyenestecampo
figurarun?

STAT

Tiene tres campos que indican el estado del proceso


(R,S,D,T,Z) (W) (N) La S indica que el proceso est
suspendido esperando la liberacin de un recurso (CPU,
Entrada Salida, etc.) necesario para continuar.
Explicaremossoloalgunosdeestosestadosensumomento.

TIME

IndicaeltiempodeCPUquellevaconsumidoeseproceso
desdequefuearrancado.

COMM
AND

Muestra el comando y los argumentos que le fueron


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
user
sys.

Tiempo real gastado (Duracin real)


Tiempo CPU de usuario.
Tiempo CPU consumido como proceso de kernel.
(Es decir dentro de las llamadas al kernel)

Lamayoradeloscomandosestngranpartedeltiemposinconsumir
CPUporquenecesitanesperarparahacerentradasalidasobredispositivos
lentosqueademspuedenestarenusocompartidosporotrosprocesos.
ExisteuncomandocapazdeesperartiemposingastartiempodeCPU.Se
trata del comando 'sleep'. Para usarlo le pasaremos un argumento que
indiqueelnmerodesegundosdedichaespera.
PorejemplovamosacomprobarcuantaCPUconsumeunaesperade6
segundosusandosleep
$ time sleep 6
real
user
sys

0m6.021s
0m0.020s
0m0.000s

El resultado obtenido puede variar ligeramente en cada sistema pero


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

66

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

Vamos a medir tiempos en un comando que realice operaciones de


entradasalidaascomoprocesodedatos.
$ time ls /* > /dev/null
real
user
sys

0m0.099s
0m0.080s
0m0.010s

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

0m6.478s
0m5.440s
0m0.900s

67

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

Podemos hacer un consumo fuerte de CPU si forzamos a clculos


masivosquenotenganapenasentradasalida.Porejemplopodemosponer
acalcularelnmeroPIcon300cifrasdecimales.'bc'esuncomandoque
consisteenunacalculadora.Admiteusointeractivoperotambinacepta
quelepasemoslasoperacionesdesdeotroprocesocombinandoentrada
salida.
$ time ( echo "scale=300; 4*a(1)" | bc -l )
3.1415926535897932384626433832795028841971693993751058
20974944592307\
816406286208998628034825342117067982148086513282306647
09384460955058\
223172535940812848111745028410270193852110555964462294
89549303819644\
288109756659334461284756482337867831652712019091456485
66923460348610\
454326648213393607260249141272
real
user
sys

0m2.528s
0m2.520s
0m0.010s

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

68

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

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

69

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

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


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

70

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

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

71

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

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

72

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

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

73

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

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

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

74

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

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

75

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

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

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

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

paraalgoquenotienequeverconelsistemadeficherosysinembargolo
mencionaremosaquporrazonesprcticas.
En muchos sistemas parecer que existe la disponibilidad de usar un
comando 'll' que sirve para mostrar un directorio con abundante
informacin.Enrealidadsetratadeunalias.Ustedpuedeverificarlos
alias definidos para su usuario tecleando 'alias' sin argumentos.
Generalmenteseusaparaabreviarelusodecomandosmuyutilizados.
Estopuederesultarledeintersparapersonalizarsuentorno.
Cuando el interprete de comandos arranca se ejecutan una serie de
ficheros '/etc/profile', '~/.bash_profile', '~/.bash_login', y '~/.profile' en
esteorden.En'.bash_profile'sueleexistirunapartequepreguntaporla
existenciadeun'~/.alias' yencasoafirmativoloejecuta.Estefichero
'.alias' contiene una serie de comandos de alias que permanecern
disponiblesdurantesusesindetrabajoconesashell.
Podraparecerqueestamosobsesionadosconlashellyquenosabemos
hablar de otra cosa pero solo queremos proporcionarle ahora unos
consejosprcticosquelefacilitenelusodesusistema.Paraellotendra
queeditarelfichero'.alias'presenteensu$HOMEyaadirlaslneas
siguientes:
alias
alias
alias
alias
alias
alias
alias
alias

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


ll.='ls -adlrt --color=auto .[a-zA-Z0-9]*'
ls='ls --color=auto'
ls.='ls -adrt --color=auto .[a-zA-Z0-9]*'
md='mkdir'
mv='mv -i'
rd='rmdir'
rm='rm -i'

Puedeejecutarelfichero'.alias'paradefinirtodosestosalias
$ . .alias

77

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

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

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

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

78

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

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

79

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

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


# Creamos en /tmp una serie de directorios anidados
cd /tmp
mkdir kkkk
cd kkkk
# Consultamos en que directorio estamos situados
pwd

/tmp/kkkk
$ # Continuamos creando ficheros y directorios
$ echo xx > kk1
$ echo xx > kk2
$ echo xx > kk3
$ mkdir kkkk
$ # Usamos el alias por primera vez para ver el
contenido
$ # del directorio actual.
$ ll
total 4
-rw-r--r-kk1
-rw-r--r-kk2
-rw-r--r-kk3
drwxr-xr-x
kkkk

1 acastro

acastro

3 abr 16 20:01

1 acastro

acastro

3 abr 16 20:01

1 acastro

acastro

3 abr 16 20:01

2 acastro

acastro

1024 abr 16 20:01

$ # Continuamos creando ficheros y directorios


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

80

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

1 acastro

acastro

3 abr 16 20:01

1 acastro

acastro

3 abr 16 20:01

1 acastro

acastro

3 abr 16 20:01

3 acastro

acastro

1024 abr 16 20:03

1 acastro

acastro

3 abr 16 20:03

1 acastro

acastro

3 abr 16 20:03

1 acastro

acastro

3 abr 16 20:03

2 acastro

acastro

1024 abr 16 20:04

1 acastro

acastro

3 abr 16 20:04

1 acastro

acastro

3 abr 16 20:04

1 acastro

acastro

3 abr 16 20:04

$ # Con el comando tree y la opcin -d podemos ver la


estructura
$ # simplemente con los directorios y como estn
colocados.
$ tree -d
.
`-- kkkk
`-- kkkk

81

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

kk1
kk2
kk3
kkkk
|-- kk1
|-- kk2
|-- kk3
`-- kkkk
|-- kk1
|-- kk2
`-- kk3

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

82

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

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

./kkkk/kkkk
./kkkk
.

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

83

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
gzip
find
tar
fichero.
cpio
fichero.

Compresor de GNU
Buscar ficheros
Empaqueta ficheros y directorios en un solo
Empaqueta ficheros y directorios en un solo

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

Regular.Sonmerosalmacenesdeinformacin.Algunoscontiene
cdigoejecutable.
DirectoriosSonunatablaconnmerosdeinodosynombresde
ficheros.
84

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

Ficheros especiales. Pueden ser dispositivo tipo carcter o


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

Generalmente los diferentes tipos de ficheros son capaces de aceptar


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

85

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

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

86

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

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

Supongamosquetenemoselsiguienteficherollamado'kkkkk'
-rwxrwxrwx

1 root root 14740 abr 15 12:05 kkkkk


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

87

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
d
l
p
b
c

Directorio
Enlace simblico
Fifo con nombre
Dispositivo de bloques
Dispositivo de caracteres

En ingls se usan los trminos owner , group, y others para designar


respectivamentealpropietario,algrupoyacualquierusuario.
Notacinnumricaparapermisos
Recuerdequetambintenemosquepensarenlaposibilidaddequemi
amigoDavidacostumbradoalusodelazadndecidahacerestecursoy
tenamos un compromiso de explicar las cosas partiendo de cero. Los
permisosdelosficherossonalmacenadosenformatobinarioysepuede
referenciar numricamente. Vimos que a cada permiso individual le
asocibamosunnmerodetresdgitosformadopordoscerosyuntercer
nmeroquepodasernicamente1,2,o4.Porejemploelpermisode
escrituraparaunusuariocualquieraera002.Conestosnmerossepuede
codificarlospermisosdelaformaqueindicamosenelsiguienteejemplo:
r w x - - w x - r - x
735
4 2 1 - 0 2 1 - 4 0 1
)

Esto equivaldra a un permiso


( 4+2+1 ,

0+2+1 , 4+0+1

= 7,3,5

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

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

Consiste en tomar a umask como una mscara donde los bits a 1


especificanlosbitsdepermisosquesepondrnacero.
Porejemplosiqueremosabrirunficheroconpermisos664ytenemosuna
umaskde022obtendremosunfichero644.
664
110 110 100
022
000 010 010
----------------644
110 100 100

Esto tiene la utilidad de proteger el sistema frente a cierto tipo de


descuidosdurantelacreacindeficheros.
Porejemplosupongamosqueunadministradordeunsistemaconsidera
que por defecto todos los ficheros que el crea deberan carecer de
permisosdeejecucinydeescrituraparatodoelmundoyqueparalos
usuariosdesumismogrupodeberandecarecerdepermisodeejecucin.
Paraelloestableceruna'umask=023'.Esdecirunaumaskqueelimina
lospermisos.w.wx
Paraunscriptquegenereficherosquesolodebanseraccesiblesparael
usuarioqueloshageneradousaramos.'umask=077'
Comandochmod
EstecomandosirveparaalterarunaseriedeatributosdelficheroExiste
dos formas de usarlo. Una indicando el tipo de acceso y a quien lo
queremos conceder o eliminar. Existen una serie de atributos que se
puedenmodificarusandoestecomando.
04000
02000
01000
00400
00200
00100
00040

r
w
x
r

Set uid on execute.


Set gid on execute.
Save text on image after execution.
Permiso de lectura para el propietario
(owner)
Permiso de escritura para el propietario
Permiso de ejecucin para el propietario
Permiso de lectura para el grupo
(group)

89

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
00020
00010
00004
00002
00001

w
x
r
w
x

Permiso
Permiso
Permiso
Permiso
Permiso

de
de
de
de
de

escritura para el grupo


ejecucion para el grupo
lectura para cualquiera
escritura para cualquiera
ejecucion para cualquiera

(others)

Los atributos Set uid, Set gid, y Save text no los explicaremos de
momento.
Consulte las pginas del manual relativas a este comando. Como de
costumbre el manual resulta imprescindible a la hora de recordar la
utilizacindeuncomandoperonoalahoradecomprenderconceptos
nuevos. No se preocupe con los ejercicios que le proponemos a
continuacincomprenderperfectamente:
$
$
$
$
$

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

-rwxrwxrwx

.... .... ......

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

.... .... ......

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

.... .... ......

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

.... .... ......

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

90

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

.... .... ......

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

.... .... ......

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

.... .... ......

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

.... .... ......

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

.... .... ......

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

.... .... ......

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

.... .... ......

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

.... .... ......

91

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

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

.... .... ......

rm kk

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

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

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

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

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

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

93

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

2 ..... ......

$ ## Para ver que ficheros


contiene el directorio kk
hacemos ...
$ ls kk
k1 k2

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


cualquiercomandoincluidolsaveriguarcualessucontenido.
Sinabandonarlasesinanteriorcontinuamoselejercicio
$ ###(1)###
$ ## Eliminamos los premisos de lectura del
directorio kk
$ chmod -r kk
$ ls -ld kk
d-wx-wx-wx

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

root

28896 jul 17

1998

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


parecidoalanteriorperoaniveldegrupo.Esdecirelprocesoqueejecuta
97

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

estecomandotemporalmentecambiesuEGIDtomandoelvalorGIDdel
fichero.Porejemploelcomadolprnosolonosconvierteen'root'cuando
loejecutamossinoquenoscambiaelgrupoporelgrupodeimpresin.
-rwsr-sr-x
1 root
/usr/bin/lpr

lp

14844 feb

1999

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

cd /tmp
echo > kk
chmod 4000 kk
ll kk

---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
lrwxrwxrwx
-rw-r--r--rw-r--r--rw-r--r-lrwxrwxrwx

2
1
3
3
3
1

pepe
pepe
pepe
pepe
pepe
pepe

user 1024 may 18 17:28 dir1


user
4 may 18 17:28 dir2 -> dir1
user
1 may 18 17:26 ej0
user
1 may 18 17:26 ej1
user
1 may 18 17:26 ej2
user
3 may 18 17:28 ejs1 -> ej0

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

101

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

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

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

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

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

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

eliminado. La diferencia con el enlace simblico es que acta


simplementeaccediendoalnombredelficheroquetienealmacenadoen
suinterior.Poresoenelcasoqueacabamosdever'ejs1'quedaapuntando
a'ej0'queesunficheroqueyanoexiste.Continuamosconelejercicioy
ahorausaremosunaopcinpara'ls'quenohabamosvistoantes.Setrata
delaopciniquesirveparavisualizarelnmerodeinodo.
Un inodo es una clave numrica para el acceso al sistema plano de
ficherosdondecadapuntocapazderecibiroentregarinformacin,tiene
unanicaclave.Poresolosdistintosenlacesrgidoscontienenelmismo
valordeinodo.Loderecibiroentregarinformacinsetraduceenchorros
de bytes producidos en operaciones de lectura escritura pero estas
funciones peseamanejarse siempreigual realizan cosasmuydistintas
dependiendo deltipo defichero. Unficheroregulares unalmacn de
informacin.Otrostiposdeficherosnosonmeroscontenedoresdebytes.
Porejemplolosdispositivosespecialesdebloquesodecaracterespueden
verse como emisores y receptores de bloques o caracteres
respectivamente asociados a un dispositivo. Tampoco son meros
contenedoresdebyteslossockets,enlacessimblicos,fifosconnombre,
etc.Salvolosdirectorios,todossoncapacesderecogerchorrosdebyteso
deentregarchorrosdebytesoambascosasalavezylomsimportante,
todosellostienenasociadouninodoyalmenosunnombredefichero
colgandodealgunapartedesistemadeficheros.Losdirectoriosnose
puedenmanejarconfuncionesclsicas delecturaescritura.Tienensus
propiasfuncionesespecficasparamanejodedirectorios.
$ ls -li
73449
dir1
59173
dir2 ->
59171
ej1
59171
ej2
59172

drwxr-xr-x

2 pepe user 1024 may 18 17:28

lrwxrwxrwx
dir1
-rw-r--r--

1 pepe user

4 may 18 17:28

2 pepe user

10 may 18 17:30

-rw-r--r--

2 pepe user

10 may 18 17:30

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
dir1
59173
dir2 ->
59171
59171

drwxr-xr-x

2 pepe user 1024 may 18 17:32

lrwxrwxrwx
dir1
-rw-r--r--rw-r--r--

1 pepe user
2 pepe user
2 pepe user

4 may 18 17:28
10 may 18 17:30 ej1
10 may 18 17:30 ej2

$ ls dir2
ejs1
$ ls -li dir1
59172 lrwxrwxrwx
ejs1 -> ej0

1 pepe user

3 may 18 17:28

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

104

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

Ahoratenemos 'dir2/ejs1>ej0'pero'ej0'nisiquieraexiste.Vamosa
cambiarelnombrede'ej2'queeraunenlacergidode'ej0'por'ej0'.
$ mv ej2 ej0
$ cat dir2/ejs1
cat: dir2/ejs1: No existe el fichero o el directorio

Buenoesteerroreslgicoporqueelenlace'dir2/ejs1'apuntaa'ej0'yno
importaqueestemosenelmismodirectorioque'ej0'sinoque'dir2/ejs1'y
'ej0'estnenelmismodirectorio.Losenlacessonsiemprerelativosal
sitio donde se encuentra el propio enlace. En caso contrario podra
resultar graciossimoperopocoprctico porquedependiendodedonde
estuviramos nosotros ( ms exactamente dependiendo del directorio
actualdelprocesoquelouse)apuntaraaundirectoriodistintocadavez.
Detodasformascomprobmoslotrasladando'ej0'a'dir2',yobservando
comohaquedadotodo.
$ mv ej0 dir2
$ cat dir2/ejs1
kkkkkkkkk
$ ls -li
73449
dir1
59173
dir2 ->
59171
ej1

drwxr-xr-x

2 pepe user 1024 may 18 17:34

lrwxrwxrwx
dir1
-rw-r--r--

1 pepe user

4 may 18 17:28

2 pepe user

10 may 18 17:30

1 pepe user

4 may 18 17:28

$ ls -li dir2
59173 lrwxrwxrwx
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
dir1
59171 -rw-r--r-ej1

2 pepe user 1024 may 18 17:34


2 pepe user

10 may 18 17:30

2 pepe user

10 may 18 17:30

1 pepe user

3 may 18 17:28

$ ls -li dir1
59171 -rw-r--r-ej0
59172 lrwxrwxrwx
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 NoVitales
share
Informacin independiente de la
arquitectura
src
Cdigo fuente

/usr/local:Jerarqualocal
La jerarqua '/usr/local' estparaserutilizadaporeladministradordel
sistemacuandoseinstaleelsoftwarelocalmente.Necesitaestarasalvode
ser sobrescrito cuando el software del sistema se actualiza. Puede ser
usadoporprogramasyporinformacinquesoncompartiblesentreun
grupodemquinas,peronoseencuentranen'/usr'.
/usr/local

Jerarqua local.

bin
doc
etc
games
lib
info
man
/usr/local

Binarios solo-locales
Documentacin local
Binarios de configuracin solo-local
Juegos instalados localmente
Libreras para /usr/local
Pginas de info local
Jerarquas de pginas de manual para

113

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

Administracin del sistema solo-local


Cdigo fuente local.

Este directorio debe estar vaco al terminar de instalar LINUX por


primera vez. Nodebe haberexcepciones a laregla, excepto quiz los
subdirectoriosvacoslistados.
LaJerarqua/var
Elsistemanecesitaconfrecuenciaunazonadetrabajotemporal.Sisolo
serequiereusarunespacioporuncortoperiododetiemposepuedeusar'/
tmp',peromuchasveceslainformacinconvienemanejarlayalmacenarla
enunlugarmspermanente.Elsistemapuedesufrirunacadarepentinay
elcontenidode'/tmp'puedeserborradoduranteelarranqueodepurado
regularmente mediante alguna tarea peridica. Por el contrario '/var'
contienetodotipodeinformacinalgunadeellapuedeserimportante.
Por ejemplo informacin vital para el mantenimiento de la gestin de
paquetes de ladistribucinomensajes pendientes deserenviados por
correo, archivos y directorios en fila de ejecucin, informacin de
bitcora administrativa y archivos temporales y transitorios aunque se
asumequesupermanenciasermayorque'/tmp'
/var

Informacin variable

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

Pginas del manual formateadas


Informacin del estado de
Informacin variable del software de
Archivos
Archivos
Archivos
Archivos
Archivos

de bloqueo
de bitcora
DNS, solo red
base de datos NIS
almacenados despus de una

Archivos relevantes a procesos


Directorios de trabajos en fila para

114

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

Archivos temporales, utilizado para

115

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

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

$ help | less
$ help cd

116

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

Dijimosquenoexplicaramosningncomandointernoperoenrealidad
'help'esuncomandointernoytenemosqueaadirqueadmiteelusode
metacaracteres.

$ help help
$ help *alias

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

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

apropos(1)
117

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

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

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

atq(1)
Permiteverlacoladetareaspendientes.
$ atq

atrm(1)
118

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

Permite cancelar una tarea programada y pendiente de ejecutarse ms


tarde.
$ atrm 188

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

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

#
#
#
#
#
######

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

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

119

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

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

cal(1)
CalendarioEjempos:
$ cal
$ cal 2000

cat(1)
Leeunoomsficherosylossacaporlasalidaestndar.

120

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

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

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

$
$
$
$

chmod
chmod
chmod
chmod

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

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

$ chown usuario fichero


$ chown usuario:grupo fichero

121

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

cksum(1)
Obtieneuncdigo(CRC)queestdiseadoparadetectarvariacionesen
lainformacinporproblemasenlagrabacinotransmisindedatos.

$ cksum fichero

clear(1)
Limpiaelcontenidodelaconsola.

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

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

cpio(1)
Admiteunalistadenombresdeficherosparaempaquetarlosenunsolo
fichero.Esuncomandomuypotenteyverstil.Juntocontarseusaentre

122

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

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


combinacinconfind.Loestudiaremosmsadelante.

cut(1)
Permiteextraercolumnasocamposdesdeunoomsficheros.

$ cut -d: -f1 /etc/passwd


$ cut -d: -f6 /etc/passwd

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

123

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

df(1)
Informadelautilizacindediscoenlasparticionesqueestnmontadas.

$ df -a

diff(1)
Sirveparalocalizardiferenciasentredosficherosdetexto.
$ diff fich1 fich2

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

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

echo(1)
Permitesacarmensajesporsalidaestndar.

124

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

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

emacs(1)
Esuneditormultipropsito.

env(1)
Obtienelalistadevariablesdeentornoysusvalores.

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

expr(1)
Esunevaluadordeexpresiones.

$ expr \( 55 + 31 \) / 3

125

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

28

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

fgrep(1)
Esunavariedaddelcomandogrep.Sirvenparabuscarcadenasdetextoo
secuenciasdecaracteresenficheros.Seestudiarnmsadelante.

file(1)
Sirveparaaveriguareltipodeficheropasadocomoargumento.Distingue
muchostiposdeficheros.

$ file fich
$ file dir1 fich2

find(1)

126

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

Permite localizar ficheros dentro de la estructura de directorios. Es


tremendamenteverstilyseestudiarmsadelante.

$ find /var -name '*.log'

finger(1)
Sirveparaaveriguarquienestconectadoalsistema.

$ finger
$ finger -l

free(1)
Proporcionaestadsticasdeusodelamemoriadelsistema.

ftp(1)
Comandoparaintercambiarficherosentredistintosordenadores.

fuser(1)
Indicaqueprocesoestusandounficherooundirectorio.

127

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

gawk(1)
EslaversinGNUdeawk.Setratadeunprogramaqueimplementaun
lenguajeparatratarficherosdetextoestructuradosencamposyregistros.
Esmuypotenteyseestudiarmsadelante.

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

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

$
$
$
$
$

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

128

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

head(1)
Permitesacarlasprimeraslneasdeunfichero.

hostname(1)
Obtieneelnombredelamquina.

id(1)
Devuelveinformacindeidentidaddeaquelqueloejecuta.

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

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

129

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

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

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

$ less fichero
$ cat fichero | less

ln(1)
Creaenlacesrgidosyenlacessimblicosquesoncosasqueyahemos
estudiado.

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

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

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

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

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

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

131

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

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

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

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

132

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

more(1)
Esunpaginadormuchomssencilloqueelsofisticado'less'.

$ ls | more
$ more fichero

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

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

dir001

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

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

prioridad.Unavezqueuncomandohasidolanzadosepuedemodificar
suprioridadconrenice.

$ nice comando

nohup(1)
Loscomandoslanzadosconnohupnoterminanalabandonarlasesin.Se
puedeusarcombinadoconlaejecucinenbackground.

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


$ # logout
$ exit

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

134

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

paste(1)
Seusaparacombinarcolumnasdedistintosficherosenunosolo.Vienea
serlocontrariodelcomandocut.

$ who | paste - -

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

ps(1)
Permiteobtenerinformacindelosprocesosenejecucin.Dependiendo
loquenosintereseexistendiversasopcionesparaunagranvariedadde
formatosydeseleccindelainformacindesalida.

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

$ pstree
$ pstree -p

135

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

Laopcinpesmuytilparaaveriguarelpiddeunproceso.

pwd(1)
Estecomandoretornaellugardondenosencontramos.
$ pwd

Sepuedeusarporejemploparaguardarellugardondeestamosahoracon
objetoderetornaralamismolugarmstarde.
$
$
$
$

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

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

136

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

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

rm(1)
Yahemosexplicadoyusadoestecomando.Sirveparaborrarficheros.

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

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

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

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

La forma de combinar comandos en unix conectando entrada salida


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

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

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

138

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

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

$ echo hola; sleep 5 ; echo que tal

sort(1)
Estecomandopermiteordenarlineasdetexto.Sepuedeusarcomofiltro.
Seestudiarmsadelante.

split(1)
Estecomandosirveparapartirentrozosmspequeosunficherogrande.
Paravolveraobtenerelficherooriginalbastarconusarelcomando'cat'

$ split --bytes=52m ficherogrande parte

Estecomando troceaunficherograndeentrozosde52Mbytesquese
guardanenficherosqueempiezanconelprefijo'parte'seguidodeuna
numeracinsecuencial.

stty(1)

139

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

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


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

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

$ su nuevousuario
$ su - nuevousuario

Paraunusuarionormalsesolicitarlapassworddelnuevousuario.

tail(1)
Ascomoheadservaparaobtenerlasprimeraslneasdeunficherotail
sirveparaobtenerlasltimaslneasdeunfichero

140

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

Tailtieneunaopcinmuytilparamostrarqueesloqueestpasandoen
ficherosqueseestngenerandooquecrecencontinuamente.

$ tail -f fichero

Estecomandonoterminanuncaymuestraelfinaldelficheroquedandoa
la espera de mostrarelrestodemismoamedida quesegenere.Para
terminarhayquematarloconCtrlC.

talk(1)
Permiteabrirunasesindecharlainteractivaconotrousuario.

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

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

telnet(1)
Permiteabrirunasesindetrabajoenotramquina.
141

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

$ telnet localhost

Con esto podemos probar telnet conectndonos con nuestra propia


mquina.Acontinuacinsaldrlasolicituddelogin.

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

$ test "2" = "3"


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

Seestudiarmsadelante.

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

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

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

&

$ tload -d 2

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

$ top

Parasalirhayquepulsar'q'.

tr(1)
Seutilizaparasustituircarcter.

143

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

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

vi(1)
Esteesuneditormuypotenteypresenteentodoslossistemasdetipo
Unix.Seestudiarmsadelante.

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

$ w

wc(1)

144

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

Estees un comando queseusabastante. Sirveparacontarcaracteres,


palabrasylneasenunficherooenunflujodeentradasalida.

$ wc fichero
$ cat fichero | wc

whatis(1)
Sirveparamostrarlabrevedescripcindeuncomandoquefiguraenlas
pginasdelmanual

$ whatis ls
$ whatis whatis

who(1)
Sacalainformacindequienesestnconectadosalsistema.

$ who

whoami(1)
Paraaveriguarquienesustedenesemomento.Enunprogramapuedeser
interesantecomprobarquienloestejecutando.

145

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

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

$ whereis ls
$ whereis whereis

write(1)
Siemprequesetengapermisopermiteenviarmensajesaotrousuario.

$ write root

xargs(1)
Sirveparapasarargumentosauncomandomedianteentradasalida.

$ echo '-l' | xargs ls

Cosascomoestasaadenbastantepotenciaallenguajeshellscript.

146

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

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

$ zless documento.txt.gz

147

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

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

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

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

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

Elelementoprecedentedebeaparecer0omsveces.

Elelementoprecedentedebeaparecer1omsveces.

Uncarctercualquieraexceptosaltodelinea.

Operadorunario.Elelementoprecedenteesopcional

Ounouotro.

Comienzodelinea

Findelinea

[...]

Conjuntodecaracteresadmitidos.

[^...] Conjuntodecaracteresnoadmitidos.

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
$ egrep 'ab*c' <<FIN
patrn'ab*c'
Este patrn localizar las cadenas de
caracteres que empiecen por 'a', que
continencon0oms'b',yquesigan
conuna'c'.
La4fallaporquela'a'yla'c'novan
seguidas ni existen caracteres 'b' entre
ambas.La5fallapornotenerunasola
'c'.yla6tieneloscaracteresadecuados
peronoenelordencorrecto.

<
<
<
<
<
<
<
<

1 ac
2 aac
3 abbbc
4 axc
5 aaab
6 cba
7 aacaa
FIN

1
2
3
7

ac
aac
abbbc
aacaa

Ejemplo para el operador '+' con el


$ egrep 'ab*c' <<FIN
patrn'ab+c'
< 1 ac
Este patrn localizar las cadenas de
caracteres que empiecen por 'a', que
continencon1oms'b',yquesigan
conuna'c'.

<
<
<
<
<
<
<

2 aac
3 abbbc
4 axc
5 aaab
6 cba
7 aacaa
FIN

Solo la lnea 3 cumple la expresin 3 abbbc


regular.

150

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

$ egrep 'a..c' <<FIN

Ejemplo para el operador '.' con el < a00c


< axxcxx
patrn'a..c'
<
<
<
<
<

aacc
abc
ac
axxxc
FIN

Este patrn localizar las cadenas de


caracteres que empiecen por 'a', que
continen con dos caracteres
cualesquieradistintosdesaltodelneay a00c
axxcxx
quesiganconuna'c'.
aacc

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


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

Ejemplo para el operador '|' con el


patrn'ab|cd'

< cd
< abbcd
< FIN
abcd
acd
$
<
<
<
<
<
<

egrep 'ab|cd|123' <<FIN


xxxabzzz
xxxcdkkk
badc
dbca
x123z
FIN

Este patrn localizar las cadenas de


caracteres que contengan 'ab', 'cd', o
xxxabzzz
'123'
xxxcdkkk
x123z

151

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

$ egrep '^abc' <<FIN

Ejemplo para el operador '^' con el < abcdefgh


< abc xx
patrn'^abc'
< 00abc
< FIN

Este patrn localizar las lineas que


abcdefgh
empiecenpor'abc'.
abc xx

Ejemplo para el operador '$' con el


patrn'abc$'

$
<
<
<
<
<

egrep 'abc$' <<FIN


abcd
000abc
xxabcx
abc
FIN

Este patrn localizar las lineas que


terminenpor'abc'.
000abc
abc

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

Ejemplo para el operador '[ ]' con el < 0abc0


< 0a0
patrn'0[abc]0'
< 0b0
Este patrn localizar las cadenas que
tenganun'0'seguidodeuncarcterque
puedeser'a','b',o'c'yseguidodeotro
'0'.

< 0c0
< xax
< FIN
0a0
0b0
0c0

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

Ejemploparaeloperador'^'(negacin) < 0abc0


dentrode'[]'conelpatrn'0[^abc]0'
< 0a0
<
<
<
<

000
x0x0x
0c0
FIN

Este patrn localizar las cadenas que


tenganun'0'seguidodeuncarcterque
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


< 000
dentrode'[]'conelpatrn'0[az]0'

< 0Z0
< x0x0x
< FIN

Este patrn localizar las cadenas que


tengan un '0' seguido de una letra
0a0
minscula,yseguidodeotro'0'.

x0x0x
$ egrep

Ejemplo para el operador '()' < hh00hh


< s0abc0s
(agrupacin)conelpatrn'0(abc)?0'

'0(abc)?0' <<FIN

< s0ab0s
< 0abc
< FIN

Este patrn localizar las cadenas que


tenganun'0'seguidoopcionalmentede
hh00hh
lasecuenciaabc,yseguidodeotro'0'.

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
Hola
Hola
Hola

este es un fichero con datos de prueba


una vez.
una vez.
una vez.

156

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

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

Idntico resultado podramos haber conseguido usando


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

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

157

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

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


hemosmencionadosepuedenhacermuchascosas.
Podemoseliminar losblancosaprincipio yalfinaldelinea ascomo
sustituirmsdeunblancoseguidoporunsoloblanco.
$
<
<
<
<

cat <<FIN > trim.sed


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

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

158

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

Lasltimaslneaslashemosaadidosimplementeparaanalizarpasoa
pasocomosevatransformandolasalidaoriginaldelcomandocaldelcual
enprimerlugaryahemosseparadolaprimeralnea.Lasdistintasetapas
quedanregistradasentraza.1atraza.8.
traza.1 contiene la salida del comando cal.
S
7
14
21
28

April 2002
M Tu W Th F S
1 2 3 4 5 6
8 9 10 11 12 13
15 16 17 18 19 20
22 23 24 25 26 27
29 30

En traza.2 se ha eliminado la primera lnea.


S
7
14
21
28

M
1
8
15
22
29

Tu W Th F S
2 3 4 5 6
9 10 11 12 13
16 17 18 19 20
23 24 25 26 27
30

En traza.3 se ha sustituido toda secuencia de


dos blancos por ' +'
S +M Tu +W Th +F +S

159

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
+
7
14
21
28

+1
+8
15
22
29

+2
+9
16
23
30

+3
10
17
24

+4
11
18
25

+5
12
19
26

+6
13
20
27

En traza.4 sustituimos los blancos a comienzo de


lnea por '+'
+S
++
+7
14
21
28

+M
+1
+8
15
22
29

Tu
+2
+9
16
23
30

+W
+3
10
17
24

Th
+4
11
18
25

+F
+5
12
19
26

+S
+6
13
20
27

Gracias a los pasos anteriores ya tenemos una


estructura de lneas formada por dos caracteres
distintos de blanco separadas por un blanco y
precisamente este blanco en traza.5 lo sustituimos
por dos blanco para dar ensanchar toda la salida.
+S
++
+7
14
21
28

+M
+1
+8
15
22
29

Tu
+2
+9
16
23
30

+W
+3
10
17
24

Th
+4
11
18
25

+F
+5
12
19
26

+S
+6
13
20
27

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


por blancos. En traza.6 ya tenemos la salida
ensanchada.
S
7
14
21
28

M
1
8
15
22
29

Tu
2
9
16
23
30

W
3
10
17
24

Th
4
11
18
25

F
5
12
19
26

S
6
13
20
27

En traza.7 no se aprecia la diferencia pero


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

160

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
y otro a la derecha para que a la hora de
enmarcar el nmero solo tengamos que sustituir
blancos y no se desalineen las columnas. Por
ello aunque no se aprecie en traza.7 hemos
aadido un blanco al final de las lneas.
S
7
14
21
28

M
1
8
15
22
29

Tu
2
9
16
23
30

W
3
10
17
24

Th
4
11
18
25

F
5
12
19
26

S
6
13
20
27

Ahora en traza.8 se ve como hemos aadido un


blanco a la izquierda.
S
7
14
21
28

M
1
8
15
22
29

Tu
2
9
16
23
30

W
3
10
17
24

Th
4
11
18
25

F
5
12
19
26

S
6
13
20
27

Por ltimo bastar sustituir el da del ms


entre blancos por el da de ms entre corchetes.
S
7
14
21
28

M
1
8
15
22
29

Tu
2
9
16
23
30

W
3
10
17
24

Th
4
11
18
25

F
S
5
6
12 13
19 [20]
26 27

Independientementedequeaustedseleocurraotrasolucinmejor,se
tratabadepracticarconsedyconsietesedsencadenadospensamosque
yahabrsaciadosuseddesed(1).
Detodasformassiloquieremsbonitoycortitopruebeestootro.
ESC=`echo -e "\033"`
cal | sed "s/$/& /" | sed "s/ $DIAMES / $ESC[1m$
{DIAMES}$ESC[0m /"

161

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

Yanossalimosdeltemaperosiestohadespertadosucuriosidadmire
console_codes(4).

162

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

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

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

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

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

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

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

Vamosasacarunacopiaparacomprobarluegoloscambios.

165

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

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

cat <<FIN > ejemplo.ed


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

73
http://www.ciberdroide.com
99

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

Podemosverlasdiferenciasconeloriginalusandoelcomando'diff'.El
comandodiffesuncomandoquesirveparasealardiferenciasentredos
ficherosperoconlaopcineestasdiferenciasseexpresanenunaforma
adecuadaparaserinterpretadaspor'ed'.Veamoscomofunciona.
$ diff -e ejemplo.txt.original ejemplo.txt

166

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

2a
(Tienda Virtual de Linux)
.

Vamos a partirdelfichero original ylevamos apasarporlaentrada


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

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

cat <<FIN >> ejemplo.diff


w
q
FIN
cat ejemplo.diff

2a
(Tienda Virtual de Linux)
.
w
q

Ya tenemos todas las instrucciones necesarias. Vamos a aplicar los


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

167

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

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


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

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

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


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

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

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

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

Ahorasivamosaentraryasalireneleditor.
$ vi

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

169

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

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

VIM - Vi IMproved
version 5.3
by Bram Moolenaar et al.
type

Vim is freely distributable


:help uganda<Enter>
if you like Vim

type
type
type

:q<Enter>
:help<Enter> or <F1>
:help version5<Enter>

to exit
for on-line help
for version info

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

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

--> Comando de uso imprescindible.


--> Comando de uso muy frecuente.
--> Comando de uso no tan frecuente.

LINEADECOMANDOS
**
vi
*

Editarunnuevofichero

**
vi<fichero>
*

Editarunfichero.(Sielficheroesdesolo
lecturaloeditaraenmodosololectura.

vi<fichero1>
<fichero2>
<fichero3>...

Editarvariosficherossucesivamente.

** viR<fichero>

Editarenmodosololectura.

** vir<fichero>

Editarrecuperandomodificacionesno
salvadas.

MODOCOMANDOS
Sepasadesdeelmodoentrada(insercinoreemplazo)mediante
<ESC>.
Movimientosdelcursor .
** h

Carcteranterior

** <ENTER>

Lineasiguiente

** j

Lineasiguiente

** k

Lineaanterior

** <ESPACIO>

Carctersiguiente

** l

Carctersiguiente

Ultimalineadelapantalla

Primeralineadelapantalla

Lineacentraldelapantalla

<CTRL+B>

Retrocesodepgina

171

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

<CTRL+F>

Avancepgina

Primercarcterdelalineasiguiente

Primercarcterdelalineaanterior

Desplazarsealfinaldelinea.

Desplazarsealprincipiodelinea.

Modoentradadetexto .
**
i
*

Pasaramodoentradainsertando.

**
R
*

Pasaramodoentradareemplazando.

** a

Avanzarelcursorypasaramodoentrada
insertando.

**
o
*

Insertarunalineadespusdelaactualy
pasarainsertar.

Insertarunalineaantesdelaactualy
pasarainsertar.

O
Corregir

**
u
*

Deshacerltimamodificacin.(Envim
sepuedenirdeshaciendolos
losltimoscambiosenotroseditoresvi
solosedeshaceelltimocambio).

**
<CTRL+R>
*

En'vim'sirveparadeshacerelltimo
comando'u'

** U

Recuperarlineacompleta.
Buscar

** /

Buscaunacadenadecaracteres,hacia
delante.

Buscaunacadenadecaracteres,hacia
atrs.

172

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

Siguienteenlabsqueda.

Anteriorenlabsqueda.

Copiar,Mover,yborrar
.
lineas
**
dd
*

Borrarunalinea.

**
<n>dd
*

borrar<n>lineas.

**
yy
*

Meterunalineaenelbuffer.

**
<n>yy
*

Meter<n>lineasenelbuffer.

**
p
*

Copiarlalineadelbufferdespusdela
lneaactual.

Copiarlalineadelbufferantesdelalnea
actual.

P
Varios

**
<CTRL+L>
*

Refrescarpantalla.(tilcuandose
descomponelapantalla)

** <CTRL+G>

Visualizaelnombredelfichero,numero
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.

* :e<fichero>

Pasaaeditardeformasimultaneaotro
fichero.

* :e#

Volveralficheroanterior.

**
:w
*

Salvar.(Nopuedesobreescribirsise
entrconviR)

**
:w!
*

Salvarforzando(Cuandofalla:w).

** :x

Salirsalvandosiesnecesario.

**
:w<fichero>
*

Salvarconotronombre.(Nopuede
existirelfichero)

**
:w!<fichero
*

Salvarconotronombreforzando.
(Permitesobreescribir)

**
:r<fichero>
*

Leeunficheroylocargaenellugar
indicadoporlaposicinactualdelcursor.

** :r!<comando

Ejecutaenunasubshellelcomandoy
guardaelresultado
delmismoenlaposicinindicadaporel
cursor.

**
:q
*

Salirsinohaymodificacin.

**
:q!
*

Salirsinsalvarcambios.

** :wq

Salirsalvandocambios.

* :sh

Ejecutarunasubshell(seretornacon
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.

* :mapmn

Crearmacro(mhacen)(Verejemplos
conmacros)

* :map!mn

Crearmacroenmodoinsercin(mhace
n)

* :unmapm

Destruirmacrom

* :unmap!m

Destruirmacrodeinsercinm.

* :cd

Cambiardedirectorioactual.

** :setnu

Activarvisualizacindenmerosde
lnea

** :setnonu

Activarvisualizacindenmerosde
lnea

** :setall

Vertodaslasopcionesconsusvalores.

** :setnocompatible

Opcinde'vim'paranoobligaraser
compatible'vi'

**
:setshowmode
*

Paravisualizarsiempreelmodoenque
nosencontramos.

**
:!<comando>
*

Ejecutaruncomandoenunasubshell.
(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

LneaN

Un$

Ultimalnea.

Un$

Desdelaltimaalaprimeralnea
(Abreviaturade1,$).

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

Salvardesde1hastala2en<fichero>

**

:#linea1,#linea2co
#linea3

**

:#linea1,#linea2mo
Moverdesde1hasta2en3.
#linea3

Copiardesde1hasta2en3.

** :#linea1,#linea2de

Borrardesde1hasta2.

:#linea1,#linea2
**
s/<s1>/<s2>

Sustituirlaprimeraocurrenciaencada
lineadesde1hastala2lacadena<s1>
porlacadena<s2>

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

Sustituirlaprimeraocurrenciaencada
lineadesde1hastala2lacadena<s1>
porlacadena<s2>conconfirmacin.

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

Sustituirtodaslasocurrenciasencada
lineadesde1hastala2lacadena<s1>
porlacadena<s2>

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

Sustituirtodaslasocurrenciasencada
lineadesde1hastala2lacadena<s1>
porlacadena<s2>conconfirmacin

Sera conveniente que sacara por la impresora esta informacin para


usarlaamododechuletaensusprimerasprcticascon'vi'.
176

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

Existe otra forma de aplicar comandos dentro de un rango de lineas.


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

$
$
$
$

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

xxxx xxxx

216 ago 12 18:24 ej-vi1.txt

Lainformacindepermisospuedeserdiferente.Recuerdequedijimos
quelospermisosdeunficherocuandosecreadependendela'umask'
peroahorasolonosinteresacomprobarefectivamentetenemospermisos

181

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

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

216 ago 12 18:24 ej-vi1.txt

Probablementeaparecerenlalineainferiordesueditorunaadvertencia
dequeestenmodosololectura.

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

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

Permitiescribirotrosficherosperoseniegaasobrescribirelficheroque
estamoseditandoconloscambiosporqueestenmodosololecturay
sugierequeusemos'!'paraforzarsuescritura.
:w!

182

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

Enestecasoestamosforzandolasituacinyestamosescribiendoenun
fichero en el que no tenemos permisos pero puesto que somos
propietarios del mismo el editor puede manejar los permisos para dar
permiso de escritura, sobrescribir el fichero y volver a cambiar los
permisosdejandolospermisosoriginales.
Podemosejecutarcomandosdesdeeleditorasqueporquenomiramos
lospermisoscon'lsl'.
:!ls -l
total 6
-r--r--r-vi1.txt
-r--r--r-vi1.txt~
-rw-r--r-vi2.txt
-rw-r--r-tempfich
-rw-r--r-trozofinal
-rw-r--r-trozoinicial

1 xxxx xxxx

304 ago 12 19:11 ej-

1 xxxx xxxx

304 ago 12 19:11 ej-

1 xxxx xxxx

216 ago 12 18:28 ej-

1 xxxx xxxx

304 ago 12 19:09

1 xxxx xxxx

147 ago 12 19:06

1 xxxx xxxx

126 ago 12 19:06

Press RETURN or enter command to continue

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


ejecutar cualquier comando tambin podemos ejecutar bash como una
subshell.Aprovecharemosparaverlosprocesosactivos.
:!bash
bash-2.01$ ps
PID TTY STAT TIME
221
2 S
0:00
893
2 S
0:00
944
2 S
0:00
951
2 R
0:00
bash-2.01$ exit

COMMAND
-bash
vi ej-vi1.txt
bash
ps

183

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

exit
1 returned
Press RETURN or enter command to continue

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

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

Desde el modo comandos podemos consultar el nombre del fichero,


cuantas lineas tiene entotal, enquelnea ycolumna estamos,yotras
cosasconsolopulsar<CTRL+G>.
Ahorautilicevariasveceselcomando'u'.Siesten'vim'vercomose
deshacen retrocediendo secuencialmente en las ltimas modificaciones
quehemosrealizado. Luegosiestusando'vim'use<CTRL+R>para
184

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

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

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

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

186

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

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

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

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

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

Tambin se puede empezar la bsqueda desde el primer momento en


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

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

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


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

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

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

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


confirmando cada cambio manualmente. Para eso utilizaremos un
comandosimilaralanteriorperofinalizadoen'/gc'.La'g'tieneelmismo
significadoqueenelcasoanterioryla'c'significa'confirmacin'.
:1,$ s/encarnado/colorado/gc

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

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

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

4)Sustituir cualquiersecuenciadeblancosytabuladores porunnico


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

190

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

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

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

Paragenerarlobastartratarcadalneaponiendoun"echo'"alcomienzo
decadalneayunacomillasimplealfinal"'"decadalnea,peroantes
escaparemoscualquierposiblecomillasimplequepudieraexistir.Para
elloeditamoseltextoanterioryhacemoslosiguiente:
:% s/\'/\'\\\'\'/g
:% s/^/echo \'/
:% s/$/\'/

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

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


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

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

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

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

Edicindevariosficherossecuencialmente
Aleditor'vi'selepuedepasarcomoargumentonosolounficherosino
variosparasereditadosensecuencia.Porejemplo:
$ vi fich1 fich2 fich2

Buenoestopuedesermstildeloquepareceasimplevista.Vamosa
suponerquetenemosquemodificarunagrancantidaddeficherospara
sustituirenmuchosdeelloslacadena'acastro'porlacadena'A.Castro'
perotampocolopodemoshacerdeformaautomticaporquenosconviene
vercasoacaso.Poresopasamosa'vi'elresultadodeunabsquedacon
'grep'.
$ vi `grep -il acastro *.txt`

Unavezdentrodeleditorhacemoslosiguiente.
:args

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

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

este preparado para editar secuencialmente varios ficheros busque la


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

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

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

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

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

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

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

Tambin podemos posicionarnos en el lugar de una marca pulsando


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

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

en varios sitios. Tamben mencionamos la posibilidad de ejecutar un


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

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

196

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

Usesuspropiasabreviaturasenuntextoyobservecomolaabreviaturano
serinterpretadasilasecuenciadecaracteresformapartedeunapalabra.
Macros
Esposibleprogramarmacros.Porejemplovamosahacerunamacroque
mueva4lneasalfinaldelfichero
:map xxx 4dd:$^Mp
:map

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

Muchas veces se usan las macros para definir comandos asociados a


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

197

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

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

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

F4(FiltroPGP)Desencriptarycomprobarfirma
:map [[D 1G!Gpgp

2>/dev/tty; sleep 7

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

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

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

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

pingpong.c
pingpong.c

?^plot(x, y, ch)$?
?^salir(s)$?

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


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

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

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

200

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

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

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

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


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

Ahoravamosapracticarrepasandounpocolasnocionesqueyavimosen
el primer captulo dedicado al shell script porque son conceptos que
convieneasentar.Paraellovamosaguardarestecomandoenunfichero
parapoderejecutarlocuandonosapetezca.Previamentenossituamosen
el directorio '/tmp' como es costumbre y nos aseguramos de no estar
usandoelusuariorootniningnotrousuarioconprivilegiosespeciales.
$
$
$
$
$
$

# Nos situamos en /tmp


cd /tmp
# Generamos el fichero con el comando
echo "banner `date '+%D %T'`" > fichero_ordenes
# Comprobamos el contenido del fichero
cat fichero_ordenes

banner 08/02/00 20:26:30

202

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

!! Vaya !! Estonoesloquequeramos hacer.Estecomando siempre


mostrara la misma fecha y hora y seguramente no pretendamos eso.
Dadoquehemosusadolasdoblescomillassehaproducidolaexpansin
delalneaderdenesconcretamenteeloperadorgrave.Sienlugardelas
doblescomillasusramoslascomillassimplesnosehabraproducidoese
errorperoexistenyacomillassimplesdentrodelpropiocomandoyla
shelltomaraelcierredelacomillasimpleenunlugarquenoeselque
nosotros desebamos. Todo esto lo comentamos a modo de repaso.
Entoncescomotendramosquehabergeneradoestecomando?Aques
donde el listillo dice que usando un editor de texto. Bueno al fin de
cuentasyasabemosusarel'vi'no?Buenopuesvamosprimeroahacerlo
sineditor.Recuerdaquemencionamoslaposibilidaddeescaparunsolo
carcterconelcarcter'\'?Intentemosdenuevo.
$
$
$
$

# Generamos el fichero con el comando


echo "banner \`date '+%D %T'\`" > fichero_ordenes
# Comprobamos el contenido del fichero
cat fichero_ordenes

banner `date '+%D %T'`

Ahorasi.Vamosausarlashelldelamismaformaqueharamosconun
programanormalredirigiendolaentradaestndardesdeestefichero.Por
lotantoelficherotienetratamientodedatosysoloserequierepermisode
lecturaparaejecutarlodeestaforma.
$
$
$
$

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

Para ejecutarlo sin redirigir entrada salida podemos pasar como


argumentoelnombredelfichero.Nuevamentesoloharfaltapermisode
lectura.

203

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

Ejecucindeunshellscriptdirectamentecomouncomando
Para ejecutarlo directamente como un comando necesitamos darle
permisodeejecucin.
$ # Ejecutar pasando el nombre del fichero como
argumento
$ chmod +x fichero_ordenes
$ ./fichero_ordenes
$FIN

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

204

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

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

205

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

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

Enestecasonosehaejecutadomedianteunasubshellperonoseaprecia
ningunadiferencia.Estonosiempreesas.Veamosunejemploenelque
seaprecieladiferencia.$$tomarelvalordelpiddelashellenejecucin
y$PPIDtomarelvalordelpiddelprocesopadre.
$echo echo \$PPID \$$ > fichero_ordenes
$ bash fichero_ordenes
213 2396
$ . ./fichero_ordenes
1 213

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

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

subshell. Por el contrario deberemos usar algo del tipo '.


./fichero_ordenes'comoacabamosdever.
Existeunficheroeneldirectorioinicialdecadausuarioqueconsisteen
unaseriedeordenesinicialesparashell.EnelcasodelaBashestefichero
es '~/.bash_profile'. Podemos ejecutarlo si queremos pero este tipo de
ficherosincluyenordenesparainicializarvariablesentreotrascosas,as
queloadecuadoseraejecutarlodesdelashellactual.Hagalosiguiente:
$ cd
$ . ./.bash_profile

Observequehaytrespuntosenelltimocomandocontressignificados
distintos.Elprimeroesparaejecutarconlashellactual,elsegundoes
paraindicareldirectorioactual,yelltimoformapartedelnombreyse
usaparaquenoseatanvisibledadoqueunpuntoalprincipiodelnombre
deunficheronoserexpandidoporlashellcuandousemos'*'.
Vamosacomprobarlaaccindelnmeromgico.Paseaundirectorio
parapracticarsusejercicios,yediteunnuevoficheroquedebellamarse
'aviso'.
echo "Error este shell-script debi arrancarse con . /
comando"

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

Vamos a ejecutar nuestro shellscript de dos formas distintas y


observamos que el resultado no es el mismo. En el segundo caso se
ejecuta el script 'aviso'. Este ltimo ejemplo no es completo ya que

207

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

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


independientedeltextoymostrarsiempreunmensajedeaviso.
$
$
$
$
$

# (1) Se ejecuta usando una sub-shell pero en este


# caso se pasa un argumento a la sub-shell y por ello
# no se ejecuta el cdigo del fichero comando.
chmod +x aviso
./comando

Error este shell-script debi arrancarse con . /comando


$ # (2) Ahora ejecutamos con la shell actual
$ . ./comando
COMANDO

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

208

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

Estamos avanzando muy deprisa, y por eso tenemos que practicar


bastante para consolidar los conocimientos. No siempre resulta trivial
averiguarcomofuncionanlascosas.Observeelsiguienteejemplo:
$ echo $$ ; ( echo $$ ; ( echo $$ ) )
218
218
218

Nuevamente el resultado puede ser distinto en su ordenador pero lo


importanteesque'echo$$'pareceobtenerelmismopidpeseaocurriren
distintas subshells. Cuando parece ocurrir algo distinto de lo que
nosotros esperbamos resultamuytil usarelmodotraza con'setx'.
Repetimoselejemplomisteriosodeantes.
$ set -x
$ echo $$ ; ( echo $$ ; ( echo $$ ) )
+ echo 218
218
+ echo 218
218
+ echo 218
218
$ set +x

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

209

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

Ahora que ya sabemos que es un shellscript vamos a ir aprendiendo


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

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

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

valordelosparmetrossegundoytercerorespectivamente.Lavariable$#
tomarelvalordelnmerodeparmetrosqueusemos.Lavariable$*
tomaelvalordetodoslosparmetrosconcatenados.Vamosaponerun
ejemploquellamaremos'pru_parametros'.Debeeditarlo,darlepermisos
deejecucinconchmod+xporejemployejecutarlopasandodistintos
parmetros.'./pru_parametros','./pru_parametroshola','./pru_parametros
pararm1param2param3'.
# pru_parametros
echo "Numero de parmetros = $#"
echo '$0=' $0
echo '$1=' $1
echo '$2=' $2
echo '$3=' $3
echo '$*=' $*

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

211

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

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

Laejecucindeestapruebaquedaracomosigue.

212

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

pararm1 param2 param3

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

213

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

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

Sitecleamos'set'despusdeestoveremostodaslasvariablesdefinidasy
tambinaparecerestafuncinqueacabamosdecrear.
$ set

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

214

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

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

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

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

Paradefinirlasintaxisdeunafuncinenshellscriptpodramosusarlo
siguiente:
_nombre_funcion_ () { _lista_de_ordenes_ }

Una lista de ordenes sera una o ms ordenes separadas por algn


operadorcomoporejemplo';','||','&&','&'o.Recuerdequeelshell
scripttieneunsignificadosimilara';'ysideseasuprimirestesignificado
deberprecederinmediatamentecon'\'paraescaparelcarcteryqueno
sea interpretado por la shell. En una cadena delimitada por comillas

215

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

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

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

Ejecutaremosesteejemplo
216

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

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

Esperamosqueejemplostancomplicadoscomoestosdosltimosnole
desanimenparacontinuarconelcurso.
Comandotest

217

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

Como ya dijimos el lenguaje shellscript utiliza muy frecuentemente


comandosexternosdelsistemaoperativo.Queremosexplicarelcomando
'test'antesdeexplicarlassentenciascondicionalesdebashporquedeesta
formapodremosusarejemplosmscompletos.
'test'esuncomandoexternoquedevolveruncdigoderetorno0o1
dependiendodelresultadodelaexpresinquesigaacontinuacin.
Seusamuchsimoytienedosformatos.'test<expr>'o'[<expr>]'.ambas
formassonequivalentes.
LasexpresionesdeestetipoquesolopuedenvalerTRUEoFALSEse
denominanexpresioneslgicas.
Comprobacinsobreficheros
r<fichero>

TRUEsielficheroexisteyeslegible.

w<fichero>

TRUEsielficheroexisteysepuedeescribir.

x<fichero>

TRUEsielficheroexisteyesejecutable.

f<fichero>

TRUEsielficheroexisteyesdetiporegular
(normal).

d<fichero>

TRUEsiexisteyesundirectorio.

c<fichero>

TRUEsiexisteyesundispositivoespecialde
caracteres.

b<fichero>

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

<cadena1>
<cadena2>

<cadena1>
<cadena2>

!=

TRUEsiambascadenassonidnticas.OJOhay
dejarespaciosaunladoyotrodelsignoigual
paranoconfundirlaordenconunaasignacin.
TRUEsisondistintas.
TRUEsinoescadenanula.(Unavariableque
no

existe
devuelvecadenanula).

<cadena>

Comparacindenmeros
<num1>
<num2>

eq

<num1>
<num2>

ne

<num1>
<num2>

gt

<num1>
<num2>

ge

<num1>

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

lt TRUEsi<num1>menorque<num2>.

219

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

<num2>
<num1>
<num2>

le

TRUEsi<num1>menoroigualque<num2>.
Operadoreslgicos

!
<expresin_logi
ca>

OperadorlgicoNOTretornaTRUEsi
<expresin_logica>es
FALSEyretornaFALSEsi
<expresin_logica>esTRUE.

<ExprLogi1>a
<ExprLogi2>

Operador lgico AND retorna TRUE si


<ExprLogi1>y<ExprLogi2>sonambasTRUE
yFALSEencasocontrario.

<ExprLogi1>o
<ExprLogi2>

Operador lgico OR retorna TRUE si


<ExprLogi1> o <ExprLogi2> son alguna de
ellasTRUEyFALSEencasocontrario.
Agrupacindeexpresiones

(<expr>)

Se pueden usar parntesis para agrupar


expresioneslgicas.EsdecirquevalganTRUE
oFALSE

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

220

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

; echo $?

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

] ; 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 $?
1

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

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

225

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

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

PROGRAMACIONSHELLSCRIPT(TerceraParte)
Sentenciacondicional'if'
Yahemosvistounaformadehacerlousandolosoperadore'||'o'&&'dela
shell, pero existen formas que pueden resultar ms versatiles y ms
legibles.
if

fi

_condicin_
then _lista_de_ordenes_
[ elif _condicin_
then _lista_de_ordenes_ ] ...
[ else _condicin_ ]

Enlugarde_condicin_podramoshaberpuesto_lista_de_ordenes_pero
queremosresaltarqueelcdigoderetornovaaserevaluado.
226

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

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

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

Tambin podemos programar una accin para cuando se cumpla una


condicinyotraparacuandonosecumpla.
# Si La variable 'modo' contiene el valor 'lp'
imprimir el fichero $FICH
# en caso contrario sacarlo por pantalla.
if [ "$modo" = "lp" ]
then lp $FICH
else cat $FICH
fi

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

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

Para usar este ltimo ejemplo ejectute './tipofichero ..' o './tipofichero


tipofichero'
Tengaencuentaquesibienla'bash'admiteelusode'elif'quizasotras
shellnoloadmitan.
Setenciacondicional'case'
Ya hemos visto que con 'elif' podemos evaluar distintas condiciones
programandounaaccinparacadacaso.
Existeuncasoespecial.Imaginemosquedeseamosevaluarunavariabley
enfuncindeloquecontengahacerunacosauotra.Podramosusaruna
sentenciacondicionalconabundantes'elif'perohayquetenerencuenta
unacosa.Con'elif'tenemosqueirevaluandoacadapasohastaquese
228

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

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

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

229

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

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

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

230

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

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

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

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

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

Existeunbuclemuysimilaryquesolosediferenciaenquenoparanunca
hastaquesecumplalacondicin.Esdecirjustoalrevsqueantes.
until _condicin_
do
_lista_de_ordenes_
done

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

Cuandopulsemos<INTRO>directamentesinnadamsLINEAvaldr""
y'test$LINEA'devolverFALSEyelbuclefinalizar.
Vamosaejecutarelejemploparacomprobarsufuncionamiento.
$ ./pru_while1
aaaaa
(aaaaa)
bbbbb
(bbbbb)
()

232

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

VemosqueenlaltimaejecucinLINEAvala"".
Bucle'for'
Seproporcionaunalistadeelementosyseejecutaunalistaderdenes
haciendoqueunavariablevayatomandoelvalordecadaunodeestos
elementos.Entreestasordenessepuedeutilizarunnuevobucle'for'.
ElsiguienteejemplofuncionaperoesunamalaideayaquesuponeVarias
ejecucionesdeuncomandocuandosepodahaberhechoconunosolo.
Habrasidomejorhacer'chmod+x*'.
for i in $*
do
chmod +x
done

$i

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

233

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

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

234

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

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

Ahora edite y pruebe el siguiente ejemplo que llamaremos


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

235

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

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

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

236

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

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

237

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

Elresultadodeejecutarestointroduciendounaseriededatosseracomo
sigue:
Introduzca algo o puse
finalizar : hhhhh
Introduzca algo o puse
finalizar : jjjj
Introduzca algo o puse
finalizar : jjjj
Introduzca algo o puse
finalizar : jjjj
Introduzca algo o puse
finalizar : ooooooooo
Introduzca algo o puse
finalizar : kk
Introduzca algo o puse
finalizar :
Ahora visualizamos los
hhhhh
jjjj
ooooooooo
kk
2 jjjj
1 hhhhh

<INTRO> directamente para


<INTRO> directamente para
<INTRO> directamente para
<INTRO> directamente para
<INTRO> directamente para
<INTRO> directamente para
<INTRO> directamente para
datos introducidos

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

238

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

Unejemposencillo:Construccindeunmen

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

239

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

Vamos a comentar algunos aspectos de este programa. Comienza con


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

240

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

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

# Bucle con let (comando interno)


typeset -i N=0
time while [ $N -le 20000 ]
do let N+=1
done
real
user
sys

0m1.413s
0m1.070s
0m0.030s

# Bucle con expr (comando externo)


typeset -i N=0
time while [ $N -le 100 ]
do N=`expr $N + 1`
done
real
user
sys

0m1.311s
0m0.230s
0m0.060s

241

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

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

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

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

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

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

244

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

Elprogramaqueacabamosdeutilizarimprimirelliteral"Holamundo"a
cadalneadedatosqueprocese.Enestecasousamossolounpardelneas
vacascomoentradadedatos.
Vamosalocalizarelbinariode'awk'
$ whereis awk
/usr/bin/awk

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

Estructuradeunprogramaawk
Unprograma'awk'puedetenertresseccionesdistintas.

Puede incluir una primera parte para que se ejecute antes de


procesar ninguna de las lneas de entrada. Se usa para ello la
245

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

palabra reservada BEGIN seguida de una o mas instrucciones


todasellasenglobadasdentrodeunpardecorchetes.'{','}'.
Puedeincluirunapartecentralqueseprocesarenteraparacada
lineadeentradadedatosyquepuedetenervariosbloques'{','}'.
Si uno de estos bloques contiene una expresin regular se
procesarsolocuandolalneadeentradaseajustealpatrndela
expresinregular.
Puedeincluirunapartefinalqueseprocesarenltimolugaruna
vezterminelalecturayprocesadodetodaslaslneasdeentrada.
SeusaparaellolapalabrareservadaENDseguidadeunaoms
instruccionestodasellasenglobadasdentrodeunpardecorchetes.
'{','}'.

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

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

246

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

Es importante que comprenda que la parte central se ejecutar tantas


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

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

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

247

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

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

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
111 222 333 444

ddd

eee

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

Editeelsiguientefichero'/tmp/delim0.awk'
{ print

"+", $3, "+", $4, "+", $1, "+", $2, "+" }

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

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

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

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

Estamos definiendo un nico carcter blanco como separador. Ahora


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

Vamos a cambiar de delimitador. Edite el siguiente fichero


'/tmp/delim3.awk'
BEGIN { FS = "\t" }
{ print "+", $1, "+", $2, "+", $3, "+", $4, "+" }

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

Seleccinderegistrosporcampo
Vamosaeditarunficheroquesimularlasalidadedatosobtenidadesde
unabasededatosrelacional.Usaremosestosdatosenvariosejemplos.
251

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

Puede corresponder a una contabilidad de un alquiler de un piso. Lo


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

Loprimeroquevemosesquetieneunacabeceradedoslneasintilesy
unfinaltambinintil.Podemosasegurarquelaslneasquedeseamos
procesarcumplirnunpatrndedosnmerosguindosnmerosguin

252

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

cuatro nmeros y lnea vertical. Vamos a editar un programa que


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

Vamosaejecutaresteejemployvamosaversusalida
$awkfcontabil1.awk<contabil.dat
3 ,
4 ,
5 ,
6 ,
7 ,
8 ,
9 ,
10 ,
11 ,
12 ,
13 ,
14 ,
15 ,
16 ,
17 ,
18 ,
19 ,
20 ,
21 ,
22 ,
23 ,
24 ,
25 ,
26 ,
27 ,
28 ,
29 ,
30 ,
31 ,
32 ,
33 ,

01-01-1999 ,
16-12-1999 ,
05-01-2000 ,
24-01-2000 ,
27-01-2000 ,
01-02-2000 ,
25-02-2000 ,
01-03-2000 ,
06-03-2000 ,
01-04-2000 ,
06-04-2000 ,
07-04-2000 ,
01-05-2000 ,
02-05-2000 ,
09-05-2000 ,
23-05-2000 ,
25-05-2000 ,
01-06-2000 ,
07-06-2000 ,
01-07-2000 ,
04-07-2000 ,
07-07-2000 ,
10-07-2000 ,
24-07-2000 ,
01-08-2000 ,
10-08-2000 ,
04-09-2000 ,
10-09-2000 ,
19-09-2000 ,
28-09-2000 ,
01-10-2000 ,

AGUA
LUZ
GAS
INGRESO
MENS
LUZ
MENS
INGRESO
MENS
AGUA
INGRESO
MENS
LUZ
INGRESO
GAS
GAS
MENS
INGRESO
MENS
LUZ
AGUA
INGRESO
GAS
MENS
INGRESO
LUZ
INGRESO
AGUA
GAS
MENS

253

,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,

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

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 '{
"mundo" }'

printf "#%10d#%10s#\n", 77,

#
77#
mundo#
$ echo | awk '{ printf "#%-10d#%-10s#\n", 77,
"mundo" }'
#77
#mundo
#
$ echo | awk '{ printf "#%+4d#%+4s#\n", 77,
"mundo" }'
# +77#mundo#
$ echo | awk '{
"mundo" }'

printf "#%04d#%+4s#\n", 77,

#0077#mundo#
$ echo | awk '{ printf "#%010.5f#%E#%g\n",
21.43527923, 21.43527923, 21.43527923 }'
#0021.43528#2.143528E+01#21.4353
$ echo | awk '{ printf "#%10.5f#%E#%g\n", 2140000,
2140000, 2140000 }'
#2140000.00000#2.140000E+06#2.14e+06

Practique un poco investigando con ms detalle el funcionamiento de


estosformatos.
Usodevariablesoperadoresyexpresiones
En'awk'podemosusartodaclasedeexpresionespresentesencualquier
lenguaje. Cualquier identificador que no corresponda con una palabra

256

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

reservadaseasumirqueesunavariable.Paraasignarunvalorseusael
operador'='
Vamosaeditarunficheroquellamaremos'ejemplexpr.awk'conalgunas
expresionesaritmticas.
{
contador = 0; # Pone a cero la variable contador
contador ++;
# Incrementa en 1 la variable contador
contador +=10; # Incrementa en 10 la variable contador.
contador *=2
# Multiplica por 2 la variable contador
print contador
contador = ( 10 + 20 ) / 2 ;
print contador
contador = sqrt ( 25 ) ; # Raiz cuadrada de 25
print contador
}

Loejecutamosyobservamoselresultado.
$ echo | awk -f ejemplexpr.awk
22
15
5

Nopodemosexplicarendetalletodoellenguaje'awk'.Setratadeque
comprendasuutilidadydequeseacapazdeutilizarloparadeterminadas
tareasenlascualesresultaextremadamentetil.
AlgunasexpresionespareceninspiradasenellenguajeC.Otrasparece
quehanservidodeinspiracinparaellenguajePerl.Enrealidadmuchos
lenguajesusanexpresionesparecidas.
Porellovamosaresumirenformadetablaunaseriedeelementosque
intervienen enlasexpresionesque'awk'escapazdemanejar.Perono
vamos a explicar en detalle cada cosa. En lugar de eso daremos una

257

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

descripcinresumidayprocuraremosquelosejemplosposteriorestengan
unpocodetodo.
Operadoresaritmticos
+

Suma

Resta

Multiplicacin

Divisin

Mdulo(resto)

Potenciacin
Operadoresdeasignacin.

var=expr

Asignacin

var++

Incrementalavariableenunaunidad

var

Decrementalavariableenunaunidad

var+=
expr_aritm

Incrementalavariableenciertacantidad

var=
expr_aritm

Decrementalavariableenciertacantidad

var*=
expr_aritm

Multiplicalavariableporciertacantidad

var/=
expr_aritm

Dividelavariableporciertacantidad

var%=
expr_aritm

Guardaenlavariableelrestodesudivisinpor
ciertacantidad

var^=
expr_aritm

Elevaelvalordelavariableenciertacantidad
Operadoreslgicosyderelacin.

expr_aritm==
expr_aritm

Comparacindeigualdad

expr_aritm!=

Comparacindedesigualdad
258

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

expr_aritm
expr_aritm<
expr_aritm

Comparacinmenorque

expr_aritm>
expr_aritm

Comparacinmayorque

expr_aritm<=
expr_aritm

Comparacinmenorigualque

expr_aritm>=
expr_aritm

Comparacinmayorigualque

expr_cad~
expr_regular

Seajustaalpatrn

expr_cad!~
expr_regular

Noseajustaalpatrn

expr_logica||
expr_logica

OperadorlgicoAND(Y)

expr_logica&&
OperadorlgicoOR(O)
expr_logica
!expr_logica

OperadorlgicoNOT(NO)
Funcionesaritmticas.

atan2(y,x)

Retornaelarcotangentedey/xenradianes

cos(x)

Retornaelcosenodexenradianes

exp(x)

Retornaelexponencialdex(e^x)

int(x)

Retornaelvalorenterodextruncadolaparte
decimal

log(x)

Retornaellogaritmoneperianodex

rand()

Retornaunvalorseudoaleatoriocomprendidoentre
0y1

sin(x)

Retornaelsenodexenradianes

sqrt(x)

Retornalaraizcuadradadex

srand(x)

Inicializalasemillaparagenerarnmeros
pseudoaleatorios
259

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

Funcionesparausarconcadenasdecaracteres
gsub(r,s,t)

Sustituye's'globalmenteentodo't'cadavezquese
encuentreunpatrnajustadoalaexpresinregular
'r'.Sinoseproporciona't'setoma$0pordefecto.
Devuelveelnmerodesustitucionesrealizado.

index(cadena,
subcadena)

Retorna la posicin de la 'subcadena' en 'cadena'


(Primeraposicin=1)

length(cadena)

Devuelvelalongituddela'cadena'.Tomar$0por
defectosinoseproporciona'cadena'

split(cadena,
array,sep)

Parte'cadena'enelementosde'array'utilizando'sep'
comoseparador.Sinoseproporciona'sep'seusar
FS.Devuelveelnmerodeelementosdelarray

sub(r,s,t)

Sustituye's'en't'laprimeravezqueseencuentreun
patrnajustadoalaexpresinregular'r'.Sinose
proporciona't'setoma$0pordefecto.Devuelve1si
tienexitoy0sifalla

substr(cadena,
beg,len)

Devuelveunasubcadenade'cadena'queempiezaen
'beg' con una longitud 'len'. Si no se proporciona
longituddevuelvehastaelfinaldelacadenadesde
'beg'

tolower(cadena) Pasaaminsculas
toupper(cadena) Pasaamaysculas

Algunasotrasfunciones
match(cadena,
expr_reg)

Indicasi'cadena'seajustaonoalaexpresinregular
'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
9,
2, 25-02-2000, LUZ
16,
3, 02-05-2000, LUZ
23,
4, 04-07-2000, LUZ
29,
5, 04-09-2000, LUZ
Consumo promedio = -12858

,
,
,
,
,

-15797,
-12475,
-11449,
-12403,
-12168,

-15797
-28272
-39721
-52124
-64292

Los datos que estamos usando para el ejemplo estn ordenados por
fechas.Vamosaobteneruninformeconuncampomsqueserelsaldo
de la cuenta. Para ello editamos un fichero que llamaremos
'contabil3.awk'.

261

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
BEGIN {
FS="\|" ;
cont_importe=0;
}
/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
cont_importe = cont_importe + $3 ;
printf ("%3d, %s, %s, %s, %10d\n", NR, $1, $2, $3,
cont_importe);
}

Vamosaejecutaresteejemployvamosaversusalida
$awkfcontabil3.awk<contabil.dat
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,

01-01-1999,
16-12-1999,
05-01-2000,
24-01-2000,
27-01-2000,
01-02-2000,
25-02-2000,
01-03-2000,
06-03-2000,
01-04-2000,
06-04-2000,
07-04-2000,
01-05-2000,
02-05-2000,
09-05-2000,
23-05-2000,
25-05-2000,
01-06-2000,
07-06-2000,
01-07-2000,
04-07-2000,
07-07-2000,
10-07-2000,
24-07-2000,
01-08-2000,
10-08-2000,
04-09-2000,
10-09-2000,

AGUA
LUZ
GAS
INGRESO
MENS
LUZ
MENS
INGRESO
MENS
AGUA
INGRESO
MENS
LUZ
INGRESO
GAS
GAS
MENS
INGRESO
MENS
LUZ
AGUA
INGRESO
GAS
MENS
INGRESO
LUZ
INGRESO

,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,

262

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

96
-14554
-30351
-64526
76674
-19418
-31893
-127985
-26685
-122777
-138636
-4636
-103611
-115060
-20060
-41488
-57940
-156915
-26915
-125890
-138293
-143854
-44854
-56802
-155777
-33422
-45590
83410

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
31,
32,
33,
34,

19-09-2000,
28-09-2000,
01-10-2000,
10-10-2000,

AGUA
GAS
MENS
INGRESO

,
,
,
,

-10529,
-2620,
-98975,
112000,

72881
70261
-28714
83286

Sentenciascondicionalesybucles
'awk'esunlenguajemuycompletoynopodafaltarlassentencias de
ejecucincondicionalydeejecucinenbucle.
Algunos de los conceptos que vamos a comentar ya los hemos visto
cuandohablamosdelaprogramacinenbashynovamosaexplicarcon
demasiadodetallecadatipodesentencia.Lasintaxisqueusaawknose
parecealasintaxisqueyahemosvistoparabash.Separecemsala
sintaxisdellenguajeC.Detodasformaslosconceptosyanosresultan
familiaresyusaremosalgunosejemplosparailustrarlos.
Empezaremos describiendo la sintaxis de cada tipo de sentencia.
Denominaremos accin a una sentencia simple o a una sentencia
compuestadelaforma'{sentencia1;sentencia2;...}'
Sentencia condicional 'if'
if ( expresin_lgica )
accion1
[ else
accion2 ]
Sentencia condicional con los operadores '?' y ':'
expresion_lgica ? accion1 :accion2
Bucle 'while'
while(expresin_lgica)
accion

263

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Bucle 'do' 'while'
do
accion
while ( expresin_lgica )
Bucle 'for'
for ( inicializar_contador ; comprobar_contador ;
modificar_contador )
accion

Dentrodelosbuclespodemosusarbreakparaforzarlasalidadeunbucle
ocontinueparasaltaralasiguienteiteracin.
Veremosdemomentotansolounejemploparalasentenciacondicional
'if'.
Editeelsiguienteficheroquellamaremos'contabil4.awk'
BEGIN { FS="\|" ; }
/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
if ( $3 >= 0) {
printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3);
}
}

Vamosaejecutaresteejemployvamosaversusalida
$awkfcontabil4.awk<contabil.dat
3,
7,
11,
14,
17,

01-01-1999,
27-01-2000,
06-03-2000,
07-04-2000,
09-05-2000,

INGRESO
INGRESO
INGRESO
INGRESO

264

,
,
,
,
,

96
141200
101300
134000
95000

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
21,
25,
28,
30,
34,

07-06-2000,
10-07-2000,
10-08-2000,
10-09-2000,
10-10-2000,

INGRESO
INGRESO
INGRESO
INGRESO
INGRESO

,
,
,
,
,

130000
99000
122355
129000
112000

Pasarvaloresalscriptawk
Enocasionespuederesultarinteresantepoderpasaralgnvaloralscript
awk. Vamos a modificar el programa anterior para que muestre los
registros con un importe superior a un valor que pasaremos por
parmetro.
Editeelsiguienteficheroquellamaremos'contabil5.awk'
BEGIN { FS="\|" ; }
/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
if ( $3 >= minimo && $3 <= maximo ) {
printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3);
}
}

Vamosaejecutaresteejemplopasandoyvamosaversusalida
$awkfcontabil5.awkminimo=100000maximo=120000<
contabil.dat
11, 06-03-2000, INGRESO ,
34, 10-10-2000, INGRESO ,

101300
112000

Hayqueadvertirqueelpasodeparmetrosequivaleadefinirunavariable
yaasignarunvalorperoestovalornoseraccesiblehastadespusdeleer
el primer registro. Si el valor pasado como parmetro tuviera que ser
accesibleenlaseccinBEGINhabraqueusarlaopcinvprevioalpaso
delparmetro.

265

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

Repetiremoselejemplopasandoeldelimitadordelregistroqueusaremos
enlaseccinBEGIN.
Editeelsiguienteficheroquellamaremos'contabil6.awk'
BEGIN { FS = delimitador ; }
/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
if ( $3 >= minimo && $3 <= maximo ) {
printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3);
}
}

Vamosaejecutaresteejemplopasandovaloresyvamosaversusalida
$ awk -f contabil6.awk minimo=100000 maximo=120000
deliminador='|' < contabil.dat

Vemosquenohemosobtenidoelresultadoesperado.
Vamosavolveraejecutaresteejemplopasandoelvalordeldelimitador
conlaopcinvyvamosaversunuevasalida
$awkvdelimitador='|'fcontabil6.awkminimo=100000
maximo=120000<contabil.dat
11, 06-03-2000, INGRESO ,
34, 10-10-2000, INGRESO ,

101300
112000

Declaracindefunciones
Comoeslgico'awk'permiteladeclaracindefunciones.Normalmente
se recurre a implementar una funcin cuando necesitamos una
funcionalidad que el lenguaje no proporciona de forma predefinida o
cuando queremos estructurar el cdigo de un programa grande en
fragmentosmspequeosyportantomsmanejables.
266

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

Lasintaxisesmuysencilla.
function nombre_de_la_funcin ( lista_de_parmetros ) {
sentencias
}

Porejemploparadeclararunafuncinqueretorneunnmeroaleatorio
entre1y6.
Editeunficheroconnombre'dado.awk'.
function aleatorio ( minimo, maximo ){
return ( ( ( maximo - minimo + 1 ) * rand () ) +
minimo ) ;
}
END{

for (i=0; i<20; i++){


printf ("%3d) Entre 1 y 6 = %3d
Entre 5 y 15 =%3d\n",
i, aleatorio (1, 6),
aleatorio(5, 15));
}
}

Ahoraloejecutamos
$echo|awkfdado.awk
0)
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
11)
12)

Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre

1
1
1
1
1
1
1
1
1
1
1
1
1

y
y
y
y
y
y
y
y
y
y
y
y
y

6
6
6
6
6
6
6
6
6
6
6
6
6

=
=
=
=
=
=
=
=
=
=
=
=
=

5
6
6
5
3
3
4
6
5
3
6
5
6

267

Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre
Entre

5
5
5
5
5
5
5
5
5
5
5
5
5

y
y
y
y
y
y
y
y
y
y
y
y
y

15
15
15
15
15
15
15
15
15
15
15
15
15

=
=
=
=
=
=
=
=
=
=
=
=
=

12
7
7
13
8
6
7
7
6
10
14
10
11

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
13)
14)
15)
16)
17)
18)
19)

Entre
Entre
Entre
Entre
Entre
Entre
Entre

1
1
1
1
1
1
1

y
y
y
y
y
y
y

6
6
6
6
6
6
6

=
=
=
=
=
=
=

4
5
2
1
3
2
2

Entre
Entre
Entre
Entre
Entre
Entre
Entre

5
5
5
5
5
5
5

y
y
y
y
y
y
y

15
15
15
15
15
15
15

=
=
=
=
=
=
=

12
15
9
9
14
14
7

Funcinsystem
Estaesunafuncinfcildeusarquenospermiteejecutaruncomandodel
sistemaoperativo.Encasodexitoretorna0,yencasodeerrorretornar
unvalordistintodecero.
$ awk ' BEGIN { if (system("ls") !=0) printf ("Error
de ejecucin\n"); }'

Por ejemplo si quisiramos verificar la existencia de un fichero


almacenadoenlavariable'nombre_fich'tendramosquehacer
if (system("test -r " nombre_fich)) {
fprintf ("%s no encontrado\n", nombre_fich);
}

Lafuncingetlineyotrasfuncionesavanzadas
Esteesesunapartadoenelquemsqueexplicarcosasnosvamosa
limitaramencionarciertasposibilidades.Nopodemosdedicardemasiado
espacioaestetipodecuestionesavanzadasperosiconloqueeneste
apartadocontemosconseguimosponerlelosdienteslargosnosdaremos
porsatisfechosaunquenoentiendaunapalabra.
En primer lugar hay que advertir que 'getline' que al igual que otras
funcionesdevuelveunvalorperosusintaxisnoesunatpicasintaxisde
funcin.Noseusacomo'getline()'sinocomounasentencia.

268

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

Estafuncinretorna1sileeunalnea,0sialcanzaelfindelaentradade
datosy1siseproduceunerror.
Usadasimplementecomo'getline'sinnadamsleelasiguientelineadela
entradaasignando$0ydesglosandoloscamposen$1,$2,$3,etc..
Sepuedeasignarelvalorcompletodelalnealedaaunavariablecon
'getlinevariable'evitandodeestaformaalterarelvalorde$0.
Sepuedeleer deunficherousandoeloperadorredireccin. 'getline <
"fichero"'.Sepuedesimbolizarlaentradaestndarcomo""
Sepuedeleerdesdeunpipe.'"whoami"|getlineusuario'.
Editeunficherollamado'tipo_usuario.awk'.
BEGIN {
"whoami" | getline usuario
if ( usuario ~ /root/ ) {
printf ("Soy superusuario\n");
}
else{
printf ("Soy usuario normal\n");
}
}

Ejecutelocon
$ awk -f tipo_usuario.awk

Nopretendemos conestesencilloejemploqueseacapazdeusarestas
funciones.Elmanejodeestasredireccionesescomplicadoyenocasiones
sehacenecesarioforzarelcierredeunaentradaodeunpipe.Paraeso
existe la funcin 'close'. Se usa haciendo 'close ("fichero")' o 'close
("whoami")'.

269

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

Porelmomentonosconformamosconloexplicadoyveremosunpoco
msadelanteelusodegetlinetomandolaentradadeunficherocuando
expliquemoslosarraysasociativos.
Arrays
Los array permiten el almacenamiento de una serie de elementos que
puedenseraccedidosmedianteunndice.Enrealidadlosarraysdeawk
son ms potentes que los arrays que vimos cuando estudiamos la
programacin de la bourneshell donde los ndices de un array eran
siemprenmerosenteros.Vamosausarenprimerlugarlosarraysdeesta
forma. Es decir nos vamos a limitar en los primeros ejemplos a usar
nmerosenteroscomondices.
Vamos a usar awk para procesar la salida obtenida con 'ps'. Primero
vamosasuponerqueobtenemosunlistadocompletodelosprocesosdel
sistema en formato largo. Si intenta realizar este ejemplo obtendr un
resultadonecesariamentediferente.
$psaxl>psaxl.out;catpsaxl.out
FLAGS
UID
PID PPID PRI
STA TTY TIME COMMAND
100
0
1
0
0
?
0:03 (init)
40
0
2
1
0
?
0:18 (kflushd)
40
0
3
1
0
?
0:18 (kupdate)
840
0
4
1
0
?
0:00 (kpiod)
840
0
5
1
0
?
0:15 (kswapd)
140
0
186
1
0
?
0:00 /sbin/sys
140
0
188
1
0
?
0:00 (klogd)
140
1
193
1
0
?
0:00 (portmap)
140
0
195
1
0
?
0:00 (inetd)

NI

SIZE

756

RSS WCHAN
0 do_select

SW

0 bdflush

SW

0 kupdate

SW

0 kpiod

SW

0 kswapd

SW

900

200 do_select

1016

0 do_syslog

SW

780

0 do_select

SW

860

0 do_select

SW

270

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

?
?
?
?
?
?
?
?
?
1
2
3
4
5
6
?
?
?
?
?
3
6
?
6
6

140
0
200
0:00 /usr/sbin
140
0
210
0:00 (lpd)
40
31
226
0:00 (postmast
140
0
237
0:00 sendmail:
140
0
241
0:01 /usr/sbin
40
0
244
0:00 /usr/bin/
40
1
254
0:00 /usr/sbin
40
0
257
0:00 /usr/sbin
140
0
262
0:07 /usr/sbin
100
0
268
0:00 -bash
100
0
269
0:00 (getty)
100 1001
270
0:00 -bash
100
0
271
0:00 (getty)
100
0
272
0:00 (getty)
100 1001
273
0:00 -bash
140
33
274
0:00 (apache)
140
33
275
0:00 (apache)
140
33
276
0:00 (apache)
140
33
277
0:00 (apache)
140
33
278
0:00 (apache)
0 1001
916
0:00 vi awk1.d
0 1001 1029
0:00 xinit /ho
100
0 1034
0:02 X :0 -bpp
0 1001 1037
0:01 mwm
40 1001 1042
0:00 bash /hom
40 1001 1045

764

108 nanosleep

908

0 do_select

SW

3784

0 do_select

SW

1728

316 do_select

1292

184 do_select

1544

56 do_select

840

96 nanosleep

860

164 nanosleep

1780

60 do_select

1964

616 read_chan

836

0 read_chan

2096

836

0 read_chan

SW

836

0 read_chan

SW

2088

262

1792

0 wait_for_co SW

262

1792

0 flock_lock_ SW

262

1792

0 flock_lock_ SW

262

1792

0 flock_lock_ SW

262

1792

0 flock_lock_ SW

270

3536

273

1916

1029

12

8824

3280 do_select

1029

4620

2748 do_select

1037

1728

924 wait4

1037

1728

924 wait4

271

724 wait4

1408 wait4

1640 do_select
668 wait4

SW
S

S
S

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

0:00 bash /hom


0
0 1050
6 0:00 xterm -ls
0 1001 1058
6 0:00 xclock -d
100 1001 1051
p0 0:00 -bash
100000 1001 1074
p0 0:00 ps axl

1042

2976

1872 do_select

1045

2320

1220 do_select

1050

14

2080

1400 wait4

1051

17

1068

528

Para dar una idea de la situacin de parentescos entre los distintos


procesosmostramoslasalidaobtenidaconelcomando'pstree'ejecutado
desdelamismasesindextermqueenelcasoanterior.
$pstreep>pstreep.out;catpstreep.out

init(1)-+-apache(262)-+-apache(274)
|
|-apache(275)
|
|-apache(276)
|
|-apache(277)
|
`-apache(278)
|-atd(254)
|-bash(268)
|-bash(270)---vi(916)
|-bash(273)---xinit(1029)-+-XF86_S3V(1034)
|
`-mwm(1037)+-.xinitrc(1042)---xterm(1050)---bash(1051)--pstree(1068)
|
`-.xinitrc(1045)---xclock(1058)
|-cron(257)
|-getty(269)
|-getty(271)
|-getty(272)
|-gpm(200)
|-inetd(195)
|-kflushd(2)
|-klogd(188)
|-kpiod(4)
|-kswapd(5)
|-kupdate(3)
|-lpd(210)
|-portmap(193)
|-postmaster(226)
|-sendmail(237)

272

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
|-sshd(241)
|-syslogd(186)
`-xfs(244)

SolovamosaprocesarloscamposPIDyPPID.$3y$4respectivamente.
Losmeteremosenunpardearraysllamadospidyppid.
BEGIN { ind=0;

function padre(p){
for (i=0; i <ind; i++){
if (pid[i]== p)
return ppid[i];
}
}
! /FLAGS/ { pid[ind]=$3 ; ppid[ind]=$4 ; ind++ ; }
END {
do {
printf ("%d->", proc);
proc= padre(proc);
} while ( proc >= 1 )
printf ("\n\n");
}

Ahoraejecutamospasandoelpiddelprocesodelcualdeseamosaveriguar
sudescendencia.
$ awk -f ancestros.awk proc=1051 < ps-axl.out
1051->1050->1042->1037->1029->273->1->

Con un nmero realmente reducido de lneas de cdigo acabamos de


procesarlasalidadeuncomandoquenoestabaespecialmentediseado
paraserprocesadosinoparaentregarunresultadolegible.
No se emocione todava porque solo hemos utilizado los arrays con
indicesnumricos.Lociertoesquelosarraysde'awk'adiferenciadelos
273

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

arrays de otros lenguajes son arrays asociativos. Eso significa que


podemos usar como ndice una cadena de caracteres. Por ejemplo
podemos hacer lo siguiente: nombre_cli["5143287H"]="Luis, Garca
Toledano"
Noesnecesariodaruntamaoalarray.Unarrayasociativonoestablece
unordenentresuselementos.Hayqueaclararqueelmanejodeunarray
conndicesnumricoscorrespondeaunmecanismomuysimpleyaquese
usan porciones consecutivas de memoria del ordenador y se accede
directamente por posicin. Por el contrario un array asociativo de las
caractersticasde'awk'sevacreandodinmicamente.Internamente'awk'
gestionaelaccesomedianteunatcnicadehashqueusatablasauxiliares
amododetablasdendicesyfuncionesauxiliaresqueobtienevalores
numricosapartirdevaloresdeunacadena.Todoellopermiteunacceso
muyrpidoenestetipodeestructurashacindolasadecuadasparasuuso
enbasesdedatos.
FTLSUSE |CURSOS |FTLinuxCourse para SuSE
| 11800
FTLREDH |CURSOS |FTLinuxCourse para RedHat
| 11800
ASUSCOM |HARDWARE|Asuscom ISDNLink 128k Adapter (PCI)
| 6865
RAILROAD|JUEGOCOM|Railroad Tycoon (Gold Edition)
| 7700
CIVILIZ |JUEGOCOM|Civilization: Call to power
| 7700
MYTHII |JUEGOCOM|Myth II
| 7700
LIAPPDEV|LIBROS |Linux Application Development (537
Pginas)
| 11000
CONECT01|LIBROS |Gua del Usuario de Linux (413 Pginas)
| 5300
CONECT03|LIBROS |Gua del Servidor (Conectiva Linux 437
Pginas)
| 5300
CONECT02|LIBROS |Gua del Administrador de redes (465
Pginas)
| 5300
LIUSRESU|LIBROS |Linux User's Resource (795 Pginas)
| 12000
RH70DLUX|LINUXCOM|RedHat Linux 7.0 Deluxe en espaol
| 9600

274

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
RH70PROF|LINUXCOM|RedHat Linux 7.0 Profesional en Espaol
| 20000
SUSE70 |LINUXCOM|Suse Linux 7.0 (6CDs)(Version espaola)
| 6850
RTIME22 |LINUXCOM|RealTime 2.2 (1CD)
| 13000
CONCT50E|LINUXCOM|Conectiva Linux 5.0 Versin Econmica
Espaol (6CDs)
| 5200
CITIUS22|LINUXCOM|Linux Citius 2.2
| 7750
TRBLIW60|LINUXCOM|Turbolinux Workstation 6.0
| 6500
MOTIF
|LINUXCOM|Motif Complete
| 22000
CONCTSRV|LINUXCOM|Conectiva Linux Ed.Servidor (Espaol
3CDs + 4 Manua
| 27500
RHORA8I |LINUXCOM|RedHat Linux Enterprise Edition optimized
for Oracle8i |270000
MANDRA72|LINUXCOM|Mandrake 7.2 (7CDs) PowerPack Deluxe
(versin espaola| 8300
PINGUINO|SUSEPROM|Pingino de peluche
| 6000

BEGIN {
FS="[\ \t]*\|[\ \t]*" ;
while ( getline < "articulos.dat" > 0) {
artic[$1]= "(" $4 " Ptas + Iva) " $3;
printf ("%s ", $1);
}
for (;;){
printf ("\n\nIntroduzca un cdigo de artculo o
solo para terminar: ");
getline codigo ;
if (codigo == "" )
break;
printf ("\n<%s>\n%s", codigo, artic[codigo]);
}
}
$ awk -f articulos.awk
FTLSUSE FTLREDH ASUSCOM RAILROAD CIVILIZ MYTHII
LIAPPDEV CONECT01 CONECT03
CONECT02 LIUSRESU RH70DLUX RH70PROF SUSE70 RTIME22

275

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
CONCT50E CITIUS22 TRBLIW60
MOTIF CONCTSRV RHORA8I MANDRA72 PINGUINO
Introduzca un cdigo de artculo o solo
terminar: RH70PROF

para

(20000 Ptas + Iva) RedHat Linux 7.0 Profesional en


Espaol
Introduzca un cdigo de artculo o solo
terminar: CITIUS22

para

(7750 Ptas + Iva) Linux Citius 2.2


Introduzca un cdigo de artculo o solo
terminar:
$

para

Elprogramaqueacabamosderealizarilustralapotenciade'awk'parael
tratamientodeficherosdedatos.Sinuestroficherodedatosdeejemplo
'articulos.dat' tuviera un nmero de registros mucho mayor habramos
notadoqueinicialmentesetardaunciertotiempoenleertodoelfichero
dedatosperounavezalmacenadoslosdatosenelarraysuaccesoalos
mismosesrapidsimo.Estarpidezsedebenosoloaquelosdatosyahan
sidoledosdesdeeldiscoduroyyaestnenmemoriasinoporquetodala
informacin est indexada de forma que la localizacion de cualquier
elementodelarrayesmuyrpida.
Faltanmuchascosasporcontarsobre'awk'.Sidisponedealgnfichero
de datos de interes personal saque una copia e intente realizar alguna
utilidaden'awk'.

276

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

EJERCICIOSRESUELTOSDESHELLSCRIPT
Buenoeshoradequepruebesusconocimientos.Nosepreocupesino
consigueresolverlostodos.Paraalgoestnlassolucionesaunqueesosi,
tendrquedescargarelarchivo ejerc1.tar.gz.Disculpelamolestiapero
conestoevitamosquesusojossedesvenalasolucinantesdetiempo.
---- ## donde_esta.txt ## ---Hacer un shell-script que busque la presencia del comando
pasado como argumento en alguno de los directorios
referenciados
en la variable $PATH, sealando su localizacin y una breve
descripcin del comando caso de existir su pgina man.
---- ## estadisticas_dir.txt ## ---Programe un script llamado 'estadistica_dir.sh'
que realice un estudio de todo el arbol de directorios y
ficheros partiendo del directorio pasado como parmetro de
forma
que obtengamos la siguiente informacin:
Nmero de
lectura
Nmero de
escritura
Nmero de
ejecucin
Nmero de
lectura
Nmero de
escritura
Nmero de
ejecucin

ficheros
=
ficheros
=
ficheros
=
ficheros
=
ficheros
=
ficheros
=

en los cuales disponemos de permiso de


en los cuales disponemos de permiso de
en los cuales disponemos de permiso de
en los cuales

carecemos de permiso de

en los cuales

carecemos de permiso de

en los cuales

carecemos de permiso de

Nmero de ficheros regulares encontrados =


Nmero de directorios encontrados =

277

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Nmero de dispositivos de bloques encontrados =
Nmero de dispositivos de carateres encontrados =
Nmero de fifos encontrados =
---- ## gen_menu2.txt ## ---Programar un shell-script que admita como argumentos
parejas formadas
por 'comando' y 'descripcion' y que construya con todo ello
un menu
de opciones donde cualquiera de los comandos pueda ser
ejecutado
seleccionando la descripcion correspondiente.
Es decir si dicha shell-script se llamara 'gen_menu2.sh' un
ejemplo
de uso sera:
./gen_menu2.sh \
Listar ls \
'Quien est conectado' who \
'Fecha actual' date \
Ocupacion du \
'Quien soy' whoami \
'Memoria libre' free \
'Calendario' cal \
'Nombre mquina' hostname
Con ello se obtendra un menu de la forma:
0
1
2
3
4
5
6
7
8

Terminar
Listar
Quien est conectado
Fecha actual
Ocupacion
Quien soy
Memoria libre
Calendario
Nombre mquina

Elija opcin.
---- ## grafica.txt ## ----

278

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Realizar un shell-script que reciba como argumentos numeros
comprendidos
entre 1 y 75. Dara error en caso de que algun argumento no
este
dentro del rango y terminar sin hacer nada. En caso
contrario
generar una linea por cada argumento con tantos asteriscos
como
indique su argumento.
---- ## incr.txt ## ---Hacer un shell-scritp que utilice dos funciones 'incr1()' e
'incr2()'
las cuales ejecutaran un simple bucle iterando 1000 veces.
La funcin
'incr1()' solo usara un contador IND1 que sera
incrementado de uno en
uno usando un comando de tipo 'let' y la funcion 'incr2()'
solo usara
un contador IND2 que se incrementar de uno en uno
calculando su siguiente
valor mediante el uso del comando expr.
Hacer una tercera funcin 'PruebaDiezSegundos()' que
aceptar como argumento
el nombre de la funcin de prueba (incr1 o incr2). Primero
informara del
tiempo real, de cpu de usuario y de cpu del sistema que
consume dicha
funcin y luego deber ejecutar dicha funcin tantas veces
sea posible
en el transcurso de 10 segundos (aproximadamente, basta
usar date '+%s')
obteniendose el nmero de veces que se ejecuto en esos diez
segundos.
Compare los resultados obtenidos con ambas funciones y
explique los
resultados.
---- ## lista_fich.txt ## ----

279

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Hacer un shell-script que acepte como argumentos nombres de
ficheros
y muestre el contenido de cada uno de ellos precedido de
una cabecera
con el nombre del fichero
---- ## media.txt ## ---Hacer un shell-script que calcule la media aritmtica de
todos los argumentos pasados como parmetros con una
precisin de 40 digitos decimales despues de la coma.
---- ## mi_banner.txt ## ---Localice en su sistema la utilidad 'banner' para consola.
Puede haber
mas de una utilidad para esto y algunas estn pensadas para
su uso
con impresora. Nos interesa la utilidad 'banner' para
terminal de
forma que el comando 'banner hola' genere la siguiente
salida:

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

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

#
#
#
#
#
######

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

Partiendo de esta utilidad realice un shell-script


'mi_banner.sh' que
admita hasta tres argumentos de tamao mximo de cuatro
caracteres
tal que el comando './mi_banner.sh hola jose luis' obtenga:
ooooooooo
oooooooo _/
_/
_/_/_/_/
_/
ooooooo _/
_/
_/
_/
_/
oooooo _/_/_/_/_/_/
_/
_/
_/
ooooo _/
_/
_/
_/
_/
oooo _/
_/
_/
_/
_/
ooo _/
_/
_/_/_/_/
_/_/_/_/_/_/

280

_/_/
_/
_/
_/
_/_/_/_/_/_/
_/
_/
_/
_/
_/

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
oo
ooooooooo
oooooooo
_/
_/_/_/_/
_/_/_/_/
_/_/_/_/_/_/
ooooooo
_/
_/
_/
_/
_/
oooooo
_/
_/
_/
_/_/_/_/
_/_/_/_/_/
ooooo
_/
_/
_/
_/
_/
oooo _/
_/
_/
_/
_/
_/
_/
ooo
_/_/_/_/
_/_/_/_/
_/_/_/_/
_/_/_/_/_/_/
oo
ooooooooo
oooooooo _/
_/
_/
_/
_/_/_/_/
ooooooo _/
_/
_/
_/
_/
oooooo _/
_/
_/
_/
_/_/_/_/
ooooo _/
_/
_/
_/
_/
oooo _/
_/
_/
_/
_/
_/
ooo _/_/_/_/_/_/
_/_/_/_/
_/
_/_/_/_/
oo

---- ## mi_cal1.txt ## ---Realizar un shell-script 'mi_cal1.sh' que utitilzando la


salida del
comando 'cal' filtre su salida para resaltar entre
corchetes
el da actual. Ponga atencin a los das a principio de
lnea,
los das a final de lnea.
La salida para el da
siguiente:

5 de Mayo de 2002 debera ser la

./mi_cal1.sh
S
[5]
12
19
26

May 2002
M
Tu
6
13
20
27

7
14
21
28

W
1
8
15
22
29

Th
2
9
16
23
30

F
3
10
17
24
31

S
4
11
18
25

No es un ejercicio trivial. Necesitar hacer un filtrado en


varios pasos.
Utilice alguna combinacin de filtros sed encadenados con
pipe.

281

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Para poder comprobar que el programa funciona correctamente
para los
distintos das hacer que en caso de pasar un argumento este
ser
considerado el da del mes.
./mi_cal1.sh 1
S
5
12
19
26

May 2002
M
Tu
6
13
20
27

7
14
21
28

W
[1]
8
15
22
29

Th
2
9
16
23
30

F
3
10
17
24
31

S
4
11
18
25

---- ## mi_cal2.txt ## ---Basandose en el ejercicio anterior realizar una


modificacin
de 'mi_cal1.sh' que llamaremos 'mi_cal2.sh' que en lugar de
encadenar varios comandos sed con pipes crear un fichero
temporal
'/tmp/$0.$$.sed' para ser usar mediande la opcin -f de
sed.
Ambos scrits debern producir idntico resultado.
---- ## mi_logrotate.txt ## ---Asumiremos que tenemos en un directorio una serie de
ficheros de
log que van creciendo de forma ilimitada con el uso regular
de
ciertos programas.
Realizar un shell-script que actue sobre los ficheros con
nombre
tipo '*.log' del directorio actual de forma tal, que si
alguno de
ellos supera en tamao las 2000 lineas, dejar solo las
ltimas
1000 lneas del fichero y las restantes sern guardadas en
un

282

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
directorio old_rot en formato comprimido.
En dicho directorio habr que conservar en formato
comprimido
no solo la ltima porcin eliminada del original, sino las
cuatro
ltimas porciones eliminadas. Para ello ser necesario ir
rotando
los nombres de estos ficheros comprimidos incorporando en
los mismos
un digito de secuencia.
(parte eliminada) --> *.log.rot1.gz --> *.log.rot2.gz -->
*.log.rot3.gz --> *.log.rot4.gz --> eliminado
El programa durante su ejecucin ir mostrando los ficheros
encontrados
y sealar aquellos que por su tamao sea necesario rotar.
---- ## ocupa_tmp_log.txt ## ---Obtiene la ocupacion de los directorios presentes en el
sistema
cuyo nombre sea de la forma '*tmp' o '*log', ordenados por
orden
de ocupacion.
Debera mostrar el numero de errores provocados por 'find'.
Si se decide usar algzn fichero temporal debera usar el
directorio '/tmp' para ello y usar un nombre que contenga
el nombre del proceso que lo origino y su pid.
---- ## palabras.txt ## ---Realice un shell-script que admita tres palabras como
argumentos
y que muestre un mensaje informando de las relaciones de
igualdad
y desigualdad entre esas palabras.
"Las tres son iguales"
"Son iguales primera y segunda"
"Son iguales primera y tercera"

283

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
"Son iguales segunda y tercera"
"Son las tres distintas"
---- ## piramide.txt ## ---Realice un shell-scrip 'piramide.sh' que admita como
argumento un
nmero 'N' y que optenga a la salida una serie de 'N' filas
de
forma triangular.
Para ./piramide.sh 12 la salida sera.
01
02
03
04
05
06
07
08
09
10
11
12

02
03
04
05
06
07
08
09
10
11
12

03
04
05
06
07
08
09
10
11
12

04
05
06
07
08
09
10
11
12

05
06
07
08
09
10
11
12

06
07
08
09
10
11
12

07
08
09
10
11
12

08
09
10
11
12

09
10 10
11 11 11
12 12 12 12

---- ## proceso.txt ## ---Hacer un shell-script llamado 'proceso.sh' para ser lanzado


en background
que como maximo permanecera vivo 30 segundos.
Podra ser lanzado varias veces en background y cada vez
generara un
shell-script distinto 'stop_proceso.sh.' que al ser
ejecutado matara el proceso lo origino y despues se borrara
a si
mismo.
---- ## vigila.txt ## ---Realizar un shell-script que escriba en el fichero
'/tmp/usuarios'

284

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
una linea con la fecha y otra con el nmero de usuarios
distintos
que estn conectados en ese momento cada dos minutos.

285

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

PARTE(II)USUARIOAVANZADODELINUX
INTRODUCCINALASEGUNDAPARTEDEL
CURSO
Llevamos ya algunos captulos enlos cuales estamos tocando muchos
temasquepodranconsiderarsepropiosdeuncursodeadministracino
de un curso avanzado de Linux. Ya no hacemos tantas bromas y
suponemosqueyahaperdidosuinseguridadinicial.
Consideramos que ya a estas alturas del curso tampoco es necesario
recordarle a cada momento las precauciones de trabajo. Tambin
asumimosqueconlaconfianzaquedaelsaberdelporquedelascosasya
habrpracticadoporsucuentaalgunasotrascosasqueespecficamentele
interesaban.
Paralosqueusenordenadorpersonalyquetenganaccesoaunacuentade
rooteselmomentodedaralgnconsejoporqueesprobablequecadavez
tenganmasganasdeprobarcosasdistintasparaaprenderporsucuenta.
Paraelloslesdiremosqueexisteunamximaparatodoadministrador.
Nomodifiquesnadaquenopuedasvolveradejarcomoestaba.
En otras palabras. Siempre, siempre, antes de hacer algo asegurate la
posibilidaddepoderretrocederfcilmentealasituacininicial.
Porejemplosivasatocarunficherodeconfiguracindelsistemasaca
antesunacopiadeesefichero.Oquizslasimpleprecaucindeanotaren
unpapelunpardecosillasantesdecambiarlaspuedaevitarundisgusto.
Muyimportante.Hazregularmentecopiasdeseguridad.Nomantengas
tuscopiasenelmismodiscoquelainformacinoriginal.Comomnimo

286

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

usatrescopiasdeseguridadestableciendounsistemaderotacinentre
ellas.
Usaremoselusuariorootlomenosposiblenoparaevitarerroressinopara
evitarqueloserroresseconviertanenHorrores.
LinuxesunSOquenoimponerestriccionesarbitrariasalosusuarios.Si
una cosa no puede ser realizada por un usuario normal es porque no
suponeunaamenazaalaseguridaddelsistemaysiemprequesepuedaes
mejornousarroot.
AdmitimosqueunusuariodeLinuxqueloinstaleensupropiosistema
necesita realizar tareas deadministracin, perorootes unusuario que
debeusarselomenosposible.Errareshumanoperoeldesastretotales
cosaderoot.Porellovamosaapurarlasposibilidadesdeapreenderdesde
unacuentadeusuarionormalita
Tambin hay que advertir que no todos los sistemas son igual de
permisivos dependiendo de las necesidades reales de seguridad del
sistema o del grado de paranoia del administrador. Por ejemplo una
mquinaquedispongadeunelevadonmerodecuentasparaestudiantes
deberseradministradaconmanofirmeporquesiemprehabrmsdeun
estudiantejuguetnconganasderersedeladministrador,ybastaunode
estosparatenerunproblemaseriosinosetomanprecauciones.
Si est realizando este curso en una mquina de esas caractersticas
posiblemente no pueda hacer muchos de los ejercicios propuesto
simplemente por limitaciones impuestas desde root. El aumento de la
seguridaddeunsistemasueleresultarenunaumentodelaincomodidad
paralosusuarios.
Elpreciodelaseguridadeslaincomodidad.Elpreciodelacomodidades
lainseguridad.
Enparticularelaccesoadistintosdispositivoshardwarepuedeestarms
omenoslimitado.Nosotrosparaestasegundapartevamosasuponerque
287

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

lasrestriccionesdelsistemadondeustedvaapracticarnosonexcesivas
enestesentido.Encualquiercasoyahabrnotadoqueenlasprcticas
mostramosycomentamoslosresultadosdelasmismas.Porellonose
desanimesinopuederealizarahoraalgunasdelasprcticaspropuestas,
pero tambin sealamos que Si esta usando un ordenador personal o
disponedeunacuentaenunsistemadondelaconfianzaenlosusuarios
porpartedeladministradoreselevadapodrseguramentesacarlemayor
provechoaestasegundapartedelcurso.
COPIASDESEGURIDAD
Porquededicamosuncaptulocompletoaesto.
Este captulo trata de las Copias de Seguridad, tambin llamados
respaldosoeningls Backupsyvamosenprimerlugarajustificar la
razndededicarunampliocaptuloaestetemaquepodraparecerms
apropiadoparauncursodeadministracin.
Evidentementegarantizarlaintegridaddelainformacindeunsistemaes
untemaqueesderesponsabilidaddeladministradordelsistemapero,
comoyahemosmencionadoanteriormente,elobjetivodeestasegunda
partedelcursoincluyelasnocionesmsnecesariasparaadministrarsu
propio ordenador personal con Linux. El objetivo es que sea
autosuficiente.
Laseguridadfrenteaataquesintencionadosquedafueradelospropsitos
deestecursoperonohaydaoquenopuedaserreparadositenemosuna
copiadeseguridaddetodalainformacinquenosinteresa.
Un buen sistema de respaldo es la mejor forma de evitar perdidas de
informacin. Estas deben ser prevenidas dentro de lo posible pero
dependiendodelascausasnosiempreresultaposiblehacerlo.
Lasposiblescausasparaunaperdidadeinformacinson:

Deteriorooborradoaccidentalporpartedeunusuarioautorizado.
288

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

Ataqueintencionadoporpartedepersonasnoautorizadas.
Fallodelsoftware.
Fallodelhardware.
Virus.
Incendio,robos,ydesastresnaturales,etc.

La peor de todas es el borrado accidental por parte de un usuario


autorizado,porqueestotalmenteimposibledeprevenir.
Algopuedehacerse.PorejemploenLinuxhaysustitutosparaelcomando
'rm' que dejarn los ficheros borrados en una papelera. Tambin se
puedenseguirciertasrecomendacionesdeprudenciaqueminimicenlos
riesgosmediantedeterminadasprcticasperosiemprecabrlaposibilidad
deunfallohumano.Eltemaesamplsimoynosvamosalimitaratratar
solodeRespaldosoCopiasdeseguridad.

/===============/
Borradoaccidentaldeficheros
Debe saber que la operacin normal de borrado no destruye toda la
informacindelosficheros.Sialgunavezborraalgomuyimportanteen
unsistemadeficherosynotienecopiadeseguridad.Deberevitarvolver
atrabajarsobreesesistemadeficherosenmodolecturaescritura.Porel
contrariodebermontaresesistemadeficherosenmodosololecturay
confiarenquequedealgorecuperableenalgnlado.Hayprogramasque
puedenayudarenestassituacionessiemprequelainformacinnoest
machacadaconposterioresoperacionesdeescriturasobreesaparticin.Si
nosabequehacernohaganadaypregunteantesdeintentarcosasque
podran destruir definitivamente toda la informacin. Este tipo de
recuperacionessonsolounltimorecursoylasposibilidadesdexitono
sonmuygrandes.
Unacosaquesepuedeintentarenmodoreadonly(sololectura)esleer
directamente del dispositivo intentando filtrar cadenas de ficheros
289

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

presentes en los ficheros borrados. Por ejemplo usando grep. Si las


cadenasaparecenessealdequenosehadestruidotodalainformacin.

/===============/
Caractersticasdeunbuensistemaderespaldo
Un sistema de respaldo debe de estar perfectamente planificado. Su
planificacin deformaautomticanosiempreesposibledebidoaque
requierenconfrecuenciaintervencinhumana.Especialmentelacopias
quenocabenenunasolacinta(multivolumen).Loidealesorganizarsu
propiosistemaderespaldoenfuncindelasnecesidadesdesusistema.
En un sistema es conveniente clasificar las diferentes partes de la
informacinatendiendoasuimportancia.Loidealserahacerrespaldode
todoregularmentemanteniendodistintascopiasenrotacin.Esdecirsi
tenemostrescintasparaalmacenarrespaldos(CintaA,CintaB,yCinta
C)deberemosirgrabandosiguiendounasecuenciacircularA,B,C,A,B,
C,... La frecuencia de los respaldos se determina en funcin de lo
importantequeseanlosdatos.Generalmenteesbuenohacerunacopia
diariaalmenosdelapartedelsistemaquesupongamayorperdidade
horasdetrabajoencasodeincidente.Detodasformashayqueteneren
cuentaqueestesistemasolonospermitemantenercopiadelosltimos
tresocuatrodas.Estonoessuficienteporquemuchasvecesnosinteresa
recuperarunainformacindehaceunasemana,unmes,oinclusoms
tiempo.Porelloalgunasvecesseusanrotacionesdesietecintas(unapara
cadadadelasemana)yunavezalmessesacaotracopiaenunacinta
distinta que se conserva por un espacio de tiempo ms largo segn
convenga.
Una prctica comn es guardar regularmente copias en otro edifico
distinto para protegerse de esa forma de incendios, inundaciones,
terremotos,robos.Sidespusdeundesastreconservamoslosdatosvitales
de nuestro negocio quizs podamos resurgir de nuestras cenizas ms
tarde.

290

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

Algunasvecesnoesposiblehacerdemasiadascopiasdetodoelsistema
condemasiadafrecuencia.Porellosepuedendelimitarareascondistinto
gradodenecesidadderespaldo.Elsistemaoperativoylasaplicacionesno
suelen variar y pueden ser recuperadas desde CDs de instalacin. Es
importantesiempremantenercopiasdetodoelsistema.Encualquiercaso
siemprehadeusarserotacindecintasporqueusarunasolacopiaesmuy
arriesgado.
Lascintassonrazonablementesegurasperosepuedenromperconeluso.
De todas formas es importante que la planificacin de respaldo del
sistema no resulte complicada. Trabajar con demasiados conjuntos de
cintasdistintosnoesbueno.
Enlacopiageneraldetodoelsistemaseguramenteseguardarncosas
quevaranpocoperoquequizscostaronmuchotrabajoconfigurar.Por
tantoesunacopiaquenonecesitahacerseconfrecuenciaperodeberemos
disponersiempredealgunascopiasenbuenestadoaunquenoseanmuy
recientes.
Todaslascopiasdebensersometidasdeformaautomticaaunproceso
deverificacin queenelcasomssencilloconsisteenleerlalistade
ficherosquecontiene.Noesmuyfiableperoalmenosdetectaremoslos
fallosmsimportantes.Enelmejordeloscasoslacomprobacinsehace
sobreelcontenidocompletocomparndoloconeloriginal.Enestecaso
cuandolacopiaterminaeloriginalpuedehabercambiadoyporellola
deteccindediferenciasentreoriginalycopiapuededeberseauncambio
eneloriginalenlugardeunerrorenlacopia.
Una cosa que se usa mucho son las copias globales combinadas con
posteriorescopiasincrementales.Esunsistemacuyaprincipalventajaes
lacomodidad.
Copiaincrementalsignificaquesolosalvamosloltimoquehacambiado
desdelaltimacopiaglobal.Poresocadanuevacopiaincrementalresulta
generalmentedemayortamaoquelaanterior.
291

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

Si la copia global ocupa varias cintas. Podemos hacer copias


incrementaleshastaquedebidoasuprogresivoaumentodeocupacinno
quepanenunasolacintaporejemplo,momentoenelquesepuedehacer
una nueva copia global. En general podemos hacer una nueva copia
globalcuandolaincrementalempiecearesultarincomodadebidoasu
progresivoaumentodetamao.
Estesistemadecopiahacerecaerdemasiadaresponsabilidadenunasola
cinta.Laltimacopiaglobalsuelesermuyvoluminosaypuedecontener
informacinquenoseencuentreenningunaotracinta.
Hay actividades que pueden generar enormes ficheros de datos y eso
incrementarmucholaocupacindenuestrasiguientecopiaincremental.
Porejemplosiestamosgenerandounaimagenanimadadegrantamaoo
siestamosdescargadodeInternetimgenesdeCDsenterasdeberamos
guardaresosdatosenunsistemadeficherosespecialmentededicadoa
ello.Deestaformacuandohagamosrespaldopodemosdesmontarantes
esa particin para poder realizar respaldos independientes con la
frecuenciaqueconvengaencadacaso.
Siemprequeseaadanpaquetes,aplicaciones,seconfigurealgoconviene
volverasacarunanuevacopiaglobaldetodoelsistema.

/===============/
Lossoportesdelainformacin
Elsoportemsadecuadosonlascintas. Esunsistema quesuponeun
fuertedesembolsoinicialperoalalargaresultamsrentableymsseguro
que los dems. Adems cuando cambiemos de ordenador podremos
conservarlo.
En cualquier caso cada cinta debe de estar perfectamente etiquetada
(Identificador clave de la cinta, Tipo de copia, mquina, contenido,
formato,periodicidad,etc...)
292

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

Despus en un papel habr que registrar cada copia realizada con


identificadordelacintayfechadelacopiaquecontiene.
Es muy importante tenerunsistema bienpensadoparaqueofrezca el
mximodeseguridadconelmximodecomodidad.Hayqueestablecer
unbuenplanquedeberconvertirseenunarutinadetrabajo.Considerela
incomodidad como un gravsimo peligro porque puede derivar en
incumplimientodeesaimportanteobligacin.
Eldaquenocumplamosnuestraobligacindehacercopiaderespaldo
sereldaqueelsistemaelijaparadarleundisgusto(leydeMurphy).
Pararesultarcmododebemosautomatizarconscriptsnuestrosistemade
respaldoylascopiasnodebentardarmsdelonecesario.
Los discos duros extraibles son una buena alternativa para sistemas
caseros.Loquenotieneningnsentidoeshacercopiasdeseguridadenel
mismodiscoduroquecontienelosdatosaunqueseutiliceunaparticin
diferente. Recuerde que los discos duros pueden perder toda su
informacindeformarepentina.
Para guardar datos de inters histrico que deban conservarse durante
aossuelesermuyinteresanteusarCDs.
Losdisquetessonunmediomuypocofiableycabepocacosa.

/===============/
Respaldoporpartes
Antesquenadadebeplantearsesirealmentenecesitahacerrespaldopor
partes.Recuerdequenoconvienecomplicarmuchoelplanderespaldoy
nohaynadamssencilloquehacerrespaldodetododeunavezsiempre
queeltamaodelosdatoslopermitan.

293

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

Para determinar la necesidad de respaldo de las partes del sistema


convienequerepaselaleccinde'SistemadeFicherosIII'Concretamente
elprrafodedicadoala'Estructuraestndardelsistemadeficherosde
Linux'.Estoleayudaracomprenderlanaturalezadelosdatosenlas
distintaspartesdelsistema.
Recuerdequepuedenexistirvariaciones,enfuncindecadadistribucin.
Cadasistemadependiendodelaactividadalaqueseadedicadotendr
unasnecesidadestotalmenteespecialesderespaldo.
Laspartesdemayorintersconvistasarespaldosfrecuentessuelenser
/home/,/root/,y/usr/local/Enalgunoscasos/var/logoundirectorioque
contenga unabasededatospuedensermuyimportantes peroesoson
cosasquecadacualdebedeterminar.Siloimportanteocupamsdel50%
delsistemalomssencilloseraporcopiasglobaleseincrementalesde
todoelsistema,peroenunordenadordeusopersonalcongrancantidad
depaquetesinstaladoslaparteimportantealahoradehacerrespaldono
suelesertangrande.
La parte ms variable del sistema est en /var/ y concretamente en
/var/logesdondeseregistranloslogsdelsistemaquesonficherosque
informan de todo tipo de cosas que van sucediendo en el mismo. En
algunossistemasestoslogstienenunaimportanciamayorqueenotros.
Porejemplosiexistealgunaaplicacinquetomaestoslogsparaelaborar
estadsticas. En otros sistemas no resultar demasiado crtico que la
ltimacopiade/var/noseamuyrecienteperoqueexistaalmenosuna
copiasiesfundamental.
Hacerlascosasenunsolopasonoessiemprebuenaidea.Loprincipales
darpasosquepuedandeshacersesinosequivocamos enalgo,poreso
siempre que sea posible conviene recuperar en un lugar distinto al
original. Luego si todo ha ido bien podemos trasladar las cosas a su
destinodefinitivo.Losquesepreguntanparaquetantasprecaucionesson
losquemstardesepreguntarnasmismocosasbastantelamentables.
294

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

Cuando se pierde toda la informacin de un sistema tendremos que


recuperarlotodopartiendodelosdiscosdeinstalacinydelacopia.

/===============/
Programasdeutilidadpararealizarrespaldos
Pararealizar copiasdeseguridadpodemosusaraplicacionescompletas
pensadasparaelloofabricarnosalgoamedidacombinandounaseriede
utilidadesdelascualeslamayorayahansidomencionadasalgunavezen
captulosanteriores.Estoltimoesloquevamosahacernosotrosporque
as podr disear algo personalizado y tambin porque resulta ms
didctico.
Nosotros solo vamos describir todas estas utilidades de forma muy
enfocadaalusoquevamosahacerdeellas.Puedeusarelmanualpara
consultarloquenonecesite.
Losprogramasmstilessonaquellosquesirvenparaempaquetardentro
deunsoloficherounagrancantidaddeficherosydirectorios,comopor
ejemplo 'tar', 'cpio', y 'afio' pero de ellos hablaremos en el siguiente
captulo. Antesvamosacomentarotraseriedeprogramasquepueden
combinarconestosempaquetadoresoquesuusopuedeserinteresanteen
tareasrelacionadasconelrespaldo.
find(1)Seusarparaelaborarunalistadeficherosquedeseamossalvar.
Suversatilidadesenorme.Laopcinnewerresultardeespecialinters
enelcasodedesearhacercopiasincrementales.Observequenosotrosnos
situaremos previamente en un directorio adecuado y luego usaremos
'find.'parapasarafindnombresqueempiezancon'.'.Esdecirusaremos
caminos relativos en lugar de caminos absolutos. Esto tiene su
importancia porque de ese modo luego podremos recuperar la
informacinsitundolaenotrolugardistintoaloriginalsifueranecesario.

295

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

egrep(1) Seusaparaintercalarloentrelasalidade'find'ylaentradade
'cpio'deesaformaseaumentalaflexibilidaddeuso.Sepuedeusarpara
incluirdeterminadosficherosquecumplandeterminadaexpresinregular
y/o para excluir determinados ficheros que cumplan determinada
expresinregular.Paraexcluirseusalaopcinv.
gzip(1) Es el compresor de uso ms frecuente en Linux. Esta muy
probadoyesmuyfiable.Cuandosecolocauncompresorcomogzipo
bzip2alasalidade'cpio'ode'tar'sepierdelaposibilidaddehacercopia
multivolumen porque el compresor es el que est escribiendo en el
dispositivo en lugar de hacerlo 'cpio' o 'tar'. Afortunadamente 'afio' si
puedehacerlo.
bzip2(1)Esmseficienteenelsentidodequepuedecomprimiralgoms
peroacostadetardarmuchoms.
diff(1)Detectadiferenciasdecontenidoentredosficheros.Especialmente
adecuadoparaficherosdetexto.
md5sum(1)Permiteasociaruncdigodecomprobacinalcontenidode
unficheroodispositivo,etc..
dircomp(1) Permite comparar dos directorios analizando su contenido
recursivamente.
dirdiff(1) Permite comparar dos directorios analizando su contenido
recursivamente.Esmselaboradoqueelanterior.
mt(1) Es la utilidad que se usa para controlar las cintas magnticas.
Permiteoperacionesderebobinado,retension,lecturadeestado,etc.
dd(1) Sirveparacopiaroleerdispositivosusandoeltamaodebloque
quesedesee.Tambinpermiterealizarciertasconversiones.
Porejemploparacopiarundisquete:
296

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ dd if=/dev/fd0 of=fichero
$ dd of=/dev/fd0 if=fichero

touch(1) Sirve para actualizar la ficha de modificacin de un fichero


crendolo en caso de que no exista y se puede usar para guardar el
instanteenqueserealizaunacopiaparaluegotomaresemomentocomo
referenciaencopiasincrementales.
Por ejemplo para modificar la fecha de modificacin de un fichero
ajustndolaconlahorayfechaactualharamoslosiguiente:
$ touch fichero

Paramodificarlafechademodificacindeunficheroajustndolaconla
fechadeayerharamos:
$ touch -t yesterday fichero

Paramodificarlafechademodificacindeunficheroajustndolaconla
mismafechaqueladeunficherodereferenciaharamos:
$ touch -r fich_ref fichero

Entodosloscasossielficheronoexistesecrearcontamaoiguala
cero.
tee(1)Permitebifurcarunasalidaendos.Deesaformapodemosguardar
lalistadeficherosqueestamosentregandoa'cpio'oa'afio'conobjetode
podercompararlasluegoporejemplo.
mount(1)Montaunsistemadeficheros.
umount(1)Desmontaunsistemadeficheros.
297

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

/===============/
Programasparaempaquetarficheros'tar','cpio',y'afio'
Vamosaverahoraunaseriedeprogramascapacesdeempaquetarvarios
ficherosenunosolo.
tar(1)Essimilaracpioenelsentidodequesirvetantoparasalvarcomo
pararecuperarficheros.Lasalidapuedeseradispositivo,ficherooaun
procesoigualquecpio,peronoaceptaporsuentradaestndarunalistade
ficheros.Hayquepasarloscomoargumentos.
'tar' admite nombres de ficheros y directorios como argumentos. Los
directoriosserntratadosrecursivamente.salvandoyrecuperandotodosu
contenido. En Linux 'tar' tiene opciones para obtener una salida ya
comprimida.Paraespecificarelficherooeldispositivodondeseguardar
lacopiaseusafarchivo.
Enlugardearchivosepuedeespecificarundispositivo(/dev/dispositivo)
otambinsepuedeusarentradasalidamediante'f'.
Paracrearlacopiaseusac,paraleerlalistadeficheroseusat,ypara
extraerlosficheroseusax.Sepuedeusarcompresinconlaopcinz.
Veamosalgunosejemplos:
$ # Salvar el directorio actual completo en
'fichero.tar'
$ tar -cf fichero.tar .
$ # Lista abreviada (solo nombres de ficheros) del
contenido
$ # de la copia 'fichero.tar'
$ tar -tf fichero.tar
$ # Lista detallada del contenido de la copia
'fichero.tar'

298

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ tar -tvf fichero.tar
$ # Extraccin completa del contenido
'fichero.tar'
$ tar -xf fichero.tar

de la copia

cpio(1) Sepuedeusarparasalvarorecuperarunaseriedeficheros.Su
salidapuedeserenviadaaundispositivoaunficherooauncompresor.
Lalistadeficherosdeunpaquetecpiopuedeobtenerseconlaopcint.
Estalistadeficherossoloincluyelosnombresdelosmismos.Guardando
esta lista en un fichero, editndolo despus de forma que eliminemos
todos menos aquellos que queramos recuperar podremos usarlo para
recuperarconlaopcini.Laopcintcombinadaconvobtienenosolo
losnombressinotambinpermisos,fechastamaosdeficheros,etc..Es
decir'cpiot'actacomoun'ls'y'cpiotv'actacomo'lsl'.Laopcind
combinada con 'i' permite la creacin de directorios'. La opcin 'm'
conserva la fecha de modificacin de los ficheros. La fecha de
modificacin de los directorios no siempre se conserva pero no suele
considerarseimportante.Seguramenteelpropio'cpio'alcopiarficheros
dentrodeldirectoriocreadoseprovocalaalteracindeestafechayla
nicaformaderespetarlafechademodificacindelosdirectoriossera
hacer una segunda pasada una vez que todos los ficheros estuvieran
creados.Puedequealgunautilidadoalgunaversindecpiosilohaga.Si
tienedudascompruebelo.Laopcin'p'decpiopermitecopiarestructuras
enterasdesdeunlugaraotro.Larecuperacindeficherosconcpioadmite
uso de patrones. Es interesante comprobar que aqu el operador '*'
tambin expandir caracteres '/' cosa que por ejemplo el bash y otros
programasnohacen.
Algunosejemplossencillos:
$ #Salvar un fichero
$ echo fichero | cpio -o > fich.cpio
$ #Salvar varios ficheros

299

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ cpio -o > fich.cpio < cat lista_ficheros'
$ #Lista detallada de los ficheros contenidos en la
copia
$ cpio -itvc < fich.cpio
$ #Recuperacion de los ficheros creando directorios
cuando sea
$ #necesario (-d) y conservando la fecha de
modificacin los ficheros
cpio -ivcdm < fich.cpio

Parausarundispositivoenlugardeunficherobastaraconsustituirenel
ejemplo'fich.cpio'por'/dev/dispositivo'.
Para evitar conflictos en sistemas de ficheros con nmero de inodos
elevadoseusalaopcin(Hnewc).Recomendamosquelausesiempre.
LaopcionBusarbloquesde5120bytesenlugardebloquesde512
bytes.
Vamosausarestaopcinenlossiguientesejemplosyademsusaremos
entradasalidaacintaconcompresindedatos.
$ # Salvar todo el rabol de directorios desde el
directorio actual
$ # en formato comprimido.
$ find . | cpio -ovBH newc | gzip > /dev/st0
$ # Listado detallado del contenido de la copia
$ gzip -d < /dev/st0 | cpio -itvBH newc
$ # Guardar listado sencillo (solo nombres de
ficheros) en
$ # el fichero 'contenido.txt'
$ gzip -d < /dev/st0 | cpio -itBH newc >
contenido.txt
$ # Suponemos que editamos el fichero anterior
'contenido.txt'

300

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ # y dejamos solo aquellos ficheros que deseamos
recuperar en
$ # el fichero 'seleccin'.
$ # Recuperamos de la siguiente forma:
$ gzip -d < /dev/st0 | cpio -ivudmBH newc `cat
seleccion`

Conlaopcionppodemoscopiartodoelcontenidodeundirectorioaotro
directamentesinpasarporunasalidaintermediaempaquetadaenformato
'cpio'.Estoesmuyutilparatrasladardirectoriosenteros.
$ cd $DIR_ORIGEN
$ find . | cpio -pdm $DIR_DESTINO

afio(1)Esunainteresantsimavariacindecpio.Tieneentreotrascosasla
posibilidaddecomprimirlosficherosdeunoenuno.Estoleproporciona
mayorseguridad,yaqueunacopiadecpioodetarcomprimidatieneel
graveproblemadequeencasodeunpequeoerrorenlacopia,todala
copiaquedainutilizada.Conafiosoloquedardaadoelficherodonde
ocurraenerror.Ademscon'afio'esposiblehacercopiasmultivolumen
comprimidas.'afio'reconocelasextensionesdeaquellosficherosqueno
interesacomprimirporqueyaloestn:(.Z.z.gz.bz2.tgz.arc.zip.rar
.lzh.lha.uc2.tpz.taz.tgz.rpm.zoo.deb.gif.jpeg.jpg.tif.tiffy.png).
Unaventajamsde'afio'esquepermiteverificarlacopiaconeloriginal.
(Opcinr)
Parahacerpruebascon'afio'situeseeneldirectorio/tmp.Generealgunos
ficherosgrandesparapoderhacerluegopruebasdecopiasdeseguridad
usando disquetes.Porejemplo paragenerarunficherode2Mbytes de
perfectabasurapuedeusarlosiguiente:
$
$
$
$

cd /tmp
mkdir pruebafio
cd pruebafio
echo 1 > fich1

301

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

gzip --fast < /dev/zero | head --bytes=2m


echo 3 > fich3
mkdir dir1
echo 4 > dir1/file4
cp fich2 fich5.gz
ls -lR

.:
total 4116
drwxr-xr-x
2
13:06 dir1
-rw-r--r-1
13:05 fich1
-rw-r--r-1
13:05 fich2
-rw-r--r-1
13:06 fich3
-rw-r--r-1
13:33 fich5.gz
./dir1:
total 4
-rw-r--r-13:06 file4

> fich2

root

root

4096 abr

root

root

2 abr

root

root

2097152 abr

root

root

2 abr

root

root

2097152 abr

1 root

root

2 abr

Buenoconestotenemosunaestructuradeficherosparahacerpruebas.
Vamosahacerpruebasdecopiasmultivolumencomprimidasquesonlas
msinteresantesyusaremosdisquetesde1.44Mbytes.Yahemosdicho
quelosdisquetesnosonfiablesperosupequeotamaolohaceideal
parahacerpruebasdecopiasmultivolumen.Parausardisquetesconviene
usarelparmetroF.
Entreotras cosasadvierta quetenemos dosficheros idnticos 'fich2'y
'fich5.gz' que admiten una compresin mejor que la realizada con la
opcinfastdegzip.Perounodeellosserreconocido comofichero
comprimidoyseguardartalcualestyelotrosercomprimido.(Por
ciertodeformaespectacular).
Formateeunpardedisquetesde1.44MBytescon'mformata:'

302

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

Compruebequeseencuentraen/tmp/pruebafioyejecuteloscomandos
siguientes:

$ # Para salvar a disquete multivolumen comprimido


$ find . | afio -o -v -s 1440k -F -Z /dev/fd0
. -- okay
fich1 -- okay
fich5.gz -- okay
fich3 -- okay
dir1 -- okay
dir1/file4 -- okay
fich2.z -- (00%)
afio: "/dev/fd0" [offset 2m+7k+0]: Next disk needed
afio: Ready for disk 2 on /dev/fd0
afio: "quit" to abort,"f" to format, anything else to
proceed. >
afio: "/dev/fd0" [offset 2m+7k+0]: Continuing
$ # Alteramos el original de fich3 en disco
$ echo jjjjj > fich3
$ #
$ # Volver a colocar el primer disquete de la copia
$ # Para comprobar con el original una copia
comprimida en varios disquetes
$ afio -r -v -s 1440k -F -Z /dev/fd0
drwxr-xr-x 1 root
root
Apr 8
13:33:23 2001 .
-rw-r--r-- 1 root
root
2 Apr 8
13:05:24 2001 fich1
-rw-r--r-- 1 root
root
2097152 Apr 8
13:33:11 2001 fich5.gz
afio: "/dev/fd0" [offset 1m+416k+0]: Input limit
reached
afio: Ready for disk 2 on /dev/fd0
afio: "quit" to abort,"f" to format, anything else to
proceed. >
afio: "/dev/fd0" [offset 1m+416k+0]: Continuing
-rw-r--r-- 1 root
root
2 Apr 8
13:06:00 2001 fich3
afio: "fich3": Corrupt archive data
drwxr-xr-x 1 root
root
Apr 8

303

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
13:06:18 2001
-rw-r--r-- 1
13:06:18 2001
-rw-r--r-- 1
13:05:48 2001

dir1
root
root
dir1/file4
root
root
fich2 -- compressed

2 Apr

4939 Apr

$ # Volver a colocar el primer disquete de la copia


$ # Para obtener la lista de ficheros de una copia
comprimida en disquete
$ afio -t -v -s 1440k -F -Z /dev/fd0
drwxr-xr-x 1 root
root
Apr 8
13:33:23 2001 .
-rw-r--r-- 1 root
root
2 Apr 8
13:05:24 2001 fich1
-rw-r--r-- 1 root
root
2097152 Apr 8
13:33:11 2001 fich5.gz
afio: "/dev/fd0" [offset 1m+416k+0]: Input limit
reached
afio: Ready for disk 2 on /dev/fd0
afio: "quit" to abort,"f" to format, anything else to
proceed. >
afio: "/dev/fd0" [offset 1m+416k+0]: Continuing
-rw-r--r-- 1 root
root
2 Apr 8
13:06:00 2001 fich3
drwxr-xr-x 1 root
root
Apr 8
13:06:18 2001 dir1
-rw-r--r-- 1 root
root
2 Apr 8
13:06:18 2001 dir1/file4
-rw-r--r-- 1 root
root
4939 Apr 8
13:05:48 2001 fich2 -- compressed
$ # Creamos un segundo directorio y nos situamos en
el
$ mkdir ../pruebafio2
$ cd ../pruebafio2
$ #
$ # Para recuperar una copia comprimida en disquete
$ # Volver a colocar el primer disquete de la copia
$ afio -i -v -s 1440k -F -Z /dev/fd0
. -- okay
fich1 -- okay
afio: "/dev/fd0" [offset 1m+416k+0]: Input limit
reached

304

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
afio: Ready for disk 2 on /dev/fd0
afio: "quit" to abort,"f" to format, anything else to
proceed. >
afio: "/dev/fd0" [offset 1m+416k+0]: Continuing
fich5.gz -- okay
fich3 -- okay
dir1 -- okay
dir1/file4 -- okay
fich2 -- uncompressed
$ # Vamos a comparar los dos directorios
$ cd ..
$ dircomp pruebafio pruebafio2
< 3241346245 6 ./fich3
> 4164007125 2 ./fich3
$ #
$ # Un anlisis ms detallado de las diferencias de
ambos directorios
$ # Se puede hacer con dirdiff
$ dirdiff pruebafio pruebafio2
2 d d - > =
2 d d - > = dir1
= r r = = = dir1/file4
= r r = = = fich1
= r r = = = fich2
1 r r X < = fich3
= r r = = = fich5.gz
^ ^ ^ ^ ^ ^
| | | | | \__ POG
| | | | \____ DAT
| | | \______ CKS
| | \________ FI2
| \__________ FI1
\____________ FI2
$ # Para comprobar dos ficheros podemos usar md5sum
$ md5sum pruebafio/fich1 pruebafio2/fich1
pruebafio/fich3 pruebafio2/fich3
md5sum pruebafio/fich1 pruebafio2/fich1
pruebafio/fich3 pruebafio2/fich3
b026324c6904b2a9cb4b88d6d61c81d1 pruebafio/fich1
b026324c6904b2a9cb4b88d6d61c81d1 pruebafio2/fich1

305

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
75894c2b3d5c3b78372af63694cdc659
6d7fce9fee471194aa8b5b6e47267f03

pruebafio/fich3
pruebafio2/fich3

Laspginasmande'afio'contienenalgunosejemplosinteresantes.Por
ejemplovienecomohacerunacopiasobreunaunidaddecdrom.
find.|afioob2048s325000xv'!cdrecord..'
Sindudaalgunaafioesunexcelenteprogramaparasusrespaldosyle
recomendamosquelopongaapruebaysefamiliariceconl.
Resumiendo Conviene conocer tanto 'cpio' como 'tar' porque son dos
clsicosdelossistemasoperativostipoUnixyambossonmuyutilizados.
Cadaunotienesusventajasysusinconvenientes.Porotraparte'afio'es
mucho ms reciente yporlotantosuusonoestanamplio, peroeso
podracambiar enunfuturogracias asusindudables mejorastcnicas
respectoalosdosclsicosantesmencionados.
Elnicomotivoquesemeocurreporelcualsepodradesaconsejarel
usode'afio'esportemasdeportabilidadentredistintasmquinas,con
distintosSO.Enesecasoparagarantizarquelacopiatengaunformatolo
ms universal posible,lorecomendable serausar'tar'sincompresin,
pero eso no justifica dejar de usar 'afio' para las copias de seguridad
rutinariasrenunciandoasusindudablesventajas.
Observequelasalidadeinformacinsiemprequeresultaposiblesehace
a salida estandar. En caso que se generen dos salida se usa la salida
estandar como salida principal. La salida estandar de errores se usar
comosalidasecundariamezcladaconposiblesmensajesdeerror.
Concretamentelaopcinten'tar'y'cpio'entreganasalidaestandarel
resultadoperolaopcionoylaopcinvde'cpio'juntashacenquela
salidadelacopiasedirijaasalidaestandarylalistadelosficherosse
dirijirentoncesalasalidaestandardeerrores.
306

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

Encualquiercasolasposibilidadesdecualquieradeestostresprogramas
sonmuyvariadas.Esimprescindibleacudirvalaspginasmandecada
unodeellosparatenerunavisincompletadesusposibilidades.Nosotros
nos hemos limitado explicar con ayuda de ejemplos algunas de sus
posibilidades.

/===============/
Unprogramacompletokbackup(1)
Es un programa muy completo para hacer backups. Es 100% libre
(LicenciaArtistic)yestescritoenlenguajeshellscript.Lainterfazde
usuario a base de un completo sistema de mens est programado
haciendo uso de 'dialog'. Permite usar encriptacin pgp. Compresin
mediante doble buffering para para optimizar la escritura en cintas y
como herramienta de empaquetado de ficheros usa 'afio' o 'tar' segn
convenga.
Esaltamenteconfigurableyverstil
Permitealmacenardistintasconfiguracionesparadistintostiposdecopias.
Sinoquiererealizarunsistemaasumedida,puedeusar'kbackup'para
suscopias.

/===============/
Recuperacintotaldesdecero
Muchas veces tener un disquete o CDROM de rescate con las
herramientas necesarias simplifica mucho las cosas. Realmente todo
podraresultartansencillocomoarrancarconesesistemaderescatey
recuperarlacintasobreelsistemadeficherosadecuadamentemontado.

307

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

Siusaprogramasespecficoscomo'kbacup'deberinvestigarlaformade
recuperarunacopiade'kbacup'sinusar'kbacup'.Ensudefectodebera
tener un disquete o cdrom de rescate (autoarrancable) que contenga
'kbackup'.
Lascopiasdekbacuppuedensermanejadaspor'afio'o'tar'.Porejemplo
encasodeperdidadetodoelsistemaquizsnotengamosformadehacer
funcionar'kbackup'perosi'tar'o'cpio'.Enestecasoesimportantesaber
quelascopiasde'kbacup'escribenenprimerlugarunficherodecabecera
queincluyeinformacinsobreelformatoqueseusoparaesacopia.
Encualquiercasodebedetenerclarocualserlarecuperacindeuna
cintadeseguridaddetodoelsistemadesdecero,ysitieneposibilidades
de hacer pruebas sin comprometer datos importantes hagalo. Use por
ejemplounsegundoordenadorsininformacinimportante.

/===============/
CopiausandodispositivodecintaSCSI
Elusodetodoslosdispositivos decintaSCSIesbastante similar.Lo
usaremos como para nuestro ejemplo. Estos dispositivos tienen varios
controladoresynosfijaremosahoraendosdeellos.
/dev/st0DispositivodecintaSCSIConautorebobinado.
/dev/nst0DispositivodecintaSCSISinautorebobinado.
El autorebobinado significa que el cierre del dispositivo provoca el
rebobinadoautomticoalprincipiodelacinta.Nosotrosusaremosparala
copia de seguridad /dev/st0 (Con auto rebobinado) Solo usaremos
/dev/nst0pararebobinadoyretensiondelacinta.Elretensionadodela
cinta es una operacin muy necesaria y en principio el programa de
ejemploprovocarsiempreunretensionadodelacinta.Lascintasqueno
sonretensionadasdevezencuandopuedellegararomperseoatascarse.

308

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

Loscontrolesquevamosausarsobrelacintason:
mtf/dev/nst0rewind
mtf/dev/nst0retension
mtf/dev/st0status
Los dos primeros ya han sido mencionados y el ltimo proporciona
informacinsobreelestadodelacinta.
Vamosaproporcionarunscriptparahacerrespaldosbasadoenelusode
afio.Deberestudiarloparaadaptarloasusnecesidades.
Estpensadoparausarcintasscsi.Sepuedeadaptarfcilmenteparaotros
dispositivosoparacopiasobrefichero.Siestonolegustasiemprepuede
usarunprogramacompletodebackupcomo'kbackup'ysilegustapero
lo encuentra incompleto puede encontrar solucin a sus necesidades
concretasinspeccionandoelcdigode'kbackup'queestescritoenshell
script.
Unprogramadebackupmsqueverstilhadesercmodo.Yalodijimos
antes.Elbackupesunatarearutinariaymuyimportante.Interesatenerun
sistemaquepermitameterlacinta,dardosotresteclazosydejarqueel
restolohagaelordenador.Deesaformaeldaqueestemoscansadosno
tendremosexcusaparanohacerlacopia.
Loquevieneacontinuacinesunejemploylosejemploshandeser
sencillos,peroestamossegurosqueleresultarmuyfciladaptarloasus
necesidades.
Enesteejemplonosotrosexcluimos/mntporqueesundirectoriodonde
suponemosquehaymontadosdispositivosquenodebenserrespaldados.
Parahacerunrespaldosobreunficheroconvieneusarundiscodistinto
montadoenunlugarquequedeexcluidodelacopia.Ennuestroejemplo
podramossituarelficheroderespaldodentrode/mnt.

309

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

Analiceelscriptaconciencia.Acudaalmanualonlineparacadaunode
loscomandosquerepresentenalgunadudaysiapesardeeso,algosale
malinsistimosenrecordarlequetodalaresponsabilidadenelusodeesto
odecualquierotromaterialdelcursoessolosuya.

#!/bin/bash
#####################################################
################
testTape(){
echo "## Inserte la cinta ${DATOS} ##"
echo ".... pulse <Intro> para continuar"
read
echo
mt -f /dev/nst0 rewind
mt -f /dev/st0 status
echo
afio -rvZ -b ${BLOCK} -s ${CAPCINTA} < /dev/st0 |
more
}
#####################################################
################
preparar(){
REF_INCR=""
if [ "$TIPO" = "I" ]
then
REF_INCR=T_${DATOS}
fi
if [ "$TIPO" = "i" ]
then
REF_INCR=I_${DATOS}
fi
T_DATOS=${TIPO}_${DATOS}
FECHA=`date +%y%b%d`
PREOUT="${BACKUP}/history/${FECHA}${T_DATOS}"
PRELAST="${BACKUP}/last/${T_DATOS}"
T_REF_INCR="${BACKUP}/last/${REF_INCR}.time"
FIFO3=/tmp/FIFO_salva_lst.$$
FIFO3OUT=${PREOUT}.lst
echo

310

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
echo '############ ' ${FECHA} ${T_DATOS} '
############'
echo
'-------------------------------------------------------------'
df
echo
'-------------------------------------------------------------'
if [ "$TIPO" = "i" ] || [ "$TIPO" = "I" ]
then
echo "Se recuperar informacin posterior
a ..."
ls -ld $T_REF_INCR | cut -c 42fi
echo
echo "desde=$DESDE, incluir=$INCLUIR,
excluir=$EXCLUIR, datos=$DATOS"
echo "!! Compruebe que los dispositivos montados
coinciden para $DATOS !!"
echo ".... pulse <Intro> para continuar"
read
echo "## Inserte la cinta. Asegurese que est
desprotegida ##"
echo "....Espere a que est lista y pulse <Intro>
para continuar"
read
echo
mt -f /dev/nst0 rewind
mt -f /dev/st0 status
echo "Espere. Realizando prueba de escritura ...."
if ! echo "____ Prueba de grabacion OK ____" |
blockout > /dev/st0
then
echo " !!! Imposible escribir !!!"
exit
else
blockout < /dev/st0
fi
mt -f /dev/nst0 rewind
echo
echo -e '\7\c' sleep 1
echo -e '\7\c' sleep 1
echo -e '\7\c' sleep 1
echo "## Compruebe estado de la cinta ##"
echo ".... pulse <Intro> para continuar"

311

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
read
}
#####################################################
################
salva(){
RETENS="S"
clear
echo "############ !! Backup en marcha !!
############## $T_DATOS"
COMIENZO=`date`
if [ "$RETENS" = "S" ]
then
echo "Retension de la cinta ............."
mt -f /dev/nst0 retension
sleep 5
fi
cd $DESDE
touch ${PRELAST}.time
chmod 400 ${PRELAST}.time
echo "Salidas en ${PREOUT}."
INI=`date "+%d %b %Y %r"`
echo "Grabando en cinta la copia de
seguridad ............"
mknod --mode=600 $FIFO3 p
cut -b 3- < $FIFO3 | egrep -v '^$' | sort
$FIFO3OUT &
rm ${PRELAST}.lst 2> /dev/null
ln -s $FIFO3OUT ${PRELAST}.lst

>

### Comienza realmente la copia ##


if [ "$TIPO" = "T" ]
then
nice find . -print | egrep -v $EXCLUIR | egrep
$INCLUIR | \
tee $FIFO3 | afio -ovZ -b ${BLOCK} -s $
{CAPCINTA} /dev/st0
else
nice find . -newer $T_REF_INCR -print | egrep
-v $EXCLUIR | \
egrep $INCLUIR | tee $FIFO3 | afio -ovZ -b $
{BLOCK} \
-s ${CAPCINTA} /dev/st0

312

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
fi
### Fin ###
FIN=`date "+%r"`
echo "$INI ======> $FIN"
mt -f /dev/st0 status
echo "Copia en cinta terminada ......."
echo "Iniciando comprobacin ........."
afio -tZ -b ${BLOCK} -s ${CAPCINTA} /dev/st0 | sort
> ${PREOUT}.tape
diff $FIFO3OUT ${PREOUT}.tape > ${PREOUT}.diff
echo
"****************************************************
**************"
echo "******************* F I N
B A C K U P
*************************"
echo
> ${PREOUT}.log
echo "******* ${PREOUT}.log "
>> ${PREOUT}.log
echo "******* Comenz $COMIENZO"
>> ${PREOUT}.log
echo "******* Finaliz `date`"
>> ${PREOUT}.log
echo "******* Diferencias `cat ${PREOUT}.diff | wc
-l` "
>> ${PREOUT}.log
echo "******* DiferenciasHead `head -n 8 $
{PREOUT}.diff` "
>> ${PREOUT}.log
echo " ...."
>> ${PREOUT}.log
echo "******* DiferenciasTail `tail -n 8 $
{PREOUT}.diff` "
>> ${PREOUT}.log
echo "bzip2 $FIFO3OUT ${PREOUT}.tape ${PREOUT}.diff"
bzip2 $FIFO3OUT ${PREOUT}.tape ${PREOUT}.diff
echo "rm $FIFO3"
rm $FIFO3
echo
"****************************************************
**************"
cat ${PREOUT}.log
echo
"****************************************************
**************"
}
##(1)#######################################
salva_tmp(){

313

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
DESDE='/tmp'
INCLUIR=$INCLUIR_TODOS
EXCLUIR=$EXCLUIR_NINGUNO
DATOS="tmp"
preparar
salva
}
##(2)#######################################
salva_root(){
DESDE='/'
INCLUIR=$INCLUIR_TODOS
EXCLUIR="\.netscape/cache/|\/core$|^./tmp|^./proc|^./
mnt|^./mount"
DATOS="root"
preparar
salva
}
##(3)#######################################
salva_home(){
DESDE='/home'
INCLUIR=$INCLUIR_TODOS
EXCLUIR=$EXCLUIR_NINGUNO
DATOS="home"
preparar
salva
}
#####################################################
###################
################################ MAIN
##################################
#####################################################
###################
CAPCINTA=3700m
BLOCK=10k
INCLUIR_TODOS="^."
EXCLUIR_NINGUNO="^./tmp|^./proc"
BACKUP="/backup"
mkdir $BACKUP 2> /dev/null
mkdir ${BACKUP}/history 2> /dev/null
mkdir ${BACKUP}/last 2> /dev/null
cd ${BACKUP}/history
clear
echo "################ BACKUP `date` ###############"

314

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
echo
ls -rt *.log
echo
sleep 2
RETRY=TRUE
while [ "$RETRY" != "FALSE" ]
do
echo
echo '0) Comprobar contenido de una cinta'
echo '1) salva_tmp (/tmp) para pruebas)'
echo '2) salva_root (menos /mnt y /mount)'
echo '3) salva_home (/home)'
echo
echo 'Introduzca la opcion deseada.'
read OPT1
case "$OPT1" in
[0123]) RETRY=FALSE
;;
*) echo "Opcion invalida. Reintentar"
;;
esac
done
if [ "$OPT1" != "0" ]
then
RETRY=TRUE
while [ "$RETRY" != "FALSE" ]
do
echo 'Introduzca en primer lugar el tipo de
copia deseado'
echo
echo 'T) TOTAL'
echo 'I) INCREMENTAL DESDE ULTIMO TOTAL'
echo
read TIPO
case "$TIPO" in
[TI]) RETRY=FALSE
;;
*) echo "Opcion invalida. Reintentar"
;;
esac
done
fi
case "$OPT1" in
0) testTape ;;

315

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
1) salva_tmp ;;
2) salva_root ;;
3) salva_home ;;
esac
echo Copia finalizada.

Los mens de esta aplicacin pueden hacerse ms vistosos usando


dialog(1), tambin puede intentar opciones para salvar y recuperar
configuraciones. Ambas cosas estn resueltas el 'kbackup' que est
realizadoigualmenteenshellscript.

/===============/
Ejemplosderecuperacindecopias
Enelejemploanteriornohemosincluidoningunaopcinderecuperacin
porquecadacasoesdistintodependiendodeloquesequierarecuperar.
Un error en la recuperacin puede suponer perdida de informacin.
Siempre que sea posible conviene recuperar en un lugar distinto al
originalysolosedebenrecuperarlosficherosnecesarios.
Generalmente los programas de propsito general permiten la
recuperacin de todoel contenido obiensacan unalista detodos los
ficherosparasealaraquellosquedeseamosrecuperar.
Alcontrarioqueelrespaldolarecuperacinnoesunatarearutinaria.Por
esaraznyporquecadarecuperacinhadehacersebajounossupuestos
distintoslosprogramasdepropsitogeneralnosiempreproporcionanla
flexibilidadnecesaria.
Conociendobienlasherramientassencillastipo'find','cpio','tar','afio',
etc y combinndolas para recuperar solo lo que deseamos lograremos
muchaflexibilidad.

316

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

Lasdistintasposibilidadessonimposiblesdecomentaryyavimosalguna
cosaalexplicar'cpio'yenrealidadbastaconsabercomosacarlalistade
ficherosdeunacintaycomopoderusaresalistapararecuperarloque
queramos.
Ahoranosvamosaverejemplosconcretoscentrndonosexclusivamente
enlarecuperacindecopiasrealizadascon'afio'enformatocomprimido,
para nocambiar porquedealgunamaneravenimosmostrandonuestro
favoritismopor'afio'entodaestaleccin.
Sepuedeconfeccionarunalistadelosficheroscontenidosenlacopia
haciendolosiguiente.
$ afio -tZ /dev/st0 > listafich

Supongamosqueennuestralistadeficherosaparecenlossiguientes.
./var/lib/postgres/data/pg_variable
./var/log/apache/access.log
./var/log/apache/error.log
./var/log/auth.log

Sihacepruebassitueseen/tmp.Paraunarecuperacindeinformacin
realtampococonvienerecuperardirectamentesobreeloriginalasque
/tmp puede ser igualmente un buen lugar si hay espacio para ello.
Recuerdequealgunossistemaslimpian/tmpalarrancaroregularmente
cadaciertotiempo.
Continuandoconnuestroejemplo,pararecuperarporejemplo'auth.log'
haramoslosiguiente.
$ afio -iZ -y '*auth.log' /dev/st0

317

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

Para recuperar los que ficheros que contengan 'log/apache' pero no


'access'haramoslosiguiente.
$ afio -iZ -y '*log/apache*' -Y '*access*' /dev/st0

Enestecasohabramosrecuperadosolo'./var/log/apache/error.log'.
ParacasosmscomplejosseusarlasopcioneswoWconficherosque
contendrnunnombredefichero,ounpatrnporcadalnea,ydonde
cada una de ellas serconsiderada como sifueraunaopcin yoY
respectivamentepara'wfichero'opara'Wfichero'.

318

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

LAMEMORIAVIRTUALENLINUX
Introduccin
Estecursonotratadelaadministracindelsistemaperoenestecaptulo
sevanaexplicaralgunascosasquesonmateriadeadministracindel
sistemaperoqueunusuariotambindebeconocer.
Muchas veces un administrador tiene dificultades para gestionar los
escasosrecursosdeunamquinaporquelosusuariosnolosutilizandel
modomsracional.
Enunsistemaconmuchosusuariosestosdebencompartirlosrecursosde
modoracional,perogeneralmenteocurrelocontrario.Elnocomprender
como funcionan las cosas y la avaricia de recursos puede conducir a
conductasabsurdas.
Porejemplounusuarioquetienequecompilar500programassabeque
tendrqueesperarmucho.Siesteusuarioessuficientementeignorantey
egosta puede pensar que lanzando las 500 compilaciones
simultneamentecausarunretrasoalosdemsperoelterminarantes.
Lo cierto es que los recursos del sistema se desperdician en trabajos
internos totalmente intiles para el usuario cuando el sistema est
sobrecargado.
Tantosisepersiguecompartirlosrecursosdeformarazonableconlos
demsusuarios,comosiloquesepretendeesusarlosrecursosdetodoel
sistemaparasacarelmayorbeneficiopersonal,senecesitacomprender
comofuncionanalgunascosas.
Estaleccin sertotalmenteterica porqueparaunusuarionormalno
resulta prudente cierto tipo de experimentos que podran provocar
319

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

incomodidades o incluso algunos problemas en el sistema. De todas


formassielsistemaempiezaatenerproblemas,siqueesbuenotenerlos
conocimientossuficientesparaaveriguarsiesotienequeverconalgoque
estemos haciendo nosotros. Quizs podamos incluso advertir a algn
compaeroquetrabajeenelmismoequipoqueelproblemaenelsistema
tienequeverconloqueelhace.
Limitarelusoderecursos
Enunsistemasesuelellamarrecursosaciertoselementosquenopueden
serutilizadosdeformailimitada.Porejemplo.'yes'esunprogramaque
genera una salida infinita y no es buena idea redirigir su salida a un
ficheroporquellenaremosnuestroespaciodedisco.Enalgunossistemas
eladministradorestableceunlimitedeespacioparacadausuario.Sino
fueraelcasollenaramoseldisco.Silasalidade'yes'laredirigimosa
/dev/null no pasar nada. El nmero de ficheros que podemos tener
abiertos simultneamente tambin tiene un lmite. Lo mismo puede
decirsedeotrasmuchascosas.
La cantidad de memoria es limitada peroexisten distintos limites que
afectanalusodelamemoria.Paralimitarelusodeciertosrecursosexiste
uncomandointernodelashellllamado'ulimit'.
Porejemplo'ulimitc'seusaparalimitareltamaodelosficheroscore
producidoscuandounprocesomuerebajodeterminadascircunstancias.
Unusuarionormalitonoutilizarparanadaestosficherosasquepodra
usarse'ulimit0'paraevitarlaaparicindeficheroscore.
TambinsepuedenlimitarotrasmuchascosascomolacantidaddeCPU
porsegundo,tamaomximodeunfichero,mximonmerodeprocesos,
mximo numero de ficheros abiertos, cantidad mxima de memoria
virtual,etc...
Para ver las limitaciones con las que estamos trabajando haremos lo
siguiente:
320

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

$ulimita

core file size (blocks)


data seg size (kbytes)
file size (blocks)
max locked memory (kbytes)
max memory size (kbytes)
open files
pipe size (512 bytes)
stack size (kbytes)
cpu time (seconds)
max user processes
virtual memory (kbytes)

0
unlimited
unlimited
unlimited
unlimited
1024
8
8192
unlimited
256
unlimited

Buenoenesteejemplovemosqueestamosenunasesinconmuypocas
limitaciones.Esoessealdequeeladministradorconfaennosotrosy
nosconcedemuchalibertad.
'ulimit'permiteestablecerdosclasesdelmites.Lmitesduros(solose
puedenponerunavezygeneralmenteestolohaceroot)ylmitesblandos
quesepuedencambiarvariasvecesperonosepermitesobrepasarlos
valoresestablecidosenellmiteduro.rootestableceestoslmitesenalgn
fichero de configuracin y los usuarios pueden tener en su
$HOME/.bashrc alterar los limites blandos. Para ms informacin
consultelapginamande'ulimit'.
Multitarea
Yahemoshabladoalgodeellacuandoestudiamoslosprocesos.Queda
claroqueenunsistemaenelqueseestnejecutandoenaparienciavarios
procesossimultneamenteloqueocurrerealmenteesqueeltiempodela
CPU se va repartiendo entre los distintos procesos concediendo
rpidamente sucesivas rodajas detiempoacadaunoenfuncindesu
prioridadydelapolticaderepartodeesetiempo.Estapolticanonos
interesa ahora. Se supone que las cosas estn pensadas para que el
funcionamientoglobaldetodoelsistemaseaelmsadecuado.

321

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

Volvamosalcasodelusuarioignoranteyegostadelcaptuloanterior.El
delas500compilacionessimultneas.Elsistemanecesitapararcadauno
delosprocesosqueusanlaCPUunavezquehanconsumidosurodajade
tiempoparatomarelsiguienteprocesoenesperadeCPU.
Cuandounprocesonecesitausaralgoyeneseinstantenoestdisponible
pasaaunestadodeinactividad.Sedicequequedadormido.
Estecambiodeunprocesoaotronoesgratuitoporqueunavezparadoel
proceso hay que anotar la situacin en la cual ese proceso ha sido
detenidoparaluegopodervolveracontinuarexactamenteenelmismo
puntocuandolevuelvaatocaryquizspartedelcdigoodelosdatosdel
proceso ya no estn en memoria RAM (tambin la llamaremos
indistintamentememoriafsica.Vermsadelantepaginacin).Todoesto
consumemuchosrecursosysepuedealcanzarlasituacinenlacualel
SO consume la mayor parte del tiempo en esta gestin de procesos
intercambiando datosentre memoria ydiscoconstantemente porquela
memoriafsicanopuedecontodoporelcontrariolosprocesosquesonla
parterealmentetilapenasdispondrnderecursos.Enestasituacinel
sistemasevuelvemuylentoylosdiscosdelsistematienenunaactividad
altsima.Enrealidadesunasituacindeautnticoagobioparaelsistema
ysucomportamientosevuelvetorpe.Escomosielsistemaactuaraala
desesperada.
Poresarazndecimosqueelusuariodelcaptuloanteriorademsdeser
egostaesignoranteporqueestprovocandounenormeretrasonosoloa
losdemsusuarios(cosaqueyasabe)sinotambinasimismo.
Sialgunaveznotamosqueelsistemavamuylentoysospechamos la
causa tendremos que parar en primer lugar el proceso que est
provocando la sobrecarga. Si no sabemos cual es o si se trata de un
proceso que no es nuestro podemos investigar con el comando 'top'.
Tengaencuentaquedeestecomandosesalecon'q'.

322

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

Estecomandosacaencabeceraunresumendelasituacingeneraldel
sistema y luego saca solo la informacin de los procesos que mayor
consumoderecursosestnprovocandoenelsistema.
Tengaencuentaque'top'sirveparadiagnosticar elusoderecursosy
permiteidentificarprocesosqueconsumendemasiadoperoensimismo
'top' tambin consume bastantes recursos. Por eso en situaciones de
sobrecargadelsistemaconvienenoabusardesuuso.'top'refrescacada
ciertotiempolainformacindelapantalla.Pordefectolohacecada5
segundos.Podemosaumentara15segundos.Paraellousaremos'topd
15'. Esto consumir menos recursos y nos permitir mirar con ms
tranquilidadlainformacindetop.
Vamosaverunejemplodelusode'top'quecorrespondeaunsistemacon
muy poca actividad. Solo 5 usuarios. La CPU est ociosa 99.6% del
tiempo,lacantidaddememoriadisponibleesaltaynoseestusandola
swap.
$top

12:17pm up 2:06, 5 users, load average: 0.00,


0.00, 0.00
55 processes: 54 sleeping, 1 running, 0 zombie, 0
stopped
CPU states: 0.0% user, 0.3% system, 0.0% nice,
99.6% idle
Mem: 258100K av, 93320K used, 164780K free, 66800K
shrd,
7652K buff
Swap: 393552K av,
0K used, 393552K free
40744K cached
PID
%MEM
1002
0.5
1
0.1
2
0.0
3
0.0

USER
PRI NI
TIME COMMAND
root
11
0
0:00 top
root
0
0
0:05 init
root
0
0
0:00 kflushd
root
0
0
0:00 kupdate

SIZE

RSS SHARE STAT

1312 1312

LIB %CPU

700 R

0.3

404 S

0.0

464

464

0 SW

0.0

0 SW

0.0

323

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

..

...

...

... ..

..

...

..

...

...

... ..

..

...

..

...

...

... ..

..

...

USEResesusuarioquearrancelproceso,%CPUeselporcentajede
tiempo deCPUusadoporelproceso.%MEM Porcentaje dememoria
fsicausadaporelproceso.Podrainclusosuperarel100%.Unvaloralto
puede delatar a un proceso como el causante de los problemas de
paginacin(swaping)enelsistema.
Otro comando que nos da informacin sobre la carga del sistema es
'uptime'
$ uptime
12:27pm up
0.00, 0.00

2:16,

5 users,

load average: 0.00,

Coincideconlaprimeralineade'top'.Losdatossonhoraactualtiempo
transcurridodesdeelarranquedelsistema,nmerodeusuariosylastres
ltimas cifras se corresponden con promedios de carga en el ltimo
minuto,5ltimosminutosy15ltimosminutosrespectivamente.
Memoriavirtual
Vamosaexplicarenprimerlugarquesignificaesodememoriavirtual.
EnmuchossistemasoperativoselSOofrecealosprogramasunespacio
de memoria superior al que realmente existe. La memoria fsica es la
memoriaRAM.LaCPUnopuedehacernadaconlosdatossiantesno
pasan ala RAM.Apesardeestounsistema con64Mbytes deRAM
puedeejecutar porejemplounprogramausevariablesconeldoblede
tamaoqueeldelamemoriaRAMdisponible.Sielprogramaaccediera
muchoydeformaaleatoriadentrodeestaenormevariable,seproducira
324

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

una fuerte sobrecarga en el sistema. Si alguien se pregunta si una


barbaridadcomoesta,puedehacerlaunusuarionormalitosinprivilegios
especiales,larespuestaes,usuarionormalsi,peroautorizado.
Esonosignificaqueestemosburlandolaseguridaddelsistemanique
seamosmslistosqueeladministrador.
Sieladministradorconfiguraelsistemadeformaparanoicaparaevitar
cualquier posible riesgo, los usuarios se vern sometidos a unas
restriccionesbastanteincmodasparatrabajar.
Por eso lo normal es que el administrador asuma que los usuarios
autorizadosutilizaranlosrecursosdeformarazonable.
Paragestionarlamemoriavirtualloquesehaceesrecurriralespaciode
discoparaampliaresteespacio.LamemoriaRAMtieneunavelocidadde
accesomuchomsrpidaqueundiscoduroyparaconseguirquetodo
funcione de forma transparente y de forma eficiente se utilizan unas
tcnicasdesegmentacinypaginacinquedescribiremosacontinuacin.
Segmentacindelamemoria
Lamemoriadeunordenadoresunaespeciedeenormecasillero.Cada
casillacontendrciertainformacinperounprocesonopuedeaccedera
todalainformacindelsistema.Cadacasillatieneunadireccinycada
procesopuedeusarciertasdireccionesparaalmacenarinformacin.De
esta forma se evita que un proceso interfiera accidentalmente o
intencionadamentealainformacindeotroprocesodistinto.
Lascasillassonlasposicionesdememoriayapesardelodichoexisten
posiciones de memoria compartidas. Por ejemplo el cdigo de un
programaqueseestejecutandoenvariosprocesossercompartidoen
modo exclusivo de lectura por los procesos que estn ejecutando ese
programa.Esdecirquesiporejemplohayvariaspersonasejecutandoel
editor'vim'elcdigodeeseprogramanoestarrepetidoenmemoria.
Seraundesperdicioporqueelcdigoeselmismo,nosepuedealterary
325

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

laCPUselimitaaleerlainformacinconsistenteeninstruccionesparala
CPU.
Todoestetipodeinformacinesloquesedenominasegmentodetexto.
Losprocesomanejanotrostiposdeinformacindistintasyparaellose
organizaensegmentosdedistintotipo.Porejemplohaysegmentosde
datosdesololectura,segmentosdedatosdelecturaescritura,segmentos
dedatosdepila,segmentosdatosdememoriacompartida,segmentosde
memoriadinmica.Novamosaexplicarestascosasporqueexcedeen
mucholospropsitosdeestecaptuloperosiqueremosdejarunaidea.
Losprocesostienenlamemoriaorganizadaensegmentosdedistintotipo.
Gracias a esto se consigue utilizar la memoria RAM de forma muy
eficiente.
PeseaqueelcdigodeunprogramapuededesaparecerdelaRAMpara
dejarespacioaotrosprogramas,nosernecesariosalvarlainformacina
disco. Si fuera necesario volver a cargarlo en RAM bastar acudir al
ficheroquecontienesucdigoejecutable.
Esto hace que los ficheros que contienen programas que se estn
ejecutandonopuedanserborradosnimodificadospornadie,nisiquiera
porroot.
Copie el ejecutable 'top' en el directorio /tmp (Seguramente estar en
'bin/top'ysinodeberisercapazdeencontrarlo).Ejecutelocomo/tmp/top
ydesdeotrasesinintenteborrarelfichero.Sencillamenteleresultar
imposiblepeseaqueesustedesdueodeesacopia.
Cuidado.Estonoesaplicablealosscriptsdebashoaotrosscriptsporque
en realidad estos programas son datos que se ejecutan dentro de un
programaquelosinterpretaenlugardehacerloenlaCPU.
Paginacin

326

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

LainformacinseorganizaenbloquesylosbloquesquelaCPUusase
mantienen el mayor tiempo posible en RAM. A estos bloques de
informacinselesllamapginas.
Seintentareducirelnmerodelecturasyescriturasadisco.Paraellose
acta en base a suposiciones de uso de la memoria. Las pginas
recientementeutilizadastienenmayorprobabilidaddevolveraserusadas
pronto que aquellas que ya hace tiempo que no han sido accedidas.
Intentaremosexplicarporque.
Los programas se comportan generalmente usando pequeas partes de
cdigodurantelamayorpartedeltiempomientrasqueotraspartesse
ejecutarndeformamuyocasional.
Ademslosprogramasusanpartescomunesdecdigoquepertenecena
libreras compartidas. El aprovechamiento de la RAM se consigue
manteniendounasolacopiadeesecdigocompartidoenmemoriaRAM.
Losaccesosaestas pginasdememoria quecontienencdigopueden
sern para leer informacin. En el caso de datos de lectura escritura
tambinpodrnseraccedidasparasumodificacin.Cuandounapgina
hasidomodificasemarcaparaescribirsucontenidoendiscoenelcaso
dequesenecesiteelespacioqueocupaparaotrapginadistinta.
El area de disco que se utiliza para ello se llama swap (tambin se
denomina memoria de intercambio) y un usuario normal no puede
modificarlaaunquerootsipuedehacerloparaaumentarlaodisminuirlade
tamaoporejemplo.
Lamemoriavirtualeslasumadelamemoriafsica(RAM)mselswap
(areadeintercambio)menosalgunaspginasdereserva.Laspaginasde
reserva estn limpias de informacin para poder cargar en ellas
informacinnuevadesdelaswapcuandosenecesita.
Alprocesodetraerunapginadelaswapamemoriafsicaselellama
(swap in). Esto necesita un tiempo y normalmente el proceso espera
327

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

dormido.Alprocesodevolcarunapginadememoriafsicaaswapsele
llama(swapout)ygeneralmenteelprocesoyaestdormidocuandoesto
ocurre.
Cuandoseagotalamemoriafsica(RAM)seempezarausarlaswap.
Cuandolamemoriavirtualseagotaelkernelempezaramatarprocesos.
Dichodeotromodounprocesoqueintentausarmemoriavirtualcuando
estagotadaterminarrecibiendounasealdelkernelqueprovocarsu
muerte.
Utilidadesparamonitorizarelusodememoriavirtual
Yavimoselusode'top'.Nossirviparaintroducireltema.Setratadeun
comando realmente buenoparalocalizar losprocesos responsables del
mayorconsumodeCPUymemoria.
Lainformacindelestadodencleodelsistemaseencuentraen/proc/Ya
comentamos en captulos anteriores parte de su cometido y tambin
resultamuytilparaobtenerinformacinsobreelusodelamemoriaen
elsistema.
$cat/proc/meminfo

total:
used:
free: shared: buffers:
cached:
Mem: 264294400 103956480 160337920 58118144 10465280
53153792
Swap: 402997248
0 402997248
MemTotal:
258100 kB
MemFree:
156580 kB
MemShared:
56756 kB
Buffers:
10220 kB
Cached:
51908 kB
SwapTotal:
393552 kB
SwapFree:
393552 kB

Tambin'psv'puededarnosinformacinsobreelconsumodememoria
virtualdeprocesos.Contopsolosalalainformacindelosprocesosque
328

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

ms consumen pero quizs necesitemos informacin de determinados


procesos.Porejemploparasacarlainformacindelosprocesosasociados
al nuestro terminal bastar usar 'ps v'. Si necesita precisar otras
condicionesconsultelasopcionesdepsensupginaman.
$psv

PID TTY
STAT
TIME MAJFL
TRS
DRS RSS
%MEM COMMAND
301 tty3
S
0:00
600
420 1743 1300
0.5 -bash
1640 tty3
S
0:00
326
518 1829 1568
0.6 vi recursyst.dat
1665 tty3
S
0:00
194
420 1451 832
0.3 /bin/bash -c (ps v) >/tmp/vok2gkuv 2>&1
1666 tty3
R
0:00
240
55 2844 1176
0.4 ps v

Sisolodeseamossabercuantamemoriaquedalibrepodemosusar'free'.
Estecomandotambinindicasiseestusandolaswap.
$free

total
buffers
cached
Mem:
258100
10248
51988
-/+ buffers/cache:
Swap:
393552

used

free

shared

101668

156432

56800

39432
0

218668
393552

Con'vmstat'podemostenerinformacindelusodememoriavirtual,cpu,
ydelconsumodeentradasalida.
$vmstat

procs
memory
io
system
cpu
r b w
swpd
free
buff cache
bo
in
cs us sy id
0 0 0
0 156404 10252 52000
1 141
132
1
0 98

329

swap
si

so

bi

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

Con'memstat'podemosverelusodememoriavirtualdelosprocesosy
delaslibrerascompartidas.
$memstat

44k: PID
1 (/sbin/init)
60k: PID
98 (/sbin/portmap)
80k: PID
156 (/sbin/syslogd)
468k: PID
158 (/sbin/klogd)
40k: PID
165 (/sbin/kerneld)
52k: PID
170 (/sbin/rpc.statd)
140k: /lib/libreadline.so.4.1 228
24k: /lib/libwrap.so.0.7.6 98 271
72k: /lib/ld-2.1.3.so 1 98 156 158 165 170 178
179 180 181 182 188 193 ...
864k: /lib/libc-2.1.3.so 1 98 156 158 165 170 178
179 180 181 182 188 19...
20k: /lib/libcrypt-2.1.3.so 228 292 295 306 307
308 309 310 311 461 966...
...: .........................
...: .........................
...: .........................
-------3768092k

Para mostrar solo la informacion del proceso 271(en nuestro caso es


sendmail)haramoslosiguiente:
$memstat|grep271

306
295
292
271

264k: PID
271 (/usr/sbin/sendmail)
24k: /lib/libwrap.so.0.7.6 98 271
232k: /lib/libdb-2.1.3.so 156 193 206 271 292 295
307 308 309 310 31...
76k: /lib/libnsl-2.1.3.so 98 228 271 284 287 292
299 300 301 303 30...
40k: /lib/libnss_compat-2.1.3.so 228 271 284 287
295 299 300 301 30...
20k: /lib/libnss_db-2.1.3.so 156 193 206 271
32k: /lib/libnss_files-2.1.3.so 156 170 193 206
292 295 306 307 308...
48k: /lib/libresolv-2.1.3.so 271
308k: /usr/sbin/sendmail 271

330

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

Conestovemoslobienaprovechadoqueestelsistemayaquemuchas
delaslibrerasaparecencompartidasconunmontndeprocesosquese
estnejecutando.
Hemosconseguidoverlaslibrerascompartidasqueestausandoycuanto
ocupanenmemoriaperolautilidadparasaberusaousarunejecutable
es'ldd'.Estecomandononecesitaqueelprogramaseestejecutando
porquesacalainformacinanalizandoelcdigodelejecutable.
$ldd/usr/sbin/sendmail

libdb.so.3 => /lib/libdb.so.3 (0x40019000)


libwrap.so.0 => /lib/libwrap.so.0
(0x40054000)
libnsl.so.1 => /lib/libnsl.so.1 (0x4005b000)
libresolv.so.2 => /lib/libresolv.so.2
(0x40071000)
libc.so.6 => /lib/libc.so.6 (0x40081000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2
(0x40000000)

Actuacinconprocesosconflictivos
Llegados a este punto conviene explicar que se puede hacer con un
procesoconflictivo.Evidentementelasolucinmsdrsticaesmatarlo.
Paraelloseusarprimeroun'kill15PID'.Laseal15esunSIGTERM
quepermitealprocesopararordenadamenteperosielprocesoignoraesta
sealhabrquematarloconun'kill9PID'.Laseal9esunSIGKILL
quenopuedeserignorado.
Detodasformaspuedeocurrirquenosdepenamataraunprocesoquese
haba comportado razonablemente durante bastante tiempo y que est
llevandoacabounastareasquenosinteresan.
Lomssuavequesepuedehaceresbajarlelaprioridadcon'renice'por
ejemplo'renice20PID'.Bajarlaprioridaddeunprocesonoperjudicaen
nadaal procesocuandolaCPUest ociosaporfaltadetrabajo. Siel
procesocontinuaconsumiendodemasiadosrecursosynopodemosbajar
331

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

ms su prioridad podemos pararlo sin matarlo. Para ello se enva al


procesounasealSIGSTOPmediante'kill19'Paravolveraarrancarlo
podemoshacerlomandandounasealSIGCONT'kill18'

332

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

LAPRIMERAINSTALACIONDELINUX
Introduccin
NotodoslosusuariosqueempiezanconLinuxpartendelmismopunto.
UnosyatienenconocimientosdeUnix,otrosnotienenconocimientosde
Unixperosideinformticaengeneral,otrosdisponendealgnamigo
quelespuedeayudar,yotroshanledocosaspreviamente.Nosotrosno
asumiremos nada de eso. Solo asumiremos que ya ha estudiado las
leccionesanteriores.
Quizassepregunteporqueestaleccinnoseexplicantes.Laraznes
que durante la instalacin de Linux se manejan una gran cantidad de
conocimientosyenestemomentoyadisponemosdeunoscuantos.
Lainstalacinesunprocesoquesehasimplificadobastanteylasguasde
instalacinpuedenserdegranayuda.Apesardeestocuandosepresenta
unadificultad,muchasvecesserequieretenerunabasedeconocimientos
ampliaparapodersuperardichasdificultades.
He conocido a bastantes personas que deseosas de probar Linux me
confesabanquenodeseabanrealmenteperdernadadetiempoenaprender
cosas sobre Linux. Se conformaban con aprender a instalar Linux y
configurarlascuatrocosasquenecesitanusar.
Siempre asumimos que ha leido las lecciones anteriores y por ello
tambinasumiremosqueestenoessucaso.
Nosotros antes de llegar a este captulo hemos realizado un amplio
recorrido formativo. Conceptos como sistema de ficheros, ncleo del
sistema, proceso,memoria virtual, etc..ya hansidotratados. Tambin
sabeusaryaeleditorvi,yyatieneprcticaconelinterpretedecomandos.
333

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

La principal utilidad de todo ello es que nunca se sentir totalmente


perdido.
DetodasformashaymuchascosasinteresantesdecaraainstalarLinuxy
quenohansidotratadasnivamosatratarenprofundidad.Noloharemos
porque desbordara los propsitos de este curso. Por ejemplo unos
conocimientos sobre hardware de PC's vendran muy bien pero nos
apartaramosdemasiadodelospropsitosdeestecurso.
LafacilidadodificultaddelainstalacindeLinuxpuedevariardesdeser
algotrivial,oporelcontrariopuederesultarmuydifcildependiendode
las circunstancias. Debe tener esto muy presente y conformarse con
objetivossencilloslaprimeravezqueintenteinstalarLinux.
Sielprimerdaconsigueinstalarunsistemacapazdearrancarydeabrir
unasesinaunqueseaenmodoconsolatendrunabuenabaseparair
aadiendo mejoras a su sistema poco a poco. No decimos que no se
puedanhacermscosaslaprimeravezperonohayqueobsesionarsecon
ello.
Cuandoinstaledeberteneramanotodaladocumentacindesuequipoy
desusperifricos.Quizsnuncaleyesospapeles,peropuedequeahora
silosnecesite.
Nodebeintentaravanzardemasiadodeprisa.DebedeirasimilandoLinux
poco a poco. Cuanto menores son los conocimientos tcnicos ms
despaciohayqueempezarporquecuestams.
Sisolodisponedeunordenadorlomejorseradejarunapartedeldisco
duroparaWindowsyotraparaLinux.Deesamaneraalarrancarpodr
elegirconqueSOquieretrabajarynoseverforzadoahacerlotodoen
unSOqueinicialmenteleresultarextraoyquizasinclusohostil.
ConfiamosenqueconelpasodeltiempoWindowsleresulteanms
extraoymuchsimomshostilqueLinux.

334

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

/===============/
Consideracioneshardware
Linuxadmiteunaamplsimavariedaddehardwareperolaautodeteccin
de hardware est disponible principalmente en algunas distribuciones
comerciales como SuSE, Mandrake y RedHat. La autodeteccin de
hardware nunca es tan completa como enWindows. Ellos juegan con
ventajaenesto.
Es importante comprobar que la tarjeta grfica est soportada por la
distribucinquevaausar,encasocontrarioesprobablequesoloconsiga
unaresolucinVGA.EnlascajasdeSuSE,RedHatoMandrakeviene
unarelacinbastanteampliadetarjetasgrficassoportadas.
Paraempezarresultamssencillousarunordenadorbaratosinelementos
degrandesprestacionesyaserposiblenodemasiadonuevo.
LosprocesadorescompatiblesconIntel386oPentiumestnsoportados
aunqueseandeotrasmarcas.Lasplacasprincipalesyeltipodememoria
tampocosoncrticos.Encuantoalosdiscosdurosycontroladorasque
funcionenbajobajoMSDOSsuelenfuncionarensumayoraconLinux.
Algunas controladoras SCSI no estn soportadas y otras controladoras
SCSI que si estn soportadas pueden suponer una dificultad para una
primerainstalacindebidoaquepuedennoestarincluidasenelncleo
(kernel)dearranquedelainstalacin.

/===============/
Eleccindesudistribucin
Puedequeaunnotengadecididoquedistribucinusar.Siustedquierela
mximafacilidaddeinstalacinquizsdeberausarMandrake,SuSE,o
RedHatperodadoqueestoformapartedeuncursodeLinuxnosotrosle
recomendamosDebian.Debianeslaquetienemayorinterseducativo.
335

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

Quizs le cueste algo ms empezar con ella pero tambin aprender


muchoms.
Evidentemente hay otras consideraciones para le eleccin de su
distribucin de Linux. Compararlas en trminos de mejor o peor no
resultaadecuado.Nosotrosnovamosabasarelcursoenningunadeellas
enparticular.PerovamosahacerunpocodepropagandadeDebian.
Alser100%libreeslamsadecuadaparaaprender.Tcnicamenteesla
distribucin ms robusta que existe. La actualizacin de los distintos
componentesatravesdelaredesmuchomscmodayeficazqueen
ningunaotradistribucin.LacomunidaddeusuariosdeDebianestmuy
bienorganizadaydanmuybuensoporte.
Debian no es para comodones. Hay que leer bastante y hay que
molestarseenbuscarlascosas.GnomeyDebiansellevanmuybieny
Debianestevolucionandoenelsentidodequecadavezresultarms
intuitivayfacildeusar.

/===============/
UtilidadesMSDOS
EnmuchasdistribucionesencontrarunosprogramitasensuCDdeLinux
que son herramientas para usar desde MSDOS. Son software libre y
puedenvenirmuybienparadeterminadascircunstancias.
fips20.zip Se usa para dividir una particin en dos sin perder los los
datos.Seusamuchoparacrearunhuecoenundiscoparapoderinstalar
enelLinux.EstaversinpuedetrabajarconFAT32.
gzip124.exeSetratadeunaversindelpopularcompresor'gzip'deLinux
paramsdos

336

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

lodlin16.zip PermitearrancarLinuxdesdemsdos.Sepuedeusardesde
disqueteodesdediscoduro.
rawrite1.zipyrawrite2.zip.Secorrespondenconrawriteversin1.3y
conrawrite2.0.Permitencrearundisquetedesdemsdosapartirdeun
ficheroquecontengalaimagendeesedisquete.Algunasdistribuciones
incluyenunavariedaddeimgenesdedisquetesdearranquescadauno
pensado para poder arrancar en distintos tipos de mquinas pero
lgicamenteparacreareldisquetedearranqueenunamquinadondeno
conseguamos arrancar Linux necesitamos que este programa funcione
bajomsdos.Seproporcionanamenudoestasdosversionesporsibienla
versin2.0esmsrpidapuedebloquearseenalgunosequipos.
unz512x3.exe Estamos poniendo ficheros con extensin .zip. Son
ficheroscomprimidosenunformatomuyutilizadoenmsdos.

/===============/
ProgramasdeutilidadparainstalarLinux
Lasdistribucionessuelenusarunsistemademensyunosasistentesque
leayudanainstalaryconfigurarelsistema.Muchosdeestosprocesos
podranrealizarsemanualmentedesdeelinterpretedecomandosyaque
selimitanausarunosprogramasqueestninstaladosencualquierLinux.
Ahoranoslimitaremosasealarsuexistenciaycomentarparaquesirven.
Convienequeconsultelaspginasdelmanualdecadaunodeellos.
fdisk(1): Se usa para particionar. Advierta que en msdos existe un
programa que tambin se llama fdisk y que sirve igualmente para
particionareldisco.
mkswap(1):Paraformatearunaparticindeswap
swapon(1):Paraactivarlaparticindeswap
337

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

mke2fs(1):ParaformatearunaparticinLinux
mount(1):ParamontarelsistemadeficherosElconceptodemontajede
ficheroslovimosmuydepasadaeneltercercaptulodedicadoalsistema
deficherosyhemospracticadopococonlporquerequerausodela
cuenta de root en un momento que no pareca prudente. Repase este
captulo si ya no se acuerda. Puede consultar en las pginas man los
comandosmount(1),umount(1).
Tambinesmuyinteresantequemireelcontenidodesu/etc/fstab.Esun
fichero que indica al kernel que es lo que debe montar durante el
arranque.Consultelapginamancorrespondientefstab(5).Sieditaeste
ficheropuedeespecificarnuevospuntosdemontajeperounerrorpodra
hacerqueelsistemanovuelvaaarrancar.
Siemprequemodifiquealgodelsistema,dejeunacopiadelficherosin
modificarenalgnlado.
Porejemplopuededejarcopiasoriginalesficherosterminadasen'.seg'.
De esa forma si algo deja de funcionar luego puede recuperar
exactamente la situacin original. Lo hemos dicho muchas veces.
Asegureseentodomomentolaposibilidaddedeshacercualquiercambio.
Conociendotodosestosprogramastendrunaideabastantebuenadelas
cosasquevansucediendoduranteelprocesodeinstalacinaunquelos
asistentes de instalacin demuchas distribuciones los usarn demodo
transparente(demodonoperceptible)mientrasinstalan.

/===============/
Discoderescate
Se llaman as a los CDs o disquetes que pueden arrancar Linux
directamenteydejanunsistemafuncionandoconunaseriedeutilidades
parapodersubsanarproblemasenequiposqueporejemplohanperdidola
338

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

capacidad de arrancar o que no deseamos que arranquen sin subsanar


antesalgnproblema.
Muchos de los primeros CDs o disquetes de instalacin de muchas
distribucionespuedenserusadoscomodiscosderescateenlugardedisco
deinstalacin.
LosdiscosderescatesonensimismosunSOLinuxenminiaturaycomo
es lgico arrancan un kernel predeterminado y montan un sistema de
ficherosraz.
Dado que se necesita permiso deescritura ynopodemos usarningn
discoduroparaelloporquepodranoexistirespacioadecuadoparaello,
loquesehaceesmontarelsistemadeficherosrazenundispositivo
RAM.DeestaformatenemosunsistemaminiaturaLinuxconmnimos
requisitosdehardware.
Loquehadehacersemuchasvecesparaarreglarproblemasesmontarlas
particionesdeldiscodurodondeseencuentraelficheroquedeseamos
modificarygeneralmenteconunsimpleeditorsecorrigeelproblema.Por
ejemplo si se olvida uno de la password de root se edita el fichero
/etc/passwd eliminando el campo de la password, y de esa forma no
pedir password.Essolounaformadehacerlo ylocomentamos solo
comoejemplodeusodeunsistemaderescate.
Tambin comentamos antesqueuncambio desafortunadoen/etc/fstab
podahacerqueelsistemanovolvieraaarrancar.Sugeriamosentonces
que dejara una copia del fichero original en algn lado. En este caso
despusdemontarlaparticin raizdelsistemaquenoarrancadeber
sobreescribir elficheromodificado conlacopia original deseguridad.
Despus de cada cambio hay que acordarse siempre de desmontar el
sistemadeficheros.
Sinodisponetodavadeundisquetederescateytampocodisponedeun
CDderescate,deberacrearunocuantoantes.Nuncasesabecuandovaa
sernecesariorecurrirael.
339

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

ParaellolocalizeenlosCDsdesudistribucinlaimagendeunodeellos
quesellamarseguramente'rescue.img','rescue.bin','rescue.raw',oalgo
parecido. Puede hacerlo desde MSDOS usando rawrite, o desde linux
usandodd.
Antesdebermontarlaunidaddecdrom.Generalmentesesuelemontar
en'/cdrom/',en'/mnt/cdrom/' oen'/mount/cdrom/'.Vienedeterminado
en/etc/fstab.Porelloparamontarlobastarhacer:
$ mount /dev/cdrom
$ df

ParaRedhatsera:
$ dd if=/mnt/cdrom/images/rescue.img of=/dev/fd0
bs=1440k

ParaDebianpotatosera:
$ if=/mnt/cdrom/dists/potato/main/disksi386/2.2.16-2000-07-14/images-2.88/rescue.bin of=/dev/
fd0 bs=1440k

/===============/
Lilo
Liloesuncargadorquepuedeserinstaladoendisqueteoendiscoduro.
En disco duro puede ser instalado en una particin o en en el MBR
(Master Boot Record). El MBR es una zona especial del disco muy
pequeareservadaparaelarranque.
Se puede especificar arranques alternativos para distintos SO como
Windows98,Linux,etc...ParaLinuxpodemosespecificararranquescon
distintosncleos,yarranquesquemontenelsistemadeficherosrazen
340

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

distintasparticionessiemprequeefectivamenteobtenganunsistemade
ficherosrazvlido.Porellosepodraespecificararranquesparadistintas
distribucionesdeLinuxinstaladasendistintossitios.
Durante el arranque se espera un tiempo para que el usuario pueda
especificarelarranquedeseadoypasadoesetiemposearrancalaopcin
dearranquequefigurepordefecto.
Lilo ofrece muchas posibilidades. Los asistentes de instalacin lo que
hacenescrearunficherodeconfiguracindeLilo/etc/lilo.confyluego
ejecutanLilo.
Si decide intentar alguna modificacin manual de este fichero de
configuracindeberejecutardespusLilo.Siolvidahacerlolaprxima
vezelsistemanoarrancar.Lomismopasarsitocacualquieradelos
elementosqueintervienenenelarranque.
PiensequeLiloseinstalaenunlugarmuypequeoenelcualsesitan
apuntadoresaunaseriedeficheroscomoelkernel,el/etc/lilo.conf,etc.
Sialgunodeestosficherossemuevedesitioosemodificasucontenido,
losapuntadoresdeLiloquedarnsealandounlugarequivocadodonde
yanoexistelainformacintil.
Ejecutando Lilo se vuelve a reconstruir todo y se actualizan esos
apuntadores. Esos apuntadores o punteros son datos numricos que
expresan posiciones fsicas en el disco en forma de cilindro, sector,
cabeza,ydispositivo.
PrecisamenteestosapuntadorestienenlimitacionesenmuchasBIOSysi
laparticindearranquedeLinuxnoestcontenidantegramentedentro
de los primeros 1023 cilindros de su disco duro el sistema puede no
arrancar.
LinuxsepuedeinstalarenelMBR.Sideseavolveradejarelarranque
originaldemsdosqueestabasituadoenelMBRpuedearrancarmsdosy
hacer'FDISK/MBR'.
341

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

Linuxtambinsepuedeinstalarenunaparticindeldiscoduro.Sipor
errorinstalaLiloenunaparticindondetenanWindowsposiblementese
pierdalainformacindelosficherosdelsistemadeWindowsydeber
transferirelsistemanuevamentearrancandodesdeundisquetemsdosy
tecleando'SYSC:'siendoC:launidadquedesearecuperar.

/===============/
Loadlin
LoadlinesunejecutableMSDOScapazdecargarLinux.
Convieneconocerestaotraformadearrancar.Esunaalternativaalusode
Lilo. Para ilustrar su uso pondremos como ejemplo la creacin de un
disquetedearranqueconLoadlin.
1. Formatee un disquete desde msdos o Windows incluyendo los
ficherosdelsistema.(FORMAT/S).
2. CopieelejecutableLOADLIN.EXEyunkernelenestedisquete.
Porejemplovamosasuponerquedichokernellometemosenun
ficherollamado'kr3'.
3. Supongamosquenuestrosistemadeficherosrazestsituadoen'/
dev/hda9'.
4. IncluyaunficheroAUTOEXEC.BATquecontengalosiguiente:
loadlinkr3root=/dev/hda9rovga=3
Buenosimplementeconestotieneundisquetedearranquequenousar
LilosinoLoadlin.Susistemadeficherospodrestarencualquierparte
deldiscodurosinlalimitacindelos1023cilindros.

/===============/
LaSwap

342

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

Unadelascosasquetendrquedeterminareslacantidaddeswap.Ya
hemos vistoenlaleccin anteriorelconceptodememoria virtual.La
swapeslapartedeldiscodestinadaalintercambiodepginasdememoria
deRAM.
Generalmentesesueledimensionarlaswapconeldobledetamaoquela
cantidad de RAM disponible. De esta forma la memoria virtual
funcionar sin detrimento de velocidad. En el casode que el total de
memoriaresultanteRAM+SWAPnoalcanceparapoderejecutaralguna
de las aplicaciones necesarias sepodrsobredimensionar la SWAP a
costadereducirunpocosurendimiento.
Enelcasodetenervariosdiscos,convienerepartirapartesigualesla
swapentreellosparaquetodoslosdiscoscolaborenporigualalproceso
depaginacin.Estonoesimprescindibleperoesteprocesoesunodelos
quemsrepercuteenlacapacidaddetrabajodetodosusistema.
Laparticindeswapserlapartedesusistemaquetengamayornmero
deaccesosyporellotampococonvieneponerlaenunextremodeldisco
alejada de los sistemas de ficheros en uso. Esdto obligara a hacer
desplazamientosmayoresalascabezasdeldiscoyseperderavelocidad.
Enrealidadtodoestosoncosasquenotienenexcesivaimportanciaenun
ordenadorquenovaatenerdemasiadacarga.Ensuprimerainstalacin
no debe preocuparle demasiado estas cosas. Ya dijimos que no
pretendemos hacer un curso de administracin sino un curso de
autosuficienciaparausuariosdeestacionesdetrabajo.Paraequiposcon
muchosusuariosograndesservidoressiserconvenienteafinarloquese
puedaalahoradeestablecerlacantidadylalocalizacindelaswap.

/===============/
Particionado

343

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

Esposiblequesudistribucinlefacilitelalabordeparticionadodeldisco
duroperonoestdemsunpocodeinformacinsobreesto.
Cadatipodedispositivousauncontroladorqueenelcasodelosdiscos
durosson'/dev/hda'paraelprimerdiscoIDE'/dev/hdb'paraelsegundo
discoIDE,'/dev/sda'paraelprimerdiscoSCSI,etc..
ConcretamentelosdiscosIDEserndelaforma'/dev/hd[ah]',losdiscos
SCSIsern'/dev/sd[ap]',losESDIsern'/dev/ed[ad]',paralosXTsern
'/dev/xd[ab]'.
Lasparticionesseusanaadiendoelnmerodelaparticinaldispositivo.
Porejemplo'/dev/hda1/'serlaprimeraparticindelprimerdiscoIDE.
Comomximosepodrntenercuatroparticionesprimariasenunmismo
disco. Si fueran necesarias ms,habra queusarunaparticin detipo
extendida.Sobreestasepuedenestablecervariasparticioneslgicas.
Laprimeraparticinlgicaserlanmero5porqueloscuatroprimeros
nmeros de particin se reservan para su posible uso en particiones
primarias.Tampocosepuedeusarmsdeunaparticinprimariadetipo
extendidoaunquepuedesercualquieradela1ala4.
Porejemplopodramostenerenunaprimeraparticinprimariaunsistema
operativoWindowsyunasegundaparticinprimariadetipoextendido,
particionadaasuvezen5partes.Deellasunadeberserparamontarel
sistemadeficherosraz(root,'/')queconvieneseadetipoLinuxyotra
paraelreadeintercambio(swap).
Elrestodelasparticionessepuedenusarparaloqueguste.Porejemplo
para montar '/usr', '/var', '/boot', '/tmp' o '/home', etc. Estos cinco
directorios son buenos candidatos para ser separados en particiones
distintas,perodarunasindicacionesgeneralesparadeterminarelespacio
necesarioresultacomplicadoyaquedependedeltipodeusoquetengael
sistema.

344

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

Por el contrario tambin se puede optar por montar todo en una sola
particin queserlaparticinraz.Porsusencillezdeberaconsiderar
hacerloasensuprimerainstalacin.Noesloidealperotampocohayque
serambiciososlaprimeravez.
Por otra parte con una sola particin se aprovecha mejor el espacio
cuandotenemospocodisco.Laprincipaldesventajaesquelaparticin
razquedarmuygrandeyesoaumentaelriesgodeproblemasenuna
particinqueconvienesealomsseguraposible.
Paraminimizaresteefectoesparaloqueseusaeldirectorio/bootquese
destinaacontenernicamentealgunosdeloselementosmsimportantes
que intervienen durante el arranque como por ejemplo el kernel.
Idealmente sera una particin muy pequea con unos 20MB que no
crecernuncayqueharmenosprobablequequeunerrorenelsistema
deficherosrazafectealarranquedelsistema,locualsupondraunmayor
esfuerzopararecuperarelsistema.
El tema del particionado se puede dejar en manos de los distintos
asistentes que usan algunas distribuciones los cuales ya sugieren las
particionesylostamaosmsomenosadecuadosenfuncindeltipode
instalacin, pero es mejor tener las ideas claras y partir ya con una
situacinadecuadaantesdemeterundisqueteoCDdeinstalacinde
Linux.Nosreferimos adejarlibrelosespaciosadecuados ensudisco
duro,yrepartidosenlasparticionesquepensemosusarantesdeempezar
ainstalarLinux.
Vamosaresumirloscasosmsfrecuentessimplementeparaquetenga
unaideageneral.

InstalarLinuxenunPCconunsolodiscoduroenteropara
Linux.Eslomssencillo.Puedeempezarcontodoeldiscolibrey
sinparticionar.

345

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

InstalarLinuxenunsegundodiscoduroenteroparaLinux
dejandoelprimerdiscoparaWindows.Estansencillocomoel
casoanterioraunquedeberidentificarlosdispositivos.
Lanomencaturadelosdiscoseslassiguiente:
o
o
o
o

hdaprimercanalmaestro.
hdbprimercanalesclavo.
hdcsegundocanalmaestro.
hddsegundocanalesclavo.

Sinosabecomoestconfiguradosuhardware.Puedearrancarun
discoderescateLinuxydesdeunaconsolateclear'fdiskl'Con
ello obtendr un listado completo de los discos y particiones
presentesensusistema.

Instalar Linux en un disco duro que ya tiene instalado


Windows. Entre en Windows. Desactive cualquier tipo de
antivirusporquesueleninstalarsealfinaldeldiscoynosepuede
mover compactando. Compacte el sistema de ficheros con la
opcindemximacompresin.Estodejartodoslosficherosenla
primerapartedeldiscoduroyelrestoquedalibre.Obtengael
programafipsparaWindowsdesdealgnCDdeLinux.Esuna
utilidadquedivideunaparticinexistentepordondeindiquemos.
Antesdeusarloconvienesalvarelcontenidodeldiscoporsilas
moscas.Useunaversinmodernadefips.Leaconatencinlas
indicaciones.CuandoterminetendrunaparticinconWindows
deltamaoqueustedindiqueyotraparaLinux.Entreenelfdisk
deWindowsyborrelaparticindondedeseeinstalarLinuxyya
puedeprocederainstalarLinux.
Instalar Windows y Linux en un PC que no tiene nada
instalado. Haga una particin para Windows dejando espacio
libre para Linux. Instale primero Windows y luego contine
instalandoLinux.

346

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

/===============/
CompatibilidaddelhardwareconLinux
Generalmenteparainstalartodaslasdistribucionesincluyenunooms
ncleos para arrancargeneralmente bastante grandesymuycompletos
para poder soportar una variedad de hardware suficientemente amplia
parasoportar unagranvariedaddedispositivos hardwareyasnodar
problemasenlainstalacin.
Noobstantelaextraordinariavariabilidaddecomponenteshardwarepara
PC disponibles en el mercado hacen imposible contemplar todas las
situacionesposibles.Elsoportedeestosdriversporelmomentonosuele
serfacilitadoporlosfabricantestalcomoocurreenWindowssinoquees
producto del trabajo desinteresado de mucha gente que colabora
desarrollando estos drivers para Linux muchas veces con la gran
dificultaddenodisponerinformacindelfabricante.
Prcticamentesevenobligadosaunalabordeinvestigacinmuycostosa.
Todo eso explica que los dispositivos ms sofisticados y los ms
modernosseanlosquetienenpeorsoporteenLinux.Estasituacinest
cambiando y ya hay algunos fabricantes que empiezan a dar la
informacin necesaria para desarrollo de drivers no desarrollados por
ellosgeneralmenteparaWindows.
SialgnelementodesuhardwarenofuncionaconLinuxpuededebersea
queestmalconfiguradoycambiardedistribucinpodranoservirde
grancosa.Cuandoalgoasocurrapiensequeestoleofrecelaoportunidad
deaprendercosasnuevas.
Tendr que investigar el tema y cuando consiga dar con la solucin
posiblementehabraprendidounaseriedecosasdegranintersparauna
variedaddesituacionesdistintas.Losprimerospasossonsiemprelosms
costosos.

347

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

Linuxnoestsiendousadoexclusivamenteporgursyhackers.Linux
est siendo usado por una cantidad enorme de personas que han
compensado su carencia de conocimientos tcnicos con tan solo un
poquitodepaciencia.AdiferenciadeWindowsnohaysecretos.Todala
informacinqueustedpuedallegaranecesitarestasualcance.Cada
distribucinvieneconsumanualdeinstalacin.
EnelcasodeDebianyotrasesemanualvieneenformatoelectrnico
pero conviene sacarlo a papel y dedicar algo de tiempo a su estudio.
Tambinsuelevenirenesemanualoenlamismacajadeladistribucin
una relacin del hardware soportado. Piense que el soporte para el
hardwareescasisiempreindependientedeladistribucinysolodepende
delaversindelkernelqueseestusando.EnelcasodeDebianlos
primeros captulos son de inters general con independencia de la
distribucinqueuseytambinestdisponiblegratuitamente.
1.
2.
3.
4.

QueesDebian(yqueesGNU/Linux)
Requerimientosdelsistema
Antesdeempezar
Particionadodeldiscoduro

TambinpuedeconsultarelmanualdeLinuxPrimerospasos.Quepuede
obtenerdesdeLuCAS,lugarqueanteriormenterecomendamos.

/===============/
ElKernel
ParaqueLinuxreconozcatodoslosdispositivosdelsistemadeberestar
compiladoconlasopcionesadecuadas.EnelcasodeLinuxelkerneles
ungranprogramayloquellamamosdriverssolosontrozosdecdigode
estegranprograma.Estediseosedicequeesunkernelmonoltico.
Linux permite que partes de este gran programa no estn
permanentementeenmemoriaRAM.Estaspartessonlosmdulosyse
348

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

corresponden con drivers que se cargan en el momento que el kernel


necesita su uso. Esta carga y descarga es muy rpida y por ello
dispositivosquenoseusancontinuamentecomo,impresoras,lectorasde
CDs,disqueterasetc..convienenestnconfiguradascomomdulos.
ParaconfigurartodohadecompilarseelncleoenunsistemaLinuxque
ya est funcionando y nosotros no vamos a tratarlo ahora. Si un
dispositivonofuncionahabrquecomprobarenprimerlugarsihasido
correctamentereconocidoporelkernel.Estoocurreduranteelarranquey
elkernelvamostrandolainformacindetodoslosdispositivospresentes
en el sistema que es capaz dereconocer. Paravolver aconsultar esta
informacindespusdearrancarsepuedeusarelcomando'dmesg|less'.
Nosocuparemosdelacompilacindelkernelenotrocaptulo.

/===============/
Consejosfinales
No resulta razonable empezar instalando una gran cantidad de cosas
distintas.Empieceinstalandolospaquetesimprescindibles.Luegopodr
iraadiendootrascosas,pocoapocoysacandocopiasdeseguridadantes
deaadiroquitarpaquetes.Piensequeunospaquetespuedendependerde
otrosoentrarenconflictosconotrosyquizsnosedecuentadequeest
modificandoalgoquenecesita.
Una vez obtenida una primera instalacin que funcione aunque falten
cosas por configurar deber avanzar despacio pero seguro. Es decir
recurra a las copias de seguridad estableciendo puntos a partir de los
cualespodrrecuperarlasituacinparanotenerqueempezarcadavez
desdecero.
Tambin es bueno ir apuntando las cosas que se van instalando y
configurandolaresolucindeproblemas,etc..Todoelloparafacilitarlas
cosasencasodetenerquevolveraempezar,delocontrarioelesfuerzo
enconfigurarsusistemasepuedeperder.
349

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

LaprimeravezqueinstaleLinuxnodebepensarenellocomounmero
trmiteparaempezarahacercosas.Piensequeesunprocesofraccionado
endistintasetapasyquecadaetapatienecomopremioelpoderdisfrutar
deunsistemacapazdehacercadavezmsymscosas.

/===============/
Documentacinadicional
Este documento fu pensado para ayudar a los usuarios con menos
conocimientos y menos recursos tcnicos a tener xito en su primera
instalacindeLinux.Eltemaesamplsimoyhaymuchadocumentacin
alrespecto. Porellonos hemos limitado ahacerunasconsideraciones
generales.Noobstantehayunagrancantidaddedocumentacindegran
utilidadparatemasdeinstalacinyconfiguracindeLinux.
Paraobtenerdichainformacinlerecomendamosquevisite.Laspginas
deLuCAScongrancantidaddedocumentacinenespaololaspginas
de LDP (LinuxDocumentatinProject)destinadasacentralizartodala
documentacindeLinuxentodoelmundo.
Enelcasodequetengaunadificultadespecficaconalgndispositivoo
conalgunaconfiguracinconcretadealgnsusbsitemapuedeencontrar
granayudaenunaseriededocumentoscortosmonogrficosdeenfoque
prcticodenominados"Howtos"o"Comos"quepodrencontrarenlos
lugaresqueacabamosdeindicarle.
Paraalgunoscasosconflictivosrelativosalhardwaredesuequipopuede
consultarladocumentacindesukernel.'/usr/src/linux/Documentation/'

/===============/
Asistenciagratuitaenlistasdeusuarios

350

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

Existen listas de correo en las cuales podr obtener respuesta a sus


preguntas sobre Linux. Realmente funciona en la prctica como un
serviciodeasistenciagratuitodegrancalidad.
Nodebetenerreparoapreguntarsiemprequecomprendaquehayque
respetarlasnormasdelalistayqueeltiempodelosdemsesvalioso.Por
ellonodeberanuncapreguntarcosassinconsultaranteslaspginasdel
manualyotradocumentacinadicionalqueacabamosdemencionar.
Seasumequenovaapreguntarporsimplecomodidad,sinoporqueha
buscadoynoaencontradolarespuesta.
EnEspaalalistadeconsultastcnicassobreLinuxengeneralesllinux.
Parasuscribirseodesuscribirseseenviaruncorreoelectrnicoconun
comandoqueserrecibidoporunservidorperonoserledoporninguna
persona sino interpretado por un programa que en este caso se llama
Majordomo.
$ # Para suscribirse
$ echo subscribe l-linux
| mail
majordomo@calvo.teleco.ulpgc.es
$ #
$ # Para borrarse
$ echo unsubscribe l-linux
| mail
majordomo@calvo.teleco.ulpgc.es
FIM

Recibir una contestacin automtica y con ello


recibir todo el
correo de la lista. Cada vez que alguien enva un
correo a la lista

351

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

todos los miembros recibirn una copia del mensaje.


La lista l-linux se modific hace poco y desde
entonces hay que estar
suscrito para poder enviar mensajes. Esto se hizo
para combatir en lo
posible el uso de SPAM y el envo de mensajes
annimos molestos.

Desde entonces la calidad de la lista ha mejorado


bastante.
Otras listas pueden tener un
funcionamiento ms abierto admitiendo cualquier
mensaje, y otras por
el contrario pueden tener un comportamiento ms
restrictivo.

Concretamente algunas
se llaman listas moderadas y solo se admite un
mensaje si una persona
llamada moderador considera que es un mensaje
oportuno.

352

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

Conviene leer atentamente las normas de uso de la


lista y atenerse
a ello. Hay gente que no respetan las normas. Incluso
hay algunos
que envan un mensaje admitiendo que est fuera de la
temtica de
la lista en tono de disculpa anticipada, pero estas
cosas se suelen
considerar abusos y pueden provocar fuertes
discusiones en la lista.
Concretamente l-linux es una lista que recibe y enva
muchos mensajes.

Hay otras listas especficas para otras


distribuciones o para temas
mucho ms especializados.

353

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

TERMINALES
Queesunterminal
En Linux y otros SO similares se considera la posibilidad de que un
ordenadortengavariosusuariostrabajandosimultneamente.
Cadadispositivoquepermiteaunusuariointeractuarconunamquinase
lellamaterminal.Hayterminalesdeentradacomoporejemplounlector
de cdigo de barras, los ya obsoletos lectores de tarjetas perforadas,
terminales salida como por ejemplo una impresora, y terminales de
entradasalidacomolosclsicosterminalesdepantalla.
Hayotrasmuchasclasesdeterminales.Porejemplohayterminalespara
personasciegas,peroeltipomsutilizadoeselformadoporpantallay
teclado. Dentrodeestacategora haycientos demodelos distintos.En
LinuxyenotrosSOtipoUnixsecontemplalaposibilidaddetrabajarcasi
concualquiertipodeterminal.
La palabra tty usada para designar los dispositivos que controlan los
terminales viene de TeleTYpe (teletipo). Los primeros terminales no
tenanmonitor.Eransimplesyprimitivosteletipos.
EnunPClapantallayeltecladosonperifricosqueseconectandeforma
independientealordenador,peroenordenadoresgrandeslosterminales
depantallaytecladosonuntodoquesecomunicaconelordenadorpor
unnicocable.Porejemploatravsdeunpuertoserie.Porestoscables
lo que circulan bytes correspondientes a los caracteres intercambiados
entreelterminalyelordenador.Antesdequesurgieranlosordenadores
personaleslonormaleraqueelordenadorestuvieraenuncuartocercano
alasaladeterminalesdondelosusuariossesentabanatrabajar.

354

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

Podemosverenla
figuraunconjunto
formado por
oordenador
centralyunaserie
de ordenadores
conectadosal.
Estos terminales
que acabamos de
mencionar aun se
usanhoyenday
no son simples
conjuntos de
tecladoymonitor.
Tienen cierto gradodeautonomalocualpermiteliberaralordenador
centraldeunapartedeltrabajoyaqueenlugardeatenderlasentradas
tecla a tecla, lo har lnea a lnea. La pantalla de un terminal no es
simplementeunmonitoryaquesuelectrnicaesmscompleja.Entresus
circuitos electrnicos dispone de una memoria. Esta guarda la
informacinhastatenerlalneacompletaqueademspuedesereditada
sinqueenesointervengaelordenador.Lapantallaencambiomuestralos
caracterestecleadosamedidaquesevanintroduciendo.Poresoloque
vemosenelterminalquizsnohasidotransmitidoanalordenador.En
realidadlamemoriadelterminalcontendrnosoloelbufferdelteclado
sinotodoelcontenidodelapantalladelterminal.Estoesnecesariopor
variasrazones.Unadeellaseslaposibilidaddehacerscrollverticalyotra
pararecuperarlainformacindetodalapantallaencasonecesario.
Terminalesvirtuales
Sihapasadoloanteriorporaltopensandoquenotienequeverconsu
casoportrabajarconPCs,vuelvaaleerlosprrafosanterioresporqueen
unPCqueuseLinuxunasesindeconsolacomolasqueestamosusando

355

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

enestecurso,funcionardeformamuysimilarporserunasimulacinde
estetipodeterminales.
En Linux existe una emulacin de varios terminales sobre un nico
monitor.Sedenominanfrecuentementeterminalesvirtuales.Paracambiar
de un terminal virtual a otro pulsaremos <Alt><F1>, <Alt><F2>,
<Alt><F3>,etc.Conellotendremos accesoalosterminales /dev/tty1,
/dev/tty2,/dev/tty3,etcrespectivamente.Encadaunodeestosterminales
puedemantenerseunasesindetrabajodistinta.
Escomosituviramosvariosterminalesfsicosdistintosformadospor
monitor, teclado, altavoz, memoria, ycable deconexin al ordenador,
pero solo pudiramos usar uno de ellos en un momento dado. La
informacin de cada terminal virtual se encuentra almacenada en
dispositivos/dev/vcsperonoesaccesibleparausuariosnormalitos.
Dispositivoscontroladoresdeterminales
Cadaterminalvirtualestgestionadoporuncontroladordedispositivo.Si
ejecuta el comando 'tty' obtendr el nombre del controlador que est
usando.
$ tty
/dev/tty3

Bueno/dev/tty3seraelnombredelterminal.Ustedpuedeobtenerotra
cosaperovamosasuponerquesuterminalfueraeste.
$ echo "hola" > /dev/tty3

Sacarelmensaje"hola"enlapantalladesuterminal.Siintentahacer
estomismosobreotrodispositivo,porejemplo/dev/tty2deberaaparecer
elmensajeenlapantalladeotroterminal.Normalmenteestonosucedea

356

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

noserque/dev/tty2tambinestfuncionandoconsuusuario.Conestose
evitaqueunusuariopuedamolestaraotro.
Losterminalesvirtualesestnnumeradosdel0al63.Paravercualesel
nmerodelterminalactualtambinsepuedeusar'fgconsole'
Hayotrostiposdeterminales.Sondispositivosdetipocarcteryhayun
montndeellosdisponibles.
$ ls /dev/*tty*

Existeundispositivoespecialqueparacadausuariosecomportacomosi
fuerasupropiocontrolador.
$ echo "hola" > /dev/tty

Estosacaunmensajeenlapantalladesupropioterminalexactamente
igualqueelelcasoanterior.Estopuedesertilparausarloporejemplo
en scripts que pueden tener ambas salidas (estndar y de errores)
redirigidas a ficheros pero deseamos que determinado mensaje salga
siempreporlapantalla.
Existe otro dispositivo especial llamado consola /dev/console. Este
dispositivo suele encontrarse prximo alamquina yporelsalen los
mensajesdelsistema.Seasumequeestepuestodetrabajoesusadoporel
administradordelsistema.
Laconsolaestasociadaa/dev/tty0quealigualque/dev/ttyesunalias
determinalvirtualactualperopuedentenerpermisosdistintos.
Vamos a hacer algunas pruebas y vamos a suponer que su sesin de
trabajo con bash utiliza el tty3. Compruebe cual es su caso con el
comando'tty'yencasodeserdistintatngaloencuentacadavezque
hagamos referencia al tty3 o a <Alt><F3>. Usted deber usar lo que
357

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

correspondaensucaso.Tambinpuedepasarsealtty3paracontinuarla
leccin.
Primerovamosacomprobarladisponibilidadylospermisosdeunttyque
casisiemprequedalibre.Eltty12.
$ ls -l /dev/tty12
crw-rw-rw- 1 root
/dev/tty12

tty

4, 12 ago 29

2000

Aquloimportanteescomprobarquepodemosusareseterminalyque
tienepermisosdelecturaescritura.
Siesto no esashabraquemodificarlospermisos oinclusocrearel
dispositivoparapoderhacerlaprcticaperoesorequiereprivilegiosde
rootynossaldramosdelospropsitosdeestecurso.
Vamosaprobarsipodemosescribireneltty12.
Siustedhace'echoxxxxx>/dev/tty12'yluegopasaalterminaltty12con
<Alt><F12>verquenopuedehacernadaenlperolas'xxxxx'aparecen
enlapantalla.
Vamosaprobarsipodemosleerdeltty12.
Haga'cat</dev/tty12'desdesusesindetrabajoyluegopasealterminal
tty12con<Alt><F12>eintroduzcaunacadenasinusarlatecla<Intro>.
Porejemplo'yyyyyyyyyyyy'.
Sivuelvealtty3con<Alt><F3>comprobarqueelcomandocatcontinua
esperandorecibirdatosperoaunnoharecibidoningncarcter.Larazn
esquelacadena'yyyyyyyyyyyy'seencuentratodavaenlamemoriadel
terminaltty12ytodavanosehaenviadounsolocarcteralordenador.
Elmodonormaldefuncionamientodelosterminalesdetextoeseste.En
lugardeenviarcaracteresaisladosenvanchorrosdecaracteres.
358

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

Vuelaaltty12con<Alt><F12>ypulse<Intro>.Inmediatamentevuelvaa
tty3con<Alt><F3>ycomprobarquecatacabaderecibirlacadenade
caracteres.Parafinalizarcatinterrmpalocon<Ctrl+C>.
Sialgunadeestasdospruebasdelecturaoescrituranohafuncionado
posiblemente se deba a unos permisos demasiado restrictivos o a una
diferenteconfiguracinensuequipoyesosuponequetendrdificultades
parapracticarestaleccinperonosotrosvamosairexplicandotodolo
quesucedeencadaprctica.
Sesindetrabajoenunterminal(getty)
Repasemosunpococosasqueyacomentamos enleccionesanteriores.
Hay un fichero de configuracin '/etc/inittab' que durante el arranque
activar un programa llamado 'getty'. Este mandar un mensaje a la
consola en espera de que alguien introduzca su nombre de usuario.
Cuandoestosucede'getty'haceunexecalprograma'login'conelnombre
de usuario obtenido y login solicitar la password. Si la password es
correctaloginharunexecalashell.
Estoyalovimoscuandohablamosdelosprocesosysirecuerda'exec'es
unallamadaalsistemaquecambiaelcdigodelprogramaqueseest
ejecutandosincambiarsuPID.Cuandolashelltermine,elproceso'init'
detectarlamuertedesuprocesohijoyarrancarunnuevo'getty'porque
en'/etc/inittab'estosprocesosfiguranenmodorespawn.Tambinfigura
elnombredeldispositivoylavelocidaddecomunicacin.
Los terminales que no tengan entrada en este fichero /etc/inittab no
estarndisponiblesparaunasesindetrabajoenmodoconsolaperoeso
no quiere decir que sean intiles. Por ejemplo si en /etc/inittab solo
aparecenlosterminalesquevandesdetty1atty6solopodrabrirestos
seisterminalesvirtualesperosisearrancanlasXwindowsloharnenel
primerterminaldisponiblequeenestecasosereltty7.
Esteesuncursodeusuarioyapesardequeaestasalturasdelcursose
explicancosasalgoavanzadasnopretendemosensearleaadministrarel
359

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

sistema. En particular le advertimos que no debe intentar modificar


/etc/inittabaunquedispongadecuentaderootsinosabeexactamentelo
queesthaciendo,porquesusistemapodranovolveraarrancar.
'getty'esunprogramanormalquenorequiereprivilegiosespecialespara
serejecutado.
Laprcticaqueponemosahorasoloserposiblesisupuestodetrabajoes
unPCconLinux.Siesttrabajandoen unterminal independiente del
ordenador central no podr hacerlo. Si la prueba de enviar 'xxxxx' al
terminaltty12nofuesatisfactoriatampocopodrhacerestaotraprueba.
Localicegettyconelcomandolocateporejemplo.Supongamosquelo
encuentraen'/sbin/getty'.
Mireen/etc/inittablapartedondeaparecegetty.
$ cat /etc/inittab
# <id>:<runlevels>:<action>:<process>
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

Supongamosquefiguraloqueacabamosdeponer.respawneslaaccin
realizadaporinit.Significaenestecasoejecutaryvolveraejecutarcada
vez que termine. /sbin/getty es el programa que abrir el terminal. El
primerparmetrodespusdegettyeslavelocidaddetransmisin(eneste
caso38400),yelltimoparmetroeselterminal.
Nosbasamosenestainformacinparalanzargettysobreeltty12:
/sbin/getty 38400 tty12

360

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

Comprobarqueaparentementeelprogramanotermina.Paseahoraal
terminaltty12con<Alt><F12>
Ver que 'getty' ha abierto una sesin en ese terminal. 'getty' esta
funcionando sin ningn problema. Introduzca su nombre de usuario y
ver que login no es tan permisivo. Dar un mensaje de error no
reconociendo a su padre como un padre legtimo. Para evitar usos
extraosdeloginseterminasuejecucin.Volviendoalasesindonde
arrancogettyverqueestetambintermin.
Esteintentofracasadonoquieredecirquenosepuedaabrirunasesinde
trabajoenunaconsolaquenoestcontroladapor'getty'.Solosignifica
que'login'esunvigilantecelosodelaseguridaddelsistema,yhemos
intentadousarlodeunamaneranoconvencional.
Nosolosepuedeabrirunasesindetrabajoenunaconsolaquenoest
controlada por 'getty' sino que adems es muy fcil y no requiere
permisos especiales. Para abrir una sesin en el /dev/tty12 basta con
ejecutar 'openvt c 12 bash' y esto lo comentamos simplemente como
curiosidadparaquelopruebesiquiereperonomerecemsexplicacin
enestemomento.
Todaestaprcticaunpocorarapretendequecomprendacomofuncionan
lascosas.Eltemadelosterminalesesbastanteamplio.
Lalibrerancurses
Novamosaaprenderausarestaslibrerasporqueestenoesuncursode
programacinperoesunalibreramuyimportanteyencontrarmontones
de referencias en el manual de Linux a estas pginas. Resulta
imprescindible comentar algo de ncurses para comprender el
comportamientodealgunasaplicaciones.
Yahemosdichoquehaymuchasclasesdeterminalesyqueinclusoun
determinadotipodeterminalfsicopuedefuncionardeformasdistintas,
emulandounosterminalesaotros.Cadaterminaltienesupropiolenguaje
361

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

decomandosquenosonotracosasdesecuenciasdecaracteresasociadas
adeterminadasacciones.Porellounaaplicacindebeconocerconque
terminalesttratando.
Las aplicaciones hacen esto usando una librera intermedia que se
encargardetraducircadaaccinalasecuenciadecaracteresadecuada.
Estalibrerasellama'curses'osuversinmodernallamada'ncurses'.La
aplicacindebedeserinformadadeeltipodelterminalconelcualest
trabajandoyesosehaceatravsdelavariableTERM.
Siustedconsulta(hgalo)elvalordeestavariableseguramenteobtendr
'linux' que es el nombre del terminal que linux usa por defecto. Hay
muchostiposdeterminalesycadaunotienesunombre.Porejemplosi
ustedejecutaTERM='vt100';exportTERM;Laaplicacinqueseejecute
acontinuacinpuedepensarquetienequedialogarconunterminaltipo
'vt100'.
Bueno algunas aplicaciones no hacen esto. Directamente asumen que
funcionarnenundeterminadotipodeterminalyporellonousannila
variableTERMnilalibreracurses.Porejemplolscolor=autoasumir
siemprequeelterminalesunterminal'linux'yenviardirectamentelas
secuenciasdecaracteresapropiadasparaunterminal'linux'aunqueexiste
unficherodeconfiguracinmsquenadaparapoderponerelcolorque
uno quiera a cada cosa. Puede probar a cambiar la variable TERM y
comprobarqueloscoloressalenperfectamente.
Porelcontrariolautilidad'less'siusa'ncurses'selaponiendolavariable
TERM=att4424ycomprobarquelaaplicacinsecomportadeunmodo
extrao.EncambiosiusalavariableTERM=vt100.Secomportarde
formacasinormalporqueelterminal'vt100'yelterminal'linux'tienen
algunassimilitudes.Enrealidadvt100(DEC)esuntipodeterminalmuy
conocido,yelterminaldelinuxderivadel.
Hemoselegido'ls'y'less'porquenosuponenunpeligroencasodeuso
incorrectoperosiintentahacerestoconotroprogramacomoporejemplo
362

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

uneditorpodradestruirunficherodebidoaldesconciertoorganizadoen
supantalla.
Lalibreracursesaccedeaunabasededatosdeterminales (terminfo)
dondeseestablecenlacapacidadesdecadaterminal.
Siustedesttrabajandoconlinuxenunterminalquenoesdetipo'linux'
notarquealgunasaplicacionesnovanbien.Laformadearreglarloes
cambiarlavariableTERMconelvalorapropiadoasuterminalyaspor
lo menos las aplicaciones que usen curses volvern a funcionar
perfectamente.
ElterminaldeLinux
Las capacidades del terminal de linux son muy variadas. Manejo del
cursor,borradodepartesodelatotalidaddelapantalla,coloresyotros
atributos, pitido del terminal, configuracin de la pantalla en filas y
columnas, guardar posicin del cursor, etc.. Las pginas del manual
anteriormente mencionadas tratan de todo esto y la cantidad de
posibilidades es tan grande que nos limitaremos a poner algunos
ejemplos.
Paraconocereljuegodecaracterescompletoycaracteresdecontrolque
tieneunterminallinuxconsulteenlaseccin7delmanuallaspginasde
ascii(7)eiso_8859_1(7).Paraunarelacindelassecuenciasdecontrol
consultelapginaconsole_codes(4).
Antesquenadaconvienesaberqueelterminalpuedequedarenunestado
que resulte muy difcil de usar. Si eso llega a ocurrir teclee
'<Intro>reset<Intro>' y con un poco de suerte todo volver a la
normalidad.Pruebeahoraestecomandoparaasegurarsedequedispone
deelantesdehacerlapruebasiguiente.
$ reset

363

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Erase is delete.
Kill is control-U (^U).
Interrupt is control-C (^C).

Semuestralaconfiguracinpordefectodealgunosparmetrosqueluego
explicaremoscuandohablemosdestty.
Vamosahacerunapruebaalgodelicada.Vamosaenviaruncarcterde
controlalterminalquelodejarenunestadobastantelamentablepara
trabajarconl,paravercomosepuederecuperarunasituacindeeste
tipo.
Vamosaenviarun<Ctrl+N>peroparaellohayqueusarunasecuencia
de escape idntica a la que se vio en el captulo del editor 'vim'.
Concretamente la secuencia para introducir el <Ctrl+N>, ser
<Ctrl+V><Ctrl+N>.Estoaparecercomo^N.Antesquenadacmbiese
aldirectorio'/tmp'dondenopodremoshacermuchosdestrozos.Despus
deenviar el'^N'alterminal nopodremos verloquehacemos porque
saldrncaracteressemigrficosenlugardeletras.
$ cd /tmp
$ echo '^N''
$FIN

Ahoraolvidesedelmonitorporunmomentoyhaga<Intro>reset<Intro>.
Sesuponequehabrfuncionadobien.Encasocontrarionoseaceptan
reclamaciones.Disponeusteddeotrosterminalesvirtualesenotrosttys
as que si un terminal noserecuperapuedeusarotros.Convieneque
aprendaarecuperarestassituaciones.
Vamos a hacer un programita que usa las secuencias de escape del
terminaldelinux.Laexplicacinlapuedeconsultarenconsole_codes(4).
Editeunficheroquellamaremos'pru_console_codes.bash'.

364

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
function muestra(){
# echo -e "\033[${POSY};${POSX}H" # Manda el
cursor a $POSY $POSX
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[30mNegro\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[31mRojo\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[32mVerde\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[33mMarron\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[34mAzul\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[35mRosa\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[36mCeleste\c'
let POSY=POSY+1 ; echo -e "\033[${POSY};$
{POSX}H\c"
echo -e '\033[37mBlanco\c'
}
typeset -i POSY ; typeset -i POSX
echo -e '\033[2J\c' # Borrar pantalla
echo -e '\033[1m\c' # Atributo Brillo
POSY=1 ; POSX=16 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Brillo*\c'; muestra
echo -e '\033[2m\c' # Atributo Semi brillo
POSY=1 ; POSX=31 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Semi Brillo*\c'; muestra
echo -e '\033[0m\c' # Atributo normal
echo -e '\033[5m\c' # Atributo Intermitente
POSY=1 ; POSX=46 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Intermitente*\c'; muestra
echo -e '\033[0m\c' # Atributo normal

365

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
echo -e '\033[7m\c' # Atributo Inverso
POSY=1 ; POSX=61 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Inverso\c'; muestra
echo -e '\033[0m\c' # Atributo normal
POSY=1 ; POSX=1 ; echo -e "\033[${POSY};${POSX}H\c"
echo -e '*Normal*\c'; muestra
echo -e
echo -e
POSY=12
echo -e

'\033[5m\c' # Atributo intermitente


'\033[7m\c' # Atributo Inverso
; POSX=1 ; echo -e "\033[${POSY};${POSX}H\c"
'*Inverso+Intermitente\c'; muestra

echo -e
echo -e
echo -e
POSY=12
echo -e

'\033[0m\c' # Atributo normal


'\033[5m\c' # Atributo intermitente
'\033[1m\c' # Atributo brillo
; POSX=26 ; echo -e "\033[${POSY};${POSX}H\c"
'*Brillo+Intermitente\c'; muestra

echo -e '\033[0m\c' # Atributo normal


echo -e "\033[25;1H\c"

Elprogramaterminaponiendoelatributonormalperorecuerdequesi
algosalemalyelterminalquedaenunestadopocooperativodeber
recuperarloconelcomandoreset.Unavezdichoestopongapermisode
ejecucinaesteficheroyejecutelo.
Podr comprobar como sale la informacin con distintos colores y
atributos.Paraellohemosusadosecuenciasdecaracteresespecificasde
losterminaleslinuxyquepodrannofuncionarenotrosterminales.
Controldeunterminal(setterm)
Paracambiarlosatributosdeunterminalcualquieraseusasetterm(1)que
utilizar la variable TERM para identificar el terminal y usar las
secuenciasdecaracteresadecuadas.
setterm admite el nombre de un terminal para enviar los cdigos de
controlaeseterminalenlugardeenviarlosalterminalactual.

366

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

Vamosacambiarelsonidodelpitidodenuestroterminal.
$ setterm -bfreq 100 -blength 500

Ahoratendremosunpitidomsgravedelonormaldemediosegundo.
Antes de volverlo a su situacin normal cambie a otro terminal y
compruebe que el cambio de sonido no ha tenido efecto sobre ese
terminal.Nopiensequesuordenadortieneunnicoaltavozporquees
como si existiera un altavoz para cada terminal solo que no puede
funcionarmasqueunodeellosenunmomentodado.Enesoconsistela
emulacindelosterminalesvirtuales.Esunsoloterminalfsicoperose
comportacomovarios.
Paradejarelsonidocomoalprincipioharemoslosiguiente:
$ setterm -reset

Ahoravamoshacerunprogramaquesacardistintossonidos.
sound(){
setterm -bfreq $1 -blength $2
echo -e '\a\c' > /dev/console
}
sound 2000 900
sleep 1
sound 700 400
sleep 1
sound 150 300
sleep 1
sound 70 200
sleep 1
sound 40 1000
sleep 1
setterm -reset # Volver a la situacin normal
echo -e '\a\c' > /dev/console

367

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

settermcursoroffsettermcursoronsettermrepeaton
Configuracindeunterminal(stty)
El programa stty(1) sirve para comprobar o alterar el estado de un
terminal.
$ stty
speed 38400 baud; line = 0;
-brkint ixoff -imaxbel
-iexten

Esto solo muestra los parmetros ms importantes. Para mostrar la


totalidaddelosparmetrosquecontrolannuestroterminalharemos
$ stty -a
speed 38400 baud; rows 25; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D;
eol = <no definido>;
eol2 = <no definido>; start = ^Q; stop = ^S; susp =
^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time =
0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal
-crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr icrnl ixon ixoff
-iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel
nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh xcase -tostop -echoprt
echoctl echoke

Cuandoejecutamosresetnosmuestralaconfiguracindelossiguientes
tres parmetros. ( erase = ^? , kill = ^U , intr = ^C ) que son
respectivamenteelcaracterqueelterminalinterpretarcomoelcaracter
368

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

para borrar el ltimocaractertecleado,elcaracterparaborrarlalnea


actual,yelcaracterparamandarunasealdeinterrupcin.
Enlapginamanstty(1)vienelainterpretacindetodoslosparmetros
usadosparaconfigurarunterminal,Lonormalesquesuvalorpermitaun
usonormaldelterminalyporellotocarlospodraafectaralaoperatividad
delterminal.
sttytambinpermiteguardarlaconfiguracinactualdeunterminalenun
ficheroconlaopcingenunformatoquepermitiralpropiosttyajustar
todos los parmetros de un terminal usando uno de estos ficheros
generadosconlaopcing.
Enlaprticaquesiguedeberecordardeparaintroduciruncaracterde
controldebervenirprecedidode<Ctrl+V>
$ # Guardamos la configuracin
$ stty -g > /tmp/stty.out
$ cat /tmp/stty.out
1500:5:4bf:a3b:3:1c:7f:15:4:0:1:0:11:13:1a:
0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
$ stty werase ^A # Ojo usar <Ctrl+V> <Ctrl+A>
$ stty -a
$ # Comprobamos que ahora werase = ^A;
speed 38400 baud; rows 25; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D;
eol = ;
eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^A; lnext = ^V; flush = ^O; min = 1; time =
0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal
-crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr icrnl ixon ixoff
-iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel
nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh xcase -tostop -echoprt
echoctl echoke
$ stty `cat /tmp/stty.out` # Recuperamos la

369

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

Losresultadosdeestaprcticapuedenvariardeunsistemaaotro.Lo
importanteesquecompruebecomohemossalvadolaconfiguracinaun
ficheroantesdealterarlaconfiguracindelterminalycomopodemos
recuperaresaconfiguracindesdeesefichero.Usamossolowerasepara
elloynovamosaproponermsejerciciossobreesto.Losterminalesen
Linuxnoemulansiemprealaperfeccinalosterminalestradicionales.
Loexplicamosenelsiguienteapartado(verreadline).
Lalibrerareadline
Nuevamente tenemos que comentar la existencia y propsito de una
libreraespecialnoparaaprenderamanejarlasinoparacomprenderuna
situacin bastante especial de los terminales en Linux. Los terminales
virtualesenLinuxnosecomportancomolosterminalesotrossistemas
tipoUnix.Porejemplopodemoscambiarelcaracterdecontrolde'erase'
consttyyparecerquenotieneningnefecto,cosaquesecontradice
totalmente con lo que dijimos antes. Esto se debe a que muchos
programas de linux usan la librera 'readline' que tiene sus propias
funcionesdeedicindelineaetc..yactansobreescribiendolasfunciones
delterminal.Estodeterminadostiposdeusosdistintosdelterminalydos
comportamientosdistintos.

Elbashymuchos delosprogramasdeGNUusarnlalibrera
readline. Los programas que usen readline usaran
$HOME/.inputrc para la configuracin de ciertos caracteres de
edicin de lnea. En caso de no existir este fichero se usa
/etc/inputrc.Porelloelcaracterdeborradodeultimocaractery
otrosnorespondernalomostradoporsttysinoalficheroinputrc.
Por el contrario un programa C que use gets() para leer
directamentedeltecladonousarlalibrerareadlineyporellolo
quefuncionarserloquedeterminenlosparmetrosdestty.

370

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

Escomosiexistierandosclasesdedispositivos.Unoserattyyelotrolo
podramosllamartty>readline.
Noescuestindeprofundizarenestostemasquesonmsadecuadospara
un curso de administracin o de programacin. Con esto se pretende
simplementedarunaexplicacinlgicaaestetipodecomportamiento
muyespecficodelosterminalesLinux.
Terminalesypseudoterminales
Yahemosvistocomopuededirigirseentradasalidaaunterminalperoun
procesopuedetenerprevistodoscomportamientosdistintosparaelcaso
quesusalidaestconectadaaunterminaloaunfichero.Porejemplola
opcin'color=auto'para'ls'resultamuytilyaqueproducirdostipos
desalidasdistintosdependiendodequeestconectadabienaunterminal
bienaotracosatipoficheropipeetc...Enelcasodeestarconectadoaun
terminal,sacarlainformacinencolor,perosidetectaotracosasacarla
informacin sin color para evitar volcar un montn de caracteres de
extraos. En otras palabras 'ls' y muchos otros programas pueden
averiguarsisusdescriptoresdeentradasalidaestndarestnconectadoo
noaunterminal.Lasalidaaunterminaldeterminaunusointeractivocon
unapersonayporellolosprogramasseadaptanaello.Algunasveces
queremosqueelcomportamientodeunprogramaseacomosiestuviera
conectadoaunterminalpeseaquenoseaciertoyporvelloalgunasveces
hayqueusarunterminalficticioopseudoterminal.
Un pseudoterminal esuncomponente softwaredestinadoasimularun
terminal.Seimplementanusandounaparejadedispositivosespecialesy
distintos denominados esclavo y maestro. Un proceso que use un
pseudoterminalpensarqueestconectadoaunterminalautnticoyno
notardiferenciaalguna.
Porejemplounaventanade'xterm'enwindowsfuncionadeesamanera.
Unejemplodepseudoterminal(script)
371

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

Scrip es un comando que funciona creando un pseudoterminal y


arrancando unasubshell que nonotarque laentrada salida noes un
autentico terminal. Script se usa para grabar una sesin completa de
trabajoconbashenunficherosiseterminaalfinalizarlaejecucindela
shellconexit.
Pruebelosiguiente:
$ script /tmp/script.out
$ ls --color=auto /
$ ls --color=auto / > /tmp/ls.out
$ exit

Elprimer'lscolor=auto/'mostrarelcontenidodeldirectoriorazen
colores.Elsegundo'lscolor=auto/>/tmp/ls.out'guardarlasalidaen
un fichero '/tmp/ls.out'.La sesindescriptsefinaliza abandonando la
shellconexit.Cuandomiremoselcontenidode'/tmp/ls.out'coneleditor
'vi'comprobaremosquenohaycoloresnicaracteresextraos.Simiramos
lasesincompletagrabadaconscriptenelfichero'/tmp/script.out'con'vi
comprobaremos que est llena de caracteres extraos. Los retornos de
carroaparecencomo'^M'(representa<Ctrl+M>yloscdigosdecolores
con secuencias del tipo '^[[0m...' o similares que responden a las
secuencias de controlparamodificar atributos ycolores enlapantalla
segnsedescribeenlapginaconsole_codes(4).Sienvaelcontenidode
esteficheroapantallaporejemplousando'cat/tmp/script.out'aparecern
loscolores.
scriptcapturaabsolutamentetodoyporellograbarunasesinconscript
enunficheropuederequeriruntratamientodefiltrarciertascosasantes
de darle determinado uso a esa salida, pero resulta muy til si solo
deseamosregistrarunasesindetrabajoparanotenerqueirapuntandolo
quevamoshaciendooloquevamosobteniendo.

372

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

PROGRAMACIONDETAREASENELTIEMPO
Introduccin
Enestepuntodelcursopodemosasumirqueyasabeprogramaralgunos
scriptsparahacercosasqueleinteresan.Silepreguntramoscomohacer
paraqueunprogramaseejecutedentrodetreshorasusaraelcomando
'sleep 10800'. Y efectivamente eso sera una solucin sencilla que
funcionaramuybienyaquesleepnoconsumenadadecpuytreshoras
son10800segundos,peroprobablementesehabrpreguntadocomohacer
paraqueunatareaseejecuteenundeterminadomomentoocomohacer
paraqueunatareaseejecuteperidicamente.
Paraesodisponemosdeloscomandos'at','batch'y'cron'.A'batch',ya
'at'hayquepasarleselcomandoporlaentradaestndar,ycon'batch','at',
ya'cron'lasalidadelcomandoserdirigidaalacuentadecorreodel
usuario.Poresoconvieneredirigirlassalidasconvenientementeyresulta
evidentequedeestaformanosepuedenejecutarprogramasinteractivos.
procmeter3unaherramientaparamonitorizarelsistema
Esteesunprogramaquenosresultardegranutilidadparacontrolarla
carga del sistema y en general para vigilar cualquier aspecto de la
actividadenelsistema.Lamayorpartedeestainformacinesobtenidaa
partirde/procyesaltamenteconfigurable.
ParaestaprcticadeberactivarloselementosparaCPUyparaLOADen
modogrficorepresentadoporunalneaquebrada.Adviertaqueestetipo
degrficaposeenunasrayashorizontalesyunnumeritoentreparntesis
enlaparteinferior.Esenumeritoindicalaunidadcorrespondiente.Por
ejemplo para CPU aparece (20%) y para LOAD aparece (1). Esto
significaqueenlaprimeragrficacadarallahorizontalsuponeun20%de
373

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

usodeCPU.EnLOADcadarallasignificaunacargade1.Estosvalores
sonlosestablecidospordefectoyaunqueestoyotrascosaspuedenser
configuradasdeformadistintanosotroslousaremosas.
Lasutilidadesat,atqyatr.
Permite programar una tarea para que se ejecute en un determinado
momento.'at'usaunajerarquadecolasycadaunadeellasserefiereaun
nivel'nice'queeselvalorqueotorgalacantidadderecursodecpuque
puedeocuparelprocesoendetrimentodeotrosqueseestnejecutando
simultneamente.Losnivelessenombranconunnicocarcterquevade
la'a'ala'z'odela'A'ala'Z'.Lasprimerasletrasdelalfabetoestn
asociadas con alta capacidad para usar CPU y las ltimas todo lo
contrario.Pordefectoelcomando'at'ejecutarconelnivel'a'.
Existeuncomandollamado'batch'quesirveparaejecutarcomandosde
formano inmediata perosinespecificar elmomento. Loexplicaremos
msadelanteyvieneaserloequivalentea"ejecutaestocuandonoests
muyocupado".Locomentaremosluegoperoresultaqueelcomando'at'
tambinpuedefuncionardeestaforma.
Siseusa'at'especificandoelniveldeejecucinconunamaysculael
programanoseejecutarobligatoriamenteenelmomentoindicadosino
queesperaraquelacargadelsistemaseainferioralvalorestablecido
paralosprocesosbatch.
echo'echoHola>/dev/console'|atnow+2minutes
Podrcomprobarqueelsistemadevuelveinformacinrelativaalatarea.
jobat
Paracomprobarlastareasplanificadasejecute'atq'paraeliminarunatarea
planificadaqueaunnosehaejecutado'atrm'

374

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

Por ejemplo si su usuario fuera pepe y quiere enviarse asi mismo un


mensajederecordatorioparaelmediodadelSbadopuedehacerqueel
sistemaaesahoraleenveuncorreoelectrnico.
echo"mails'Recordatorio.LlamaraJaime'pepe"|atNOONMON
Lasespecificacionesdetiempoutilizanunasintaxisespecialperoquizs
resultemsintuitivoymsprcticoponeramododechuletaunaspocas
reglassiguiendounanotacinarbitrariaqueponerlagramticacompleta
enformatoyaccoenformatoBNF.Estonosllevaraatenerqueexplicar
cosasquesesalendelpropsitodeestecursoyqueseranmsapropiadas
parauncursodeprogramacin. Porelloybasandonosenunresumen
arbitrariodeesagramticaincluimoselsiguientecuadroresumen.
timespec

= time | time date | time increment


| time date increment | time decrement
| time date decrement | nowspec

nowspec

= NOW | NOW increment | NOW decrement

time
TEATIME

= hr24clock | NOON | MIDNIGHT |

date

= month_name day_number
| month_name day_number ','

year_number
day_number
increment

| day_of_week | TODAY | TOMORROW


| year_number '-' month_number '-'
= '+' inc_number inc_period

decrement

= '-' inc_number inc_period

hr24clock

= INT 'h' INT

inc_period
YEAR
day_of_week
SAT

= MINUTE | HOUR | DAY | WEEK | MONTH |


= SUN | MON | TUE | WED | THU | FRI |

375

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

month_name
JUL

= JAN | FEB | MAR | APR | MAY | JUN |


| AUG | SEP | OCT | NOV | DEC

Lo que sigue es una regla prctica para el uso de esta chuleta sin
demasiadovalortcnico.Esperamosqueseautil:
Para saber si una especificacin se ajusta o no, se parte siempre de
'timespec'.Lasreglaslasrepresentamoscomounaseriedeposibilidades
separadaspor'|'.Cuandounadeestasposibilidadesapareceenminculas
significaqueasuvezesaposibilidadtieneunasreglas.Porejemplopara
comprobarque'NOONMON'cumplelaespecificacinnosfijamosen
que 'timespec' entre otras cosas se corresponde con 'time' seguido de
'date'.NOON(medioda)esunaformavlidade'time'yMON(Lunes)es
unaformavlidade'day_of_week'queasuvezesunaformavlidade
'date'.
timespec
time
date
day_of_week

=
=
=
=

time date
NOON
day_of_week
MON

|
|
|
|

.....
.....
....
.....

Ejemplos:
at9amTUE
atnow+2minutes
at9amFeb18
at4pm+3days
at10amJul31
at1amtomorrow
EnDebianlaespecificacindetiempoenformatoyaccseencuentraenel
fichero '/usr/doc/at/timespec' que nose corresponde conlo que hemos
puestoporquehemospretendidosimplificarestainformacin.

376

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

'atq'solodainformacindelnmerodetareaydelmomentoenqueseva
aejecutarperolatareaensimismano.EnDebianlastareaseguardanen
'/var/spool/cron/atjobs/' y resulta interesante como se guardan. Son
simplementeunscripquelanzaelcomandoindicadoperoantesdeello
recuperatodoelentornodesdeelcualselanzysesituaeneldirectorio
desde el cual se lanz. En el fichero '/var/spool/cron/atjobs/.SEQ' se
guardauncontadordesecuenciaparalostrabajosperoenhexadecimal.
Si existe el fichero '/etc/at.allow' solo los usuarios contenidos estarn
autorizados a lanzar trabajos con 'at'. Si no existiera '/etc/at.allow' se
permitir el acceso a todos los usuarios salvo que exista un fichero
'/etc/at.deny'encuyocasolosusuarioscontenidosenelnopodrnusar
'at'.
Lautilidadbatch
Yahemoscomentadoquesirveparainstruiralsistemaqueejecuteun
comandocuandolacargadelsistemanoseaaltayademsloharconuna
prioridadbaja.Silacarganodesciendepordebajodelvalorestablecido
paralastareasbatch,elprogramanoseejecutarnunca.
Amododeorientacinpodemosdecirqueparasistemasmonoprocesador
sueleusarsevaloresde0.7a1.5yparasistemasmultiprocesadorser
superioryestarenfuncindelnmerodeCPUs.
VamosaprogramarunshellscriptqueconsumamuchaCPUyquedeje
unatrazaquenospermitasabercuandoarrancaycuandopara.
# piloop
if [ $# -ne 1 ]
then echo "Uso piloop10 "
else
for i in 0 1 2 3 4 5 6 7 8 9
do
echo "$$ $i `date`" >> /tmp/piloop.out
echo "scale=$1; 4*a(1)" | bc -l >>
/tmp/piloop.bc

377

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

fi

done

Elvalordelaescalasepasacomoparmetroydeberprobarprimerocon
valoresbajoshastaqueconsumaunoodosminutosparapoderhacerla
prcticaconcomodidad.Ennuestroequipoelclculodelnmeropicon
1000cifrasdecimalesresultaunvaloradecuado.
1.
2.
3.
4.

procmeter3
nice19piloop1000&
Esperaraquesubalacarga
echopiloop1000|batch

Los procesos planificados con 'at' y 'batch' son gestionados por 'atd'.
Muchos de los procesos de este tipo que estn permanentemente
funcionando terminan en 'd' de 'daemon'. En ingles daemon significa
duende.Siporcualquieranomalaatddejaradefuncionarnosepodra
usar 'at' ni 'batch'. Curiosamente hay un proceso que se encarga de
gestionar tareas peridicas y que igualmente est permanentente
funcionandoperonosellamacrondsino'cron'.
Usodecronycrontab
Elcomando'cron'permitenejecutarperidicamenteunaseriedetareas
queestarnprogramadasenunosficherosespeciales.
La planificacin de tareas para usuarios no se hace directamente sino
pasandounficheroa'crontab'oeditndolodirectamentecon'crontabe'.
Esto generar un fichero en /var/spool/cron/crontabs/ Para verificar el
contenidodelficherocrontabdeunusuariobastaconusar'crontabl'y
paraeliminarlo'crontabr'.
Ponersiemprecomomnimo2minutosmsalactualparaprobaryaque
encasocontrariopuedenofuncionar.

378

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

Elformatoconsisteenunaseriedelineasconelformatosiguiente:
minutohorada_del_mesmesda_de_la_semana
Campo

ValoresPermitidos

minuto

059

hora

023

da_del_mes

131

mes

112onombres

da_de_la_semana

07onombres
0o7esDomingo

Losnombresdemesesydasdelasemanadependendelidiomaquese
use(variableLC_TIME).Puedeprobarconelcomando'date'paraver
cualesseestnusandoensusistema.
Dos valores con un guin en medio indica un rango de valores que
incluiran los valores extremos indicados. Un asterisco (*) equivale al
rango de valores que van desde el primero al ltimo. Y se pueden
especificarunalistadeelementosoderangosseparndolosporcomas.
Porejemplo"2023,03"equivalea"20,21,22,23,0,1,2,3"
Comoveremosacontinuacinhayunaformadeagruparlasaccionesque
sehandeejecutarenelmismoperiodo.
A parte de las tareas peridicas que cada usuario pueda programarse
usando'crontabe'parasuspropiasnecesidades,elsistematendruna
seriedetareasprogramadasyestasseespecificanen/etc/crontab.

379

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

EnelcasodeDebiancronincluyenosololastareasde/etc/crontabsino
cadaunadelastareas queseincluyaenlosficheroscontenidosenel
directorio/etc/cron.d
Lautilidadrunparts
Enmuchasdistribuciones(yDebianesunadeellas)lastareasquesehan
deejecutarenunmismomomentoseagrupanenunnicodirectoriopara
ser procesadas. En Debian estos directorios son /etc/cron.daily,
cron.weekly,ycron.monthly.
De esta forma en crontab podemos indicar como accin runparts
directorio. La accinexpresadadeesaformaejecutara todosaquellos
scriptscontenidosenesedirectorio.Todosestosscriptsdeberncomenzar
forzosamentepor#!/bin/interprete_de_comandos.
Deestaformaaadirunanuevaaccinresultamuysencilloynorequiere
tocarelficherodeconfiguracindecron/etc/crontabquenormalmentese
limita a contener la programacin de tareas genricas para ciertos
periodos.Severmsclaroconunejemplo.Elejemploquesigueest
tomadodeunaDebian:
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the
`crontab'
# command to install the new version when you edit
this file.
# This file also has a username field, that none of
the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb
in:/usr/bin
# (mon = 3,6 = Miercoles,Sabado)
# m h dom mon dow user command
25 6
* * *
root
test -e /usr/sbin/anacron ||
run-parts --report /etc/cron.daily
50 6
* * 7
root
test -e /usr/sbin/anacron ||
run-parts --report /etc/cron.weekly

380

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
55 6
1 * *
root
test -e /usr/sbin/anacron ||
run-parts --report /etc/cron.monthly
#

Cadaaccinconsisteenunacomprobacin.Sinoexisteanacronquees
un programa que explicaremos seguidamente se ejecutarn los scripts
contenidosenlosrespectivosdirectorios.Encasocontrarionosehace
nadayaqueseasumequeanacronseencargardeello.
Mejorarelcomportamientodecronconanacron.
Elcomandocronfuncionamuybienenunsistemaquefuncionedemodo
ininterrumpido. Si un sistema permanece un mes apagado y lo
encendemos,cronactivarsimultneamentetodaslastareaspendientes.
Estasseguramenteconsistirnentareasdiarias,semanales,ymensuales
entreotras.Elcomando'anacron'permitecorregirlosproblemasclsicos
quepresentaelusode'cron'ensistemasquenoestnfuncionandode
forma continua. Para ello se establece en el fichero /etc/anacrontab el
periodoyelretrasoparaactivarlastareasperidicas.
PorejemploenDebiantenemospordefectolosiguienteenelfichero/etc/
anacrontab:
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb
in:/usr/bin
# These replace cron's entries
1
5
cron.daily
nice run-parts
--report /etc/cron.daily
7
10
cron.weekly
nice run-parts
--report /etc/cron.weekly
30
15
cron.monthly nice run-parts --report /
etc/cron.monthly

381

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

Quesucederusandotodoestoenunsistemaquearranquedespusde
unlargoperiododeestarapagado?Puesquealos5minutosarrancarlas
tareasdiarias,alos10lassemanalescasodeestarpendientes,yalos15
minutoslasmensuales,casodeestarpendientes.Deesaformaelsistema
reparteeneltiempolacargadetrabajodeformaescalonada.
Uncasoprctico.Tareasdosvecesporsemana
Enelcasoanteriorpodemosincluirunatareaparaqueseejecuteunavez
cadasietedasounavezaldaperonodisponemosdeunaprogramacin
intermedia.Vamosasuponerelsiguientecontenidoenlosdirectoriosde
tareasperidicos.
# ll /etc/cron.daily/
-rwxr-xr-x
1 root
1999 man-db
-rwxr-xr-x
1 root
1999 logrotate
-rwxr-xr-x
1 root
2000 suidmanager
-rwxr-xr-x
1 root
2000 standard
-rwxr-xr-x
1 root
2000 apache
-rwxr-xr-x
1 root
2000 exim
-rwxr-xr-x
1 root
2000 tetex-bin
-rwxr-xr-x
1 root
2000 0anacron
-rwxr-xr-x
1 root
2000 sendmail
-rwxr-xr-x
1 root
2000 calendar
-rwxr-xr-x
1 root
2001 sysklogd
-rwxr-xr-x
1 root
2001 netbase
-rwxr-xr-x
1 root
2001 modutils
-rwxr-xr-x
1 root

root

238 mar 15

root

51 sep 13

root

592 feb 27

root

2259 mar 30

root

3030 abr 29

root

427 abr 30

root

157 may 19

root

311 may 25

root

1065 jun

root

450 jul 18

root

660 ene

root

485 ene

root

41 ene

root

57 feb 29

382

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
2000 htdig
-rwxr-xr-x
2001 find

1 root

root

277 ene

root

root

210 nov 28

root

root

540 nov

root

root

217 ene

root

root

116 feb 28

root

root

1302 mar 22

root

root

653 mar 23

root

root

312 may 25

root

root

781 ene

root

129 mar 30

root

313 may 25

# ll /etc/cron.weekly/
-rwxr-xr-x
1
1998 man-db
-rwxr-xr-x
1
1999 isdnutils
-rwxr-xr-x
1
2000 lpr
-rwxr-xr-x
1
2000 man2html
-rwxr-xr-x
1
2000 cvs
-rwxr-xr-x
1
2000 dhelp
-rwxr-xr-x
1
2000 0anacron
-rwxr-xr-x
1
2001 sysklogd

# ll /etc/cron.monthly/
-rwxr-xr-x
1 root
2000 standard
-rwxr-xr-x
1 root
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
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
403

172.22.23.1/172.22.21.1

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:
HostB:
HostC:
HostD:
GW1:
GW2:

0.0.0.0(default)>172.22.22.2
0.0.0.0(default)>172.22.22.2
0.0.0.0(default)>172.22.23.1
0.0.0.0(default)>172.22.23.1
172.22.22.0 >172.22.21.2
172.22.23.0 >172.22.21.1

405

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

Sinosfijamos,podemosverquelarutapordefectoeselgatewaypor
defectoqueapareceenlaconfiguracindemuchasmquinasLinux,pero
paralosgatewaysnoapareceningungatewaypordefecto.Estoesuna
caractersticadelasredesquetienenbackbones.
Backbon
Literalmente, backbone significa columna vertebral. Las tramas se
canalizanhaciaelbackbone,peroeste,alfinaldebedecidiradondevana
pararlastramas.Comoconclusindeestaltimafrasesedesprendeque
entodobackbone(reddeniveljerrquicosuperiordondenohayninguna
redmasimportante.p.ej.elbackbonedeInternet,olaredprincipaldeuna
empresa que no tiene conexiones con el exterior) los gateways que
formanelbackbonedebentenerrutasatodaslasredesynoapareceruna
rutapordefectoensustablasderutas,mientrasqueparaelrestodelas
redes,larutapordefecto(yparaloshosts)sersiemprelaquellevehacia
elbackbon.
Configuracindeunpuesto
Unavezcomprendidoslosconceptospasemosacalcularlasdirecciones.
ConladireccinIPylamscaraderedsepuedenobtenerlasdems.
Tomando como ejemplo el nodo A observamos que se cumplen las
siguientesrelacioneslgicasusandolosoperadoreslgicos(AND,NOTy
OR)sobrelosbitsqueloscomponen:

406

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

Mscara
deRed

255.255.255.000

Direccin
IP

172.022.022.021
AND

Direccin
deRed

172.022.022.000

NOT(Ms
caradeRed)

000.000.000.255

Direccin
deRed

172.022.022.021
OR

Direccin
deBroadcast

172.022.022.000

ObservequeconladireccinIPylamscaraderedsepuedededucirlas
restantesdirecciones.Porlotantositienequeconectarseaunaredlocal
bastarconpreguntaraladministradordelamismaesosdosnicosdatos.
Criteriosparasubnetearunared
Vamosacomentarloscriteriosquesepuedentenerencuentaalahorade
decidirsubnetearunagranredenvariasmspequeas.
Subnetear una red no sirve unicamente a criterios topolgicos
relacionadosconlainstalacinfsicadelared.Estclaroquelaredes
407

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

topolgicamente distintas o que usen diferentes protocolos de


transmisin, deberan tener direcciones distintas para no mezclar
artificialmentecosasdistintasperotambinsepuededividirunagranred
envariasporotrosmotivos.Porejemploparafacilitarlaadministracin
delareddelegandoacadaadministradorlagestindedireccionesdeuna
subred. Quizs las estructura de una empresa aconseje separar redes
disintasparadistintosdepartamentosporejemplo.Esdecirlassubredes
pueden facilitar la adaptacin de la red a la estructura de una
organizacin.Tambinpuedenservirparaaislarredescontrficointerno
abundanteyfacilitareldiagnsticodeproblemasenlared.
Entehorasepuededividirunasolaredfsicaenvariaslgicasperosila
separacin fsica fuera posible conviene hacerla uniendolas con un
gatewayporqueaumentaremoselanchodebandatotalenlared.Hayque
tenerencuentaqueunaredethernetesunbusconacesoCsma/CDypor
lotantoenuninstantedetiempodado,variospuestospuedenescuchar
simultaneamenteperonuncapuedenhablardosusandoelmismobusala
vez porque origina la colisin de los paquetes y estos debern ser
reenviadosdeformanosimultnea.
Los trminos Pasarelas (Gateways), Routers (Routers) y Puentes
(Bridges)serefierenaunaseriededispositivosparainterconectarredes.
Muchas veces estos dispositivos son un PC con un par de tarjetas de
comunicaciones para conectarse simultaneamente a dos redes
funcionando con un software apropiado. Un puente conecta dos redes
parecidas(porejemplopuedenserdistintasensuvelocidad)sincambiar
laestructuradelosmensajesquecirculanporellas.UnRouterconecta
dos redes que son iguales (o parecidas). No hay traduccin de un
protocoloaotroperositraduccindedirecciones.Unapasarelapuede
conectar redes distintas (por ejemplo una ethernet y una token ring)
realiza la conversin de protocolos y la traduccin de direcciones. Si
recordamoslosmodelosOSIyTCP/IPexplicadosanteriormentevemos
queenlosdistintosdispositivosmencionadosactuaranadistintonivel
delmodelodecomunicaciones.

408

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

Puestoqueunrouterincluyelafuncindepuente,ylapasarelaengloba
lasfuncionesderouterydepuente.Porqueentoncesnoseusasiempre
unapasarela(gateway)?
Cuandotodoslosnodosdeunareddebenalcanzartodoslosnodosdeotra
red, se provoca una sobre carga de la red debido a los protocolos de
rutado.Enestecasoycuandoambasredesutilizenelmismoprotocolode
red,lamejorsolucionesunpuente.
Existeotrotipodedispositivoquesirveparaconectardosredesyquese
llamaFirewall.Setratadeundispositivolgicoquesirveparaconectar
deformaseguralaparteprivadadeunaredconlapartepblica.Estos
dispositivos pueden establecer una poltica de restricciones a la
informacinquecirculaporellos.
Para determinar una ruta como la mas idonea, se utiliza el siguiente
criterio.Elprotocolodeinformacinderutado(RIP)esunprotocoloque
estbasadounicamenteenelcoste.
Acadarutaseleasociauncosteenfuncindelrendimientodelared,tipo
delalinea,etc.Estopermitedeterminardeentrevariasrutasposiblescual
es

la

de

menor

coste.

Cadarouterdeunaredenvayrecibeinformacinderutadoquepermite
actualizarlastablasderutadocada30segundos.Cuandoelcostedeuna
rutasuperaelvalor16elsistemaseconsiderafueradealcance.Lacaida
deunnododelaredsueleprovocarlaperdidadealgunosmensajeshasta
quelastablasderutadodetodoslosrouterssereajustan.
ServidoresdeNombres
Las direcciones IP son muy adecuadas para las mquinas pero son
dificiles de recordar. Por esta razn se usan nombres de dominios.
AdemsusandosolounadireccinIPsinnombretendramosquecambiar
de direccin cada vez que nos alojemos en un servidor distinto. Si
asimilamos una direccin a un nombre podemos mantener nuestra
presenciaeninternet cambiandodeservidorsinqueapenassenoteel
409

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

cambio.Enlaprcticaelcambionosucedeinstantaneamenteporquetiene
quepropagarselainformacindelcambiodenombreengranpartedela
red.
Para una red pequea nos bastara usar un fichero /etc/hosts que sea
comnatodoslosnodosdelared.Silaredesmsgrandecadacambio
ha de ser propagado a los dems lo antes posible y controlar que la
informacin se mantiene coerente o usar un sistema de base de datos
compartidocomoNIS,etc.
Apesardeellotodoestoresultainsuficientecuandohablamosderedes
muygrandes.Elfichero/etc/hostsoequivalenteseraenormeasiquelo
quesehaimplementadoparaqueeninternetexistaunserviciodenombre
esqueesunprotocolollamadoDNSquepermitetenerestainformacin
distribuida adecuadamente mediante un sistema de dominios que se
reparten la carga de gestionar estos nombres organizados de forma
jerrquicageneralmentehastatresnivelesdeloscualeselprimerosuele
indicareltipodeactividad.Porejemplo:

com:Empresascomerciales
org:Organizacionesnocomerciales.
edu:Universidadesycentrosdeinvestigacin.
net:Pasarelasynodosadministrativosdelared.

Conelfindeaumentarlaeficienciaylatoleranciaafalloscadazonatiene
unservidordenombresautorizadoomaestroycadaunodeestostiene
variosservidoressecundarios.Laszonassedefinencomosuperconjuntos
deredesIPredondeadasaniveldeunocteto.
Estructuradepaquetes
Lospaquetesotramassonsecuenciasdebitsquecontienennosololos
datosconinformacindeusuariosinodatosdecabeceraydecolaquese
estructurandeformaquelosnivelesinferioresdetransmisindedatos
vanencapsulandoalosnivelessuperiores.ParaformarunpaqueteUDP
habraqueenvolverlodelaformasiguiente.
410

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

Datos
Nbytes
UDP
20bytes
IP
20bytes

Datos
Nbytes
UDP
20bytes

Ethernet
IP
14bytes 20bytes

Datos
Nbytes

UDP
20bytes

Datos
Nbytes

Ethernet
4bytes

La parte que representamos a la izquierda de los datos son datos de


cabecera, y los de la derecha son datos de finalizacin del paquete.
nicamente el niveldeInterfaz Ethernet tienepartedefinalizacin, y
todos los niveles tienen datos de cabecera. Para el caso de TCP la
estructurasersimilar.
Datos
Nbytes
TCP
20bytes
IP
20bytes

Datos
Nbytes
TCP
20bytes

Ethernet
IP
14bytes 20bytes

Datos
Nbytes

TCP
20bytes

Datos
Nbytes

Ethernet
4bytes

La parte de datos puede tener distinto tamao segn los casos pero
generalmentenosermuchomayorde1KByte.
Estudiarendetallelaestructuradeestospaquetesexcedelaspretensiones
deestecursoapesardeelloconvieneilustrarconunpardeejemploslo
queseranunpardecabecerasyparaellousaremoslaestructuradeuna
cabeceraIPydeunacabeceraTCP.Ambassonestructurasde20Bytes.

411

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

CabeceraIP(20bytes)
Versin

IHL TipodeServic.
Identificacin

TiempodeVida

TamaoTotal
Desplazamientodel
Fragmento

Flags

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
datos
GKH I NN

Ventana

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
14bytes 20bytes 20bytes

Datos
Nbytes

Ethernet
4bytes

Ethernet
IP
TCP
14bytes 20bytes 20bytes

Datos
Nbytes

Ethernet
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
14bytes 20bytes

UDP
20bytes

Datos
Nbytes

Ethernet
4bytes

Ethernet
IP
14bytes 20bytes

TCP
20bytes

Datos
Nbytes

Ethernet
4bytes

ENRUTADOR(ROUTER)
UnRouteractuatraduciendoocontrolandolacirculacindepaquetesa
niveldered.Podemosvereneldibujosiguientecomounrouterpuede
actuaraniveldeInterfazdered(EnnuestrocasoEthernet)yanivelde
red(ennuestrocasocapaIP).
Ethernet
IP
14bytes 20bytes

UDP
20bytes

Datos
Nbytes

Ethernet
4bytes

Ethernet
IP
14bytes 20bytes

TCP
20bytes

Datos
Nbytes

Ethernet
4bytes

PASARELA(GATEWAY)
Unapasarela(Gateway)actuaraniveldetransportequeennuestrocaso
puedeserTCPoUDP.Tambinenglobalosnivelesinferiores.
Ethernet
IP
14bytes 20bytes

UDP
20bytes

Datos
Nbytes

Ethernet
4bytes

Ethernet
IP
14bytes 20bytes

TCP
20bytes

Datos
Nbytes

Ethernet
4bytes

CORTAFUEGOS(FIREWALL)
Un CortaFuegos (FireWall) puede actuar permitiendo o denegando el
paso de paquetes considerandolos en su totalidad permitiendo el ms
ampliocontrolposible.Unodelosusosmscomuneseseldeproteger
una intranet de accesos indeseados en ambos sentidos con el exterior
414

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

especificando una polticas restrictivas a nivel de puertos, servicios,


direccionesIP,ocualquierotracosa.
Ethernet
IP
14bytes 20bytes

UDP
20bytes

Datos
Nbytes

Ethernet
4bytes

Ethernet
IP
14bytes 20bytes

TCP
20bytes

Datos
Nbytes

Ethernet
4bytes

En la siguiente ilustracin se muestra a que nivel se comunican dos


equiposintercomunicadosporunodeestosdispositivos

415

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

ELARRANQUEENLINUXYCOMOSOLUCIONAR
SUSPROBLEMAS(PrimeraParte)
Introduccin
Enestecaptulointentaremosdescribirlasposiblescausasporlascuales
unsistemaLinuxpuedetenerproblemasparaarrancaroparafuncionar
correctamenteylaformadesolucionarlo.
Estos problemas pueden aparecer durante la instalacin con relativa
frecuencia perotambin puedenpresentarsepordistintas causasenun
sistema que lleva tiempo funcionando. En estos ltimos casos suele
tratarse de un descuido cometido desde root o bien por un fallo del
hardware.Algunasvecesseconviertenenautnticaspesadillas parael
usuarioquelaspadece.
Paradefendersedetodoestotenemosqueaprenderbastantescosassobre
el sistema y su funcionamiento. Trataremos primero de describir el
procesodearranque.
Este tema ha sido dividido en dos partes. La primera describe
principalmente los diferentes cargadores de arranque, y la segunda el
procesodeinicializacin.
Cargadoresdearranqueengeneral
Uncargadordearranqueesunsoftwareencargadodecargarenmemoria
elsistemaoperativo.Setratadealgocuriosoyaquebienmiradoesun
softwareencargadodecargarenmemoriaotrosoftware.Peroentoncesel
astutolectorsepreguntarquiencargaalcargador?Larespuestaesmuy
sencilla.LaBIOS.(BasicInputOutputSistem).Esunsoftwarequereside
enunamemoriaespecialnovoltildelordenador.Novoltilquieredecir
416

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

queseconservainclusonoelordenadorapagado.Estamemoriaesde
solo lectura. Denominada por ello ROM (Read Only Memory) por
contraposicinalaRAMqueesmemoriatotalmentevoltil.
No se pretende explicar el hardware del PC pero para no dejar esto
incompletomencionaremosqueexisteotrocomponentehardwarequea
diferenciadelaROMydelaRAMadmitelaalteracindeciertosvalores
de configuracin que no se perdern cuando el ordenador se apague,
aunqueparaelloserecurreaunapequeapila.Estamoshablandodela
CMOS.
LaBIOS esperaencontrar uncargador enalgndispositivo.Conviene
tener presente que la CMOS debe configurarse de modo que intente
arrancarexplorandolosdistintostiposdedispositivos,(disquete,cdrom,o
discoduro,etcenlasecuenciaqueanosotrosnosinterese).
Existen distintas alternativas para arrancar en Linux. Nosotros
comentaremosLilo,Loadlin,yGrub.Nosepuedeafirmartajantemente
que uno sea superior a otro. Son muy distintos en su filosofa y ello
presenta ventajas e inconvenientes para cada uno dependiendo de las
circunstancias.Todoselloscomopasofinalpasanelcontrolalsistema
operativo.Algunoscargadoresofrecenlaposibilidaddeelegirarrancar
condistintossistemasoperativos.
LaBIOSdebercargarunaseccinespecialdeldiscoodisquetequeno
se localiza en ninguna particin pues se encuentra en una pequea
localizacinpreviaalaparticiones.Estaseccineselregistromaestrode
arranqueabreviadamenteMBR(MasterBootRecord).Unavezcargadoel
MBRyasepuedelocalizarlaparticindonderesideelkerneloncleo
del sistema operativo y cargarlo. Tambin podr localizar la particin
donde reside el sistema de ficheros raz que no tiene porque ser
necesariamentelamisma.
Undisquetenoposeeparticiones.nicamentedisponedeunsectorde
arranquede512bytesyunazonadedatos.
417

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

UndiscodurotieneunMBRyhastaunmximodecuatroparticiones
primarias.Sisenecesitanmsparticionessetomaunadelasparticiones
primariasysesubdivideenparticioneslgicasperoentonceslaparticin
primariatratadadeestaformapasaallamarseparticinextendida.
Resumiendotodoelprocesodearranqueseraalgoas:
1. La seal elctrica de reset o la de establecimiento de la
alimentacin elctrica instruyen a la CPU para ejecutar las
instruccionesdelaBIOSdesdesupuntoinicial.
2. LaBIOSbasndoseenlaconfiguracindelaCMOSlocalizael
dispositivodearranqueycargaelMBR.
3. ElMBRpasaelcontrolalsectordearranqueenlalaparticin
adecuada.
4. ElsectordearranquecargaelSOylecedeelcontrol.
Discosyparticiones
RecordamoslanomenclaturadelosdiscosylasparticionesenLinux.
(/dev/hd[ah]paradiscosIDE,/dev/sd[ap]paradiscosSCSI,/dev/ed[ad]
para discos ESDI, /dev/xd[ab] para discos XT, /dev/fd[01] para
disquetes).
Estos nombres de dispositivo se refieren siempre al disco entero. El
dispositivo puede ser un disco duro no removible, un disco duro
removible, una unidad lectora o lectora/grabadora de cdrom, o de
cdrom/dvd,unidadeszip,uotrascosas.
Imaginemos un PC con tres discos duros IDE, dos discos SCSI, una
disquetera y unlector de CDROM IDE conectado al controlador IDE
primarioesclavo
/dev/hda
/dev/hdb

controlador IDE
controlador IDE

primario
primario

418

maestro
esclavo

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
/dev/hdc
controlador IDE secundario maestro
/dev/hdd
controlador IDE secundario esclavo
/dev/sda
primer dispositivo SCSI.
/dev/sdb
segundo dispositivo SCSI
/dev/fd0
disquetera
/dev/cdrom -> /dev/hdb (link simblico para unidad
cdrom conectado al
controlador IDE primario esclavo

ComomximocadadiscopodrtenercuatroparticionesprimariasPara
un primer disco IDE (/dev/hda) las particiones primarias seran
/dev/hda1 ... /dev/hda4. Las particiones lgicas se nombran siempre a
partirdela/dev/hda5enadelante.
Por ejemplo vamos a suponer que deseamos disponer de cuatro
particionesdistintas.Vamosasuponerqueusamos2particionesprimarias
yunaterceraextendidasobrelacualsehandefinido2particioneslgicas
elresultadoseraelsiguiente.
+-------------------------------------+
| Tabla de particiones
/dev/hda |
| +-----------------------------------|
| | Particin 1
/dev/hda1 |
| |
|
| |-----------------------------------|
| | Particin 2
/dev/hda2 |
| |
|
| |-----------------------------------|
| | Particin extendida
/dev/hda3 |
| | +---------------------------------|
| | | Tabla de particiones extendida |
| | |---------------------------------|
| | | Particin 3
/dev/hda5 |
| | |
|
| | |---------------------------------|
| | | Tabla de particiones extendida |
| | |---------------------------------|
| | | Particin 4
/dev/hda6 |
| | |
|
+-------------------------------------+

419

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

Es decir tenemos /dev/hda1, /dev/hda2, /dev/hda5, y /dev/hda6. La


particin /dev/hda3 extendida no se usa directamente. Es un mero
contenedordeparticioneslgicas.(Nosedebeformatear).
SeguramenteleresulteextraoporqueenlosSOoperativosdeMicrosoft
nosesueleusarmsdeunaparticinprimaria.Realmentesepodrahaber
usadounaparticinprimariayunaextendidacontresunidadeslgicas.
Es decir podramos haber usado /dev/hda1, /dev/hda5, /dev/hda6, y
/dev/hda7dejando/dev/hda2comoparticinextendida.
Tambinpodramoshaberusadolascuatroparticionescomoparticiones
primarias/dev/hda1,/dev/hda2,/dev/hda3,/dev/hda4.
ParavercualeslasituacinactualensuPC.Hagalosiguiente:
$
fdisk -l

Conviene sacar esta informacin por impresora y guardarla. Si


accidentalmentesepierdelainformacindelatabladeparticiones,por
ejemploporescrituraaccidentalenelprimersectordeundiscopodra
volver a recuperarla usando ese listado. Tambin se puede guardar la
informacin del primer sector de un disco duro salvndolo a disquete
mediante:
$

dd if=/dev/hda of=/dev/fd0 count=1 bs=512

Pararecuperarestesectorbastahacer:
$

dd of=/dev/hda if=/dev/fd0 count=1 bs=512

Puede valer si solo usa particiones primarias, pero esto no salva la


informacindelasparticioneslgicas.Lomejoresconservarlasalidade

420

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

'fdisk l'. No cuesta nada volver a particionar todo igual que estaba
nuevamenteusandofdisk.
CompartirelarranqueconotroSO
InstalarLinuxenundiscoqueyatieneotroSOtipoWindows.Daremos
unarecetamuysimplesuponiendoquepartedeunsistemaconunsolo
discoduroyconunasolaparticinqueyatieneotroSOtipoWindows.
1. Desinstale antivirus y otros programas que pueda residir en
posicionesfijasalfinaldeldiscoduro.
2. Desfragmentar el disco duro con la opcin de mxima
descompresin.
3. Asegresedequetodalainformacinquedaagrupadaytomenota
decuantoespacioquedalibre.
4. Dividir la particin con fips cortando por una parte donde no
existainformacin.
5. Eliminarlasegundaparticin.Puedehacerloconelpropiofdisk
deLinux.
6. Aadir una particin pequea para swap. y el resto la para la
futuraparticinrazdeLinux.Paralaswappuedeusaruntamao
deunos150Mbytes.
7. PorltimoinstaleLinux.
Lilo
LiloesprobablementeelcargadormsutilizadoenLinuxperosepuede
usarparacargarunagranvariedaddesistemasoperativos.
ElcargadorLilopuedeubicarseendistintoslugares.

SectordearranquedeundisqueteLinux.boot=(/dev/fd0,...)
MBR de la primera unidad de disco duro. boot=(/dev/hda,
/dev/sda,...)

421

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

Sector de arranque del primer sistema de ficheros Linux en el


primerdiscoduro.boot=(/dev/hda1,...)

Lilotambinpermitearrancardesdeunaparticinextendidaaunquenoes
frecuentetenerquerecurriraesto.
Nodebeconfundir/dev/hday/dev/hda1.Comoacabamosdeexplicarson
cosasbiendistintas.
SiustedtieneunSOdistintodeLinuxen/dev/hda1yusaboot=/dev/hda1
deteriorarelsistemadearranquedeeseotroSO.EnMSDOSsepuede
regeneraresaprdidamediantelatransferenciadelosficherosdelsistema
dearranquedesdeundisquetedelsistemamedianteelcomandosys.
Siutilizoboot=/dev/hdaLilosegrabarenelMBR.Sidesearecuperarel
MBR de MSDOS oWindows use desde undisquete dearranque que
contengaelcomandofdiskdeMSDOSelcomandofdisk/MBR.Setrata
deuncomandonodocumentadodeMSDOS.
PorlotantocadavezqueustedejecutaelcomandoLilodeLinuxpuede
estar afectando el proceso de arranque de otros sistemas operativos
instaladosensumquina.AMicrosoftnolegustacompartirdemasiado
su sistema de arranque con otros sistemas operativos. Durante la
instalacindeWindowsnoserespetaelMBRyporellosidebeinstalar
WindowsyLinuxconvieneinstalarLinuxensegundolugar.Paraello
dejeunapartedeldiscolibreconsuficienteespaciooreserveundisco
completoparasuLinux.
Liloseconfiguramedianteelfichero/etc/lilo.conf.Semuestraunejemplo
deconfiguracinbsica.Constadetrespartes:

Seccingeneraloglobal.
SeccindeentradasLinux(image=<kernel>)
SeccindeentradasnoLinux.(other=<particiondearranque>)

422

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

Existe una parte general previa yluegopara cada opcindearranque


etiquetadaconunidentificadorlabel=<etiqueta>.Paracadaopcinde
arranque se puede definir cosas nuevas o redefinir ciertas cosas
previamentedefinidasenlapartegeneral.
boot = /dev/hda
delay = 40
vga = normal
root = /dev/hda1
read-only
image = /zImage-2.5.99
label = kern2.5.99
image = /zImage-1.0.9
label = kern1.0.9
image = /boot/vmlinuz
label = linux
vga = ask
root = /dev/hdb2
other = /dev/hda3
label = dos
table = /dev/hda

Salvoquesendicecualeslaentradapordefectoconlaopcindefault=,
laprimeraentradaseconsideralaentradapredeterminadapordefectoy
encasodenointervencinelsistemaarrancarusandoestaentrada.Antes
deesoesperaruntiempo(delay=<dcimasdesegundo>)paradar
tiempoainterveniryelegirelarranquedeseado.Sinoserecuerdacuales
son las opciones para poder arrancar basta usar la tecla de cambio a
maysculas <Shift> y se mostrarn la lista de las distintas opciones
disponibles.Tambinsepuedeusarparalomismolacombinacindelas
teclas<Alt>+<Ctrl>.Sisequiereforzarlaaparicindeestalistasintener
queusarlasteclasusaremoslaopcinprompt.
Elkernelausarseestablecemedianteimage=<ficherodelkernel>La
variablerootpermiteespecificarcualserlaparticinraz.Denoexistir
estavariablelilotomarelvalordeterminadoenelpropiokernel,locual
puedealterarseconlautilidadrdev.

423

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

Ennuestroejemplohemosdefinidounaparticinrazparalossistemas
linuxmedianteelusoderoot=/dev/hda1enlaseccinglobalperoestose
puedealterarylaentradalabel=linuxusarroot=/dev/hdb2yvga=
ask.Estoltimopermiteelegirduranteelarranqueelmododepantallaa
usar.Laopcinreadonlyhacequeelsistemadeficherosrazsearranque
inicialmente en modo de solo lectura. Esto es lo normal pero
posteriormenteduranteelarranquecambiaraamodolecturaescritura.
Se puede incluir un mensaje durante el arranque mediante message =
<fichero>. La opcin compact permite una carga ms rpida y es
recomendableporellosuusoendisquetes(boot=/dev/fd0)peropuede
serincompatibleconlaopcinlinear.Buenohaymuchasopcionesmsy
convienemirarladocumentacindelilo.
Unavezeditadoelfichero'lilo.conf'hayqueejecutarelcomando'lilo'
parainstalarelcargadordearranque,queseactivarlaprximavezque
searranqueelsistema.Elmsmnimocambioqueafecteaalgunodelos
ficherosqueintervienenenelarranqueharqueestefalle.Porejemplosi
sacaunacopiadelkernel,borraeloriginalyrenombralacopiaconel
mismonombrequeeloriginaltodoparecerqueestigualqueantespero
lasposicionesendiscoyanosonlasmismasyelarranquefallar.Para
evitarestodespusdelarecompilacindeunkernelodecualquierotro
cambioencualquieradeloselementosinvolucradosduranteelarranque
deberreconstruirelcargadorvolviendoaejecutarelcomandolilo.
LILO puede informar de la limitacin de la BIOS para acceder por
encimadelcilindro1024.Silaparticindearranquesuperaestelmite
cabelaposibilidaddequeelkerneluotroelementonecesarioduranteel
arranqueresidaporencimadeeselmiteyresulteinaccesibleparaLilo
impidiendo elarranquedelsistema.Laopcinlinearpuedeevitareste
problema.
Comonormadeprecaucindejesiempreunaentradaconelltimokernel
defuncionamientocomprobadoparapoderarrancardesdelencasode
queelnuevokernelgeneradofalle.
424

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

Siustednopuedearrancarporqueolvidejecutarlilodespusdealgn
cambio, deber arrancar desde un disquete y recuperar el arranque.
Vamos a suponer que su sistema usaba la particin raz montada en
/dev/hda1.(Esunasuposicinnadams).Enesecasoysidisponedeun
disquete de arranque que ya est preparado para arrancar usando la
particin raz /dev/hda1 el problema ser fcil de solucionar. Bastar
ejecutar'lilo'unavezquearranquedesdedisquete.Undisqueteaspuede
obtenersedevariasformas.Unadeellasessiustedcompilelkernel
usando'makezimage'.(Veremosenposteriorescaptuloslacompilacin
del kernel). Tambin podemos usar un disquete o CD de rescate que
arranqueconunaparticinrazcualquierasiemprequeelkernelutilizado
seacompatibleconnuestrosistema.Encualquiercasosepuedesiempre
intentar.Unavezarrancadocondisquetederescatecreamosundirectorio
paramontarenlnuestraparticinraz.
mkdir /hda1
cd /hda1
mount -t ext2 /dev/hda1 /hda1
chroot /hda1
lilo
shutdown -r now

Laclavedeesteprocedimientoesten'chroot'.Setratadeuncomando
queobtieneunasesinbasholanzauncomandocambiandoeldirectorio
razactualporunodiferente.Evidentementeelnuevodirectoriodebede
tener la estructura adecuada y los ficheros adecuados a cualquier
directoriorazquesepreciedeserlo.Eldirectoriorazeslacajadonde
ocurrecualquiercosaenelsistema.Hacer'chroot'equivaleacambiarde
caja.FueradelanuevacajaescomosinadaexistieraparanuestroSO.
Nosotroslousamosparaquelilofuncionedesdelaparticinrazquenos
interesa.
Tambinpuedeobtenerundisquetedearranquequeuselaparticinraz/
dev/hda1. Introduzca un disquete virgen formateado en la disquetera.
Tendrquesaberdondeseencuentrasukernel.Puedemirarelfichero

425

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

/etc/lilo.confpararecordarlo.Esteeselficherodeconfiguracindelilo.
Vamosasuponerqueelkernelfuera/hda1/boot/kernel.
mkdir /hda1
cd /hda1
mount -t ext2 /dev/hda1 /hda1
dd if=/hda1/boot/kernel of=/dev/fd0
rdev /dev/fd0 /dev/hda1
shutdown -r now

Conellocrearundisquetedearranqueparasuparticinraz.Despusde
arrancardesdeelnuevodisquete,ejecuteliloparapoderarrancardesdeel
discoduroenocasionesposteriores.
Sonmuchaslascosasquesepuedendecirsobreliloyalgunosdetalles
tcnicossoncomplicadosdeexplicar.Generalmenteesfcilconfigurar
una arranque bsicoquefuncioneyencasodefallodaremos algunas
indicacionessobrelasposiblescausas.
Mensajesdeprogresodelcargadordearranquelilo.
AmedidaqueLilovaprogresandovamostrandolasletras'L','I','L','O'.y
sisedetieneenalgnpuntoserporquehasurgidoalgnproblemaquele
impideprogresar.
1. Sinoapareceningunaletraduranteenarranquesignificaqueel
cargador Lilo no pudo encontrarse. Quizs olvid ejecutar el
comandolilo.
2. SisoloapareceLprobablementeexistaalgnproblemahardware.
3. Sisoloaparece LI elkernelnofuelocalizado.Aadalaopcin
linearparaversisesolucionaelproblema.Estaopcingenera
direccioneslinealesdesectoresenlugardedireccionesutilizando
cilindros, cabezas y sectores. Esto permite direccionar sin
necesidaddeusarlageometradeldisco.Porellotambinpuede
servirparasolucionarellmitedelos1024cilindrosimpuestopor
algunasBIOS.Estaopcinnodebeusarseconlaopcinlba32son
426

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

mutuamenteexcluyentes.Laopcinlineartambinpuedeentrar
enconflictoconlaopcincompact.
4. SisoloapareceLILsignificaquenosepuedenleerlosdatosdel
ficherodemapaypuedetratarsedealgnproblemahardware.
5. SiapareceLILOsignificaquelilofinalizcorrectamente.
Loadlin
SetratadeuncargadordelinuxqueactadesdeunsistemaDOS.Loadlin
hadeejecutarsedesdeunsistemaDOSquepodrserundisquetecon
autoarranqueoundiscoduro.
Estecargadorpuedevenirbienenalgunascircunstancias.Hayquetener
encuentaquelosPCssuelenestarpensadosparaarrancarsistemasDOSy
algunavezpuedenincluiruncomponentehardwarequedependadeun
controlador DOS para configurar unos pocos registros en el hardware
antesdearrancarelSO.
Elprocesodearranqueconloadlinsedivideendosetapas.Unaesel
arranquedelpropiosistemaDOSyposteriormenteseejecutaloadlin.exe
comounprogramaDOSnormalycorrientepasandocomoargumentosel
kernelyalgunascosasms.
Compararemos la secuencia de arranque con lilo o con loadlin en el
siguientegrfico:

427

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

Vamosacomentarunarecetaparaconstruirundisquetedearranquecon
loadlin.
FormateeundisquetedesdeDOSincluyendolosficherosdelsistemade
arranque.Esdecir'formata:/s'
DesdeLinuxcopieaesedisqueteelkernel.Porejemplo
$

mcopy /boot/kern24 a:

Editeunficheroautoexec.batparaquecontengalosiguiente:
$

loadlin kern24

root=/dev/hda3 ro vga=3

Copieloaldisquete.'mcopyautoexec.bata:'Tambincopieloadlin.exe,
'mcopyloadlin.exea:'Esunficheroquepuedevenirenalgnpaquetede
su distribucin oenelCDdeinstalacin. Antesderetirar eldisquete
asegurequesegrabarontodosesosficherosusando'sync;sync'
Grub

428

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

GRUB Es un cargador que ofrece algunas ventajas sobre LILO pero


tambin algunas desventajas. GRUB no es sensible a cosas como la
sobreescrituradeunkernelantiguoporotronuevoconelmismonombre
ninecesitavolveraejecutarelcargadorsinohaycambiosanivelde
ficherosenloselementosqueparticiparanenelarranque.Estossuelen
encontrarse localizados generalmente en /boot/grub/. La linea de
comandos del cargador es ms compleja en GRUB. El fichero de
configuracindeGRUBes/etc/grub.conf
Unejemplodegrub.confparaunaconfiguracinbsicasera:
root (hd0,2)
install /boot/grub/stage1 (hd0,2) /boot/grub/stage2
0x8000 (hd0,2)
/boot/grub/menu.1st
quit
############
(fd0) /dev/fd0
(hd0) /dev/hda
############
timeout=7
splashscreen = (hd0,1)/boot/messages.col24
default=0
title=Linux
root=(hd0,2)
kernel=/boot/vmlinuz.2.4 noapic nosmp
root=/dev/hda3
title=Windows
chainloader=(hd0,0)+1

El timeout viene expresado en segundos (en Lilo eran decimas de


segundos).Eldefaultsealaconunnmerolaopcindearranquepor
defecto.Enestecasoporvaler0tomarlaprimeraqueestitle=Linux
dondetitlehacelasvecesdelabelenLilo.root=(hd0,2)indicaquela
particinrazseencuentraenelprimerdiscoduro,terceraparticin.La
lineadelkernelenGRUPmezclacosasqueirancomoappend=ycosas
queenLiloaparecanenotraslneasdelilo.conf

429

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

Montarydesmontarparticiones(mount)
Lautilidadparamontarydesmontarparticionesesmount(8).
Graciasamountlosdistintosdispositivosoparticionessepuedencolgar
enalgnpuntodelgranarboldelsistemadeficherosraz.
Elficherodeconfiguracinqueutilizamountparasabercomodonde,y
cuando debe montar las particiones es fstab(5) que se localiza en
/etc/fstab.
Cada linea de fstab representa un registro donde se describe un
determinadosistemadeficherosdelsistema.
Loscamposencadalneaestnseparadosportabsoespacios.Elordende
losregistrosenfstabesimportanteporquefsck(8),mount(8),yumount(8)
recorren fstab secuencialmente a medida que trabajan. Los distintos
camposdefstabson:
1. fs_spec)Describeeldispositivoasermontado.
2. fs_file)Describeelpuntodemontajeparaelsistemadeficheros.
Para particiones de intercambio (swap), este campo debe decir
``none''
3. fs_vfstype) Describeeltipodelsistemadeficheros.(minix,ext,
ext2,msdos,
vfat,autofs,iso9660,nfs,swap,...etc)
4. fs_mntops) Opciones de montaje. Es una lista de opciones
separadasporcomas.Estaspuedenser:
o defaults Resumetodaslasopciones(rw,suid,dev,exec,
auto,nouser,atimeyasync).
o rw,ro Respectivamente montaenescritura lectura oen
sololectura

430

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

suid, nosuid Respectivamente permite o impide el


funcionamientodeldelicadobitdepermisosetuid.
o dev,nodev Respectivamenteinterpretaonocaractereso
bloquesdeundispositivoespecialdebloques.
o exec, noexec Respectivamente permite o impide la
ejecucindebinarios.(Laejecucindescriptsnopuede
ser impedida y tampoco confe en esto para impedir la
ejecucindeunbinario.Cualquierprogramaquepuedaser
ledopuedeserejecutado,aunqueseaindirectamente).
o auto, noauto Respectivamente se puede montar con la
opcina oserequiere hacerlo explcitamente. Es decir
unoporuno.
o user, nouser Respectivamente permite o impide que
cualquiera pueda montar y desmontar dicho sistema de
fichero. Lonormal es nopermitir que cualquier usuario
puedahacerlo.
o sync, async Toda entrada salida sobre este sistema de
fichero se realizar de modo sncrono o asncrono. El
modoasncrononoaseguraelmomentoenquelascosas
realmenteocurrenperograciasaesto,elSOsercapazde
optimizarlasoperacionesdeentradasalida.
o atime,noatimeNoactualizarlaltimafechadeaccesoa
uninodo.Conelloseaumentalavelocidaddeacceso.
5. fs_freq)Estequintocamposeusaparadeterminarsielcomando
dump(8) necesita volcar o no el contenido de este sistema de
ficheros.
6. fs_passno) Lo usar fsck(8) para saber en que orden deber
comprobarlossistemasdeficheros.Sinotienevalorseasumeque
el sistema de ficheros no debe ser chequeado. El sistema de
ficherosrazdeberallevarfs_passnoiguala1,yotrossistemasde
ficherosdeberanllevarfs_passnoiguala2omas.Sistemasde
ficherosenunmismodiscosernchequeadossecuencialmentey
conviene establecer el orden mas conveniente entre ellos, pero
sistemas de ficheros en diferentes discos, con mismo valor
fs_passnosernchequeadosalmismotiempoparaganartiempo.
o

431

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

Paraquemountseacapazdemontarundeterminadosistemadeficheros
resultaimprescindiblequeexistaelsoporteadecuadoenelkernelbiensea
estticamenteocomomdulo.Enelcasodelaparticinraznosirveusar
unmduloparadichosistemadeficherosniparasucontroladordedisco
ni nada ya que para acceder a los mdulos es requisito previo
imprescindibletenermontadoelsistemadeficherosraiz.
Ejecutandomountasecaspodemosverlossistemasqueestnmontadosy
conqueopciones.Conelcomandodf(1)vemoslossistemasmontadosy
elnumerodebloquetotales,libres,usadosyelporcentajedeuso.
Unavezmontadaslaparticionespodemosconsiderarqueelarranqueha
tenidolugardadoqueexisteunkernelfuncionandoyloscontroladores
bsicosdememoria,dediscosydesistemadeficherosfuncionan.
Serahoracuandosearranqueelprimerprocesoencargadodeinicializar
todoelsistema.Estoloveremosenelsiguientecaptulo.

432

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

ELARRANQUEENLINUXYCOMOSOLUCIONAR
SUSPROBLEMAS(SegundaParte)
Introduccin
Enlaprimerapartedeestetemayacomentamoslosdiferentescargadores
dearranque,yahoracomentaremoselprocesodeinicializacin.
Tambin repasaremos los problemas que pueden aparecer en nuestros
discosoennuestrossistemasdeficheros.Asumiremosenestecaptulo
quelaparticionesLinuxsondetipoext2.Entreotrascosastrataremosde
explicar como reparar sistemas de ficheros ext2. Para otro tipo de
sistemasdeficheroscomoext3,reiserfs,JFS,XFSseusarnutilidades
diferentesycambiarnalgunascosasrespectaext2.Enreiserfsyenext3
noresultanecesariochequearelsistemadeficherosdespusdeunapagn
peroesonolohacemssegurofrenteacortesdefluidoelctrico.Puede
haberdiferenciasderendimientoentrelosdiferentessistemasdeficheros
dependiendodelostamaosdeficherosydeotrascircunstanciaspero
tampocodebenesperarsediferenciasespectacularesderendimientoentre
ellos.
Nosiemprelonuevoeslomejor.Elsistemaext2esmuyestableporque
llevamuchotiempofuncionando.Lossistemasnosonperfectosysobreel
sistemadeficherosrecaemucharesponsabilidad.Unfalloenunsistema
deficherospuedeprovocarlaprdidadetodalainformacindelsistema.
Hayalgunasdistribucionesquepordefectoinstalansistemasdeficheros
distintos de ext2. En parte es una cuestin de gustos. Nosotros nos
limitamos a ext2 pero aunque usted use otro sistema de ficheros
encontrarmuchainformacinutilenestecaptulo.
Enestecaptulosemencionarlalocalizacindemuchoseimportantes
scriptsdelsistema.Ustedyatienenivelsuficientecomoparaentenderlos.
433

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

Muchosdeellossonbastantecrticosyesmejornomodificarlosotrosno
son tan crticos ypuedenadaptarsesin riesgoalas necesidades desu
sistema. En cualquier caso sea curioso, repase los diferentes scripts y
aprendermuchascosasinteresantes.
Muchossonlosaspectosdelkernelqueincidenenlaproblemticadel
arranqueperoesaparteladejaremosparaunposteriorcaptulo.
Inicializacindelsistema(init)
Unavezelcargadorcompletalacargadelkernel,esteterminacediendoel
controldeejecucinalsistemaoperativoelcualefectuarunaseriede
tareasqueconvieneconocer.
1. Existeunalimitacininicialquevienedeldiseooriginaldelos
PCs.IBMeligicomolmite1MegaByteporqueensumomento
no consider la posibilidad de que un ordenador personal
necesitarajamsaccederamsde1MegadememoriaRAM.Por
estaraznelkerneldeLinuxsecargaenformacomprimidapara
no rebasar ese primer Megabyte de la memoria RAM. A
continuacinseejecutaunaprimeracabeceradeesainformacin
grabadaenRAMquepasalaCPUamodoprotegidoydeesta
formaeliminalarestriccindeaccesoaRAMpudiendoentonces
acceder ms all del primer Megabyte de memoria, y pasando
seguidamente a descomprimir todo el kernel para su posterior
ejecucin.
2. El kernel monta el sistema de ficheros raz raz en modo solo
lectura,ylohacesinpoderusarningunodesusmdulosyaque
estos solo son accesibles una vez el sistema raz est
perfectamentemontado.Elkerneltambinnecesitasercapazde
manejar el sistema dememoria virtual sinusar ningnmdulo
antesdequesemonteelsistemaraz.
3. Elkernelarrancaelprocesoinitquizsprecedidodealgnproceso
planificadordependiendodelossistemas.Elprocesoinittendr

434

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

comoPIDelvalor1.Serelprocesoquegenereatodoslosdems
procesosdelsistema.
4. 'init'leeelfichero'/etc/inittab'.Esteficherocontienelalistadelos
procesosquedebenserarrancados.Losprocesosserepartenen
distintosnivelesdeejecucinparagarantizarunordendearranque
o parada entreellos dependiendo delniveldeejecucin alque
estnasociados.Losprocesossernarrancadosmediantescriptsrc
situadosen/etc/rcX.d/dondeXeselniveldeejecucin. Estos
scriptsusanunanomenclatura'Snn...'o'Knn...'dondeelprefijoS
significa arranque de un servicio y el prefijo K parada de un
servicio. Viene de (S)tart, y (K)ill). Los dos dgitos siguientes
determinan el orden de ejecucin de cada script dentro de un
mismonivel.
5. 'init' arranca los procesos que estn asociados al nivel 1 de
ejecucin,quesecorrespondeconelmodomonousuario.Antes
deentrarenestenivel1seejecutaranlosscriptsasociadosalnivel
'S'quenoesenrealidadunniveldeejecucinquesepuedausar
directamente,sinoquecontienescriptsespecficosqueseejecutan
durante el arranque, y como acabamos de explicar se ejecutan
antesinclusodelnivel1.Sedeterminasielsistemadebechequear
el sistema de ficheros con 'fsck(8)'. Esto ser necesario si se
terminbruscamentesindesmontarlossistemasdeficherosobien
porqueelsistemadeficherosalcanceunciertonmerodeveces
de montaje y desmontaje sin que se chequee el sistema de
ficheros.Porlotantosiresultanecesariosechequearelsistema
deficherosrazysielchequeoterminasinnovedadsecontinua
conelmontajedelosrestantes sistemasdeficheros,perosise
detecta algn tipo de problema serio el sistema solicitar la
contraseaderootquedandoelsistemaenelnivel1monousuario
parasepuedaejecutar'fsck'manualmente.Trataremosestetema
msadelante.
Lossistemasdeficherostienenincorporadouncontadordeforma
que alcanzado un cierto valor mximo se considera necesario
chequearelsistemadeficheros.Dichovalormximopuedeser
435

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

alteradousando'tune2fs(8)',perogeneralmentenoesbuenaidea
hacerlo. Un chequeo ms frecuente resultar incmodo, uno
menos frecuentesuponeaumentarelriesgodeundeteriorodel
sistemadeficheros.
6. Finalizadoelchequeodelaparticinrazestasevuelveamontar
peroestavezenmodolecturaescritura.Chequearelsistemade
ficheros Se montan el resto de los sistemas de ficheros
especificados en '/etc/fstab' salvo aquellas entradas (lineas) que
figurencomonoauto.Vease'mount(8)'y'fstab(5)'
7. Elsistemaentrarenelrunlevelpredeterminadoquepordefecto
queenelcasodeDebianesel2.Estealigualquemuchascosas
vieneespecificadoen'/etc/inittab'
8.
9.

# The default runlevel.


id:2:initdefault:

EnestenivelenDebiansearrancaelentornogrficodeventanas
mientrasqueenotrossistemasestoocurreenelnivel5.Los
nivelesdeejecucin(runlevel)puedenvariardeunsistemaaotro
peroentrminosgeneralesestnorganizadosdelaforma
siguiente:
0Detieneelsistema.
o 1Entraenmodomodousuario.
o 25Entraenunavariedaddemodosmultiusuario.
o 6Provocaelrearranquedelsistema.
10. Despusdeejecutarlosscriptsdelrunlevelpredeterminado,'init'
procedeaarrancarmediante'getty(8)'unaseriedeterminaleso
seudoterminalesconectadosalsistema.
o

'getty'presentasobreelterminalunintroductor'login:'quetomar
elnombredeusuario.Unavezintroducidoelnombredeusuario
esteprocesosetransformaenelprocesologinpormediodeuna
llamadaexec.(Estoyaseexplicenlapartedelcursodedicadaa
losprocesos).Elprograma'login(8)'solicitarunapasswordyen
casodequeestaseavlidasetransformarmedianteunnuevo
436

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

exec en la shell destinada a ese usuario mediante su


correspondienteentradaen'/etc/passwd'.
Cuandolashellmuere,initlodetectacomosielprocesogettyque
arranchubieramuerto.(Enrealidadelpidnovaraalhacerlos
sucesivosexec).Dadoquelosgettysearrancanenmodorespawn,
'init'losrearrancacadavezquemueran.
Explicacindeinittab
Primero consute la pgina man inittab(5). Luego examine su fichero
'/etc/inittab'. Tiene quetener claro quelamodificacin deestefichero
conduce con enorme facilidad a situaciones donde el sistema no ser
capazdevolveraarrancar.
Porelmomentoesmejorqueselimitealeerinittabsinmodificarlo.Las
lneasqueempiezanpor'#'sonsimplescomentarios.Lasdemslneas
constarndecuatrocamposseparadospor':'
1. IdentificadorGeneralmenteelidentificadoradmiteunmximode
doscaracteresquedebersernicoparacadalnea.
2. Niveles de ejecucin Contiene los niveles de ejecucin en los
cuales la accin resulta adecuada. Si no aparece ninguno se
entiendeadecuadaparacualquiernivel.
3. TipodeaccinHayunascuantostiposdeacciones(once,sysinit,
boot, bootwait, wait, off, ondemand, initdefault, powerwait,
powerfail,powerokwait,ctrlaldel,kbrequest)Puedeconsultarla
pginamandeinittab(5)dondevienenexplicados.
4. ProcesoProgramaaejecutar.
Elcomandorunlevel(8)devuelvelosdosltimosnivelesdeejecucin.
Encasodenoexistirunniveldeejecucinprevioalactualserepresentar
conlaletraN.

437

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

Pruebeapasarmodomonousuarioconelcomandoinitotelinit.

# init 1

Ocon

# telinit 1

Recuerdequeenestemodonadiemsqueessuperusuariopodrusarel
sistemaynopodrusarningnserviciodelsistema.Estosehacepara
reforzarelcontrolderootsobretodoelsistema.
Ensituacionesdelicadaslepermiteasegurardequeensistemanoesta
ocurriendoabsolutamentenadasalvolasordenesque'root'vaejecutando.
Ofreceunabsolutocontroldeoperacinparaeladministracinfrentea
todotipodeproblemasincluidoslosataquesintencionados.
Lamejormaneradesalirdelmodomonousuarioesrearrancarcon

# shutdown -r now

Ocon

# init 6

Ocon

# telinit 6

438

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

Losscriptsrc
Lainformacinsobrelosscriptsrcosobreinittabpermitecomprenderel
proceso completo del arranque de Linux. Gracias a esta informacin
podr con un poco de suerte diagnosticar una enorme variedad de
problemasysolucionarlos,peroexperimentarporpurojuegoconestas
cosaspuedeocasionarproblemasconunagranfacilidad.
Los scripts rc o el fichero inittab son fciles de interpretar pero su
funcionamientoesbastantecrticoparaelbuenfuncionamientodelresto
delsistema.
Nuncadeberatocarnadasinasegurarsequepuedellegadoelcasodar
marchaatrsydejarlotodocomoestaba.Porejemplosieditaalgunode
estosficherossaquepreviamenteunacopiadeloriginalyguardelaporun
tiempo.
Existeunaopcinparaarrancarelprocesoinitsinqueejecuteningunode
losficherosdescript.

# init -b

Esto est especialmente indicado para ciertos problemas de arranque.


Como veremos luego ficheros deconfiguracin del tipo quesean que
impidan unarranquepuedenserrecuperados montandolaparticin en
modolecturaescritura.
Losscriptsrcsonficherospresentesenlosdirectorios/etc/rc.d#.ddonde
# es el runlevel . Cada script rc suele implementarse como un link
simblicoqueempiezaporSoK(start)o(kill)seguidodedosdgitosy
queapuntaaunficheroconelmismonombreperosinSniKnilosdos
dgitos.
Hagalosiguiente:
439

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

# cd /etc
# ls -l rc*.d/*cron* init.d/*cron*

Obtendralgoparecidoalosiguiente:

init.d/anacron
init.d/cron
rc0.d/K11cron ->
rc1.d/K11cron ->
rc2.d/S20anacron
rc2.d/S89cron ->
rc3.d/S20anacron
rc3.d/S89cron ->
rc4.d/S20anacron
rc4.d/S89cron ->
rc5.d/S20anacron
rc5.d/S89cron ->
rc6.d/K11cron ->

../init.d/cron
../init.d/cron
-> ../init.d/anacron
../init.d/cron
-> ../init.d/anacron
../init.d/cron
-> ../init.d/anacron
../init.d/cron
-> ../init.d/anacron
../init.d/cron
../init.d/cron

Losservicioscronyanacronsonserviciosqueyahemostratadoenun
captulo anterior. Observe que estos servicios de forma similar a la
mayora de los servicios se arrancan y paran desde 'init.d/cron' y
'init.d/anacron' respectivamente.Observequelosenlacessimblicosde
arranqueapuntanalmismoscriptquelosenlacessimblicosdeparada.
Cualquier servicio puede arrancarse o detenerse de forma individual
haciendo: '/etc/init.d/servicio start' o '/etc/init.d/servicio stop'
respectivamente.
Elproceso'init'procesaloscontenidosdelosdirectorios'rc#.d/'parair
arrancandoyparandolosserviciosadecuados.
Comopuedeverseen'/etc/inittab'elencargadodeprocesarlosscripts'rc'
es '/etc/init.d/rc' que se usa pasndole el nivel de ejecucin como
argumento.Elscript'rc'eselqueusalaletrainicialdelenlacesimblico

440

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

paralanzarelscriptaadiendounargumento'start'o'stop'segnresulte
laletrainicial.
ElordendeejecucindelosdiferentesscriptsdelsistemaenDebianeses
siguiente:
1. Comopuedeverseeninittab(si::sysinit:/etc/init.d/rcS)desde'init'
searranca'/etc/init.d/rcS'.
2. Desde'/etc/init.d/rcS'sonarrancadoslosscriptsqueseajustanal
patrn'/etc/rcS.d/S[09][09]*'
3. Desde '/etc/init.d/rcS' se arranca los scripts en '/etc/rc.boot/*'
usando'runparts/etc/rc.boot'.
4. Desde '/etc/init.d/rcS' se arranca '/sbin/setup.h' (Esto en Debian
Potato,enSlinkera'/root/setup.sh')
5. Comopuedeverseeninittab(5)desde'init'searrancalosscripts
delniveldeejecucinpasadocomoargumentoainitoencasode
ausencia los scripts correspondientes al nivel de ejecucin por
defecto. (En Debian es el 2). Para ello se usa '/etc/init.d/rc'
pasndoleelniveldeejecucincomoargumento.
Como hemos visto hay una serie de scripts destinados a procesar un
conjuntodescriptscontenidosenundirectorio.Estatcnicaseusaen
varioscasos:

Enelcasode'/etc/init.d/rc'seprocesalosscriptsdeldirectorio
correspondienteaeseniveldeejecucinaadiendounargumento
startostopdependiendodequeelnombreempieceporSoporK.
En el caso de '/etc/init.d/rcS' solo se procesan los scripts
encontradosqueempiecenporSaadiendolaopcinstart.
Enelcasode'runparts(8)'soloseprocesalosscriptsdeldirectorio
pasado como argumento sin aadir argumentos al script. Ya
habiamos visto que 'runparts', es utilizado con frecuencia para
procesar las tareas peridicas con 'cron(8)' organizando en
directorios las distintas tareas dependiendodequeseandiarias,
semanales,mensuales,anuales,etc.
441

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

Personalizandoelprocesodearranque
Nodecimosqueestosscriptsdearranquenosepuedantocarperohacerlo
esarriesgado.Porejemplounscriptquenoterminesuejecucincolocado
en'/etc/rc.boot'detendrelprocesodearranque.
Siintentaaadirunservicioquedebaestarpermanentementeactivolo
mejoresincluirloenelpropioinittabasociadoalaopcinrespawnpara
queen caso demorirelprocesoinit lorearranque. Sinembargosiel
proceso muere nada ms arrancar init lo rearrancara continuamente
creandounproblemaenelsistema.Afortunadamenteinitdetectareso.Si
init detecta que un proceso rearranca ms de 10 veces en 2 minutos
suspenderdurantecincominutoselnuevointentodearranque.Tiempo
quetendrqueaprovecharsolucionarelproblemadealgunaforma.
Por ejemplo. Puede intentar editar directamente '/etc/inittab'. Si no se
ponenerviosodisponede5minutosantesdequeseproduzcanotros2
minutosdelocuradelsistema.
Siedita'/etc/inittab'desdeelpropiosistemaelprocesoinitnotomaren
cuentaloscambiosmientrasnosearranqueomientrasnoseleinformede
ellomediante:

# init q

Siestonoleconvenceonoseleocurrenadamejorpuederearrancar
desdeunsistemadedisqueteparaeliminarlaentradaeninittabmientras
el problema no est solucionado. Ms adelante se explica como
solucionarunproblemadeolvidodepasswordderootybsicamenteen
estecasohabraquehacerlomismoperoenlugardeeditar'/etc/passwd'
habrqueeditar'/etc/inittab'.
Recuerdequelamodificacinde'/etc/inittab'esunaoperacincrticaque
puedeafectaralacapacidaddearranquedesusistema.
442

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

EnDebiansepuedeaadirunscriptasociadoaunniveldeejecucin
deseado. Paraellosecolocaelscripten/etc/init.d/ yluegoseejecuta
'updaterc.d(8)' con los argumentos adecuados que crear los enlaces
simblicoscorrespondientes.
Porejemplo:

# update-rc.d mi-script defaults 88

CrearalosenlacessimblicosS88miscriptyK88miscriptparatodoslos
runlevels.

# update-rc.d mi-script stop 83 1 2 3 5 6 start 85 2 3 5

CrearaK83miscriptparalosniveles1235y6,yS85miscriptparalos
niveles23y5.
ParaeliminarserviciosinnecesariosenDebianpuedehacerlosiguiente:
1. Creeundirectorioporejempo'/etc/services_off/'
2. Guarde la informacin actua siguiente: 'ls l d rc*/* >
/etc/services_off/lsl.out', y despus mueva los scripts
correspondientesalosserviciosinnecesariosdesde'/etc/init.d/'a'/
etc/services_off/'.(Sepuedenenlugardeesoeliminarlosscripts
perodeestaformapodemosdarmarchaatrsconmsfacilidadsi
fueranecesario).
3. Para cada unos de los servicios eliminados hacer 'updaterc.d
nombre_servicioremove'.Conelloseeliminarnselectivamente
todos los links simblicos que apunten a
'/etc/init.d/nombre_servicio'desdelosdirectorios.
Continuamosconladescripcindelprocesoderranque.Cuandoarranca
elsistemaaparecenunosmensajesquepuedenseralteradoseditando'/etc/
443

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

motd','/etc/issue',y'/etc/issue.net'Quizslesorprendaverunoscaracteres
extraos pero son secuencias de escape destinadas a la consola. Si le
interesacomprenderlasconsultelapginamandeconsole_codes(4).
Recordemos que existen otros scripts que se ejecutan previamente al
establecimientodeunasesindeintrpretedecomandos.
Elprimeroqueseejecutaenelcasodeinterpretesdecompatiblesconsh(
sh(1),bash(1),ksh(1),ash(1),..)ser'/etc/profile'
En el caso de abrir una sesin con bash desde login se ejecutar
'~/.bash_profile' que a su vez ejecutar '~/.bashrc'. Si la sesin no se
arrancadesdelogin,(Porejemplosiarrancamosunasubshelldesdeun
editor.),soloseejecutar'~/.bashrc'.
HayotrosscriptsqueseejecutanparaarrancarsesionesdeXWindow
mediantexdm(1)ostartx(1).Paraconfigurarelarranquedexwindows
mediante el arraque de una serie de procesos en background que
personalizanelarranqueenmodogrficoseusa'~/.xinitrc'ensudefecto
seusar'/etc/X11/xinit/xinitrc'.
Paraestablecerelservidorseusar'~/.xserverrc'ensudefectoseusar
'/etc/X11/xinit/xserverrc'.Arranquedirectoconshsinusarinit
Existeunaformadearrancarusadaenemergenciasquepuedesalvaren
casodeapuroperodebeusarseconlamximaprecaucin.
Consisteenarrancarusandoenlugardelprocesoinit,hacerloarrancando
directamenteunashell.Esosepuedehacerpasandolealkernellaopcin
'init=/bin/sh'.Estosepuedehacerdesdeliloporejemplo.Deestaformase
podra montar la particin raz en modo lectura/escritura y modificar
nuevamente el fichero daado, cambiar una password olvidada, o
cualquierotracosa.
Silohacemos ashayquetenerencuentaquenoestamos usandoun
mododefuncionamientonormal,yporelloantesderearrancarconviene
444

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

asegurarse que el sistema de ficheros queda perfectamente escrito sin


operacionesdeentradasalidapendientesenmemoria.Paraellohagalo
siguiente.

# sync
# sync
# shutdown -r now

Por el contrario si apaga de cualquier manera, el dao podra ser


considerableeinclusopodraverseobligadoareinstalarlotodo.
Algunasvecessearrancadeestaformacuandosesospechaqueelfichero
correspondiente al ejecutable 'init' pudiera estar daado impidiendo
totalmente el arranque pero podra ocurrir que arrancanco con 'sh'
tampocologremosnada.Tanto'init'como'sh'usanlibrerascompartidas
comunes y un dao en alguna de estas librera impedir el arranque
usandocualquieradelasversionesnormalestantode'init'comode'sh'.
Unalibreradinmicacompartidaconsisteenunconjuntodefunciones
que pueden cargarse en memoria una sola vez y ser aprovechadas y
compartidasporvariosprocesosfuncionandosimultaneamente.
Porejemplo'libc.so.6','/lib/ldlinux.so.2'sonlibrerascomunesamuchos
programasen Debian2.2.Puedecomprobarloconsultandolas librerias
compartidasusadaspor'init'y'sh'.Paraellohagalosiguiente:

# ldd /bin/sh /sbin/init

Obtendrlosiguiente:

/bin/sh:
libncurses.so.5 => /lib/libncurses.so.5

445

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
(0x40019000)
libdl.so.2 => /lib/libdl.so.2 (0x40057000)
libc.so.6 => /lib/libc.so.6 (0x4005b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2
(0x40000000)
/sbin/init:
libc.so.6 => /lib/libc.so.6 (0x40019000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2
(0x40000000)

LalibccontienetodasfuncionesdelaconocidsimalibreraestandardeC
yalgunasfuncionalidadesaadidasporGNU.estecursonoestenfocado
alaprogramacin.Dedotasformassinecesitainformacinsobreesta
librerapuedeconsultarlousando:

# info libc

Hayquienmantieneunaversincompiladaestticamentedeinitosh.En
realidad no es necesario. En caso de que el sistema tenga deteriorada
libreras dinmicas lo apropiado es partir de un disco de rescate y
recuperardesdecopiasdeseguridadantiguastodoelsistema.
QueesunCDderescateyparaquesirve
Unsistemapuedesufriralgnaccidenteoataquequeleimpidavolvera
arrancar. La prdida de informacin de un sistema se puede subsanar
mediantecopiasdeseguridadcomolasqueyasecomentaronenlecciones
anteriores.Sisehaperdidoabsolutamentetodoresultaevidentequehabr
querecurriralaltimacopiadeseguridadglobalperounacopiaglobal
resultamuycostosayquizsnosehagacondemasiadafrecuencia.Por
ellogeneralmentesehaceocasionalmenteysecomplementanconcopias
incrementalesposteriores.
Apesardeellosiserecuperaunsistemaapartirdelaltimacopiapuede
haberinformacinnorespaldadaporserdemasiadoreciente.
446

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

Afortunadamentelaprdidadelacapacidaddearrancarnosignificaque
setratedeundesastrequeobliguearecuperartodoelsistemadesdelas
copiasdeseguridadovolviendoainstalar,etc.
Generalmente se puede recuperar el arranque interviniendo
exclusivamentedonderesideelproblema.
Deestaformalarecuperacinresultarmascompleta,msrpidaypuede
quenossirvaparapreveniruncasosimilarenelfuturo.
Parapoderarrancardeformaindependienteypoderiniciarlareparacin
delsistema,esparaloqueseusanlosdisquetesoCD'sderescate.
Evidentemente en caso del CD es importante que nuestro sistema sea
capaz de arrancar desde CD. Para ello las opciones de arranque
correspondientesdebendeestarhabilitadasenlaCMOS.
Si nuestro sistemanopuedearrancarenmodoalgunodesdeCDROM
habrqueconformarseconelusodeundisquetederescateperoenun
disquetederescatenocabendemasiadasutilidadesdeayuda.
Puede darse el caso que unsistema quearranca necesite serreparado
desdeunsistemaderescate.Porejemplosielsistemadeficherosest
deterioradoynopodemosusardemodofiablelasutilidadesdelsistema
paraautorrepararseusaremoselCDderescate.
Muchas distribuciones permiten que alguno de los CDs de instalacin
puedaserusadoparaarrancarenmodorescate.Unavezqueunsistema
derescatehaarrancadotenemos unpequeosistemaLinuxarrancado.
Unadelasformasenlasqueundiscoderescatepuedearrancaresde
formatotalmenteindependientesinnecesidaddeusarningndiscoduro
parafuncionar.
Generalmente se recurre a usar ramdisk para montar la particin raz
aunquegeneralmentemenosadecuadotambinpodrausarseparaesoun
disquete.
447

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

EnDebiantambinpodemosintroducirelCDdeinstalacinyprogresar
hastaseleccionareltecladoyelidiomaparapodertrabajarcmodamente.
Despusdeestosepuedeabandonarlainstalacinycontinuarabriendo
unasesinnuevaenunseudoterminal.Porejemploycontinuarcomosi
estuviramosenmodorescateotambinsepuedearrancardesdeesteCD
usando distintas modalidades. Por ejemplo indicando la particin raz.
Desde un sistema Debian tambin se puede montar el cdrom de
instalacin y crear con ello un par de disquetes de rescate. Para ello
montamoselcdromen/cdromyponemosundisqueteformateadoenla
disqueterayluegohacemos:

# dd if=/cdrom/install/rescue.bin of=/dev/fd0 bs=1k


count=1440

Estocreaelrescuedisk,conelquesearrancaelequipo.

# dd if=/cdrom/install/root.bin of=/dev/fd0 bs=1k


count=1440

Conestootrosecreaelrootdiskquepedirmientrasarranque.
Siusamoslaparticinrazendiscodurosoloservirparacasosenlos
queelproblemasoloafecteaelementosmuyconcretosdelarranquetales
como kernel, cargador de arranque, etc. Pero no para casos donde la
propiaparticinrazestcomprometidaporalgnproblema.
En cualquier caso un disco de rescate deber incluir un conjunto de
herramientasadecuadasparasolucionartodotipodeemergencias.
EnDebiancomoyahemosdichoelprimerCDesmultipropsito.Por
defectoempezaraelprocesodeinstalacinperoleyendoatentamenteen
las primeras pantallas de arranque con lilo descubrir las distintas
posibilidadesparaarrancar.
448

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

Sisevaausarunaparticinrazindependienteporejemploenramdiskse
podrusarunCDderescatedeunadistribucincualquierapararescatar
unsistemadeotradistribucindistinta.Unadministradordesistemascon
varios sistemas LinuxasucargosolonecesitaunCDderescatepara
solucionarunagrancantidaddeemergenciasencualquiersistemaLinux.
AlgunosdeestosCDsespecialmentediseadospararescateseofrecenen
suversinminiaturadeltamaodeunatarjetadecrdito.
Unavezarrancadoelsistemaconvienecomprobarquelosdiscosestn
perfectamentereconocidosporelkerneldelsistemaderescate.Paraello
haga:

# fdisk -l

Obtendr la informacin de los discos presentes en su sistema y sus


diferentes particiones. Esta es una informacin que usted debera
conservarenpapelporsiacasoalgndaseborraporaccidentelatabla
de particiones. La perdida de la tabla de particiones no es un fallo
frecuente pero puede ser muy grave ya que provoca la prdida de
absolutamente toda la informacin salvo que se vuelva a particionar
exactamentetodoigualqueestaba.Elparticionadosehaceconfdisk(8)
queesunadelasutilidadesquenodebefaltarenundiscoderescate.La
listadelasherramientasmsimportantesquedebecontenerunCDde
rescateson:

Unkernelcapazdereconocerunagranvariedaddesistemasde
ficherosydedispositivosdediscos.
Todo tipo de herramientas de diagnstico, exploracin,
manipulacinyreparacindesistemasdeficheros,ydediscos.La
listaseramuylarga.Casitodassonmuyimportantes.
Uneditorsencillodetexto.
Siquedaespacio,otrasmuchasutilidadesdeusofrecuentepueden
venirmuybien.

449

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

IMPRESCINDIBLE.Compruebequesusistemaderescatecontienelas
utilidadesadecuadaspararecuperarlascopiasdeseguridaddelsistema.
Empaquetadoydesempaquetadodeficheros(afio,cpio,tar)compresory
descompresor(gzip,unzip,bzip2,etc),otroscomo(find,etc)driverspara
losdispositivosdediscoydeunidadderespaldo.
Asegurese haciendo copias pequeas de prueba y recuperandolas
arrancandodesdeelCDodisquetederescate.Tengamuchocuidado.La
recuperacin de un backup es una operacin que exige la mxima
prudencia. Un errorpuedeserfatal. Repaseelcaptulo dedicadoalas
copias de seguridad. Dedique tiempo a estudiar y dominar sus
herramientasdecopiayrespaldo.
Eltiempogastadoendominarestostemasestiempoganado.Lonormal
enpersonasqueadministranellosmismossusequiposyquenodominan
estostemasesquetardeotempranopierdanunmontndedasosemanas
devaliosotrabajo.
LomejoresilustrarelusodelosdisquetesoCDsderescatemediante
medianteunejemploqueestodounclsico.Olvidarlapasswordderoot.
Olvidar

la

password

de

root
Nosepreocupe.
Este es un problema relativamente frecuente. Afortunadamente no es
grave.Algoquemuchospreguntanes:Siunolvidodelapasswordde
root puede ser solucionado fcilmente entonces que utilidad tiene la
passwordderoot?
La password noimpedir quealguien seacerque a suordenador ylo
destroceamartillazos,olorobe.Tampocoevitaqueotraspersonascon
accesofsicoasuordenadorpuedancambiarlapassword.Seasumeque
ustednovaapermitiraccederfsicamenteallugardondeseencuentrasu
equipoacualquierpersona.

450

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

alias_arranque init=/bin/bash

Esto hace que se arranque una sesin shell sin necesidad de poner
password. Es una operacin bastante delicada repase las instrucciones
relativasaArrancarconinit=/bin/bash.Unavezarrancadobastacambiar
lapassword.usaremoselcomandopasswd(1).

# passwd root

Otraformaseraarrancardesdeundiscoderescatequenousenuestra
particinrazparaarrancar.
Debercrearundirectoriotemporalquenosotrosllamaremosmnttmpy
montarenlnuestraparticinrazenmodolecturaescritura.Repaseel
comando'mount(8)'.
Despusdeesoentramosen'/mnttmp/etc/passwd'yeliminamoselcampo
delaclave.Enestefichero'passwd(5)'
cuenta:contrasea:UID:GID:GECOS:directorio_home:intrprete

Bastausaruneditoreneseficheroparacambiarporejemplo:
root:x:0:0:root:/root:/bin/bash por
root::0:0:root:/root:/bin/bash

Por
root::0:0:root:/root:/bin/bash por
root::0:0:root:/root:/bin/bash

Siexisteunfichero'/mnttmp/etc/shadow'debereliminarigualmenteel
segundocampoenesteotrofichero.Muyimportante.Antesderearrancar
desmonteelsistemadeficheroshaciendolosiguiente.
451

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

#
#
#
#

sync
sync
umount /mnttmp
shutdown -r now

Conello laprximavezquesehagalogin:rootnolepedirninguna
password.Nodebeolvidardardealtaunapasswordusandoelcomando
passwd.
Recuperarunsistemadeficherosdaado
Puedeocurrirqueunsistemadeficherosdaadonopuedaserreparadode
formaautomticaduranteelarranque.Enelcasodequeelsistemadetect
lanecesidaddechequeoenalgunadelasparticiones'fsck'laschequeary
en caso necesario las reparar. El ordende los registros en'/etc/fstab'
(vease'fstab(5)'esimportanteporque'fsck(8)','mount(8)',y'umount(8)'
recorrenfstabsecuencialmenteamedidaquetrabajan.Elsextocampo,
(fs_passno),lousaelprogramafsck(8)paradeterminarelordenenelcual
sevanachequearlossistemasdeficheroscuandoelsistemaarranca.El
sistema de ficheros raz debera llevar fs_passno igual a 1, y otros
sistemas de ficheros deberan llevar fs_passno igual o superior a 2.
Sistemas de ficheros en un mismo disco sern chequeados
secuencialmenteysitienenelmismovalorde(fs_passno)elordenserel
orden de los registros en '/etc/fstab', pero sistemas de ficheros en
diferentesdiscosconelmismovalorparafs_passno,sernchequeadosal
mismo tiempo para utilizar el paralelismo disponible en el equipo. Si
fs_passno (sexto campo) no est presente o tiene un valor de 0, fsck
asumirqueesesistemadeficherosnonecesitaserchequeado.
Encasodequelaparticinconelsistemadeficherosraznotermine
satisfactoriamente no se prosigue con el montaje de otros sitemas de
ficherossinoqueelsistemasolicitarlacontraseaderootparaejecutar
fsckmanualmente.

452

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

Siestoleocurrealgunavezynoesustedunexpertolimiteseachequear
la particin con la opcin y que en lugar de preguntar cosas quizs
incompresiblesparaustedasumircontestacinafirmativapordefecto,ya
que es la contestacin menos comprometida en estos casos. Una vez
finalizado el chequeo deber hacer 'shutdown r now' para rearrancar.
Mientrastantodebercruzarlosdedos.(Generalmentetienexito).
Noesposiblechequearunsistemadeficherossiesteestmontadocon
opciones de lectura/escritura. Si se llegara a forzar tal posibilidad de
alguna manera, la destruccin de todo el sistema de ficheros sera
inevitableperoafortunadamentefscksedacuentadeelloynolointentar
chequearsisedatalcircunstancia.
fscknormalmentenohacenadasilaparticinpareceestarcorrectaperosi
ustedquiereforzarunchequeoapesardetododeberusarlaopcinf.
Enelsupuestoquenoseaunexpertocontineusandolaopciny,Es
decir
# fsck -fy /dev/....

fsck(8)actualmenteestimplementadocomounintermediarioqueasu
vez usar algn fsck especfico para el tipo de sistema de ficheros
detectado sobre esa particin. La nomenclatura para estos comandos
especficos es fsck.tipofs. Por ejemplo fsck.ext2(8) que puede usarse
directamente en lugar de fsck. Debera consultar las pginas man de
ambos comandos si est usando sistema de ficheros linux ext2. El
comando mount(8) usado sin argumentos le puede informar sobre los
tiposdeficherosqueactualmenteestnmontadosensusistema.
Lainformacinclavedeunsistemadeficherossesitaenelsuperbloque.
Estaestructuraestduplicadapormotivosdeseguridad.Sialgunavez
obtieneunerrorindicandoquenosepuedemontarelsistemadeficheros
debidoaqueelsuperbloqueestdaadointentehacerlosiguientesin
olvidarlaopcinS.Tambindebeirseguidadeunchequedetodoel
sistemadeficheros.
453

AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
# mke2fs -S /dev/...
# e2fsck -fy /dev...

Estaoperacinnogarantizalarecuperacindesussistemadeficheros
La informacin del superbloque puede ser obtenida mediante
dumpe2fs(8)perosiustednoconoceenprofundidadlaestructuradesu
sistema de ficheros no le resultar demasiado til. A pesar de ello
encontraralgunacosaquesilepuedeinteresar.Porejemplolepermitir
sabercualeselmximonmerodevecesquesepuedemontarsusistema
deficherosantesdeestimarnecesariounchequeoycuantasveceshasido
montado desde el ltimo chequeo y en que fecha tuvo lugar. Lo que
queremosdeciresquetampocoesnecesarioentenderlotodoparasacarle
algnprovechoaestecomando.
Recuperarundiscodurodaado
Puedeocurrirqueunsistemasevuelvainestableysoliciteconfrecuencia
elchequeodealgunaparticin.Puedequeapesardequeaparentemente
el fsck solucione el problema este reaparezca nuevamente con mucha
frecuencia,oinclusoacadanuevoarranque.
Esto se debe generalmente a un dao en su disco duro. Los motivos
pueden ser varios. Puede ser una avera grave o puede ser que algn
sectorcomoconsecuenciadeuncortedeluzduranteunaescriturafsicaa
discotengadeficienciasdeformatoabajonivelenlossectoresgrabados,
escomosiquedarangrabadosdeformaincompletadebidoalcortede
suministroelctricoenelprecisoinstantedeesaoperacin.
Estetipodedaospuedeafectaracualquierparticinylasituacinnoes
equivalente.Sepuedeverafectadalaparticinraz,algunaotraparticin
dedatosoprogramas,ounaparticindeintercambioswap.
Unaparticindeswapdaadaprovocarcuelguesdelsistemadeforma
msomenosaleatoria.
454

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

Sialgnprogramaolibreradinmicacompartidaestadaadapuedeque
el sistema no pueda arrancar normalmente y deba arrancar desde un
sistemaderescate.Encualquiercasoenestetipodesituacionespuede
que los elementos destinados a reparar su sistema estn igualmente
daadosyporellolomejoresarrancardesdeundiscoderescateyhacer
unchequeoatodaslasparticionesincluidaslasparticionesdeswap.
Deestaformasecercioraunodelaamplituddeldao.
Puede intentar usar badblocks(8) pero si no funciona adecuadamente
puedequealgnbloquedefectuosoestafectandoalpropiobadblocksoa
algunadelaslibrerasdinmicas.
Usebadblocksdesdealgndiscoderescate.LosprimerosCDsdelas
distribucionessuelenofrecerlaopcindearrancarenmodorescue.
badblocks es independiente deltipodesistema deficheros queusela
particin.Puedeserext2,ext3,reiserfs,linuxswap,umsdos,vfat,etc.
NoesnecesariousarunCDderescatedelamismadistribucin.Vale
cualquiera.Lonicoquesenecesitaespasarbadblocksyluegosepueden
hacer variascosas.Laopcinodebadblocks produceunasalidaque
puedeserusadapore2fsck(8)opormke2fs(8)ambosconlaopcinl.
Estosprogramastambinadmitenlaopcincparahacerquee2fscko
mke2fs usen a su vez badblocks. Realmente es muy sencillo y
convenientesinembargolerecomendamoslosiguiente.
1. Pasebadblocksatodoslossistemasdeficherospresentesenel
disco afectado uno a uno y anote o guarde lo resultados. (Por
ejemploredirigiendosalidaaundiscosano).
2. Pasee2fsckconlaopcincenlasparticionesdaadas.Deesta
formalossectoresdefectuososyanoseusarn
3. Si el problema persiste saque una o dos copias de seguridad.
Quizstengaqueolvidarsedesusutilidadesynecesiterecurrira
lasutilidadesdesudiscoderescateparaeso.
4. Verifiquemuybiensuscopiasdeseguridad.
455

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

5. formateeprimeroabajonivelusandoalgunautilidaddelaBIOSu
otraproporcionadaporelfabricantedeldiscoduro.
6. Formateeusandomke2fsc.
7. Recuperesuscopiasdeseguridad.
8. Antesdeusarelsistemavuelvaapasarbadblocks.Sielproblema
continuaovuelveaapareceralpocotiempoytieneunmnimode
aprecioasusdatos,considereseriamentetirareldiscoduroala
basura.
Conestoterminamosestedensocaptuloyllenodesugerenciasdeltipo
mireustedtalcosaoconsulteustedtalotra.Paralaasimilacindeeste
captuloseexigemsdeunalecturayunacantidaddetrabajopersonal
curioseandoafondounmontndecosas.Quizsaustedlebasteconocer
superficialmente estas cosas para en caso de apuro poder localizar el
remedioadecuadoperoenesecasoguardeestematerialenmsdeun
ordenador,osaqueunacopiaporimpresora.
Quizscuandomslonecesitenopuedaaccederalprecisamentepor
tenerunserioproblemaensuequipo.
Si,si...yalos,perolosiento.EstecursosoloseeditaenformatoHTML
ynoquedamuyestticoalimprimir.(Actualmenteesten*.doc,*.odty
*.pdf).
No obstante existe la libertad para que aquel que lo desee adapte el
formatosegnsusnecesidades.Entalcasonoestarademscompartirel
frutodesuesfuerzodelamismaformaenqueyoloestoyhaciendo,al
publicarestecurso.

456

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

CONSEJOSGENERALESPARACOMPILAR
KERNELS
Introduccin
Comodecostumbrenovamosaprofundizarenaspectostericossinoque
vamosarealizarunenfoqueprcticodeestetema.Vamosahablardel
ncleo(kernel)porqueconmuchafrecuenciaresultanecesariorecompilar
elncleoparaadaptarloalasnecesidadesdenuestrohardware.
ParaunapersonaquenicamentepretendeusarLinuxenunounospocos
ordenadoressimplementeconpropsitospersonalespuedequetodoesto
lesueneaalgomuycomplicadoonoaptoparasimplesmortales.
Lasdistribucionesporreglageneralproporcionanunncleoconamplias
capacidadesparaabarcarunagrancantidaddehardwaredisponible.Esto
conduceancleospocooptimizadosporestarsobredimensionados.Para
agravar el problema algunas distribuciones comerciales desaconsejan
recompilarelkernelsinosetienesuficienteexperienciayadviertenque
en caso de recompilar el ncleo, se pierde el derecho a la asistencia
gratuitaenperiododeinstalacin.
Haymuchagentequecreequelarecompilacindelkernelesunatarea
paraexpertos.Unacosaestclaro.Cuandoserecompilaunnuevoncleo
resulta una temeridad no contemplar la posibilidad de arrancar con el
ncleoantiguoporsialgofallaenelnuevo.Enrealidadesmuyfcil
olvidaralgoygenerarunncleoquenoseacapazsiquieradearrancar
peroesonoesunproblemasimantenemoselantiguo.
Locierto esquelacompilacindeunkernelenLinuxesmuchoms
simplequeenotrosSO.Confrecuenciaseconsideralarecompilacinde
unkernelamedidacomounatareaobligadayaqueconellosepuede
457

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

obtenerunncleomsreducidoypersonalizadoanuestrasnecesidades.
Estoresultaespecialmenteinteresanteenloscasosdeordenadorescon
pocaRAM.
Las primeras versiones del kernel de Linux residan ntegramente y
permanentementeenlaRAMfsicadelordenador.
EnlaactualidadlosncleosdeLinuxsonmodulares.Esdecir,haypartes
delkernelquepuedenresidirendiscoysolosecarganenelmomentoque
resultenecesario.Sellamanmduloscargables ygeneralmentehayun
programallamado'kerneld'encargadodesucargaydescarga.
Lasversionesdelkernel
Haydoslneasdefuentesdelncleo.Lasdeproduccinquesonestables
ylasdedesarrolloquenoloson.Lasdedesarrollosonadecuadasparalos
programadoresquedeseanexperimentarconfuncionalidadesnuevasdel
kernel,oparalosusuariosquecompraronhardwarequenoestsoportado
deunamaneratotalmentesegurayprobadaenelkernel.
La nomenclatura de las versiones del ncleo utiliza tres nmeros
separadosporpuntos.Porejemplosihacemos'cat/proc/version'podemos
obtenerlaversindelkernelqueestamosusandoyquepodraseralgodel
tipo'Linuxversion2.2.17'.

Elprimernmeroennuestrocasoesun'2'yrepresentaelmximo
niveldecambioposible.Deunkernel'1.x.x'auno'2.x.x'hayun
enormesalto.
El segundo nmero debe considerarse de forma totalmente
independientesiesparosiesimpar.Laserieparcorrespondeala
serieestableylaserieimparaladedesarrollo.Porelloala2.2.x
laseguirala2.4.xyala2.3.xlaseguirala2.5.x.Elniveldeeste
cursohacesuponerqueustednodeberasiquieraintentarusarla
serie impar reservada para desarrolladores con ganas de probar
cosas nuevas, para lo cual se suele usar un ordenador
especialmentereservadoparaesoysininformacinvaliosa.Los
458

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

cambios en este segundo nmero 2.0.x, 2.2.x, 2.4.x realmente


representan un importante cambio en el SO y por ello no se
aseguralacompatibilidaddetodoslosprogramasconlaversin
anterior.Esdecirlosprogramasdesarrolladospara2.4.xpueden
nofuncionarparalaversin2.2.xyloqueespeorlosprogramas
desarrollados para 2.2.x pueden dejar de funcionar para las
versiones 2.4.x. Lo cual significa que debe acompaarse de
numerosasactualizacionesdelsoftware.Lasdistribucionessuelen
facilitarestoscambioscuandosecambiaaunaversinsuperiorde
esadistribucin.
Eltercernmerorepresentageneralmenteunaversinmejoradade
la versin anterior manteniendo total compatibilidad. Suele
corregir fallos detectados y aadir algo de soporte para nuevo
hardwaremanteniendolacompatibilidad.

Quizsalgodeloqueacabamosdedecirseatotalmenteexactoperosi
que le permite entender bastante bien todo lo que significa esta
nomenclatura.
Cuandoconvienesubirlaversindeunkernel?
En un servidor dando servicio en Internet puede resultar necesario
actualizarloregularmenteparacorregirlosproblemasdeseguridadque
aparezcan, pero nosotros estamos tratando temas bsicos de
administracin para sistemas de uso personal ya sea profesional o
domstico. Por lo tanto si su sistema operativo est funcionando
correctamenteysuhardwareestperfectamentesoportadonohaymotivo
paraactualizarlo.Laideaesquesialgofuncionanohayquearreglarlo.
Otracosaesrecompilarlamismaversindelkernelsimplementepara
cambiaralgunascosasaefectodeoptimizarlo.Detodasformassitiene
ustednoticiadequeciertoproblemaocarenciasesolucionausandouna
versin superior del kernel recuerde que mantener los dos primeros
nmerosdelaversindelkernelesmuchomssencilloquepasarauna

459

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

seriesuperiorenlaqueelsegundonmeroessuperioryrecuerdeusar
siempreversionesparesestables.
Cuandoconvieneusarmdulos
Alahoradeconfigurarelkerneltendrqueirleyendodetenidamenteel
significado decadaopcinyverqueparaalgunas opciones resultar
posiblenicamenteincluirlasonoincluirlasdeformaesttica.Esdecir
solopodrnestarenelkerneldeformapermanenteonoestar.Porel
contrario otras opciones admiten una tercera posibilidad que es su
inclusincomomduloyaquvienelapreguntainteresante.Cualesla
mejor formadeincluirlo ?Larespuestaesquetodoloquepuedaser
puestocomomduloestarmejorcomomduloanoserqueincluirlode
formapermanenteresulteimprescindibleparaarrancaroquesuusovaya
asercasicontinuo.Tengaencuentaquesisukernelesporejemploun
2.2.17losmdulosserncargadosdesde'/lib/modules/2.2.17/'peropara
esolaparticinrazdebedeestarmontadaysiustedtienesuparticin
raz en un disco ide necesitar que las opciones correspondientes a
BLK_DEV_IDE,BLK_DEV_IDEDISKdebendeestarenmodoesttico
(permanente)porquesiestncomomduloscargableselsistemajams
podra arrancar desde un disco ide. Hay otras opciones que tambin
pueden ser necesarias en modo esttico EXT2_FS, BINFMT_ELF,
VT_CONSOLE,PROC_FS,etc
Porelcontrarioestaclaroquelaunidaddecdrom,laimpresora,sistemas
de ficheros que se usen de forma ocasional, etc. pueden y deben ser
configuradoscomomdulos.Sitienedudasdeberleerparaquesirven
intentandodeducirsisonnecesariosparaarrancarono.EXT2_FSespara
sistemadeficherosLinuxylgicamenteesimprescindible.PROC_FSes
un sistema deficheros que se monta en /proc yque es usado porun
montn de programas de forma casi continua. BINFMT_ELF permite
ejecutar la inmensa mayora de los binarios de Linux y por ello es
imprescindible,etc.Sinoescapazdellegaraunaconclusinsobresies
imprescindible,convienequelopongacomoestticolaprimeravezque
lointente,ysitodovabienpuedeenunfuturoprobaraponerlocomo
460

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

mduloperosiendoconscientedequequizsnoarranque.Todosestos
cambiosdebenhacerseteniendomuyclarocomovolveralasituacin
anteriorusandoelkernelantiguo.
Primeraprueba
Suponiendo que usted est usando arranque desde disco duro con el
cargadorLILOleproponemospracticarlosiguiente:
1.
2.
3.
4.

Repaselasleccionesanterioresquetratansobreelarranque.
Localicesukernelactualmirando/etc/lilo.conf.
Saqueunacopiadesukernelconotronombredistinto.
Editesu/etc/lilo.confaadiendounaentradaparausarlanueva
copiadelkernel.
5. !!Importante!!.Ejecuteelcomando'lilo'.
6. Rearranqueusandoalternativamenteunacopiadelkerneluotra.
En realidad estar usando el mismo kernel para arrancar pero de esta
formayapuedecomprobarquepuedearrancarasueleccinusandodos
ficheros de kernel que notendran porque haber sidoiguales. Cuando
obtengaunnuevokerneldebedeasegurarsequeencasodequeesteno
arranquepodrusarelantiguo.
Encualquiercasonolerecomendamoscompilarelncleosinhaberledo
detenidamenteelcaptulocompleto.
Instalacinapartirdelasfuentes
1. Loprimeroquetendrquehaceresdescargarlo.Parabajarlos
fuentes del kernel existen muchos sitios enInternet parapoder
hacerlo. Por ejemplo ftp://ftp.us.kernel.org. Puede consultar en
http://mirrors.kernel.org para localizar otros lugares adecuados.
Vamosasuponerquedeseamosinstalarunkernel2.4.10.Unavez
descargado tendremos un fichero empaquetado y comprimido.

461

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

Probablemente algo similar a linux2.4.10.tar.gz o


linux2.4.10.tar.bz2.
2. Creeundirectorio2.4.10(mkdir2.4.10)
3. Conviene engancharlo a un link simblico /usr/src/linux.
Compruebesien/usr/srcexisteundirectorioounlinksimblico
'linux'.
1. Sinoexisteundirectorioounlinksimblico'linux'.
1. Cree un link simblico 'linux' mediante: 'ln s
2.4.10linux'
2. Siexistaundirectorio'linux'.
1. Renombrarlo con el nombre de la versin
correspondiente.Porejemplo2.4.2mediante:'mv
linux2.4.2'
2. Cree un link simblico 'linux' mediante: 'ln s
2.4.10linux'
3. Siexistaunlinksimblico'linux'.
1. Borreellinksimblicomediante:'rmlinux'.
2. Cree un link simblico 'linux' mediante: 'ln s
2.4.10linux'
4. Despeshayquedescompactar.
1. Paralinux2.4.10.tar.gzusar'tarxzvflinux2.4.10.tar.gz'
2. Paralinux2.4.10.tar.bz2usar'bzcatlinux2.4.10.tar.bz2|
tarxv'
Estoexpandeelficherocomprimidovolcandosucontenidoenun
directoriolinuxperocomonosotroslohemospreparadolometer
en2.4.10graciasallinksimblico,sinafectaralkernelanterior.
5. Situeseahoradentrodeldirectoriolinux>2.4.10.Comprobar
queexisteunMakefile.Esteficheroeselquedeterminalaforma
ysecuenciaenquesecompilarelkernelascomootrasacciones
depreparacinyconfiguracin.
6. Laprimeravezquesecompilaunnuevokernelconvienehacer:
'makemrproper'ynosernecesariovolverloahacercadavezque
serecompileaunqueseaconunaconfiguracindistinta.Tengaen
462

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

cuenta que 'make mrproper' eliminar el fichero que guarda la


configuracin de la ltima compilacin del kernel.
'/usr/src/linux/.config' y generar un '.config' con valores por
defectoloscualespretendenresultaradecuadosparalamayorade
loscasos.
7. Paraconfigurarelkerneldesdeconsolaelmtodomscmodoes
usar 'make menuconfig'. Para X Window se puede usar 'make
xconfig' ms amistoso pero requiere tener bien configurado el
entornogrfico.Laconfiguracindelkernelesunalabordelicada
quetrataremosenunaseccinposterior.
8. Para compilar el kernel habr que ejecutar una serie de pasos
secuencialmente.'makedep;makeclean;makebzimage'Esto
dejar

un

kernel

en

el

fichero
'/usr/src/linux/arch/i386/boot/bzimage'Sitienedudasporqueleha
parecidoveralgnerror,compruebelafechadecreaciondeeste
ficheroparaasegurarsedequeeselqueacabadecrear.Parausar
estekernelhabrqueaadirloalficherodeconfiguracindeLILO
odelcargadorqueestusando.Lasimplesustitucindelkernel
antiguonolepermitiraarrancarconelkernelantiguosialgofalla.
Tambin se puede generar directamente el kernel de arranque
sobreundisquetedesdeelcualelsistemasercapazdearrancar.
Para eso en lugar de 'make bzimage' use 'make bzdisk'. Otra
alternativamsquenovamosaexplicaresusarbzlilo.Esms
fcil equivocarse y no poder arrancar o sobreescribir el kernel
antiguonopudiendovolverausarlo.EnDebiansepuedeconstruir
un disquete de arranque mediante el comando 'mkboot' que
necesitacomoparmetrolarutaalkernel.
9. Si la compilacin fall leer el README para saber si el
compiladoreseladecuadoparacompilaresencleo.ErrorSignal
11Lacompilacindelkernelesunprocesomuyexigenteyresulta
una verdadera prueba de fuego para la gestin de la memoria.
Algunasvecesunamemoriaaparentementesana,fallayprovoca
unerror'signal11'durantelacompilacindelncleo.Estopuede
ocurrirporejemplosiloschipsusadosparalamemoriaRAMno

463

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

tienenexactamentelamismavelocidaddeaccesooporalgunos
otrosproblemasensuhardware.
10. Salvoqueelkernelfueracompiladoenmodoesttico,quegenera
un kernel enorme poco eficiente y solo se usa para casos
especiales,lomshabitualesquetengaquegenerarlosmdulosy
quetengaqueinstalarlos.Siestrecompilandolamismaversin
desukernelperoconopcionesdistintasestarmodificandocosas
que anteriormente seusabanconelkernel antiguo(elqueest
actualmente funcionando) y por lo tanto dar marcha atrs para
dejarlo todo como estaba puede serms complicado. Si porel
contrario est compilando una versin distinta de la actual los
mdulosseinstalarnenunlugardiferente.Paralacompilacine
instalacindelosmduloshagalosiguiente:(makemodules&&
makemodules_install).Porlotantoleaconsejamosusarunkernel
diferente al que ya usa para mantener una versin antigua sin
problemas.
11. Hay varias formas de arrancar con un determinado kernel. Si
arrancaporejemplodesdeundisqueteMSDOSconloadlin.exe
bastar duplicar el disquete y sustituir el kernel. Si us bzlilo
bastargenerarundisquetenuevo.Enamboscasosconserveel
antiguo disquete de arranque durante algn tiempo. Etiquete
correctamentelosdisquetes.Recuerdequecon'rdev(8)'sepuede
retocarlaimagendeunkernelyaseaendisqueteoendiscoduro
porejemploparaestablecereltamaodelaramolaparticinraiz,
oelmodovideodeconsola.
Para arrancar desde disco duro tambin hay varias formas.
Dependiendodelcargadorcomoyahemosexplicadotendrque
copiarelnuevokernelallugaradecuadoparaqueelcargadorlo
use.ComentaremosnicamenteelcasodeusarelcargadorLILO
queeselmsutilizado.
1. Copie el kernel '/usr/src/linux/arch/i386/boot/bzimage' a
'/boot/bzimage2.4.10'.

464

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

2. Copieelnuevofichero'/usr/src/linux/System.map'creado
durantelacompilacina'/boot/System.map2.4.10'
3. EsimportantequesepautilizarLILOqueseexplicenun
captuloanterior.LaconfiguracindeLILOseguardaen/
etc/lilo.conf.Partiremosdeunejemplo:
boot = /dev/hda
delay = 40
vga = normal
root = /dev/hda1
read-only
image = /boot/bzimage.2.4.2
label = linux.2.4.2
other = /dev/hda3
label = dos
table = /dev/hda

4. Tenemos elkernel antiguoen'/boot/bzimage.2.4.2',para


aadir una nueva entrada para '/boot/bzimage2.4.10'
haramoslossiguiente:
boot = /dev/hda
delay = 40
vga = normal
root = /dev/hda1
read-only
image = /boot/bzimage.2.4.2
label = linux.2.4.2
image = /boot/bzimage.2.4.10
label = linux.2.4.10
other = /dev/hda3
label = dos
table = /dev/hda

5. Lgicamente los nombres (label) pueden ser diferentes.


Solo deben ser distintos entre ellos y que sirvan para
recordarquekerneles.Esmuyimportanteunavezeditado
465

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

y salvado '/etc/lilo.conf' no olvidarse de ejecutar el


comando'lilo'yaquedeotraformaelsistemanoarrancar
laprximavez.
12. Laprimeravezquearranqueconunnuevokernelconvieneque
ejecuteelcomando'depmoda'.Estochequealasdependenciasde
losmdulosusandoelfichero'etc/modules'.Esteesquemaresulta
sencilloyeselqueseutilizaenDebianperootrasdistribuciones
usanunesquemadiferenteparapoderarrancardiferenteskernels
con diferentes conjuntos de mdulos. Por ejemplo en RedHat
existeunarchivo'/etc/rc.d/modules'quesirveparadeterminarla
ubicacin de los diferentes conjuntos de mdulos. Vease
depmod(8)ymodules(5).Paralacargaydescargamanualdelos
diferentesmdulosconsultemodprobe(8),insmod(8),rmmod(8),
ylsmod(8).Ningunodeellosefectuacambiospermanentesensu
sistema. Para determinar cuales son los mdulos que deben
cargarsedeformaautomticaexistendistintasherramientaspara
las distintas distribuciones. Concretamente para Debian existe
'modconf'queesunaherramientadiseadaabasedemensyes
muy fcilyagradabledeusar.Permitedeterminarlosmdulos
queserncargadosdeformaautomtica.
Documentacin
Ladocumentacinespecficadesuncleoseencuentraeneldirectorio
'/usr/src/linux/Documentation/' Si tiene dudas sobre el soporte de
determinadoHardwareosuconfiguracinenelkernelesenestelugar
dondetienequebuscar.Usegrepparabuscar.
/usr/src/linux/Documentation/Changeslepermitirsaberlosrequisitosdel
nuevokernel.Contieneunlistadoconlasversionesmnimasnecesarias
dedeterminadosprogramascompatiblesconesekernel.Silaversindel
kernelsolodifiereenelltimonmerodeversinlacompatibilidadcon
kernelsanterioresdeesamismaserieestgarantizada.
Configuracin
466

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

Esrecomendablesalvarel'.config' conunnombredistintoparaevitar
perderloalhacer'makemrproper'oalhacer'makemenuconfig'etc.De
esaformasigeneramosunnuevokernelconmuchasopcionesdistintasy
noconseguimosquefuncionenisabemosqueopcionessonlasqueestn
malelegidaspodremosvolveralaconfiguracininicialyapartirdeella
irgenerandonuevoskernelvariandocadavezpocascosasparadetectar
cualeslaopcinquedaproblemas.Convieneusarunnombrelargoy
descriptivo como por ejemplo '.config.original.distribucion' o
'.config.sinsoporte.sonido',etc.yguardarloporuntiempo.
Sinolohamiradonuncamiresu'.config'mediante'less.config'. Podr
veralgodeltipo:
....
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
# CONFIG_SYSCTL is not set
CONFIG_BINFMT_AOUT=m
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
....

Esdecirqueelresultadodeunaconfiguracineslacreacindeunfichero
conunalistadeopcionesysusvalores.Lasopcionesquenoseincuiran
aparecencomentadasconun'#'aprincipiodelnea.
Evidentemente las opciones para configurar un kernel son las mismas
independientemente del procedimiento make lo_que_sea_config
empleado.
Vamosasuponerqueconfiguramosdesdeconsoladetexto.Lasopciones
puedenaparecerendistintoestado:
'[*]'

Opcinestticaseleccionada.

'[]'

Opcinestticanoseleccionada.

'<*>'

Opcincargableseleccionadaenmodoesttico.
467

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

'<M>' Opcincargableseleccionadacomomdulocargable.
'<>'

Opcincargablenoseleccionada.

Paraalterarelestadodelasdiferentesopcionesseusanlateclas'N','M',
'Y',ylabarradeespacio.Estaltimapermiteirvariandolasopcionespor
las diferentes posibilidades. Las otras determinan las siguientes
transicionesdeestados.
'[*]'

(N)> '[]'

'[]'

(Y)> '[*]'

'<*>' (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:
Virtualterminal
o Suportforconsoleonvirtualterminal
o UNIX98PTYsuport
Filesystems
o

Comomnimodeberincluirsoporteparaelsistemadeficherosdel
sistema de ficheros raz que generalmente es ext2, y sea cual sea
deberestarincluidoestticamenteynocomomdulo.

Consoledrivers
o VGAtextconsole

InstalarunnuevokernelpersonalizadoenDebian
TodolodichosirvetambinparaDebianperoenDebianexisteunaforma
alternativamuyinteresante.

474

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

AntesdelaaparicindelkernelmodularenLinuxunkernelcompletoera
unsimplefichero.Estasencillezpermitaporejemplomigrarunkernelde
unamquinaaotrasimplementecopiandoestefichero.Esloquesucede
ahora si compilamos un kernel en modo totalmente esttico. Es decir
obtenemosungranypesadokernel,totalmentecompletoyfuncionalpero
sinsoporteparacargarmdulos.
Parapodermigrarunkernelcompletoenelcasogeneraldequetenga
soporte para mdulos habra que trasladar como mnimo el fichero
compiladoestticamenteycomomnimotodossusmdulos.
Por ello existe enDebian unmakekpkgcapaz degenerarunpaquete
Debian'mi_kernel.deb'conelbinariodelkernelysusmdulos.Sepuede
por ejemplo copiar ese'mi_kernel.deb' aotra mquina ybastarhacer
"dpkgi'mi_kernel.deb'"parainstalarelkernelenesamquina.Para
usarestesistemadeberinstalar'kernelpackage'yalgunosotrospaquetes
quedependendelyquenoestntodavainstalados.
Lasprimerasvecesquecompileunkernelnonecesitausarestesistema
peroesteprocedimientoresultaespecialmenteindicadoenlainstalacin
dekernelspersonalizadosenmsdeunamquinaodediversoskernels
personalizadosenunamismamquina.
Paraterminar
Soloustedpuedesaberqueotrascosassonnecesariasoconvenientesen
funcin del ordenador utilizado. Las primeras veces le costar trabajo
porquetendrqueleerlaayudadecadaunadelasopcionesperomuchas
deellasrecordarsusignificadolaprximavez.Lomejorespartirdeun
kernelquefuncioneyeliminartodasaquellasopcionesquesabemoscon
certezanonecesitaremosusarnuncaennuestroequipo.Recuerdequelas
opcionesqueestncomomdulosapenassuponenunahorroprescindir
totalmentedeellas.Porelcontrariounaopcinquefigurecomoesttica
innecesariamente est sobrecargando la parte esttica del kernel y eso

475

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

reducesueficiencia.Unkernelpequeoessensiblementemsrpidoque
unogrande.
Sitienedificultadesparaarrancarconelnuevokernelintentehacerlocon
el antiguo y si esto tampoco resulta repase el captulo dedicado a las
dificultadesconelarranqueenLinux.
No olvide que lo primero que hace cualquier kernel al arrancar es
informardetodosaquellosdispositivosqueescapazdesoportar.Estolo
puedevisualizarnuevamentecon'dmesg(8)'.Sialgncomponentedesu
hardwarenoapareceytampocoestdisponiblecomomdulosignificar
queesedispositivonoestasoportado.Tambinpuedeaccedera'/proc'
para comprobar una amplsima variedad de capacidades de su kernel
actual.

476

También podría gustarte