Documentos de Académico
Documentos de Profesional
Documentos de Cultura
html
CURSO DE LINUX
PARA NOVATOS,
BRUTOS Y
EXTREMADAMENTE
TORPES
Autor:AntonioCastroSnurmacher.
1
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Primeraedicin(Nov2008)
(PreviamentefuepublicadoenEne2000enformatohtmlenla
webhttp://www.ciberdroide.com)
Estapginapuedeserredistribuidalibrementebajolostrminos
delalicenciaGPL.Vase(GPLtextooriginal)osiloprefiere
(TraduccinespaolanooficialdelaGPL)Almargendelas
obligacioneslegalesquesederivandelusodeestalicencia
rogamossearespetadalareferenciaasulugardepublicacin
originalwww.ciberdroide.com.yasuautororiginalAntonioCastro
Snurmacher(Madrid01/01/2000).
CopyrightMadrid(Enero2000).
2
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
AusenciadeGaranta
Estaausenciadegarantasehaceextensaacualquiertipodeuso
deestematerialymuyespecialmentealasprcticas,ejercicios,y
deejemplosqueencuentreenestaspginas.Debertrabajar
siempresalvoindicacincontrariaconunSOLinuxyconun
usuariodistintode'root'sinprivilegiosespeciales.Comodirectorio
detrabajoseprocurarusareldirectorio'/tmp'oalgnotroqueno
contengainformacinvaliosa.Tampocoseconsiderabuenaidea
practicarenunamquinaquecontengainformacinvaliosa.
Todoestosonrecomendacionesdeprudencia.Encualquiercaso
sialgosalemaltodalaresponsabilidadsernicamentesuya.En
ningncasopodrreclamaranadiepordaosyperjuicios
derivadosdelusodeestematerial.Abstngasedehacerprcticas
sinoestdispuestoaasumirtodalaresponsabilidad.
Notasdelautor:
Estecursohasidoreeditadoparacambiarelformatodeltexto.No
sehatocadoapenaseltextoqueesdehaceochoaos.Est
pendientedecorreccinortogrficaydeestilo.Peseasusfallos,
hasidoampliamentedescargadoenInternet.Lamayorpartedel
cursoconservasuvigenciagraciasatratarlosfundamentosUNIX
delS.OLinux.Elcursoesunaintroduccingeneralalossistemas
operativotipoUnixengeneralyLinuxenparticular.
Perdonelacrudezadenuestrottuloperocuandoterminela
primerapartedeestecursosentirquehasuperadouna
desagradablefasedesuexistenciaypodrrersedelafaltade
conocimientosdesuvecino.
3
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Cuandotermineustedlasegundapartenoscomosesentir
usted,peroyomesentirfelizporquetodavanoestterminada,
yparacuandodecidaterminarlaseguramentehabrquecambiar
algunascosas.Lasegundapartedeadministracinhaperdido
msvigenciaquelaprimeraquecontinuasiendobsica.
Parauncorrectoaprovechamientodelcursoserecomiendauna
lecturasecuencialdecadaunodeloscaptulosenorden
establecidoenestendice.(secuencialquieredecirprimeroel1,
luegoel2,luegoel3,etc...)
Efectivamenteesteltimocomentarioentreparntesisva
especialmentededicadoanuestropblicopredilectoalquenos
referimosenelttulo,peroalgunoslistillostambindeberan
probarnuestrocurso.
Lasconvencionesutilizadasenestecursoylametodologade
trabajotambinseexplicandeformaprogresivaporlocual
saltarseuncaptulopuedellevarleainterpretarerrneamenteel
materialdelcurso.Posiblementeesteustedtentadodeempezar
directamenteporlasegundapartedelcursoperodemomentono
sehaconsideradofacilitarestalabor.
Estecurso,comoyahemoscomentado,constaporelmomentode
dospartesbastantedistintas.
*LaprimeraparteIniciacinalSOLinuxasumeunnivelcerode
conocimientos.Nisiquieraasumiremosunaciertaexperienciacon
ordenadoresylascosasseexplicarnenestaprimerapartepaso
apasofacilitandolomximoposiblelalabordelalumno.
RomperemosalgunosmitosquepresentanaLinuxcomoSOpara
gurs.Enestapartenoentraremosnuncaaexplicarcosasque
necesitenforzosamenteunacuentadesuperusuario.Ello
4
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
implicaraciertoriesgoyaquesetratadeunusuarioconpermisos
enelsistemaparahacercosasdetodotipo.
LasegundaparteUsuarioavanzadodeLinuxasumequeyaha
asimiladolaprimerapartedelcursoyprobablementetodassus
inseguridadeshabrndesaparecido.Estapartetocaralgunos
temasmsrelacionadosconlaadministracindelsistemay
puntualmentenecesitaremosaccesoaunacuentade
superusuario,peronoseruncursodeadministracinde
Linux.Elobjetivonoesadministrarunsistemaconmuchos
usuariossinolograrunrazonableniveldeautosuficienciacon
Linuxconsiderandolasnecesidadesdeadministracindel
sistemaenordenadorespersonalesconLinuxydebe
contemplarsecomouncursointermedioentreuncursode
IniciacinyunodeAdministracin.
Encualquiercasofinalizadoestecursoqueempiezadesdeun
niveldeconocimientoscero,yqueavanzaconsolidandolos
conceptospasoapaso.Peseaelloesuncursomuyambicioso.
Conllograrconlunabasedeconocimientosqueledarnuna
granseguridadalahoradeabordarcualquierdesafoenesteS.O.
5
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
ndicedecontenido
PARTE(I)INICIACICIONALS.O.LINUX............................................7
AQUIENVADIRIGIDOESTECURSO.............................................7
INTRODUCCIONALINUX..............................................................12
ALGUNOSCONCEPTOSBSICOS.................................................18
ELMANUALDELSISTEMA............................................................26
LASHELL...........................................................................................30
INTRODUCCINALOSPROCESOS..............................................50
MSSOBREPROCESOSYSEALES............................................57
SISTEMADEFICHEROS(Primeraparte).........................................72
SISTEMADEFICHEROS(Segundaparte)........................................87
SISTEMADEFICHEROS(Terceraparte).......................................100
ALGUNOSCOMANDOSTILES..................................................116
EXPRESIONESREGULARES.........................................................148
ELEDITORVI(Primeraparte).........................................................163
ELEDITORVI(SegundaParte)........................................................187
PROGRAMACIONSHELLSCRIPT(PrimeraParte)......................201
PROGRAMACIONSHELLSCRIPT(SegundaParte)....................214
EJERCICIOSRESUELTOSDESHELLSCRIPT...........................277
PARTE(II)USUARIOAVANZADODELINUX...............................286
INTRODUCCINALASEGUNDAPARTEDELCURSO..........286
LAMEMORIAVIRTUALENLINUX............................................319
LAPRIMERAINSTALACIONDELINUX....................................333
TERMINALES...................................................................................354
PROGRAMACIONDETAREASENELTIEMPO........................373
INTRODUCCIONAREDES............................................................387
ELARRANQUEENLINUXYCOMOSOLUCIONARSUS
PROBLEMAS(PrimeraParte)..........................................................416
ELARRANQUEENLINUXYCOMOSOLUCIONARSUS
PROBLEMAS(SegundaParte).........................................................433
CONSEJOSGENERALESPARACOMPILARKERNELS...........457
6
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
PARTE(I)INICIACICIONALS.O.LINUX
AQUIENVADIRIGIDOESTECURSO
Estaprimerapartedelcursoesunaintroduccingeneralalossistemas
operativostipoUnixengeneralyLinuxenparticular.
EstonopretendeserunHOWTOniunaFAQ,niunaguadeusuario,de
programacin,odeadministracin.Tampocoesunaenciclopediasobreel
tema.EstoesuncursodeiniciacindeUnixusandoLinuxparailustrar
losejemplos.
Tampocoesunaguaparahacerlascosasarrastrandoysoltandodesdeun
escritorio precioso. Linux tiene varios escritorios de este tipo pero
nosotrosusaremoslaconsola.Unescritoriopuedesermsagradabley
msintuitivoperonotodaslascosaspuedenhacerseapretandounsolo
botn.Ademsestoesuncursoyparaaprenderausarunescritoriono
hacefaltauncurso.
Ustednonecesitaparaestaprimerapartedelcursoteneraccesoauna
cuenta de administrador (root), ni tendr que usar ningn entorno de
programacinsalvolapropiashell.
NoprejuzgueaLinuxcomounsistemanoaptoparausted.
7
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Esperamosqueestonoleconviertaenunrepugnantelistilloinformtico
peroyadijimosquenonoshacemosresponsablesabsolutamentedenada.
Usaremosunlenguajeacordealafaltatotaldeconocimientosprevios,en
cambioasumiremosquepuedeusarunordenadorconLinuxinstaladoy
listoparapracticar. Esdecirnoexplicaremos comoseinstalalinuxni
comocrearunacuentadeusuarioperoasumiremosqueyadisponede
ambascosasyqueescapazdeabrirunasesindetrabajo(esdecirhacer
loginconunusuarioypasswordvlidas)
Siesustedunvirtuosodelazadnylapala,enhorabuenaporqueeste
cursoeselindicadoparaustedperosustituyaesasherramientasporun
ordenador.Losejemplosyejerciciosestnpensadosparaquelospruebe
ensuordenadorconsuSOLinux,ylapala,azadnyotrasartessimilares
no le sern de mucha utilidad para este curso. (Esperoque mi amigo
Davidseenterebiendeestoltimo).
Buenoconestetipodecomentariosquizspiensequeestecursoespoco
serio.Elusodeunpoquitodehumorloharemosdurantelasprimeras
leccionesparaquesesientamasrelajado.
LinuxesunSOtipoUnixyporlotantosusconceptosmsbsicosson
comunes a los que incorpora cualquier sistema tipo Unix y resultan
8
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
DadoquevamosausarLinuxdesdeconsolayalgunosusuariospueden
tenerexperienciapreviaconMsdos,meparecenecesariohacerunanueva
advertenciadestinadaaestosusuarios.
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.
Tiposdelicenciaslibres
12
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Unbuenlugarparainformarsesobrelostiposdelicenciaslibresesel
'DebianPolicyManual'enestedocumentoseestablecenunoscriterios
para establecer si Debian considera o no libre una licencia. Esto se
describeacontinuacindeformaresumida.
Libertaddedistribucin
Cdigolibre
Seconsideraqueelcdigoeslibrecuandolosfuentessondedominio
pblico.
Integridaddelosfuentes
Serecomiendanorestringirlosderechosdemodificacindelcdigo
fuente,aunqueseaceptanalgunasfrmulasquerestringenlaformade
efectuar ciertas modificaciones pero no entramos en estos detalles
ahora.
Nodiscriminacinparagruposopersonas
Lalicencianoconsideradistincinalgunaparaningntipodepersona
ogrupo.
Nodiscriminacinparaactividadopropsito
Distribucindelalicencia
13
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Lalicenciaafectaralassucesivasdistribucionesdelosprogramasde
formaautomticasinnecesidaddetrmitealguno.
LalicencianodebedeserespecficadeDebian
EsdecirDebiannoadmitiraunalicenciaqueimpidaelusodeun
programafueradeladistribucinDebian.
Lalicencianodebecontaminarotrosprogramas
Lalicencianodebeimponerrestriccinalgunaaotrosprogramas.Por
ejemplonoseraadmisibleobligaraqueelprogramasolosepueda
redistribuirenunmedioquenocontengasoftwarecomercial.
Ejemplosdelicenciaslibres
GPL,BSD,yArtisticsonejemplosdelicenciaslibres.
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
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
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
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.
$ id
$ whoami
23
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
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.
$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
$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
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.
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.
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>.
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:
cd,exec,arg,eval,exit,...
33
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$#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
$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
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:
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.
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
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
$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.
aaaaa
bbbb
cccccc
44
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
yyyy
zzzzz
Operadorgrave:
$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:
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:
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.
$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
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
Elprocesoinit
Cuandoarrancaelsistemasedesencadenaunasecuenciadeprocesosque
agrandes rasgoseslasiguiente. Primero secargaelncleo deLinux
51
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
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.
53
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
valores numricos.
$ ls -lnd .
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.
Estamosdandopequeosdetallesdeprogramacinporqueenestasdos
llamadasdelsistemasonmuysignificativas.Sufuncionamientoresulta
chocanteysucomprensinpermiteexplicarunmontndecosas.
56
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
MSSOBREPROCESOSYSEALES
Lasformasdecomunicacinentreprocesos
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
$ 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
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.
61
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
conusarunterminalremotosinoquenecesitarunPCcompletoparair
haciendocosasdesdedistintassesiones.Leproponemoshacerlomso
menosdelasiguientemanera:
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:
63
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Estosejemplosqueacabamosdeverobtienenunmismoformatodedatos.
Explicaremoselsignificadodeestosatributos.
PID Eselvalornumricoqueidentificaalproceso.
Eselterminalasociadoaeseproceso.Losdemoniosdel
TTY sistemanotienenningnterminalasociadoyenestecampo
figurarun?
Tiene tres campos que indican el estado del proceso
(R,S,D,T,Z) (W) (N) La S indica que el proceso est
STAT suspendido esperando la liberacin de un recurso (CPU,
Entrada Salida, etc.) necesario para continuar.
Explicaremossoloalgunosdeestosestadosensumomento.
TIME
IndicaeltiempodeCPUquellevaconsumidoeseproceso
desdequefuearrancado.
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
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
Lamayoradeloscomandosestngranpartedeltiemposinconsumir
CPUporquenecesitanesperarparahacerentradasalidasobredispositivos
lentosqueademspuedenestarenusocompartidosporotrosprocesos.
ExisteuncomandocapazdeesperartiemposingastartiempodeCPU.Se
trata del comando 'sleep'. Para usarlo le pasaremos un argumento que
indiqueelnmerodesegundosdedichaespera.
PorejemplovamosacomprobarcuantaCPUconsumeunaesperade6
segundosusandosleep
$ time sleep 6
real 0m6.021s
user 0m0.020s
sys 0m0.000s
66
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
real 0m0.099s
user 0m0.080s
sys 0m0.010s
EnestecomandoverqueelconsumototaldeCPUessuperioraldel
comandosleep.Encualquiercasoeltiemporealtardadoenlaejecucin
delcomandoessiempremuysuperioralconsumodeCPU.
Vamosaprobaruncomandoqueapenasrealiceotracosaqueentrada
salida. Vamos a enviar 10Mbytes al dispositivo /dev/null. Existe un
comando'yes'queprovocalasalidacontinuadeuncarcter'y'seguidode
uncarcterretornodecarro.Estapensadoparasustituirlaentradadeun
comando interactivo en el cual queremos contestar afirmativamente a
todo lo que pregunte. Nosotros filtraremos la salida de 'yes' con el
comando'head'paraobtenersololos10Mbytesprimerosproducidospor
'yes'ylosenviaremosaldispositivonulo'/dev/null'quevieneaserun
pozosinfondoenelcualpodemosintroducircualquiercosasinquese
llene,peronopodremossacarabsolutamentenada.Enunapalabravamos
aprovocarprocesodeentradasalidaperfectamenteintil.
Tubera rota
real 0m6.478s
user 0m5.440s
sys 0m0.900s
67
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
3.1415926535897932384626433832795028841971693993751058
20974944592307\
816406286208998628034825342117067982148086513282306647
09384460955058\
223172535940812848111745028410270193852110555964462294
89549303819644\
288109756659334461284756482337867831652712019091456485
66923460348610\
454326648213393607260249141272
real 0m2.528s
user 0m2.520s
sys 0m0.010s
EnunPentium200Mhzestecomandotard3segundospara300cifrasy
20segundosusando600cifras.Decimosestoparaqueveaqueeltiempo
quesetardaaumentaexponencialmenteyquedependiendodelapotencia
desuordenadorpuedesuponerbastantetiempodeproceso.Quizstenga
quevariarelnmerodecifrassignificativasparapodermedirtiemposcon
comodidad.
Estecomando'time'esuncomandointernoperoenLinuxtambinhayun
comandoexternollamadodelamismaforma.Parapoderejecutarlocon
estashelldeberaincluirelcaminocompleto.Nodeseamosabusardesu
escaso 'time' as que no lo comentaremos. Para buscar en el man el
comando'time'quehemosexplicadoodecualquierotrocomandointerno
tendraquemirarenlapginadelmanualdebash.
68
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Comandokill
Estecomandoseutilizaparamatarprocesos.Enrealidadenvasealesa
otrosprocesos,perolaaccinpordefectoasociadaalamayoradelas
sealesdeunixesladefinalizarelproceso.Lafinalizacindeunproceso
puedeveniracompaadadelvolcadodelainformacindelprocesoen
disco.Segeneraunfichero'core'eneldirectorioactualquesolosirve
paraque los programadores localicen elfalloqueprovocestabrusca
finalizacindelproceso.Porejemplosielprocesointentaaccederfuera
delespaciodememoriaconcedidoporelkernel,recibirunasealquelo
matar.Lomismoocurrirsiseproduceunadivisinporcerooalgn
otrotipodeerrorirrecuperable.
Unprocesounixpuedecapturarcualquiersealexceptolaseal9.Una
vezcapturadalasealsepuedeactivarunarutinaquepuedeprogramarse
contodalibertadpararealizarcualquiercosa.
'kill'pordefectoes'kill15'envaunSIGTERMygeneralmenteprovoca
cierreordenadodelosrecursosenuso.Estasealpuedeserignorada,o
puede ser utilizada como un aviso para terminar ordenadamente. Para
matarunprocesoresultarecomendableenviarprimerounkill15ysino
seconsiguenadarepetirconkill9.Esteltimo9envaSIGKILLqueno
puedeserignorada,yterminainmediatamente.Solofallarasinotenemos
permisosparamatareseproceso,perosiesunprocesonuestro,kill9
resultaunaopcinseguraparafinalizarunproceso.
Lassealesactanfrecuentementecomoavisosdequehaocurridoalgo.
Existen muchos tipos de seales para poder distinguir entre distintas
categorasdeincidenciasposibles.
Comandonice
ElmultiprocesoestaimplementadoconcediendocclicamentelaCPUen
rodajasdetiempoacadaprocesoqueestaenejecucin.
69
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
Comprendertodoestocuandohablemosdetiposdeficheros.
72
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Paraponerapruebaunavezmssusagacidad,(santapaciencialasuya)
usaremoseltrminoficherosensusdosacepciones paradescribiruna
clasedeficherosllamadadirectorios.
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
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)
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.
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
Recuerdequetieneasudisposicinelcomando'man'paraconsultarlas
distintasopcionesdecadaunodeestoscomandos.
Aliasparaelusodeloscomandosmsfrecuentes
76
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
paraalgoquenotienequeverconelsistemadeficherosysinembargolo
mencionaremosaquporrazonesprcticas.
Podraparecerqueestamosobsesionadosconlashellyquenosabemos
hablar de otra cosa pero solo queremos proporcionarle ahora unos
consejosprcticosquelefacilitenelusodesusistema.Paraellotendra
queeditarelfichero'.alias'presenteensu$HOMEyaadirlaslneas
siguientes:
Puedeejecutarelfichero'.alias'paradefinirtodosestosalias
$ . .alias
77
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Opuedeejecutarcualquieradeestoscomandosaliasahoramismo,por
ejemplo
Luegotecleeelcomando'alias'.Comprobarquequedadefinido.Teclee
elnuevocomando'll'ycompruebesuefecto.
Elbashsoloexpandelosaliasdelaprimerapalabradeuncomandoysolo
cuandonovanentrecomillados.Poresocuandodefinimosunaliasque
sustituye a un comando(Porejemplo "ls='ls color=auto'")tendremos
queusar'ls'entrecomillassimplesodoblesparasinodeseamosquese
produzcalaexpansindelalias.
$ 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.
CosassimpticasdeUnixyLinux.
mvSetratademoverinformacinperoaplicamoselmismoprincipioque
para'rm'.
Ejemplosdeusodeloscomandosestudiados
Ejecutaremospasoapasounaseriedecomandosycomprobaremoslo
queocurre.
79
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
/tmp/kkkk
total 4
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk3
drwxr-xr-x 2 acastro acastro 1024 abr 16 20:01
kkkk
80
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
estructura de
$ # ficheros y directorios que cuelga del directorio
actual.
$ # /tmp/kkk
$ ll -R .
total 4
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:01
kk3
drwxr-xr-x 3 acastro acastro 1024 abr 16 20:03
kkkk
kkkk:
total 4
-rw-r--r-- 1 acastro acastro 3 abr 16 20:03
kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:03
kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:03
kk3
drwxr-xr-x 2 acastro acastro 1024 abr 16 20:04
kkkk
kkkk/kkkk:
total 3
-rw-r--r-- 1 acastro acastro 3 abr 16 20:04
kk1
-rw-r--r-- 1 acastro acastro 3 abr 16 20:04
kk2
-rw-r--r-- 1 acastro acastro 3 abr 16 20:04
kk3
.
`-- kkkk
`-- kkkk
81
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
2 directories
.
|-- kk1
|-- kk2
|-- kk3
`-- kkkk
|-- kk1
|-- kk2
|-- kk3
`-- kkkk
|-- kk1
|-- kk2
`-- kk3
2 directories, 9 files
./kk1
./kk2
./kk3
./kkkk
./kkkk/kk1
./kkkk/kk2
./kkkk/kk3
./kkkk/kkkk
./kkkk/kkkk/kk1
./kkkk/kkkk/kk2
./kkkk/kkkk/kk3
82
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
./kkkk
./kkkk/kk3
./kkkk/kkkk
./kkkk/kkkk/kk1
./kkkk/kkkk/kk2
./kkkk/kkkk/kk3
4 ./kkkk/kkkk
8 ./kkkk
12 .
Paraborrartodoestosesueleusarlaopcindeborradorecursivo.No
debeusarestaopcincomorootsinestarmuysegurodeloquehace.Esta
opcinborrarecursivamenteyesmuypeligrosaporqueunerrorpuede
borrar recursivamente desde un lugar equivocado un montn de
informacin.
Noesnecesarioborrarnadaporqueen/tmplainformacinsueleborrarse
durante el arranque. Si quiere intentarlo con las precauciones
mencionadas teclee 'rmfr/tmp/kkkk'.Siloprefierepuededejarlosin
boraryaquenoocupacasinadayseborrarlaprximavezquesevace
el'/tmp'queserseguramentecuandovuelvaaarrancarelordenador.
Paraqueloscomandosanteriorespuedanfuncionarcorrectamente
deberemostenerlospermisosadecuadossobrelosficherosylos
subdirectorios.
Evidentementehaymuchosmsynopodemosexplicarlostodosahora
peroquizsseabuenomostrarunapequealistadealgunosdeellosque
veremosmsadelanteenposteriorescaptulos.
83
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Sistemaplanodeficheros
Laestructuraenformaderboltieneelinconvenientedequeserequiere
irrecorriendoelrbolparairlocalizandocadaunodeloselementos.Por
ellosehacenecesariounsistemamuchomsdirecto.
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
$ 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'
87
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
d Directorio
l Enlace simblico
p Fifo con nombre
b Dispositivo de bloques
c Dispositivo de caracteres
En ingls se usan los trminos owner , group, y others para designar
respectivamentealpropietario,algrupoyacualquierusuario.
Notacinnumricaparapermisos
Recuerdequetambintenemosquepensarenlaposibilidaddequemi
amigoDavidacostumbradoalusodelazadndecidahacerestecursoy
tenamos un compromiso de explicar las cosas partiendo de cero. Los
permisosdelosficherossonalmacenadosenformatobinarioysepuede
referenciar numricamente. Vimos que a cada permiso individual le
asocibamosunnmerodetresdgitosformadopordoscerosyuntercer
nmeroquepodasernicamente1,2,o4.Porejemploelpermisode
escrituraparaunusuariocualquieraera002.Conestosnmerossepuede
codificarlospermisosdelaformaqueindicamosenelsiguienteejemplo:
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
Porejemplosiqueremosabrirunficheroconpermisos664ytenemosuna
umaskde022obtendremosunfichero644.
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.
89
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Los atributos Set uid, Set gid, y Save text no los explicaremos de
momento.
$ cd /tmp
$ echo > kk
$ ##################################
$ chmod 777 kk
$ ls -l kk
$ ##################################
$ chmod 707 kk
$ ls -l kk
$ ##################################
$ chmod 421 kk
$ ls -l kk
$ ##################################
$ chmod 124 kk
$ ls -l kk
$ ##################################
$ # '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
$ ##################################
$ chmod +x kk
$ ls -l kk
$ ##################################
$ chmod -r kk
$ ls -l kk
$ ##################################
$ chmod u+r kk
$ ls -l kk
$ ##################################
$ chmod a-x kk
$ ls -l kk
$ ##################################
$ chmod g+x kk
$ ls -l kk
$ ##################################
$ chmod o+x kk
$ ls -l kk
91
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ ##################################
$ chmod a+rwx kk
$ ls -l kk
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
k1 k2
Sinabandonarlasesinanteriorcontinuamoselejercicio
$ ###(1)###
$ ## Eliminamos los premisos de lectura del
directorio kk
$ chmod -r kk
$ ls -ld kk
$ ls -l kk
/tmp/kk
$ echo > k3
$ ls -l
94
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Sinosetienepermisodeejecucinenundirectorionosepodrhacercd
aesedirectorio,nianingunodelosdirectoriosquecuelgandeel.Esto
imposibilitatodaslasoperacionesqueutilicenesedirectoriocomoparte
delcamino.
Sinabandonarlasesinanteriorcontinuamoselejercicio
$ ###(2)###
$ ## Ahora eliminamos permiso de ejecucin
$ chmod -x kk
$ ls -ld kk
$ ## Intentamos entrar
$ cd kk
95
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ rm kk/k2
$ ls kk
k1
Sinabandonarlasesinanteriorcontinuamoselejercicio
$ ###(3)###
$ ## Ahora eliminaremos permisos de escritura
$ chmod 666 kk
$ ls -ld kk
$ echo > k3
$ touch k3
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.
Hagaunllparacomprobarsuspermisosyverqueespropiedadde'root'
yquetieneuna's'enlugardeuna'x'enlapartedelospermisosparael
propietario.
97
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
estecomandotemporalmentecambiesuEGIDtomandoelvalorGIDdel
fichero.Porejemploelcomadolprnosolonosconvierteen'root'cuando
loejecutamossinoquenoscambiaelgrupoporelgrupodeimpresin.
Paraverelaspectodeestospermisosrealiceelsiguienteejercicio.Realice
siemprelosejerciciosdesdeunusuarionormaldistintoderoot.
$ cd /tmp
$ echo > kk
$ chmod 4000 kk
$ ll kk
$ chmod 4100 kk
$ chmod 2000 kk
$ chmod 2010 kk
$ chmod 1000 kk
$ chmod 1001 kk
98
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
99
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
SISTEMADEFICHEROS(Terceraparte)
Tiposdeenlaces(links)ysumanejo
Elmanejodeambostiposdeenlacessehaceconelcomando'ln'.Como
es habitual un repaso a la pgina man de este comando es muy
recomendable.Lacreacindeunenlacergidoyunosimblicoesmuy
similar.Ladiferenciaesqueparaelenlacesimblicotendremosqueusar
laopcins.
$ 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
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
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 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
$ ls -li
103
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
$ ls dir2
ejs1
$ ls -li dir1
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
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
$ ls -li dir2
$ rmdir dir2
105
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ rm dir2
$ ls -li
$ ls -li dir1
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
.
`-- 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
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.
Simiramosdentrodeldirectorio'/proc'veremosquehayunmontnde
directorioscuyonombreesunnmero.Estosdirectoriosrepresentancada
uno a un proceso por su pid. Ya hemos estudiado el proceso init en
captulosanterioresasquevamosaponerunejemplo.
Pruebeahacerlosiguiente:
$ cat /proc/1/status
108
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Sistemadeficherosvirtual
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
111
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
particin.Unsistemadearchivos'/'(raiz)pequeoesmenospropensoa
corrompersecomoresultadodeunfallodelsistema.
Lajerarqua/usr.
112
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
/usr/local:Jerarqualocal
113
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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'
114
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
115
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
ALGUNOSCOMANDOSTILES
Noslimitaremosaindicarbrevementeparaqueseusan.Enalgunosde
ellospondremosalgnejemploperolosdetallestalescomoformadeuso
yopcionesdebenconsultarseenelmanual.Elobjetivoessimplemente
que conozca la existencia de los comandos que pueden resultarle de
mayorutilidadenestemomento.
Recuerdequeunnmeroentreparntesisacontinuacindeuncomando
indicaelnmerodeseccinenelman.
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)
atq(1)
Permiteverlacoladetareaspendientes.
$ atq
atrm(1)
118
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ 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:
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.
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
chgrp(1)
chmod(1)
$ chmod +r /tmp/fich
$ chmod u+r /tmp/fich
$ chmod 770 /tmp/fich
$ chmod a-wx,a+r /tmp/fich
chown(1)
Permitecambiarelpropietarioactualdeunfichero.Soloelpropietariodel
ficheroounusuarioprivilegiadopuedeusarlo.Tambinpermitecambiar
elgrupo.
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
cut(1)
Permiteextraercolumnasocamposdesdeunoomsficheros.
date(1)
$ date
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.
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)
emacs(1)
Esuneditormultipropsito.
env(1)
Obtienelalistadevariablesdeentornoysusvalores.
ex(1)
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
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)
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)
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)
ls(1)
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.
man(1)
mkdir(1)
Creaunoomsdirectorios.Lospermisosdependerndeelvaloractual
de 'umask'.Estoyalovimosencaptulos anteriores.Paraeliminarun
directorioseusar'rmdir'.
132
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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)
133
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
prioridad.Unavezqueuncomandohasidolanzadosepuedemodificar
suprioridadconrenice.
$ nice comando
nohup(1)
Loscomandoslanzadosconnohupnoterminanalabandonarlasesin.Se
puedeusarcombinadoconlaejecucinenbackground.
$ # 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.
ps(1)
Permiteobtenerinformacindelosprocesosenejecucin.Dependiendo
loquenosintereseexistendiversasopcionesparaunagranvariedadde
formatosydeseleccindelainformacindesalida.
pstree(1)
$ 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.
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)
rsh(1)
137
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
ejecutarenelordenadorremotoconrshyelotroseejecutaenlocal.
Ambosprocesosquedancomunicadosporentradasalidaperoesoimplica
queesacomunicacinviajaratravsdelared.
script(1)
Esteesuncomandorealmentecurioso.Suutilidadprincipalesgrabaruna
sesin.Lanzaunasubshellqueseejecutaraenunpseudoterminal.Este
palabro no deseamos explicarlo ahora pero mientras estamos en esa
subshelltodosloscaracteresrecibidosporelterminalsongrabadosenun
fichero.Paraterminarsetecleaexit.Estilparamemorizarsesionesde
trabajo.
sed(1)
138
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
sleep(1)
sort(1)
Estecomandopermiteordenarlineasdetexto.Sepuedeusarcomofiltro.
Seestudiarmsadelante.
split(1)
Estecomandosirveparapartirentrozosmspequeosunficherogrande.
Paravolveraobtenerelficherooriginalbastarconusarelcomando'cat'
Estecomando troceaunficherograndeentrozosde52Mbytesquese
guardanenficherosqueempiezanconelprefijo'parte'seguidodeuna
numeracinsecuencial.
stty(1)
139
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ 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)
telnet(1)
Permiteabrirunasesindetrabajoenotramquina.
141
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ telnet localhost
test(1)
Seusaparaevaluarexpresiones.Seusamuchoenlaprogramacinshell
script.Loqueseusaessucdigoderetorno.Tienedosformasdeuso
'testexpresin'o'[expresin]'
$ 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
$ tload -d 2
top(1)
$ 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
true(1)
vi(1)
Esteesuneditormuypotenteypresenteentodoslossistemasdetipo
Unix.Seestudiarmsadelante.
w(1)
$ w
wc(1)
144
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ 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)
$ whereis ls
$ whereis whereis
write(1)
Siemprequesetengapermisopermiteenviarmensajesaotrousuario.
$ write root
xargs(1)
Sirveparapasarargumentosauncomandomedianteentradasalida.
Cosascomoestasaadenbastantepotenciaallenguajeshellscript.
146
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
z...
Hayunaseriedecomandos.'zcat,zmore,zgrep,zless,zdiff'quepermiten
trabajar directamente con ficheros comprimidos con gzip en la misma
forma que lo haramos directamente con 'cat, more, grep, less y diff'
respectivamente.
$ zless documento.txt.gz
147
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
EXPRESIONESREGULARES
Introduccin
Vamosaexplicarlasexpresionesregularesporqueseutilizanamenudo
desdeunagranvariedaddeaplicacionesenlosSOtipoUnixcomoLinux.
Permitenreconocerunaseriedecadenasdecaracteresqueobedecena
ciertopatrnquellamamosexpresinregular.Porejemplosideseamos
buscarlineasquecontengalaspalabras'hola'o'adis'enlosficherosdel
directorioactualharemos:
$ egrep 'hola|adis' *
Notodosloscomandosusandeformaidnticalasexpresionesregulares.
Algunos de los comandos que usan expresiones regulares son 'grep',
'egrep', 'sed', 'vi', y 'lex'. Este ltimo en linux se llama 'flex' y es un
analizadorsintcticomuypotenteperonoloexplicaremosporquepara
usarlo hay que saber lenguaje 'C'. Actualmente algunos lenguajes
modernos como el 'perl' incluyen capacidad de manejar expresiones
regulareslocuallesdaunagranpotenciayparalenguajesmsantiguos
comoel'C'existenlibreras parapoderusarexpresionesregulares.En
resumenlasexpresionesregularesestnsinedoincorporadasendistintos
sitiosyyanoestnlimitadasasuusoenSOtipoUnix.Cadacomandoo
aplicacin implementalaexpresionesregularesasumaneraaunqueen
general son todas bastantes parecidas. Por ejemplo 'grep' permite usar
expresiones regulares sencillas mientras que 'egrep' es capaz de usar
expresionesregularesmscomplejas.Otroscomandosadaptanelusode
expresiones a sus particulares necesidades yporello sibien sepuede
hablarengeneraldeellashayquetenerencuentalaspeculiaridadesde
cadacasoquedebernserconsultadasenlaspaginasdelmanualdecada
comando.Lasexpresionesregularesvienenaserunaespeciedelenguaje
ycadacomandousasupropiodialecto.Enrealidadlasdiferenciasentre
148
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
losdistintosdialectossuelensermuypocas.Porejemplosiuncomando
usa los parntesis y adems admite el uso de expresiones regulares
extendidasseestablecerunaformadedistinguirsilosparntesisdeben
serinterpretadoscomopatrndelaexpresinregularocomootracosa.
Paraellosesueleusarlosparntesisprecedidosdelcarcterescape'\'.
Vamos a tomar a 'egrep' y 'sed' como comandos para aprender
expresiones regulares porque este curso tiene un enfoque prctico.
Usaremoselcomando'egrep'condistintospatronesyveremoscuando
cumpleycuandonocumpleydeesaformaseentenderperfectamente.
Operadoresusadosenexpresionesregulares.
* Elelementoprecedentedebeaparecer0omsveces.
+ Elelementoprecedentedebeaparecer1omsveces.
. Uncarctercualquieraexceptosaltodelinea.
? Operadorunario.Elelementoprecedenteesopcional
| Ounouotro.
^ Comienzodelinea
$ Findelinea
[...] Conjuntodecaracteresadmitidos.
[^...] Conjuntodecaracteresnoadmitidos.
Operadorderango
(...) Agrupacin.
\ Escape
\n Representacindelcarcterfindelinea.
\t Representacindelcarcterdetabulacin.
149
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Estalistanoescompletaperoconestoessuficienteparahacercasitodo
loquenormalmentesehaceconexpresionesregulares.
Ejemplosparacadaoperadorcon'egrep'
150
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
151
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
152
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Ampliandoconocimientossobre'egrep'
Hemosaprendidocosasdeegrepparailustrarelusodelasexpresiones
regularesperotantogrepcomoegreppermitenelusodeciertasopciones
queannohemoscomentadoyquenovamosailustrarconejemplos
porquenoestnrelacionadasconlasexpresionesregulares.Solovamosa
sealarlasopcionesmstilesparaquelasconozca.
iBuscaignorandodiferenciasentremaysculasyminsculas.
wParaforzarquelacadenareconocidaseaunapalabracompleta.
153
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
154
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Empezamosconunasustitucinsencillita.
abcNUMEROdef
Ahorausamoseloperador'&'.Observecomosesustituyeporelpatrn
reconocido.
abc<1234>def
Despuseliminamoslasecuencianumrica.
abcdef
Vamosacomprobarqueenlasexpresionesregularesseintentasiempre
reconocerlasecuenciamslargaposible.
000<x111x222x>333
Vamosahoraatrabajarsobreunfichero.Comosiemprerecordamosque
trabajeconunusuariosinprivilegiosydentrode/tmp.Yasabecomo
hacerloasquecambieahoraa/tmpantesdecontinuar.Parasuprimirdel
ficherolapalabra'Hola'enlaslineasdela3ala4.
155
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Elficheronohacambiado.Elresultadosaleporsalidaestndar.Ahora
veamosquepasasiintentamossustituirlapalabra'otra'porlapalabra
'una'entodoelfichero.
Vemosquesolosehacambiadolaprimeraocurrenciadecadalnea.Para
obtenerelresultadodeseadotendramosqueusarlagalfinal.
156
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Ampliandoconocimientossobre'sed'
Tambinpodemosobtenerelmismoresultadousandolaopcinfyun
ficherodeinstruccionespara'sed'.
157
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
April 2002
S M Tu W Th F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
S M Tu W Th F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
S +M Tu +W Th +F +S
159
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
+ +1 +2 +3 +4 +5 +6
7 +8 +9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
+S +M Tu +W Th +F +S
++ +1 +2 +3 +4 +5 +6
+7 +8 +9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
+S +M Tu +W Th +F +S
++ +1 +2 +3 +4 +5 +6
+7 +8 +9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
S M Tu W Th F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
160
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
S M Tu W Th F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
S M Tu W Th F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
S M Tu W Th F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 [20]
21 22 23 24 25 26 27
28 29 30
Independientementedequeaustedseleocurraotrasolucinmejor,se
tratabadepracticarconsedyconsietesedsencadenadospensamosque
yahabrsaciadosuseddesed(1).
Detodasformassiloquieremsbonitoycortitopruebeestootro.
ESC=`echo -e "\033"`
cal | sed "s/$/& /" | sed "s/ $DIAMES / $ESC[1m$
{DIAMES}$ESC[0m /"
161
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Yanossalimosdeltemaperosiestohadespertadosucuriosidadmire
console_codes(4).
162
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
ELEDITORVI(Primeraparte)
Introduccin
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').
73
http://www.ciberdroide.com
99
Veamoscomohaquedado.
$ cat ejemplo.txt
Podemosverlasdiferenciasconeloriginalusandoelcomando'diff'.El
comandodiffesuncomandoquesirveparasealardiferenciasentredos
ficherosperoconlaopcineestasdiferenciasseexpresanenunaforma
adecuadaparaserinterpretadaspor'ed'.Veamoscomofunciona.
166
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
2a
(Tienda Virtual de Linux)
.
$ 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'.
2a
(Tienda Virtual de Linux)
.
w
q
73
y esto es todo.
167
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
99
$ cat ejemplo2.txt
'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
$ vi -? | less
Solosileinvitaausarlaopcin'h'hgalo.
$ vi -h | less
Compruebeenlasprimeraslineassisetratade'vim'.Siyahaentradopor
error en editor salga mediante <ESC> :q<ENTER> Continuemos
averiguandocosas.
$ whereis vi
$ whereis vim
$ whereis elvis
$ man vi
$ man vim
$ man elvis
$ man ex
$ man view
$ man ed
Ahorasivamosaentraryasalireneleditor.
$ vi
Yaestdentrodeleditor.Compruebesisaleinformacinrelativaaltipo
deeditorysalgatecleando':q'Parasignificarqueestamoseneleditor'vi'
pondremoselfondoazuloscuroylasletrasenamarillosonlasquesalen
enpantallayenblancolasqueintroducimosnosotros.
169
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
~ VIM - Vi IMproved
~
~ version 5.3
~ by Bram Moolenaar et al.
~
~ Vim is freely distributable
~ type :help uganda<Enter> if you like Vim
~
~ type :q<Enter> to exit
~ type :help<Enter> or <F1> for on-line help
~ type :help version5<Enter> for version info
~
~
:q
Cuadroresumenparaelusode'vi'
Acontinuacinsedescribenunaseriedecomandosdeusofrecuenteen
'vi'. Sedestacan los queseconsideran ms importantes conunmayor
numero de asteriscos. En una primera lectura le recomendamos que
empieceautilizaryaaprenderaquelloscomandosmarcadoscon'***'que
sonlosmsimportantes.Leaconsejamosquenopasedeleccinhasta
quenoseaprendacomomnimoloscomandoscalificadoscon'***'.Al
final del captulo como es costumbre pondremos un test pero solo
haremos preguntassobrecomandos calificados con'***'quesernlos
quepracticaremosdeformaespecialenestecaptulo.
Hemosagrupadotodaestainformacinenunnicocuadroparaquesea
suchuleta,parausaryaprender'vi'.Soloseincluyenloscomandosque
suponemosserndelamayorutilidadparaunusuarionovatoydadoque
hayvariasformasdehacerunamismacosahemoselegidoporustedy
hemosclasificadodeformatotalmentesubjetivaunaseriedecomandos
para que inicialmente tengaqueaprendersolounreducidonmerode
ellos. Tambin se incluyen otros comandos para que pueda ser usado
comouncuadrodeconsultabastantecompleto.
170
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
LINEADECOMANDOS
**
vi Editarunnuevofichero
*
** Editarunfichero.(Sielficheroesdesolo
vi<fichero>
* lecturaloeditaraenmodosololectura.
vi<fichero1>
* <fichero2> Editarvariosficherossucesivamente.
<fichero3>...
** viR<fichero> Editarenmodosololectura.
Editarrecuperandomodificacionesno
** vir<fichero>
salvadas.
MODOCOMANDOS
Sepasadesdeelmodoentrada(insercinoreemplazo)mediante
<ESC>.
Movimientosdelcursor .
** h Carcteranterior
** <ENTER> Lineasiguiente
** j Lineasiguiente
** k Lineaanterior
** <ESPACIO> Carctersiguiente
** l Carctersiguiente
* L Ultimalineadelapantalla
* H Primeralineadelapantalla
* M Lineacentraldelapantalla
* <CTRL+B> Retrocesodepgina
171
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
* <CTRL+F> Avancepgina
* + Primercarcterdelalineasiguiente
* Primercarcterdelalineaanterior
* $ Desplazarsealfinaldelinea.
* 0 Desplazarsealprincipiodelinea.
Modoentradadetexto .
**
i Pasaramodoentradainsertando.
*
**
R Pasaramodoentradareemplazando.
*
Avanzarelcursorypasaramodoentrada
** a
insertando.
** Insertarunalineadespusdelaactualy
o
* pasarainsertar.
Insertarunalineaantesdelaactualy
* O
pasarainsertar.
Corregir .
Deshacerltimamodificacin.(Envim
** sepuedenirdeshaciendolos
u
* losltimoscambiosenotroseditoresvi
solosedeshaceelltimocambio).
** En'vim'sirveparadeshacerelltimo
<CTRL+R>
* comando'u'
** U Recuperarlineacompleta.
Buscar .
Buscaunacadenadecaracteres,hacia
** /
delante.
Buscaunacadenadecaracteres,hacia
* ?
atrs.
172
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
* n Siguienteenlabsqueda.
* N Anteriorenlabsqueda.
Copiar,Mover,yborrar
.
lineas
**
dd Borrarunalinea.
*
**
<n>dd borrar<n>lineas.
*
**
yy Meterunalineaenelbuffer.
*
**
<n>yy Meter<n>lineasenelbuffer.
*
** Copiarlalineadelbufferdespusdela
p
* lneaactual.
Copiarlalineadelbufferantesdelalnea
* P
actual.
Varios .
** Refrescarpantalla.(tilcuandose
<CTRL+L>
* descomponelapantalla)
Visualizaelnombredelfichero,numero
** <CTRL+G>
delineastotalesyenquelineaestamos.
**
J Unelalneaactualconlasiguiente.
*
** . Repetirltimocomando.
**
: Pasaralmodoex(Modocomandos)
*
**
ZZ Terminarsalvandosihubocambios.
*
MODOEX
Sepasadesdeelmododecomandosalmodoexcon':'
173
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Sepuedeforzaraentrardirectamenteenestemodo
usandolaopcin'e'oejecutandoelcomando'ex'.
** :<#linea> Iraunalinea.
Pasaaeditardeformasimultaneaotro
* :e<fichero>
fichero.
* :e# Volveralficheroanterior.
** Salvar.(Nopuedesobreescribirsise
:w
* entrconviR)
**
:w! Salvarforzando(Cuandofalla:w).
*
** :x Salirsalvandosiesnecesario.
** Salvarconotronombre.(Nopuede
:w<fichero>
* existirelfichero)
** Salvarconotronombreforzando.
:w!<fichero
* (Permitesobreescribir)
** Leeunficheroylocargaenellugar
:r<fichero>
* indicadoporlaposicinactualdelcursor.
Ejecutaenunasubshellelcomandoy
guardaelresultado
** :r!<comando
delmismoenlaposicinindicadaporel
cursor.
**
:q Salirsinohaymodificacin.
*
**
:q! Salirsinsalvarcambios.
*
** :wq Salirsalvandocambios.
Ejecutarunasubshell(seretornacon
* :sh
exit).
* :g/<s1>/p Visualizarlineasquetienen<s1>
* :g/<s1>/s//<s2>/g Sustituirglobalmente<s1>por<s2>.
174
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
* :g/<s1>/s//<s2>/gc demperopidiendoconfirmacin.
* :n Siguientedocumento.
* :args Mirarficherosaeditar.
* :abmn Abreviaturas.Teclear1sesustituyepor2
* :unabm Desabreviar.
Crearmacro(mhacen)(Verejemplos
* :mapmn
conmacros)
Crearmacroenmodoinsercin(mhace
* :map!mn
n)
* :unmapm Destruirmacrom
* :unmap!m Destruirmacrodeinsercinm.
* :cd Cambiardedirectorioactual.
Activarvisualizacindenmerosde
** :setnu
lnea
Activarvisualizacindenmerosde
** :setnonu
lnea
** :setall Vertodaslasopcionesconsusvalores.
Opcinde'vim'paranoobligaraser
** :setnocompatible
compatible'vi'
** Paravisualizarsiempreelmodoenque
:setshowmode
* nosencontramos.
** Ejecutaruncomandoenunasubshell.
:!<comando>
* (Verejemploscon!)
Muchosdeestoscomandospuedenaplicarsedentrodeunrangode
lneas.Unnmerodelneapuedevenircomounnmero,unpunto,
un$.
175
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Unpunto . Lneaactual
Unpunto .N NLneasantesdelaactual
Unpunto .+N NLneasdespusdelaactual
Unnmero N LneaN
Un$ $ Ultimalnea.
Desdelaltimaalaprimeralnea
Un$ %
(Abreviaturade1,$).
** :#linea1,#linea2w
Salvardesde1hastala2en<fichero>
* <fichero>
:#linea1,#linea2co
** Copiardesde1hasta2en3.
#linea3
:#linea1,#linea2mo
** Moverdesde1hasta2en3.
#linea3
** :#linea1,#linea2de Borrardesde1hasta2.
Sustituirlaprimeraocurrenciaencada
:#linea1,#linea2
** lineadesde1hastala2lacadena<s1>
s/<s1>/<s2>
porlacadena<s2>
Sustituirlaprimeraocurrenciaencada
:#linea1,#linea2
** lineadesde1hastala2lacadena<s1>
s/<s1>/<s2>/c
porlacadena<s2>conconfirmacin.
Sustituirtodaslasocurrenciasencada
:#linea1,#linea2
** lineadesde1hastala2lacadena<s1>
s/<s1>/<s2>/g
porlacadena<s2>
Sustituirtodaslasocurrenciasencada
:#linea1,#linea2
** lineadesde1hastala2lacadena<s1>
s/<s1>/<s2>/gc
porlacadena<s2>conconfirmacin
176
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
177
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
~
~
~
"ej-vi1.txt" [New File]
: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.
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.
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.
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
Perorealmentedeseamossalirsinsalvarasqueintentamosdenuevocon
':q!'desdeelmodocomandos.
:q!
$ cat ej-vi1.txt
Lainformacindepermisospuedeserdiferente.Recuerdequedijimos
quelospermisosdeunficherocuandosecreadependendela'umask'
peroahorasolonosinteresacomprobarefectivamentetenemospermisos
181
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
paraleeryescribirenestefichero.Vamosaeliminarlospermisosde
escrituradelficheroyvamosaintentareditarlonuevamente.
Probablementeaparecerenlalineainferiordesueditorunaadvertencia
dequeestenmodosololectura.
Buenoapesardeellovamosaintentarhacercambiosycomoestamos
practicandocontinuaremosconunaseriedecomandosqueannohemos
vistoyquetenamosclasificadoscon'***'.
:3
:.,$ w trozofinal
:1,. w trozoinicial
:1,$ de
:r trozoinicial
:$
:r !date
:$
:r trozofinal
:w tempfich
:w
Permitiescribirotrosficherosperoseniegaasobrescribirelficheroque
estamoseditandoconloscambiosporqueestenmodosololecturay
sugierequeusemos'!'paraforzarsuescritura.
:w!
182
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Enestecasoestamosforzandolasituacinyestamosescribiendoenun
fichero en el que no tenemos permisos pero puesto que somos
propietarios del mismo el editor puede manejar los permisos para dar
permiso de escritura, sobrescribir el fichero y volver a cambiar los
permisosdejandolospermisosoriginales.
Podemosejecutarcomandosdesdeeleditorasqueporquenomiramos
lospermisoscon'lsl'.
:!ls -l
total 6
-r--r--r-- 1 xxxx xxxx 304 ago 12 19:11 ej-
vi1.txt
-r--r--r-- 1 xxxx xxxx 304 ago 12 19:11 ej-
vi1.txt~
-rw-r--r-- 1 xxxx xxxx 216 ago 12 18:28 ej-
vi2.txt
-rw-r--r-- 1 xxxx xxxx 304 ago 12 19:09
tempfich
-rw-r--r-- 1 xxxx xxxx 147 ago 12 19:06
trozofinal
-rw-r--r-- 1 xxxx xxxx 126 ago 12 19:06
trozoinicial
:!bash
bash-2.01$ ps
183
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
exit
1 returned
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>
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'.
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.
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.
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
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
Lasexpresionesregularesofrecengrandesposibilidadescomoyahemos
vistoperoparticularmenteinteresantespara'vi'puedenserlasbsquedas
aprincipiooafinaldeunalnea.Enelejemplobuscaremo'El'aprincipio
deunalneayluego'as'alfinealdelnea.
'/^El'
'/as$'
Sustituciones
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
189
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
'/g'.Losejememplossolovaranenlaformadeindicarcon'1,$'ocon'%'
labsquedaentodoeltexto.
:1,$ s/encarnado/colorado/g
:% s/encarnado/colorado/g
:1,$ s/encarnado/colorado/gc
Vamosausarahoralassustitucionesconexpresionesregulares.
1)Poneradoblelneatodountexto.
:%s/$/\
/g
2)Eliminarblancosytabuladoresafinaldelinea.
:%s/[space tab]*$//
3)Eliminarblancosytabuladoresalprincipiodelnea.
:%s/^[space tab]*//
190
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
5)Ponerentreparntesistodoslosnmerosenterosdeuntexto.
:%s/[0-9][0-9]*/\(&\)/g
Enesteltimohemosusadoeloperador'&'enlamismaformaquevimos
con 'sed' unas lecciones atrs. Se pueden hacer en poco tiempo cosas
bastantecomplejas.Porejemplovamosahacerunshellscriptquegenere
otroshellscript.Paraelloprimeroloqueharemosesescribirelprograma
quedeseamosgenerar.
echo 'kkkk'
echo 'kkkk'\''hhhh'
Paragenerarlobastartratarcadalneaponiendoun"echo'"alcomienzo
decadalneayunacomillasimplealfinal"'"decadalnea,peroantes
escaparemoscualquierposiblecomillasimplequepudieraexistir.Para
elloeditamoseltextoanterioryhacemoslosiguiente:
:% s/\'/\'\\\'\'/g
:% s/^/echo \'/
:% s/$/\'/
Deberquedarnosdeestaforma.
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:
Buenoestopuedesermstildeloquepareceasimplevista.Vamosa
suponerquetenemosquemodificarunagrancantidaddeficherospara
sustituirenmuchosdeelloslacadena'acastro'porlacadena'A.Castro'
perotampocolopodemoshacerdeformaautomticaporquenosconviene
vercasoacaso.Poresopasamosa'vi'elresultadodeunabsquedacon
'grep'.
Unavezdentrodeleditorhacemoslosiguiente.
:args
Elcomando':args'nosinformardelnombredelosficherosquevamosa
editarsecuencialmente.Intenteprobarestocreandosuspropiosficheros
deprueba.Yasabecomohacerlo.Convienequetodosellostenganuna
cadenaidnticaparaserlocalizadacongrep.Unavezqueeleditor'vi'
192
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Paraeditarficherossecuencialmenteleconvienetenerencuentalos
siguientescomandos.Algunosnoloshabamoscomentadotodava.
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
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
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.
Abreviaturas
196
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Usesuspropiasabreviaturasenuntextoyobservecomolaabreviaturano
serinterpretadasilasecuenciadecaracteresformapartedeunapalabra.
Macros
Esposibleprogramarmacros.Porejemplovamosahacerunamacroque
mueva4lneasalfinaldelfichero
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
F2(FiltroPGP)Firmar.
197
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Seralomismosiusaramos'<F2>'enlugarde'^[[[B'.
F3(FiltroPGP)Encriptar
F4(FiltroPGP)Desencriptarycomprobarfirma
F5(Filtroispell)Correctorortogrfico.
:map [[E :w
:!ispell %
:e!
Opcionesdevi
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:
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
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
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.
202
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Ahorasi.Vamosausarlashelldelamismaformaqueharamosconun
programanormalredirigiendolaentradaestndardesdeestefichero.Por
lotantoelficherotienetratamientodedatosysoloserequierepermisode
lecturaparaejecutarlodeestaforma.
$ # Ejecutamos
$ bash < fichero_ordenes
$ # Tambin podemos ejecutarlo de otra forma
$ cat fichero_ordenes | bash
203
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Ejecucindeunshellscriptdirectamentecomouncomando
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.
Enestecasonosehaejecutadomedianteunasubshellperonoseaprecia
ningunadiferencia.Estonosiempreesas.Veamosunejemploenelque
seaprecieladiferencia.$$tomarelvalordelpiddelashellenejecucin
y$PPIDtomarelvalordelpiddelprocesopadre.
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
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'.
Ahoraediteotronuevoficheroquellamaremos'comando'.
#!/bin/bash /tmp/aviso
echo "COMANDO"
207
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ . ./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
$ var1=888
$ ( var1=111; echo $var1 )
208
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
111
$ echo $var1
888
218
218
218
$ 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
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
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
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
---------------------------
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.
Paradefinirlasintaxisdeunafuncinenshellscriptpodramosusarlo
siguiente:
_nombre_funcion_ () { _lista_de_ordenes_ }
215
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
simplesodoblesnotieneestesignificadoperopuedeusarse'\'paraevitar
queelcarcterquedeinsertadoenlacadena.
$ echo \
> kkk\
> xxx
kkkxxx
Cdigosderetorno
# 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
Enunaexpresinlgicadondeloqueinteresaessimplementedistinguir
entrealgoquesecumpleoquenosecumplesetomar0comovalor
lgicoTRUE(oseacierto)ydistintode0setomarcomoFALSE(falso).
'true'y'false'soncomandosquenohacennada.Simplementeretornanel
valorlgicoTRUEoFALSErespectivamente.Elvalorde$?siempre
devuelveelltimocdigoderetornoobtenidoporlashelldespusde
ejecutarelltimocomando.
Ejemplos:
$ true ; echo $?
0
$ false ; echo $?
Esperamosqueejemplostancomplicadoscomoestosdosltimosnole
desanimenparacontinuarconelcurso.
Comandotest
217
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
'test'esuncomandoexternoquedevolveruncdigoderetorno0o1
dependiendodelresultadodelaexpresinquesigaacontinuacin.
Seusamuchsimoytienedosformatos.'test<expr>'o'[<expr>]'.ambas
formassonequivalentes.
LasexpresionesdeestetipoquesolopuedenvalerTRUEoFALSEse
denominanexpresioneslgicas.
Comprobacinsobreficheros
r<fichero> TRUEsielficheroexisteyeslegible.
w<fichero> TRUEsielficheroexisteysepuedeescribir.
x<fichero> TRUEsielficheroexisteyesejecutable.
TRUEsielficheroexisteyesdetiporegular
f<fichero>
(normal).
d<fichero> TRUEsiexisteyesundirectorio.
TRUEsiexisteyesundispositivoespecialde
c<fichero>
caracteres.
TRUEsiexisteyesundispositivoespecialde
b<fichero>
bloques.
p<fichero> TRUEsiexisteyesunpipe(fifo).
218
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
u<fichero> TRUEsiexisteytieneelbitsetuserID.
s<fichero> TRUEsiexisteytienetamaomayorque0.
Comparacindecadenas
z<cadena> TRUEsiesunacadenavaca.
n<cadena> TRUEsiesunacadenanovaca.
TRUEsiambascadenassonidnticas.OJOhay
<cadena1> =
dejarespaciosaunladoyotrodelsignoigual
<cadena2>
paranoconfundirlaordenconunaasignacin.
<cadena1> !=
TRUEsisondistintas.
<cadena2>
TRUEsinoescadenanula.(Unavariableque
<cadena> no existe
devuelvecadenanula).
Comparacindenmeros
<num1> eq
TRUEsiambosnmerossoniguales.
<num2>
<num1> ne
TRUEsiambosnmerossondistintos.
<num2>
<num1> gt
TRUEsi<num1>mayorque<num2>.
<num2>
<num1> ge
TRUEsi<num1>mayoroigualque<num2>.
<num2>
<num1> lt TRUEsi<num1>menorque<num2>.
219
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
<num2>
<num1> le
TRUEsi<num1>menoroigualque<num2>.
<num2>
Operadoreslgicos
OperadorlgicoNOTretornaTRUEsi
!
<expresin_logica>es
<expresin_logi
FALSEyretornaFALSEsi
ca>
<expresin_logica>esTRUE.
Agrupacindeexpresiones
Ejemplos:
0
$ test -w /etc/passwd ; echo $?
1
$ test -x /etc/passwd ; echo $?
220
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
Hayunaseriedeoperadoresquetrabajananiveldebitsperonovamosa
explicarlosdemomento.
Operadores'&&'y'||'
SonoperadoresANDyORaniveldeshellyposeencircuitode
evaluacincorto.Notienenqueverconlosoperadoresayoyaque
estoseraninterpretadosporelcomando'test'.Estosoperadores'&&'y'||'
serncolocadosseparandocomandosquelgicamenteretornansiempre
algnvalor.
223
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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'.
hola
0
224
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Cuandoejecutamoscomandosconunpipe('|')elcdigoderetornoesel
delltimocomandoejecutado.Ennuestrocasoelprimercdigo1sedebe
alaimposibilidaddegenerarlasalida.Elsegundocdigo1sedebeaque
la cadena no fue encontrada. En los tres casos $? recoge el cdigo
retornadopor'grep'.
hola
$ # El resultado sera 0
$ echo $?
AhoraparaAND.
hola
225
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
adis
$ # El resultado sera 0
$ echo $?
Elcircuitodeevaluacincortohadeusarsecorrectamente.Sisabemos
que un comando dar casi siempre un resultado que puede hacer
innecesario la ejecucin de otros comandos lo colocaremos en primer
lugar. Los comandos lentos se colocan en ltimo lugar porque de esa
formapuedenosernecesarioejecutarlos.Algunasvecesnonosinteresa
unresultadosinosoloqueseejecuteunaordendependiendodelresultado
de otra orden. Es decir queremos ejecutar solo si se cumple una
condicin.
PROGRAMACIONSHELLSCRIPT(TerceraParte)
Sentenciacondicional'if'
Yahemosvistounaformadehacerlousandolosoperadore'||'o'&&'dela
shell, pero existen formas que pueden resultar ms versatiles y ms
legibles.
if _condicin_
then _lista_de_ordenes_
[ elif _condicin_
then _lista_de_ordenes_ ] ...
[ else _condicin_ ]
fi
Enlugarde_condicin_podramoshaberpuesto_lista_de_ordenes_pero
queremosresaltarqueelcdigoderetornovaaserevaluado.
226
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Laspartesentrecorchetessonopcionalesysivanseguidasdetrespuntos
'...' indica que puede presentarse varias veces. Todas las sentencias
condicionales'if'empiezanconlapalabrareservada'if'yterminanconla
palabrareservada'fi'.
Acabamosdeutilizarunacondicinquesiempresecumplir.Vamosa
veralgounpocomsutil.
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
Tengaencuentaquesibienla'bash'admiteelusode'elif'quizasotras
shellnoloadmitan.
Setenciacondicional'case'
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.
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
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
Ejecute'./pru_read'.Observequelosdatosintroducidossonguardadosen
lavariableNOMBRE.Sipulsadirectamentelavariabletomarvalor"".
Bucles'while'y'until'
while _condicin_
do
_lista_de_ordenes_
done
Enlugarde_condicin_podramoshaberpuesto_lista_de_ordenes_pero
queremosresaltarqueelcdigoderetornovaaserevaluado.
Mientrassecumplalacondicinseejecutar_lista_de_ordenes_.Resulta
evidentequesidentrodela _lista_de_ordenes_ nohaynadacapazde
alterar la condicin, resultar un blucle que se ejecutar de forma
ininterrumpida.(Bucleinfinito).Siestoocurrehabrquematarelproceso
enviandoalgunaseal.
231
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Existeunbuclemuysimilaryquesolosediferenciaenquenoparanunca
hastaquesecumplalacondicin.Esdecirjustoalrevsqueantes.
until _condicin_
do
_lista_de_ordenes_
done
Editecomo'pru_while1'elsiguienteejemplo.
# pru_while1
# Hacer un bucle de captura por consola (terminara
cuando se pulse
# solo <INTRO> ) y mostrar el resultado de cada
captura entre parentesis.
# Inicializamos primero la variable LINEA con un valor
cualquiera
# pero distinto de ""
LINEA="x"
while test $LINEA
do
read LINEA
echo '('$LINEA')'
done
Cuandopulsemos<INTRO>directamentesinnadamsLINEAvaldr""
y'test$LINEA'devolverFALSEyelbuclefinalizar.
Vamosaejecutarelejemploparacomprobarsufuncionamiento.
$ ./pru_while1
aaaaa
(aaaaa)
bbbbb
(bbbbb)
()
232
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
VemosqueenlaltimaejecucinLINEAvala"".
Bucle'for'
Seproporcionaunalistadeelementosyseejecutaunalistaderdenes
haciendoqueunavariablevayatomandoelvalordecadaunodeestos
elementos.Entreestasordenessepuedeutilizarunnuevobucle'for'.
ElsiguienteejemplofuncionaperoesunamalaideayaquesuponeVarias
ejecucionesdeuncomandocuandosepodahaberhechoconunosolo.
Habrasidomejorhacer'chmod+x*'.
for i in $*
do
chmod +x $i
done
Elsiguienteejemplonofuncionarsinopreparaunpocounaseriede
cosasquesenecesitan.Concretamentedeberdeexistirunfichero'lista'
con varios elementos. Varios ficheros con nombre que empiecen por
SCAN.Variosficheros'*.doc'deloscualesalgunosdeberancontenerla
palabra'CODIGO'.Estudieelcontenidodelejemploquesigue.Editeloy
ejecutelopasandovariosargumentos.Suobjetivoeshacerlofuncionary
entendercomofunciona.
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
Probamosahoraaejecutarloyobtendremos
$ ./pru_break_continue
2
4
10
12
14
16
18
# ./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.
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:
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
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.
real 0m1.413s
user 0m1.070s
sys 0m0.030s
real 0m1.311s
user 0m0.230s
sys 0m0.060s
241
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Ambaspruebastardanaproximadamentelomismoperoelprimerbucle
ejecuta20000iteracionesyelsegundosolo100.Esdecirqueelusodel
comando externo hace el comando unas 200 veces ms lento. Quizs
piense que es culpa de expr y en parte es cierto pero lo realmente
importanteesquehayquearrancarunasubshelllacualarrancarexpr
paraluegotomarlasalidaestandaryexpandirlotodocorrectamente.Esto
comporta abrir los respectivos ficheros de esos ejecutables y abrir un
fichero es algo que requiere un trabajo que no tiene lugar cuando
ejecutamoscomandosinternosdelashell.
Recomendacionesfinales
Acabamosdeexplicarunprogramamuysencillo.Compliquelounpoco
aadiendounaopcin9quemuestreunsubmenqueentreotrascosas
contengaunaopcinquevuelvaalmenprincipal.Usesuimaginaciny
practiqueparaintentarmejorarlo.
Enestosmomentosyadisponedetodalabasedeconocimientosquele
permitirpersonalizarsuentornodetrabajooconstruirsencillosscripts
queleayudenarealizarunagranvariedaddetareas,otambinpuede
investigaralgunosdelosprogramasdelsistemaescritosenshellscript.Si
seconformaconloestudiadoynointentaponerloenprcticaprontolo
olvidartodo.Practiquelaprogramacinenshellscriptyamismoantes
dequeolvidelateora.Empieceporlascosasquehemosexplicadopero
nosequedeeneso.Intentellegarunpocomslejos.
Enlasleccionesquesiguencontinuaremostratandotemasqueabrirn
nuevaspuertasasuconocimiento.Enningncasopodemosdetenernos
excesivamenteenningunadeellas.Alaprogramacinenshellscriptla
hemosdedicadovariasleccionesyanteriormentededicamosalgunosms
alashellcomointerpretedecomandos,perohallegadoelmomentode
decirquedebedeponermuchodesuparteyqueexisteel'manbash'para
buscarlascosasquenopudimosexplicaraqu.
NOCIONESDEPROGRAMACINENAWK
242
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Queesawkyparaqueseusa
Lapalabra'awk'seusatantoparareferirseaunlenguajedemanipulacin
deficherosdedatoscomoparareferirseasuinterprete.
Dado que los SO tipo Unix incluido Linux acostumbran con mucha
frecuenciaausarficherosdeconfiguracindelsistemaenformatosdede
textoperfectamentelegiblesyeditablessediseounlenguajeparapoder
procesarestetipodeficherosdedatosenformatodetexto.
Cuandounprogramanecesitaunavelocidadmuyaltaparaaccederaunos
datosoparamodificarlosseutilizanestructurasdedatosmssofisticadas.
'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.
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.
Estructuradeunprogramaawk
Unprograma'awk'puedetenertresseccionesdistintas.
245
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Elprimerejemploquevimosanteriormente("Holamundo")solotena
una de las tres partes. Concretamente era la parte central ya que no
pusimosningunadelaspalabrasreservadasBEGINoEND.
Vamosaponerahoraunejemploconlastrespartes.Editeunficherocon
nombre'/tmp/3partes.awk'
Ejectelocon:
246
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Loscomentariosen'awk'comienzanconun'#'yterminanalfinaldela
lnea.
Expresionesregulares
Algunasveceslosdatospuedenvenirconalgunaslineasquenointeresa
procesaroquesedebenprocesardeformadistinta.Podemosusaruna
expresinregulardelimitadaporelcarcter'/'paraseleccionarunaaccin
especial.Vamosaeditarotroejemploquellamaremos'/tmp/expreg.awk':
Ahoraeditamosunsegundofichero'/tmp/expreg.dat':
Lnea nmero 1.
Lnea nmero 2
....
Fin de los datos
Ahoraejecutelosiguiente:
247
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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...
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'
Enlaprimeralneadebeintroducirunblancoparasepararlosprimeros
blancosyunasecuencienciade',,,'parasepararlosdosltimoscampos.
Es importante que lo edite de esta forma porque el resultado de los
ejemplospodravariar.
Ahoraejecutelosiguiente:
Editeelsiguientefichero'/tmp/delim0.awk'
{ print "+", $3, "+", $4, "+", $1, "+", $2, "+" }
Ahoraejecutelosiguiente:
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 = "\t" }
{ print "+", $1, "+", $2, "+", $3, "+", $4, "+" }
Estamosdefiniendounnicocarctertabuladorcomoseparador.Ahora
ejecutelosiguiente:
Seleccinderegistrosporcampo
Vamosaeditarunficheroquesimularlasalidadedatosobtenidadesde
unabasededatosrelacional.Usaremosestosdatosenvariosejemplos.
251
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
BEGIN { FS="\|" }
/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
print NR, ", ", $1, ", ", $2, ", ", $3
}
Vamosaejecutaresteejemployvamosaversusalida
$awkfcontabil1.awk<contabil.dat
3 , 01-01-1999 , - , 96
4 , 16-12-1999 , AGUA , -14650
5 , 05-01-2000 , LUZ , -15797
6 , 24-01-2000 , GAS , -34175
7 , 27-01-2000 , INGRESO , 141200
8 , 01-02-2000 , MENS , -96092
9 , 25-02-2000 , LUZ , -12475
10 , 01-03-2000 , MENS , -96092
11 , 06-03-2000 , INGRESO , 101300
12 , 01-04-2000 , MENS , -96092
13 , 06-04-2000 , AGUA , -15859
14 , 07-04-2000 , INGRESO , 134000
15 , 01-05-2000 , MENS , -98975
16 , 02-05-2000 , LUZ , -11449
17 , 09-05-2000 , INGRESO , 95000
18 , 23-05-2000 , GAS , -21428
19 , 25-05-2000 , GAS , -16452
20 , 01-06-2000 , MENS , -98975
21 , 07-06-2000 , INGRESO , 130000
22 , 01-07-2000 , MENS , -98975
23 , 04-07-2000 , LUZ , -12403
24 , 07-07-2000 , AGUA , -5561
25 , 10-07-2000 , INGRESO , 99000
26 , 24-07-2000 , GAS , -11948
27 , 01-08-2000 , MENS , -98975
28 , 10-08-2000 , INGRESO , 122355
29 , 04-09-2000 , LUZ , -12168
30 , 10-09-2000 , INGRESO , 129000
31 , 19-09-2000 , AGUA , -10529
32 , 28-09-2000 , GAS , -2620
33 , 01-10-2000 , MENS , -98975
253
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
Hola mundo
$ echo | awk '{ printf "Hola %s\n", "mundo" }'
Hola mundo
$ echo | awk '{ printf "#%d#%s#\n", 77, "mundo" }'
#77#mundo#
$ echo | awk '{ printf "#%10d#%10s#\n", 77,
"mundo" }'
# 77# mundo#
$ echo | awk '{ printf "#%-10d#%-10s#\n", 77,
"mundo" }'
#77 #mundo #
$ echo | awk '{ printf "#%+4d#%+4s#\n", 77,
"mundo" }'
# +77#mundo#
$ echo | awk '{ printf "#%04d#%+4s#\n", 77,
"mundo" }'
#0077#mundo#
$ echo | awk '{ printf "#%010.5f#%E#%g\n",
21.43527923, 21.43527923, 21.43527923 }'
#0021.43528#2.143528E+01#21.4353
$ echo | awk '{ printf "#%10.5f#%E#%g\n", 2140000,
2140000, 2140000 }'
#2140000.00000#2.140000E+06#2.14e+06
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.
22
15
5
Nopodemosexplicarendetalletodoellenguaje'awk'.Setratadeque
comprendasuutilidadydequeseacapazdeutilizarloparadeterminadas
tareasenlascualesresultaextremadamentetil.
AlgunasexpresionespareceninspiradasenellenguajeC.Otrasparece
quehanservidodeinspiracinparaellenguajePerl.Enrealidadmuchos
lenguajesusanexpresionesparecidas.
Porellovamosaresumirenformadetablaunaseriedeelementosque
intervienen enlasexpresionesque'awk'escapazdemanejar.Perono
vamos a explicar en detalle cada cosa. En lugar de eso daremos una
257
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
descripcinresumidayprocuraremosquelosejemplosposteriorestengan
unpocodetodo.
Operadoresaritmticos
+ Suma
Resta
* Multiplicacin
/ Divisin
% Mdulo(resto)
^ Potenciacin
Operadoresdeasignacin.
var=expr Asignacin
var++ Incrementalavariableenunaunidad
var Decrementalavariableenunaunidad
var+=
Incrementalavariableenciertacantidad
expr_aritm
var=
Decrementalavariableenciertacantidad
expr_aritm
var*=
Multiplicalavariableporciertacantidad
expr_aritm
var/=
Dividelavariableporciertacantidad
expr_aritm
var%= Guardaenlavariableelrestodesudivisinpor
expr_aritm ciertacantidad
var^=
Elevaelvalordelavariableenciertacantidad
expr_aritm
Operadoreslgicosyderelacin.
expr_aritm==
Comparacindeigualdad
expr_aritm
expr_aritm!= Comparacindedesigualdad
258
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
expr_aritm
expr_aritm<
Comparacinmenorque
expr_aritm
expr_aritm>
Comparacinmayorque
expr_aritm
expr_aritm<=
Comparacinmenorigualque
expr_aritm
expr_aritm>=
Comparacinmayorigualque
expr_aritm
expr_cad~
Seajustaalpatrn
expr_regular
expr_cad!~
Noseajustaalpatrn
expr_regular
expr_logica||
OperadorlgicoAND(Y)
expr_logica
expr_logica&&
OperadorlgicoOR(O)
expr_logica
!expr_logica OperadorlgicoNOT(NO)
Funcionesaritmticas.
atan2(y,x) Retornaelarcotangentedey/xenradianes
cos(x) Retornaelcosenodexenradianes
exp(x) Retornaelexponencialdex(e^x)
Retornaelvalorenterodextruncadolaparte
int(x)
decimal
log(x) Retornaellogaritmoneperianodex
Retornaunvalorseudoaleatoriocomprendidoentre
rand()
0y1
sin(x) Retornaelsenodexenradianes
sqrt(x) Retornalaraizcuadradadex
Inicializalasemillaparagenerarnmeros
srand(x)
pseudoaleatorios
259
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Funcionesparausarconcadenasdecaracteres
Sustituye's'globalmenteentodo't'cadavezquese
encuentreunpatrnajustadoalaexpresinregular
gsub(r,s,t)
'r'.Sinoseproporciona't'setoma$0pordefecto.
Devuelveelnmerodesustitucionesrealizado.
index(cadena, Retorna la posicin de la 'subcadena' en 'cadena'
subcadena) (Primeraposicin=1)
Devuelvelalongituddela'cadena'.Tomar$0por
length(cadena)
defectosinoseproporciona'cadena'
Parte'cadena'enelementosde'array'utilizando'sep'
split(cadena,
comoseparador.Sinoseproporciona'sep'seusar
array,sep)
FS.Devuelveelnmerodeelementosdelarray
Sustituye's'en't'laprimeravezqueseencuentreun
patrnajustadoalaexpresinregular'r'.Sinose
sub(r,s,t)
proporciona't'setoma$0pordefecto.Devuelve1si
tienexitoy0sifalla
Devuelveunasubcadenade'cadena'queempiezaen
substr(cadena, 'beg' con una longitud 'len'. Si no se proporciona
beg,len) longituddevuelvehastaelfinaldelacadenadesde
'beg'
tolower(cadena) Pasaaminsculas
toupper(cadena) Pasaamaysculas
Algunasotrasfunciones
match(cadena, Indicasi'cadena'seajustaonoalaexpresinregular
expr_reg) 'expr_reg'
system(comand
o)
sprintf(formato
Paraobtenersalidaconformato.
[,exprlist])
Computoconregistros
260
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
BEGIN {
FS="\|" ;
cont_reg_luz=0;
cont_importe_luz=0;
}
$2 ~ /LUZ/ {
cont_reg_luz = cont_reg_luz + 1 ;
cont_importe_luz = cont_importe_luz + $3 ;
printf ("%3d, %3d, %s, %s, %s, %10d\n", NR,
cont_reg_luz, $1, $2, $3, cont_importe_luz);
}
END {
printf ("Consumo promedio = %d\n", cont_importe_luz
/ cont_reg_luz) ;
}
Vamosaejecutaresteejemployvamosaversusalida
$awkfcontabil2.awk<contabil.dat
5, 1, 05-01-2000, LUZ , -15797, -15797
9, 2, 25-02-2000, LUZ , -12475, -28272
16, 3, 02-05-2000, LUZ , -11449, -39721
23, 4, 04-07-2000, LUZ , -12403, -52124
29, 5, 04-09-2000, LUZ , -12168, -64292
Consumo promedio = -12858
Los datos que estamos usando para el ejemplo estn ordenados por
fechas.Vamosaobteneruninformeconuncampomsqueserelsaldo
de la cuenta. Para ello editamos un fichero que llamaremos
'contabil3.awk'.
261
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
BEGIN {
FS="\|" ;
cont_importe=0;
}
/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
cont_importe = cont_importe + $3 ;
printf ("%3d, %s, %s, %s, %10d\n", NR, $1, $2, $3,
cont_importe);
}
Vamosaejecutaresteejemployvamosaversusalida
$awkfcontabil3.awk<contabil.dat
3, 01-01-1999, - , 96, 96
4, 16-12-1999, AGUA , -14650, -14554
5, 05-01-2000, LUZ , -15797, -30351
6, 24-01-2000, GAS , -34175, -64526
7, 27-01-2000, INGRESO , 141200, 76674
8, 01-02-2000, MENS , -96092, -19418
9, 25-02-2000, LUZ , -12475, -31893
10, 01-03-2000, MENS , -96092, -127985
11, 06-03-2000, INGRESO , 101300, -26685
12, 01-04-2000, MENS , -96092, -122777
13, 06-04-2000, AGUA , -15859, -138636
14, 07-04-2000, INGRESO , 134000, -4636
15, 01-05-2000, MENS , -98975, -103611
16, 02-05-2000, LUZ , -11449, -115060
17, 09-05-2000, INGRESO , 95000, -20060
18, 23-05-2000, GAS , -21428, -41488
19, 25-05-2000, GAS , -16452, -57940
20, 01-06-2000, MENS , -98975, -156915
21, 07-06-2000, INGRESO , 130000, -26915
22, 01-07-2000, MENS , -98975, -125890
23, 04-07-2000, LUZ , -12403, -138293
24, 07-07-2000, AGUA , -5561, -143854
25, 10-07-2000, INGRESO , 99000, -44854
26, 24-07-2000, GAS , -11948, -56802
27, 01-08-2000, MENS , -98975, -155777
28, 10-08-2000, INGRESO , 122355, -33422
29, 04-09-2000, LUZ , -12168, -45590
30, 10-09-2000, INGRESO , 129000, 83410
262
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Sentenciascondicionalesybucles
'awk'esunlenguajemuycompletoynopodafaltarlassentencias de
ejecucincondicionalydeejecucinenbucle.
if ( expresin_lgica )
accion1
[ else
accion2 ]
Bucle 'while'
while(expresin_lgica)
accion
263
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
do
accion
while ( expresin_lgica )
Bucle 'for'
accion
Dentrodelosbuclespodemosusarbreakparaforzarlasalidadeunbucle
ocontinueparasaltaralasiguienteiteracin.
Veremosdemomentotansolounejemploparalasentenciacondicional
'if'.
Editeelsiguienteficheroquellamaremos'contabil4.awk'
BEGIN { FS="\|" ; }
/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
if ( $3 >= 0) {
printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3);
}
}
Vamosaejecutaresteejemployvamosaversusalida
$awkfcontabil4.awk<contabil.dat
3, 01-01-1999, - , 96
7, 27-01-2000, INGRESO , 141200
11, 06-03-2000, INGRESO , 101300
14, 07-04-2000, INGRESO , 134000
17, 09-05-2000, INGRESO , 95000
264
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Pasarvaloresalscriptawk
Enocasionespuederesultarinteresantepoderpasaralgnvaloralscript
awk. Vamos a modificar el programa anterior para que muestre los
registros con un importe superior a un valor que pasaremos por
parmetro.
Editeelsiguienteficheroquellamaremos'contabil5.awk'
BEGIN { FS="\|" ; }
/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
if ( $3 >= minimo && $3 <= maximo ) {
printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3);
}
}
Vamosaejecutaresteejemplopasandoyvamosaversusalida
$awkfcontabil5.awkminimo=100000maximo=120000<
contabil.dat
11, 06-03-2000, INGRESO , 101300
34, 10-10-2000, INGRESO , 112000
Hayqueadvertirqueelpasodeparmetrosequivaleadefinirunavariable
yaasignarunvalorperoestovalornoseraccesiblehastadespusdeleer
el primer registro. Si el valor pasado como parmetro tuviera que ser
accesibleenlaseccinBEGINhabraqueusarlaopcinvprevioalpaso
delparmetro.
265
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Repetiremoselejemplopasandoeldelimitadordelregistroqueusaremos
enlaseccinBEGIN.
Editeelsiguienteficheroquellamaremos'contabil6.awk'
BEGIN { FS = delimitador ; }
/[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9][0-9][0-9]\|/ {
if ( $3 >= minimo && $3 <= maximo ) {
printf ("%3d, %s, %s, %s\n", NR, $1, $2, $3);
}
}
Vamosaejecutaresteejemplopasandovaloresyvamosaversusalida
Vemosquenohemosobtenidoelresultadoesperado.
Vamosavolveraejecutaresteejemplopasandoelvalordeldelimitador
conlaopcinvyvamosaversunuevasalida
$awkvdelimitador='|'fcontabil6.awkminimo=100000
maximo=120000<contabil.dat
11, 06-03-2000, INGRESO , 101300
34, 10-10-2000, INGRESO , 112000
Declaracindefunciones
Comoeslgico'awk'permiteladeclaracindefunciones.Normalmente
se recurre a implementar una funcin cuando necesitamos una
funcionalidad que el lenguaje no proporciona de forma predefinida o
cuando queremos estructurar el cdigo de un programa grande en
fragmentosmspequeosyportantomsmanejables.
266
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Lasintaxisesmuysencilla.
Porejemploparadeclararunafuncinqueretorneunnmeroaleatorio
entre1y6.
Editeunficheroconnombre'dado.awk'.
END{
for (i=0; i<20; i++){
printf ("%3d) Entre 1 y 6 = %3d
Entre 5 y 15 =%3d\n",
i, aleatorio (1, 6),
aleatorio(5, 15));
}
}
Ahoraloejecutamos
$echo|awkfdado.awk
0) Entre 1 y 6 = 5 Entre 5 y 15 = 12
1) Entre 1 y 6 = 6 Entre 5 y 15 = 7
2) Entre 1 y 6 = 6 Entre 5 y 15 = 7
3) Entre 1 y 6 = 5 Entre 5 y 15 = 13
4) Entre 1 y 6 = 3 Entre 5 y 15 = 8
5) Entre 1 y 6 = 3 Entre 5 y 15 = 6
6) Entre 1 y 6 = 4 Entre 5 y 15 = 7
7) Entre 1 y 6 = 6 Entre 5 y 15 = 7
8) Entre 1 y 6 = 5 Entre 5 y 15 = 6
9) Entre 1 y 6 = 3 Entre 5 y 15 = 10
10) Entre 1 y 6 = 6 Entre 5 y 15 = 14
11) Entre 1 y 6 = 5 Entre 5 y 15 = 10
12) Entre 1 y 6 = 6 Entre 5 y 15 = 11
267
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Funcinsystem
Estaesunafuncinfcildeusarquenospermiteejecutaruncomandodel
sistemaoperativo.Encasodexitoretorna0,yencasodeerrorretornar
unvalordistintodecero.
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.
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
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
270
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
271
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$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];
}
}
END {
do {
printf ("%d->", proc);
proc= padre(proc);
} while ( proc >= 1 )
printf ("\n\n");
}
Ahoraejecutamospasandoelpiddelprocesodelcualdeseamosaveriguar
sudescendencia.
1051->1050->1042->1037->1029->273->1->
273
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
274
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
275
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
277
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
./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
0 Terminar
1 Listar
2 Quien est conectado
3 Fecha actual
4 Ocupacion
5 Quien soy
6 Memoria libre
7 Calendario
8 Nombre mquina
Elija opcin.
278
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
279
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
# # #### # ##
# # # # # # #
###### # # # # #
# # # # # ######
# # # # # # #
# # #### ###### # #
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.sh
May 2002
S M Tu W Th F S
1 2 3 4
[5] 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
281
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
./mi_cal1.sh 1
May 2002
S M Tu W Th F S
[1] 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
282
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
283
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06
07 07 07 07 07 07 07
08 08 08 08 08 08 08 08
09 09 09 09 09 09 09 09 09
10 10 10 10 10 10 10 10 10 10
11 11 11 11 11 11 11 11 11 11 11
12 12 12 12 12 12 12 12 12 12 12 12
284
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
285
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
PARTE(II)USUARIOAVANZADODELINUX
INTRODUCCINALASEGUNDAPARTEDEL
CURSO
Paralosqueusenordenadorpersonalyquetenganaccesoaunacuentade
rooteselmomentodedaralgnconsejoporqueesprobablequecadavez
tenganmasganasdeprobarcosasdistintasparaaprenderporsucuenta.
Paraelloslesdiremosqueexisteunamximaparatodoadministrador.
Nomodifiquesnadaquenopuedasvolveradejarcomoestaba.
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.
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.
Evidentementegarantizarlaintegridaddelainformacindeunsistemaes
untemaqueesderesponsabilidaddeladministradordelsistemapero,
comoyahemosmencionadoanteriormente,elobjetivodeestasegunda
partedelcursoincluyelasnocionesmsnecesariasparaadministrarsu
propio ordenador personal con Linux. El objetivo es que sea
autosuficiente.
Laseguridadfrenteaataquesintencionadosquedafueradelospropsitos
deestecursoperonohaydaoquenopuedaserreparadositenemosuna
copiadeseguridaddetodalainformacinquenosinteresa.
Lasposiblescausasparaunaperdidadeinformacinson:
Deteriorooborradoaccidentalporpartedeunusuarioautorizado.
288
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Ataqueintencionadoporpartedepersonasnoautorizadas.
Fallodelsoftware.
Fallodelhardware.
Virus.
Incendio,robos,ydesastresnaturales,etc.
Algopuedehacerse.PorejemploenLinuxhaysustitutosparaelcomando
'rm' que dejarn los ficheros borrados en una papelera. Tambin se
puedenseguirciertasrecomendacionesdeprudenciaqueminimicenlos
riesgosmediantedeterminadasprcticasperosiemprecabrlaposibilidad
deunfallohumano.Eltemaesamplsimoynosvamosalimitaratratar
solodeRespaldosoCopiasdeseguridad.
/===============/
Borradoaccidentaldeficheros
Unacosaquesepuedeintentarenmodoreadonly(sololectura)esleer
directamente del dispositivo intentando filtrar cadenas de ficheros
289
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
/===============/
Caractersticasdeunbuensistemaderespaldo
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
Estesistemadecopiahacerecaerdemasiadaresponsabilidadenunasola
cinta.Laltimacopiaglobalsuelesermuyvoluminosaypuedecontener
informacinquenoseencuentreenningunaotracinta.
Siemprequeseaadanpaquetes,aplicaciones,seconfigurealgoconviene
volverasacarunanuevacopiaglobaldetodoelsistema.
/===============/
Lossoportesdelainformacin
292
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
Losdisquetessonunmediomuypocofiableycabepocacosa.
/===============/
Respaldoporpartes
Antesquenadadebeplantearsesirealmentenecesitahacerrespaldopor
partes.Recuerdequenoconvienecomplicarmuchoelplanderespaldoy
nohaynadamssencilloquehacerrespaldodetododeunavezsiempre
queeltamaodelosdatoslopermitan.
293
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Recuerdequepuedenexistirvariaciones,enfuncindecadadistribucin.
Cadasistemadependiendodelaactividadalaqueseadedicadotendr
unasnecesidadestotalmenteespecialesderespaldo.
Laspartesdemayorintersconvistasarespaldosfrecuentessuelenser
/home/,/root/,y/usr/local/Enalgunoscasos/var/logoundirectorioque
contenga unabasededatospuedensermuyimportantes peroesoson
cosasquecadacualdebedeterminar.Siloimportanteocupamsdel50%
delsistemalomssencilloseraporcopiasglobaleseincrementalesde
todoelsistema,peroenunordenadordeusopersonalcongrancantidad
depaquetesinstaladoslaparteimportantealahoradehacerrespaldono
suelesertangrande.
Hacerlascosasenunsolopasonoessiemprebuenaidea.Loprincipales
darpasosquepuedandeshacersesinosequivocamos enalgo,poreso
siempre que sea posible conviene recuperar en un lugar distinto al
original. Luego si todo ha ido bien podemos trasladar las cosas a su
destinodefinitivo.Losquesepreguntanparaquetantasprecaucionesson
losquemstardesepreguntarnasmismocosasbastantelamentables.
294
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
/===============/
Programasdeutilidadpararealizarrespaldos
Pararealizar copiasdeseguridadpodemosusaraplicacionescompletas
pensadasparaelloofabricarnosalgoamedidacombinandounaseriede
utilidadesdelascualeslamayorayahansidomencionadasalgunavezen
captulosanteriores.Estoltimoesloquevamosahacernosotrosporque
as podr disear algo personalizado y tambin porque resulta ms
didctico.
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.
bzip2(1)Esmseficienteenelsentidodequepuedecomprimiralgoms
peroacostadetardarmuchoms.
diff(1)Detectadiferenciasdecontenidoentredosficheros.Especialmente
adecuadoparaficherosdetexto.
md5sum(1)Permiteasociaruncdigodecomprobacinalcontenidode
unficheroodispositivo,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 fichero
Paramodificarlafechademodificacindeunficheroajustndolaconla
fechadeayerharamos:
Paramodificarlafechademodificacindeunficheroajustndolaconla
mismafechaqueladeunficherodereferenciaharamos:
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.
Enlugardearchivosepuedeespecificarundispositivo(/dev/dispositivo)
otambinsepuedeusarentradasalidamediante'f'.
Paracrearlacopiaseusac,paraleerlalistadeficheroseusat,ypara
extraerlosficheroseusax.Sepuedeusarcompresinconlaopcinz.
Veamosalgunosejemplos:
298
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
299
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Parausarundispositivoenlugardeunficherobastaraconsustituirenel
ejemplo'fich.cpio'por'/dev/dispositivo'.
LaopcionBusarbloquesde5120bytesenlugardebloquesde512
bytes.
Vamosausarestaopcinenlossiguientesejemplosyademsusaremos
entradasalidaacintaconcompresindedatos.
300
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
.:
total 4116
drwxr-xr-x 2 root root 4096 abr 8
13:06 dir1
-rw-r--r-- 1 root root 2 abr 8
13:05 fich1
-rw-r--r-- 1 root root 2097152 abr 8
13:05 fich2
-rw-r--r-- 1 root root 2 abr 8
13:06 fich3
-rw-r--r-- 1 root root 2097152 abr 8
13:33 fich5.gz
./dir1:
total 4
-rw-r--r-- 1 root root 2 abr 8
13:06 file4
Buenoconestotenemosunaestructuradeficherosparahacerpruebas.
Vamosahacerpruebasdecopiasmultivolumencomprimidasquesonlas
msinteresantesyusaremosdisquetesde1.44Mbytes.Yahemosdicho
quelosdisquetesnosonfiablesperosupequeotamaolohaceideal
parahacerpruebasdecopiasmultivolumen.Parausardisquetesconviene
usarelparmetroF.
Formateeunpardedisquetesde1.44MBytescon'mformata:'
302
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Compruebequeseencuentraen/tmp/pruebafioyejecuteloscomandos
siguientes:
. -- 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
303
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
. -- okay
fich1 -- okay
afio: "/dev/fd0" [offset 1m+416k+0]: Input limit
reached
304
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ #
$ # 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
305
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
75894c2b3d5c3b78372af63694cdc659 pruebafio/fich3
6d7fce9fee471194aa8b5b6e47267f03 pruebafio2/fich3
Laspginasmande'afio'contienenalgunosejemplosinteresantes.Por
ejemplovienecomohacerunacopiasobreunaunidaddecdrom.
find.|afioob2048s325000xv'!cdrecord..'
Sindudaalgunaafioesunexcelenteprogramaparasusrespaldosyle
recomendamosquelopongaapruebaysefamiliariceconl.
Resumiendo Conviene conocer tanto 'cpio' como 'tar' porque son dos
clsicosdelossistemasoperativostipoUnixyambossonmuyutilizados.
Cadaunotienesusventajasysusinconvenientes.Porotraparte'afio'es
mucho ms reciente yporlotantosuusonoestanamplio, peroeso
podracambiar enunfuturogracias asusindudables mejorastcnicas
respectoalosdosclsicosantesmencionados.
Elnicomotivoquesemeocurreporelcualsepodradesaconsejarel
usode'afio'esportemasdeportabilidadentredistintasmquinas,con
distintosSO.Enesecasoparagarantizarquelacopiatengaunformatolo
ms universal posible,lorecomendable serausar'tar'sincompresin,
pero eso no justifica dejar de usar 'afio' para las copias de seguridad
rutinariasrenunciandoasusindudablesventajas.
Observequelasalidadeinformacinsiemprequeresultaposiblesehace
a salida estandar. En caso que se generen dos salida se usa la salida
estandar como salida principal. La salida estandar de errores se usar
comosalidasecundariamezcladaconposiblesmensajesdeerror.
Concretamentelaopcinten'tar'y'cpio'entreganasalidaestandarel
resultadoperolaopcionoylaopcinvde'cpio'juntashacenquela
salidadelacopiasedirijaasalidaestandarylalistadelosficherosse
dirijirentoncesalasalidaestandardeerrores.
306
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Encualquiercasolasposibilidadesdecualquieradeestostresprogramas
sonmuyvariadas.Esimprescindibleacudirvalaspginasmandecada
unodeellosparatenerunavisincompletadesusposibilidades.Nosotros
nos hemos limitado explicar con ayuda de ejemplos algunas de sus
posibilidades.
/===============/
Unprogramacompletokbackup(1)
Esaltamenteconfigurableyverstil
Permitealmacenardistintasconfiguracionesparadistintostiposdecopias.
Sinoquiererealizarunsistemaasumedida,puedeusar'kbackup'para
suscopias.
/===============/
Recuperacintotaldesdecero
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
/dev/st0DispositivodecintaSCSIConautorebobinado.
/dev/nst0DispositivodecintaSCSISinautorebobinado.
308
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Loscontrolesquevamosausarsobrelacintason:
mtf/dev/nst0rewind
mtf/dev/nst0retension
mtf/dev/st0status
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
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}."
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.
/===============/
Ejemplosderecuperacindecopias
Enelejemploanteriornohemosincluidoningunaopcinderecuperacin
porquecadacasoesdistintodependiendodeloquesequierarecuperar.
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.
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.
317
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
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.
319
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
Porejemplo'ulimitc'seusaparalimitareltamaodelosficheroscore
producidoscuandounprocesomuerebajodeterminadascircunstancias.
Unusuarionormalitonoutilizarparanadaestosficherosasquepodra
usarse'ulimit0'paraevitarlaaparicindeficheroscore.
TambinsepuedenlimitarotrasmuchascosascomolacantidaddeCPU
porsegundo,tamaomximodeunfichero,mximonmerodeprocesos,
mximo numero de ficheros abiertos, cantidad mxima de memoria
virtual,etc...
Para ver las limitaciones con las que estamos trabajando haremos lo
siguiente:
320
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
$ulimita
core file size (blocks) 0
data seg size (kbytes) unlimited
file size (blocks) unlimited
max locked memory (kbytes) unlimited
max memory size (kbytes) unlimited
open files 1024
pipe size (512 bytes) 8
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes 256
virtual memory (kbytes) unlimited
Buenoenesteejemplovemosqueestamosenunasesinconmuypocas
limitaciones.Esoessealdequeeladministradorconfaennosotrosy
nosconcedemuchalibertad.
'ulimit'permiteestablecerdosclasesdelmites.Lmitesduros(solose
puedenponerunavezygeneralmenteestolohaceroot)ylmitesblandos
quesepuedencambiarvariasvecesperonosepermitesobrepasarlos
valoresestablecidosenellmiteduro.rootestableceestoslmitesenalgn
fichero de configuracin y los usuarios pueden tener en su
$HOME/.bashrc alterar los limites blandos. Para ms informacin
consultelapginamande'ulimit'.
Multitarea
Yahemoshabladoalgodeellacuandoestudiamoslosprocesos.Queda
claroqueenunsistemaenelqueseestnejecutandoenaparienciavarios
procesossimultneamenteloqueocurrerealmenteesqueeltiempodela
CPU se va repartiendo entre los distintos procesos concediendo
rpidamente sucesivas rodajas detiempoacadaunoenfuncindesu
prioridadydelapolticaderepartodeesetiempo.Estapolticanonos
interesa ahora. Se supone que las cosas estn pensadas para que el
funcionamientoglobaldetodoelsistemaseaelmsadecuado.
321
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Volvamosalcasodelusuarioignoranteyegostadelcaptuloanterior.El
delas500compilacionessimultneas.Elsistemanecesitapararcadauno
delosprocesosqueusanlaCPUunavezquehanconsumidosurodajade
tiempoparatomarelsiguienteprocesoenesperadeCPU.
Cuandounprocesonecesitausaralgoyeneseinstantenoestdisponible
pasaaunestadodeinactividad.Sedicequequedadormido.
Estecambiodeunprocesoaotronoesgratuitoporqueunavezparadoel
proceso hay que anotar la situacin en la cual ese proceso ha sido
detenidoparaluegopodervolveracontinuarexactamenteenelmismo
puntocuandolevuelvaatocaryquizspartedelcdigoodelosdatosdel
proceso ya no estn en memoria RAM (tambin la llamaremos
indistintamentememoriafsica.Vermsadelantepaginacin).Todoesto
consumemuchosrecursosysepuedealcanzarlasituacinenlacualel
SO consume la mayor parte del tiempo en esta gestin de procesos
intercambiando datosentre memoria ydiscoconstantemente porquela
memoriafsicanopuedecontodoporelcontrariolosprocesosquesonla
parterealmentetilapenasdispondrnderecursos.Enestasituacinel
sistemasevuelvemuylentoylosdiscosdelsistematienenunaactividad
altsima.Enrealidadesunasituacindeautnticoagobioparaelsistema
ysucomportamientosevuelvetorpe.Escomosielsistemaactuaraala
desesperada.
Poresarazndecimosqueelusuariodelcaptuloanteriorademsdeser
egostaesignoranteporqueestprovocandounenormeretrasonosoloa
losdemsusuarios(cosaqueyasabe)sinotambinasimismo.
Sialgunaveznotamosqueelsistemavamuylentoysospechamos la
causa tendremos que parar en primer lugar el proceso que est
provocando la sobrecarga. Si no sabemos cual es o si se trata de un
proceso que no es nuestro podemos investigar con el comando 'top'.
Tengaencuentaquedeestecomandosesalecon'q'.
322
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Estecomandosacaencabeceraunresumendelasituacingeneraldel
sistema y luego saca solo la informacin de los procesos que mayor
consumoderecursosestnprovocandoenelsistema.
Tengaencuentaque'top'sirveparadiagnosticar elusoderecursosy
permiteidentificarprocesosqueconsumendemasiadoperoensimismo
'top' tambin consume bastantes recursos. Por eso en situaciones de
sobrecargadelsistemaconvienenoabusardesuuso.'top'refrescacada
ciertotiempolainformacindelapantalla.Pordefectolohacecada5
segundos.Podemosaumentara15segundos.Paraellousaremos'topd
15'. Esto consumir menos recursos y nos permitir mirar con ms
tranquilidadlainformacindetop.
Vamosaverunejemplodelusode'top'quecorrespondeaunsistemacon
muy poca actividad. Solo 5 usuarios. La CPU est ociosa 99.6% del
tiempo,lacantidaddememoriadisponibleesaltaynoseestusandola
swap.
$top
12:17pm up 2:06, 5 users, load average: 0.00,
0.00, 0.00
55 processes: 54 sleeping, 1 running, 0 zombie, 0
stopped
CPU states: 0.0% user, 0.3% system, 0.0% nice,
99.6% idle
Mem: 258100K av, 93320K used, 164780K free, 66800K
shrd, 7652K buff
Swap: 393552K av, 0K used, 393552K free
40744K cached
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.
$ uptime
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
Esonosignificaqueestemosburlandolaseguridaddelsistemanique
seamosmslistosqueeladministrador.
Sieladministradorconfiguraelsistemadeformaparanoicaparaevitar
cualquier posible riesgo, los usuarios se vern sometidos a unas
restriccionesbastanteincmodasparatrabajar.
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.
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.
Ademslosprogramasusanpartescomunesdecdigoquepertenecena
libreras compartidas. El aprovechamiento de la RAM se consigue
manteniendounasolacopiadeesecdigocompartidoenmemoriaRAM.
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
$psv
PID TTY STAT TIME MAJFL TRS DRS RSS
%MEM COMMAND
301 tty3 S 0:00 600 420 1743 1300
0.5 -bash
1640 tty3 S 0:00 326 518 1829 1568
0.6 vi recursyst.dat
1665 tty3 S 0:00 194 420 1451 832
0.3 /bin/bash -c (ps v) >/tmp/vok2gkuv 2>&1
1666 tty3 R 0:00 240 55 2844 1176
0.4 ps v
Sisolodeseamossabercuantamemoriaquedalibrepodemosusar'free'.
Estecomandotambinindicasiseestusandolaswap.
$free
total used free shared
buffers cached
Mem: 258100 101668 156432 56800
10248 51988
-/+ buffers/cache: 39432 218668
Swap: 393552 0 393552
Con'vmstat'podemostenerinformacindelusodememoriavirtual,cpu,
ydelconsumodeentradasalida.
$vmstat
procs memory swap
io system cpu
r b w swpd free buff cache si so bi
bo in cs us sy id
0 0 0 0 156404 10252 52000 0 0 2
1 141 132 1 0 98
329
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Con'memstat'podemosverelusodememoriavirtualdelosprocesosy
delaslibrerascompartidas.
$memstat
44k: PID 1 (/sbin/init)
60k: PID 98 (/sbin/portmap)
80k: PID 156 (/sbin/syslogd)
468k: PID 158 (/sbin/klogd)
40k: PID 165 (/sbin/kerneld)
52k: PID 170 (/sbin/rpc.statd)
140k: /lib/libreadline.so.4.1 228
24k: /lib/libwrap.so.0.7.6 98 271
72k: /lib/ld-2.1.3.so 1 98 156 158 165 170 178
179 180 181 182 188 193 ...
864k: /lib/libc-2.1.3.so 1 98 156 158 165 170 178
179 180 181 182 188 19...
20k: /lib/libcrypt-2.1.3.so 228 292 295 306 307
308 309 310 311 461 966...
...: .........................
...: .........................
...: .........................
--------
3768092k
$memstat|grep271
264k: PID 271 (/usr/sbin/sendmail)
24k: /lib/libwrap.so.0.7.6 98 271
232k: /lib/libdb-2.1.3.so 156 193 206 271 292 295
306 307 308 309 310 31...
76k: /lib/libnsl-2.1.3.so 98 228 271 284 287 292
295 299 300 301 303 30...
40k: /lib/libnss_compat-2.1.3.so 228 271 284 287
292 295 299 300 301 30...
20k: /lib/libnss_db-2.1.3.so 156 193 206 271
32k: /lib/libnss_files-2.1.3.so 156 170 193 206
271 292 295 306 307 308...
48k: /lib/libresolv-2.1.3.so 271
308k: /usr/sbin/sendmail 271
330
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Conestovemoslobienaprovechadoqueestelsistemayaquemuchas
delaslibrerasaparecencompartidasconunmontndeprocesosquese
estnejecutando.
Hemosconseguidoverlaslibrerascompartidasqueestausandoycuanto
ocupanenmemoriaperolautilidadparasaberusaousarunejecutable
es'ldd'.Estecomandononecesitaqueelprogramaseestejecutando
porquesacalainformacinanalizandoelcdigodelejecutable.
$ldd/usr/sbin/sendmail
libdb.so.3 => /lib/libdb.so.3 (0x40019000)
libwrap.so.0 => /lib/libwrap.so.0
(0x40054000)
libnsl.so.1 => /lib/libnsl.so.1 (0x4005b000)
libresolv.so.2 => /lib/libresolv.so.2
(0x40071000)
libc.so.6 => /lib/libc.so.6 (0x40081000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2
(0x40000000)
Actuacinconprocesosconflictivos
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
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.
333
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
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
Alser100%libreeslamsadecuadaparaaprender.Tcnicamenteesla
distribucin ms robusta que existe. La actualizacin de los distintos
componentesatravesdelaredesmuchomscmodayeficazqueen
ningunaotradistribucin.LacomunidaddeusuariosdeDebianestmuy
bienorganizadaydanmuybuensoporte.
/===============/
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.
/===============/
ProgramasdeutilidadparainstalarLinux
Lasdistribucionessuelenusarunsistemademensyunosasistentesque
leayudanainstalaryconfigurarelsistema.Muchosdeestosprocesos
podranrealizarsemanualmentedesdeelinterpretedecomandosyaque
selimitanausarunosprogramasqueestninstaladosencualquierLinux.
Ahoranoslimitaremosasealarsuexistenciaycomentarparaquesirven.
Convienequeconsultelaspginasdelmanualdecadaunodeellos.
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
338
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
LosdiscosderescatesonensimismosunSOLinuxenminiaturaycomo
es lgico arrancan un kernel predeterminado y montan un sistema de
ficherosraz.
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.
Sinodisponetodavadeundisquetederescateytampocodisponedeun
CDderescate,deberacrearunocuantoantes.Nuncasesabecuandovaa
sernecesariorecurrirael.
339
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
ParaellolocalizeenlosCDsdesudistribucinlaimagendeunodeellos
quesellamarseguramente'rescue.img','rescue.bin','rescue.raw',oalgo
parecido. Puede hacerlo desde MSDOS usando rawrite, o desde linux
usandodd.
Antesdebermontarlaunidaddecdrom.Generalmentesesuelemontar
en'/cdrom/',en'/mnt/cdrom/' oen'/mount/cdrom/'.Vienedeterminado
en/etc/fstab.Porelloparamontarlobastarhacer:
$ mount /dev/cdrom
$ df
ParaRedhatsera:
$ dd if=/mnt/cdrom/images/rescue.img of=/dev/fd0
bs=1440k
ParaDebianpotatosera:
$ if=/mnt/cdrom/dists/potato/main/disks-
i386/2.2.16-2000-07-14/images-2.88/rescue.bin of=/dev/
fd0 bs=1440k
/===============/
Lilo
Liloesuncargadorquepuedeserinstaladoendisqueteoendiscoduro.
En disco duro puede ser instalado en una particin o en en el MBR
(Master Boot Record). El MBR es una zona especial del disco muy
pequeareservadaparaelarranque.
340
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
distintasparticionessiemprequeefectivamenteobtenganunsistemade
ficherosrazvlido.Porellosepodraespecificararranquesparadistintas
distribucionesdeLinuxinstaladasendistintossitios.
PiensequeLiloseinstalaenunlugarmuypequeoenelcualsesitan
apuntadoresaunaseriedeficheroscomoelkernel,el/etc/lilo.conf,etc.
Sialgunodeestosficherossemuevedesitioosemodificasucontenido,
losapuntadoresdeLiloquedarnsealandounlugarequivocadodonde
yanoexistelainformacintil.
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.
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.
Vamosaresumirloscasosmsfrecuentessimplementeparaquetenga
unaideageneral.
InstalarLinuxenunPCconunsolodiscoduroenteropara
Linux.Eslomssencillo.Puedeempezarcontodoeldiscolibrey
sinparticionar.
345
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
InstalarLinuxenunsegundodiscoduroenteroparaLinux
dejandoelprimerdiscoparaWindows.Estansencillocomoel
casoanterioraunquedeberidentificarlosdispositivos.
Lanomencaturadelosdiscoseslassiguiente:
o hdaprimercanalmaestro.
o hdbprimercanalesclavo.
o hdcsegundocanalmaestro.
o hddsegundocanalesclavo.
Sinosabecomoestconfiguradosuhardware.Puedearrancarun
discoderescateLinuxydesdeunaconsolateclear'fdiskl'Con
ello obtendr un listado completo de los discos y particiones
presentesensusistema.
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.
347
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Linuxnoestsiendousadoexclusivamenteporgursyhackers.Linux
est siendo usado por una cantidad enorme de personas que han
compensado su carencia de conocimientos tcnicos con tan solo un
poquitodepaciencia.AdiferenciadeWindowsnohaysecretos.Todala
informacinqueustedpuedallegaranecesitarestasualcance.Cada
distribucinvieneconsumanualdeinstalacin.
EnelcasodeDebianyotrasesemanualvieneenformatoelectrnico
pero conviene sacarlo a papel y dedicar algo de tiempo a su estudio.
Tambinsuelevenirenesemanualoenlamismacajadeladistribucin
una relacin del hardware soportado. Piense que el soporte para el
hardwareescasisiempreindependientedeladistribucinysolodepende
delaversindelkernelqueseestusando.EnelcasodeDebianlos
primeros captulos son de inters general con independencia de la
distribucinqueuseytambinestdisponiblegratuitamente.
1. QueesDebian(yqueesGNU/Linux)
2. Requerimientosdelsistema
3. Antesdeempezar
4. Particionadodeldiscoduro
TambinpuedeconsultarelmanualdeLinuxPrimerospasos.Quepuede
obtenerdesdeLuCAS,lugarqueanteriormenterecomendamos.
/===============/
ElKernel
ParaqueLinuxreconozcatodoslosdispositivosdelsistemadeberestar
compiladoconlasopcionesadecuadas.EnelcasodeLinuxelkerneles
ungranprogramayloquellamamosdriverssolosontrozosdecdigode
estegranprograma.Estediseosedicequeesunkernelmonoltico.
348
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
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.
349
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
LaprimeravezqueinstaleLinuxnodebepensarenellocomounmero
trmiteparaempezarahacercosas.Piensequeesunprocesofraccionado
endistintasetapasyquecadaetapatienecomopremioelpoderdisfrutar
deunsistemacapazdehacercadavezmsymscosas.
/===============/
Documentacinadicional
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
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
351
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Concretamente algunas
352
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
mucho ms especializados.
353
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
TERMINALES
Queesunterminal
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.
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.
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.
Estosacaunmensajeenlapantalladesupropioterminalexactamente
igualqueelelcasoanterior.Estopuedesertilparausarloporejemplo
en scripts que pueden tener ambas salidas (estndar y de errores)
redirigidas a ficheros pero deseamos que determinado mensaje salga
siempreporlapantalla.
Laconsolaestasociadaa/dev/tty0quealigualque/dev/ttyesunalias
determinalvirtualactualperopuedentenerpermisosdistintos.
357
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
correspondaensucaso.Tambinpuedepasarsealtty3paracontinuarla
leccin.
Primerovamosacomprobarladisponibilidadylospermisosdeunttyque
casisiemprequedalibre.Eltty12.
$ ls -l /dev/tty12
crw-rw-rw- 1 root tty 4, 12 ago 29 2000
/dev/tty12
Aquloimportanteescomprobarquepodemosusareseterminalyque
tienepermisosdelecturaescritura.
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.
Esteesuncursodeusuarioyapesardequeaestasalturasdelcursose
explicancosasalgoavanzadasnopretendemosensearleaadministrarel
359
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
'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:
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.
Siustedconsulta(hgalo)elvalordeestavariableseguramenteobtendr
'linux' que es el nombre del terminal que linux usa por defecto. Hay
muchostiposdeterminalesycadaunotienesunombre.Porejemplosi
ustedejecutaTERM='vt100';exportTERM;Laaplicacinqueseejecute
acontinuacinpuedepensarquetienequedialogarconunterminaltipo
'vt100'.
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.
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'
}
365
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Elprogramaterminaponiendoelatributonormalperorecuerdequesi
algosalemalyelterminalquedaenunestadopocooperativodeber
recuperarloconelcomandoreset.Unavezdichoestopongapermisode
ejecucinaesteficheroyejecutelo.
Controldeunterminal(setterm)
Paracambiarlosatributosdeunterminalcualquieraseusasetterm(1)que
utilizar la variable TERM para identificar el terminal y usar las
secuenciasdecaracteresadecuadas.
366
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Vamosacambiarelsonidodelpitidodenuestroterminal.
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
}
367
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
settermcursoroffsettermcursoronsettermrepeaton
Configuracindeunterminal(stty)
$ stty
$ stty -a
Cuandoejecutamosresetnosmuestralaconfiguracindelossiguientes
tres parmetros. ( erase = ^? , kill = ^U , intr = ^C ) que son
respectivamenteelcaracterqueelterminalinterpretarcomoelcaracter
368
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
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.
Porejemplounaventanade'xterm'enwindowsfuncionadeesamanera.
Unejemplodepseudoterminal(script)
371
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Pruebelosiguiente:
$ script /tmp/script.out
$ ls --color=auto /
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.
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
echo"mails'Recordatorio.LlamaraJaime'pepe"|atNOONMON
Lasespecificacionesdetiempoutilizanunasintaxisespecialperoquizs
resultemsintuitivoymsprcticoponeramododechuletaunaspocas
reglassiguiendounanotacinarbitrariaqueponerlagramticacompleta
enformatoyaccoenformatoBNF.Estonosllevaraatenerqueexplicar
cosasquesesalendelpropsitodeestecursoyqueseranmsapropiadas
parauncursodeprogramacin. Porelloybasandonosenunresumen
arbitrariodeesagramticaincluimoselsiguientecuadroresumen.
375
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Lo que sigue es una regla prctica para el uso de esta chuleta sin
demasiadovalortcnico.Esperamosqueseautil:
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.
Lautilidadbatch
Yahemoscomentadoquesirveparainstruiralsistemaqueejecuteun
comandocuandolacargadelsistemanoseaaltayademsloharconuna
prioridadbaja.Silacarganodesciendepordebajodelvalorestablecido
paralastareasbatch,elprogramanoseejecutarnunca.
Amododeorientacinpodemosdecirqueparasistemasmonoprocesador
sueleusarsevaloresde0.7a1.5yparasistemasmultiprocesadorser
superioryestarenfuncindelnmerodeCPUs.
VamosaprogramarunshellscriptqueconsumamuchaCPUyquedeje
unatrazaquenospermitasabercuandoarrancaycuandopara.
# piloop
if [ $# -ne 1 ]
then echo "Uso piloop10 "
else
for i in 0 1 2 3 4 5 6 7 8 9
do
echo "$$ $i `date`" >> /tmp/piloop.out
echo "scale=$1; 4*a(1)" | bc -l >>
/tmp/piloop.bc
377
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
done
fi
Elvalordelaescalasepasacomoparmetroydeberprobarprimerocon
valoresbajoshastaqueconsumaunoodosminutosparapoderhacerla
prcticaconcomodidad.Ennuestroequipoelclculodelnmeropicon
1000cifrasdecimalesresultaunvaloradecuado.
1. procmeter3
2. nice19piloop1000&
3. Esperaraquesubalacarga
4. echopiloop1000|batch
Los procesos planificados con 'at' y 'batch' son gestionados por 'atd'.
Muchos de los procesos de este tipo que estn permanentemente
funcionando terminan en 'd' de 'daemon'. En ingles daemon significa
duende.Siporcualquieranomalaatddejaradefuncionarnosepodra
usar 'at' ni 'batch'. Curiosamente hay un proceso que se encarga de
gestionar tareas peridicas y que igualmente est permanentente
funcionandoperonosellamacrondsino'cron'.
Usodecronycrontab
Elcomando'cron'permitenejecutarperidicamenteunaseriedetareas
queestarnprogramadasenunosficherosespeciales.
Ponersiemprecomomnimo2minutosmsalactualparaprobaryaque
encasocontrariopuedenofuncionar.
378
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Elformatoconsisteenunaseriedelineasconelformatosiguiente:
minutohorada_del_mesmesda_de_la_semana
Campo ValoresPermitidos
minuto 059
hora 023
da_del_mes 131
mes 112onombres
07onombres
da_de_la_semana
0o7esDomingo
Losnombresdemesesydasdelasemanadependendelidiomaquese
use(variableLC_TIME).Puedeprobarconelcomando'date'paraver
cualesseestnusandoensusistema.
Comoveremosacontinuacinhayunaformadeagruparlasaccionesque
sehandeejecutarenelmismoperiodo.
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.
Deestaformaaadirunanuevaaccinresultamuysencilloynorequiere
tocarelficherodeconfiguracindecron/etc/crontabquenormalmentese
limita a contener la programacin de tareas genricas para ciertos
periodos.Severmsclaroconunejemplo.Elejemploquesigueest
tomadodeunaDebian:
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
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:
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/
382
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
2000 htdig
-rwxr-xr-x 1 root root 277 ene 9
2001 find
# ll /etc/cron.weekly/
# ll /etc/cron.monthly/
Lasolucinseraincluirunanuevacategoradetareasqueseejecutaran
porejemplounpardevecesporsemana.
Paraello:
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.
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
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sb
in:/usr/bin
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
385
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
muestralatrazaenunordenadorquesueleencenderseunosminutosantes
delas8delamaanatodoslosdas.
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
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.)
Csma(CarrierSenseMultipleAccess)
(Generalmenteestemtodoseasociaatopologaenbus).
389
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Csma/CD(CarrierSenseMultipleAccesColisionDetect
(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
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.
Un 'hub' esundispositivoconcentradorquedisponedevariasbocasde
conexin.Resultarimprescindiblesuusocuandoseusaenunaredde
msdedosordenadoresconcable10base2.Estecabletieneconectoresde
plsticoRJ45similaresalosconectoresdelostelfonos.
391
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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
392
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
EnelncleodeLinuxsepuedenincluirdistintostiposdeinterfaceso
controladores.Algunosdeellosson:
lo
394
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
eth
EslainterfazgenricaparatarjetasEthernetdeusomuyfrecuente.
sl
InterfazSLIPparapuertoserie.Montarunaredmedianteunpuerto
serieespocoeficienteperolaposibilidadexiste.
ppp
InterfazPPPparamodem.
ippp
InterfazIPPPparaISDN(RDSI).
plip
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
ModoStandalone:Enestemodoparaqueelservicioestactivoel
servidordeberestarpermanentementearrancadoyescuchandosu
puertoparapoderatendercualquierpeticindeservicio.
Modosupeditadoalservidordeserviciosinetd:
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.
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:
401
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Ejemplodeunapequeared
Vamosaexplicarcomoconstruiriamosporejemplotresredespequeas
interconectadasentresyquedireccionespodriamosusarparaello.De
estaformapodremosexplicarcomofuncionaelenrutado.
DireccionesreservadasparalaclaseA10.0.0.0
DireccionesreservadasparalaclaseB172.16.0.0 >172.31.0.0
DireccionesreservadasparalaclaseC192.168.0.0 >192.168.255.0
ParanuestroejemplousaremostresredesdeclaseBdetipo172.22.n.n.
En todas las redes (incluidas las que tienen subnetting) existen dos
direccionesdehostqueestnreservadas.Laprimeraeslaquetienetodos
losbitscorrespondientesalapartedehostacero.Estadireccinseutiliza
pararepresentaralapropiaredyportantonosedebeasignaraningun
host.Laotraeslaquetienetodoslosbitspuestosauno,yrepresentaa
todosloshostsqueestanconectadosaunamismared.Enredesdondese
permite el broadcast(dondeunhostpuedehacerquetodosreciban el
mensaje que ha enviado) esta direccin se utiliza para este fin. Estas
direccionessellamandireccionesderedydebroadcastrespectivamente.
TambinestreservadaladireccinIPquetienetodoslosbitsaceroenla
partederedparaindicarestared,aunqueestasoloest;permitidousarla
cuando aun no conocemos nuestra direccin IP completamente (por
ejemplocuandohayqueadquirirlaporlapropiared,enelarranque,al
configurar,etc.)
402
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
LaconfiguracindelospuestosA,B,C,Dseralasiguiente:
A B C D
IP.ADR 172.22.22.21 172.22.22.22 172.22.23.21 172.22.23.22
N.MASK 255.255.255.0 255.255.255.0 255.255.255.0 255.255.255.0
BROADK 0.0.0.255 0.0.0.255 0.0.0.255 0.0.0.255
NETWRK 172.22.22.0 172.22.22.0 172.22.23.0 172.22.23.0
GW1 GW2
IP.Addr 172.22.22.2/172.22.21.2 172.22.23.1/172.22.21.1
403
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Segnloquehemosexplicado,lared172.22.0.0esunaredclaseBypor
tanto su mscara por defecto es la 255.255.0.0. En el ejemplo est
subneteadaconmscara255.255.255.0ydadoqueestamscaranoesla
mscarapordefectolaredhadeindicarseporsudireccinIPseguidade
sumscara.Estastresredesportantoson:
172.22.22.0/255.255.255.0
172.22.23.0/255.255.255.0
172.22.21.0/255.255.255.0
Mscarasdered
LareddelejemploestformadaportressubredesdelareddeclaseB
172.22.0.0conmscaras255.255.255.0(osea,consideradascomoosila
red172.22.0.0sehubierasubneteado)
LamscaraderednoesmsqueunadireccinIPdondesehasustituido
todos los bits de la parte de red de la direccin por unos y los bits
correspondientesalapartedehostporceros.As,lamscaraderedde
una red de clase A ser 255.0.0.0, la de una red de clase B ser
255.255.0.0yladeunaclaseCser255.255.255.0.
Porqueseusaentonceslamscaraderedsiestimplcitaeneltipode
direccion?
Sehacomprobadoqueaveceselsistemadeclasesnoesapropiado.Aun
proveedorledanunaclaseCcompletaperoelquieredividirlaencuatro
redesdiferentes,ynovaausarcuatroclasesCparaesto1000direcciones
IP,porquesemalgastaranmuchas.Puesbien,dentrodeunamismared,
sepuedeextenderelmecanismoderouting,considerandoquelapartede
404
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
hostsonlosbitsceroylapartederedsonlosbitsunodelamscaray
asociandoacadadireccinIPunamscaraenelmomentodeconfigurarla
(por supuesto, los valores por defecto sern los de la clase dela red,
aunquesepodrnaadir,ysolamenteaadir,bitsunoalamscara,conel
findesubnetearla.
Enelcasodelejemplodeesteparrafo,elproveedorpodraextenderla
mscaradesubreddosbitsmsalldelafronteraimpuestaporeltipode
ladireccinadquiridayconsiderarquetienecuatroredes(enestecasola
partederedseranlosprimerostresbytesydosbitsdelcuartoylaparte
delhostlosrestantes).
Tablasderutas
Porejemplopartiendodelared21.0parairala23.0habraqueusarel
GW1,yparairdela23.0ala22.0habraqueusarGW1yGW2.
Perocomoseindicalarutaatomarparacadadestino?
Paraelloseusanlastablasderutasyparaconstruirlas,formaremospara
cadamquina,unatablaconlaformadedirigirlastramashacialasredes
que no vemos directamente, con la ventaja adicional de que como la
direccin0.0.0.0representaobviamentelaredlocal,podemosusaresta
direccinespecialparaindicarlarutapordefecto(esdecir,ladireccin
localalaqueenviarlastramasquenotienenrutayquenecesariamente
hayqueenrutar).As,lastablasderutasquedaran:
HostA: 0.0.0.0(default)>172.22.22.2
HostB: 0.0.0.0(default)>172.22.22.2
HostC: 0.0.0.0(default)>172.22.23.1
HostD: 0.0.0.0(default)>172.22.23.1
GW1: 172.22.22.0 >172.22.21.2
GW2: 172.22.23.0 >172.22.21.1
405
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Sinosfijamos,podemosverquelarutapordefectoeselgatewaypor
defectoqueapareceenlaconfiguracindemuchasmquinasLinux,pero
paralosgatewaysnoapareceningungatewaypordefecto.Estoesuna
caractersticadelasredesquetienenbackbones.
Backbon
Configuracindeunpuesto
Unavezcomprendidoslosconceptospasemosacalcularlasdirecciones.
ConladireccinIPylamscaraderedsepuedenobtenerlasdems.
Tomando como ejemplo el nodo A observamos que se cumplen las
siguientesrelacioneslgicasusandolosoperadoreslgicos(AND,NOTy
OR)sobrelosbitsqueloscomponen:
406
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Mscara
255.255.255.000
deRed
Direccin
172.022.022.021
IP
AND
Direccin
172.022.022.000
deRed
NOT(Ms
000.000.000.255
caradeRed)
Direccin
172.022.022.021
deRed
OR
Direccin
172.022.022.000
deBroadcast
ObservequeconladireccinIPylamscaraderedsepuedededucirlas
restantesdirecciones.Porlotantositienequeconectarseaunaredlocal
bastarconpreguntaraladministradordelamismaesosdosnicosdatos.
Criteriosparasubnetearunared
Vamosacomentarloscriteriosquesepuedentenerencuentaalahorade
decidirsubnetearunagranredenvariasmspequeas.
407
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
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.
Acadarutaseleasociauncosteenfuncindelrendimientodelared,tipo
delalinea,etc.Estopermitedeterminardeentrevariasrutasposiblescual
es la de menor coste.
Cadarouterdeunaredenvayrecibeinformacinderutadoquepermite
actualizarlastablasderutadocada30segundos.Cuandoelcostedeuna
rutasuperaelvalor16elsistemaseconsiderafueradealcance.Lacaida
deunnododelaredsueleprovocarlaperdidadealgunosmensajeshasta
quelastablasderutadodetodoslosrouterssereajustan.
ServidoresdeNombres
Las direcciones IP son muy adecuadas para las mquinas pero son
dificiles de recordar. Por esta razn se usan nombres de dominios.
AdemsusandosolounadireccinIPsinnombretendramosquecambiar
de direccin cada vez que nos alojemos en un servidor distinto. Si
asimilamos una direccin a un nombre podemos mantener nuestra
presenciaeninternet cambiandodeservidorsinqueapenassenoteel
409
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
cambio.Enlaprcticaelcambionosucedeinstantaneamenteporquetiene
quepropagarselainformacindelcambiodenombreengranpartedela
red.
Para una red pequea nos bastara usar un fichero /etc/hosts que sea
comnatodoslosnodosdelared.Silaredesmsgrandecadacambio
ha de ser propagado a los dems lo antes posible y controlar que la
informacin se mantiene coerente o usar un sistema de base de datos
compartidocomoNIS,etc.
Apesardeellotodoestoresultainsuficientecuandohablamosderedes
muygrandes.Elfichero/etc/hostsoequivalenteseraenormeasiquelo
quesehaimplementadoparaqueeninternetexistaunserviciodenombre
esqueesunprotocolollamadoDNSquepermitetenerestainformacin
distribuida adecuadamente mediante un sistema de dominios que se
reparten la carga de gestionar estos nombres organizados de forma
jerrquicageneralmentehastatresnivelesdeloscualeselprimerosuele
indicareltipodeactividad.Porejemplo:
com:Empresascomerciales
org:Organizacionesnocomerciales.
edu:Universidadesycentrosdeinvestigacin.
net:Pasarelasynodosadministrativosdelared.
Conelfindeaumentarlaeficienciaylatoleranciaafalloscadazonatiene
unservidordenombresautorizadoomaestroycadaunodeestostiene
variosservidoressecundarios.Laszonassedefinencomosuperconjuntos
deredesIPredondeadasaniveldeunocteto.
Estructuradepaquetes
Lospaquetesotramassonsecuenciasdebitsquecontienennosololos
datosconinformacindeusuariosinodatosdecabeceraydecolaquese
estructurandeformaquelosnivelesinferioresdetransmisindedatos
vanencapsulandoalosnivelessuperiores.ParaformarunpaqueteUDP
habraqueenvolverlodelaformasiguiente.
410
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Datos
Nbytes
UDP Datos
20bytes Nbytes
IP UDP Datos
20bytes 20bytes Nbytes
Ethernet IP UDP Datos Ethernet
14bytes 20bytes 20bytes Nbytes 4bytes
Datos
Nbytes
TCP Datos
20bytes Nbytes
IP TCP Datos
20bytes 20bytes Nbytes
Ethernet IP TCP Datos Ethernet
14bytes 20bytes 20bytes Nbytes 4bytes
La parte de datos puede tener distinto tamao segn los casos pero
generalmentenosermuchomayorde1KByte.
Estudiarendetallelaestructuradeestospaquetesexcedelaspretensiones
deestecursoapesardeelloconvieneilustrarconunpardeejemploslo
queseranunpardecabecerasyparaellousaremoslaestructuradeuna
cabeceraIPydeunacabeceraTCP.Ambassonestructurasde20Bytes.
411
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
CabeceraIP(20bytes)
Versin IHL TipodeServic. TamaoTotal
Desplazamientodel
Identificacin Flags
Fragmento
TiempodeVida Protocolo ChecksumdeCabecera
DireccindeOrigen
DireccindeDestino
SimplementenosconformaremosconresaltarquelacabeceraIPtiene
datosdeidentificacinydireccionamientoylacabeceraTCPcontiene
informacindelospuertosascomoindicadoresdecontrol,numerode
secuenciadelospaquetes,etc.paradetectarlaperdidadepaquetesosu
deterioroafindegestionarelreenvidepaquetesencasonecesario.
CabeceraTCP(20bytes)
PuertodeOrigen Puertodestino
Nmerodesecuencia
NmerodeConfirmacin
Desplz. UA P R S F
delos Reservado R C S S Y I Ventana
datos GKH I NN
Checksum PunterodeUrgencia
EnInternetundestinoyunorigennoimplicaunarutafija.Losmensajes
buscansurutapasandoatravesdevariosnodosydicharutapuedevariar
incluso dentro de una misma sesin o de una misma transferencia de
ficheros.Porejemplolacaidaenunarutasupondralaperdidadealgunos
paquetes pero no afectara a la transmision ya que esta continuara
rpidamenteporotrarutasinqueapenaspodamospercibirlo.
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.
Unrepetidorsoloamplificayretocalasealanivelpuramenteelctrico.
Porlotantoignoracualquiercosasobrelainformacintransmitida.
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
ENRUTADOR(ROUTER)
UnRouteractuatraduciendoocontrolandolacirculacindepaquetesa
niveldered.Podemosvereneldibujosiguientecomounrouterpuede
actuaraniveldeInterfazdered(EnnuestrocasoEthernet)yanivelde
red(ennuestrocasocapaIP).
PASARELA(GATEWAY)
Unapasarela(Gateway)actuaraniveldetransportequeennuestrocaso
puedeserTCPoUDP.Tambinenglobalosnivelesinferiores.
CORTAFUEGOS(FIREWALL)
414
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
415
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
ELARRANQUEENLINUXYCOMOSOLUCIONAR
SUSPROBLEMAS(PrimeraParte)
Introduccin
Enestecaptulointentaremosdescribirlasposiblescausasporlascuales
unsistemaLinuxpuedetenerproblemasparaarrancaroparafuncionar
correctamenteylaformadesolucionarlo.
Paradefendersedetodoestotenemosqueaprenderbastantescosassobre
el sistema y su funcionamiento. Trataremos primero de describir el
procesodearranque.
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.
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:
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).
Imaginemos un PC con tres discos duros IDE, dos discos SCSI, una
disquetera y unlector de CDROM IDE conectado al controlador IDE
primarioesclavo
418
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
+-------------------------------------+
| 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
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
Pararecuperarestesectorbastahacer:
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.
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
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
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.
Unavezeditadoelfichero'lilo.conf'hayqueejecutarelcomando'lilo'
parainstalarelcargadordearranque,queseactivarlaprximavezque
searranqueelsistema.Elmsmnimocambioqueafecteaalgunodelos
ficherosqueintervienenenelarranqueharqueestefalle.Porejemplosi
sacaunacopiadelkernel,borraeloriginalyrenombralacopiaconel
mismonombrequeeloriginaltodoparecerqueestigualqueantespero
lasposicionesendiscoyanosonlasmismasyelarranquefallar.Para
evitarestodespusdelarecompilacindeunkernelodecualquierotro
cambioencualquieradeloselementosinvolucradosduranteelarranque
deberreconstruirelcargadorvolviendoaejecutarelcomandolilo.
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.
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:
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
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
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.
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)
430
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
Nosiemprelonuevoeslomejor.Elsistemaext2esmuyestableporque
llevamuchotiempofuncionando.Lossistemasnosonperfectosysobreel
sistemadeficherosrecaemucharesponsabilidad.Unfalloenunsistema
deficherospuedeprovocarlaprdidadetodalainformacindelsistema.
Hayalgunasdistribucionesquepordefectoinstalansistemasdeficheros
distintos de ext2. En parte es una cuestin de gustos. Nosotros nos
limitamos a ext2 pero aunque usted use otro sistema de ficheros
encontrarmuchainformacinutilenestecaptulo.
Enestecaptulosemencionarlalocalizacindemuchoseimportantes
scriptsdelsistema.Ustedyatienenivelsuficientecomoparaentenderlos.
433
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Muchosdeellossonbastantecrticosyesmejornomodificarlosotrosno
son tan crticos ypuedenadaptarsesin riesgoalas necesidades desu
sistema. En cualquier caso sea curioso, repase los diferentes scripts y
aprendermuchascosasinteresantes.
Muchossonlosaspectosdelkernelqueincidenenlaproblemticadel
arranqueperoesaparteladejaremosparaunposteriorcaptulo.
Inicializacindelsistema(init)
Unavezelcargadorcompletalacargadelkernel,esteterminacediendoel
controldeejecucinalsistemaoperativoelcualefectuarunaseriede
tareasqueconvieneconocer.
1. Existeunalimitacininicialquevienedeldiseooriginaldelos
PCs.IBMeligicomolmite1MegaByteporqueensumomento
no consider la posibilidad de que un ordenador personal
necesitarajamsaccederamsde1MegadememoriaRAM.Por
estaraznelkerneldeLinuxsecargaenformacomprimidapara
no rebasar ese primer Megabyte de la memoria RAM. A
continuacinseejecutaunaprimeracabeceradeesainformacin
grabadaenRAMquepasalaCPUamodoprotegidoydeesta
formaeliminalarestriccindeaccesoaRAMpudiendoentonces
acceder ms all del primer Megabyte de memoria, y pasando
seguidamente a descomprimir todo el kernel para su posterior
ejecucin.
2. El kernel monta el sistema de ficheros raz raz en modo solo
lectura,ylohacesinpoderusarningunodesusmdulosyaque
estos solo son accesibles una vez el sistema raz est
perfectamentemontado.Elkerneltambinnecesitasercapazde
manejar el sistema dememoria virtual sinusar ningnmdulo
antesdequesemonteelsistemaraz.
3. Elkernelarrancaelprocesoinitquizsprecedidodealgnproceso
planificadordependiendodelossistemas.Elprocesoinittendr
434
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
comoPIDelvalor1.Serelprocesoquegenereatodoslosdems
procesosdelsistema.
4. 'init'leeelfichero'/etc/inittab'.Esteficherocontienelalistadelos
procesosquedebenserarrancados.Losprocesosserepartenen
distintosnivelesdeejecucinparagarantizarunordendearranque
o parada entreellos dependiendo delniveldeejecucin alque
estnasociados.Losprocesossernarrancadosmediantescriptsrc
situadosen/etc/rcX.d/dondeXeselniveldeejecucin. Estos
scriptsusanunanomenclatura'Snn...'o'Knn...'dondeelprefijoS
significa arranque de un servicio y el prefijo K parada de un
servicio. Viene de (S)tart, y (K)ill). Los dos dgitos siguientes
determinan el orden de ejecucin de cada script dentro de un
mismonivel.
5. 'init' arranca los procesos que estn asociados al nivel 1 de
ejecucin,quesecorrespondeconelmodomonousuario.Antes
deentrarenestenivel1seejecutaranlosscriptsasociadosalnivel
'S'quenoesenrealidadunniveldeejecucinquesepuedausar
directamente,sinoquecontienescriptsespecficosqueseejecutan
durante el arranque, y como acabamos de explicar se ejecutan
antesinclusodelnivel1.Sedeterminasielsistemadebechequear
el sistema de ficheros con 'fsck(8)'. Esto ser necesario si se
terminbruscamentesindesmontarlossistemasdeficherosobien
porqueelsistemadeficherosalcanceunciertonmerodeveces
de montaje y desmontaje sin que se chequee el sistema de
ficheros.Porlotantosiresultanecesariosechequearelsistema
deficherosrazysielchequeoterminasinnovedadsecontinua
conelmontajedelosrestantes sistemasdeficheros,perosise
detecta algn tipo de problema serio el sistema solicitar la
contraseaderootquedandoelsistemaenelnivel1monousuario
parasepuedaejecutar'fsck'manualmente.Trataremosestetema
msadelante.
Lossistemasdeficherostienenincorporadouncontadordeforma
que alcanzado un cierto valor mximo se considera necesario
chequearelsistemadeficheros.Dichovalormximopuedeser
435
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
alteradousando'tune2fs(8)',perogeneralmentenoesbuenaidea
hacerlo. Un chequeo ms frecuente resultar incmodo, uno
menos frecuentesuponeaumentarelriesgodeundeteriorodel
sistemadeficheros.
6. Finalizadoelchequeodelaparticinrazestasevuelveamontar
peroestavezenmodolecturaescritura.Chequearelsistemade
ficheros Se montan el resto de los sistemas de ficheros
especificados en '/etc/fstab' salvo aquellas entradas (lineas) que
figurencomonoauto.Vease'mount(8)'y'fstab(5)'
7. Elsistemaentrarenelrunlevelpredeterminadoquepordefecto
queenelcasodeDebianesel2.Estealigualquemuchascosas
vieneespecificadoen'/etc/inittab'
8. # The default runlevel.
9. id:2:initdefault:
EnestenivelenDebiansearrancaelentornogrficodeventanas
mientrasqueenotrossistemasestoocurreenelnivel5.Los
nivelesdeejecucin(runlevel)puedenvariardeunsistemaaotro
peroentrminosgeneralesestnorganizadosdelaforma
siguiente:
o 0Detieneelsistema.
o 1Entraenmodomodousuario.
o 25Entraenunavariedaddemodosmultiusuario.
o 6Provocaelrearranquedelsistema.
10. Despusdeejecutarlosscriptsdelrunlevelpredeterminado,'init'
procedeaarrancarmediante'getty(8)'unaseriedeterminaleso
seudoterminalesconectadosalsistema.
'getty'presentasobreelterminalunintroductor'login:'quetomar
elnombredeusuario.Unavezintroducidoelnombredeusuario
esteprocesosetransformaenelprocesologinpormediodeuna
llamadaexec.(Estoyaseexplicenlapartedelcursodedicadaa
losprocesos).Elprograma'login(8)'solicitarunapasswordyen
casodequeestaseavlidasetransformarmedianteunnuevo
436
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
Cuandolashellmuere,initlodetectacomosielprocesogettyque
arranchubieramuerto.(Enrealidadelpidnovaraalhacerlos
sucesivosexec).Dadoquelosgettysearrancanenmodorespawn,
'init'losrearrancacadavezquemueran.
Explicacindeinittab
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.
Nuncadeberatocarnadasinasegurarsequepuedellegadoelcasodar
marchaatrsydejarlotodocomoestaba.Porejemplosieditaalgunode
estosficherossaquepreviamenteunacopiadeloriginalyguardelaporun
tiempo.
Existeunaopcinparaarrancarelprocesoinitsinqueejecuteningunode
losficherosdescript.
# init -b
Losscriptsrcsonficherospresentesenlosdirectorios/etc/rc.d#.ddonde
# es el runlevel . Cada script rc suele implementarse como un link
simblicoqueempiezaporSoK(start)o(kill)seguidodedosdgitosy
queapuntaaunficheroconelmismonombreperosinSniKnilosdos
dgitos.
Hagalosiguiente:
439
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
# cd /etc
# ls -l rc*.d/*cron* init.d/*cron*
Obtendralgoparecidoalosiguiente:
init.d/anacron
init.d/cron
rc0.d/K11cron -> ../init.d/cron
rc1.d/K11cron -> ../init.d/cron
rc2.d/S20anacron -> ../init.d/anacron
rc2.d/S89cron -> ../init.d/cron
rc3.d/S20anacron -> ../init.d/anacron
rc3.d/S89cron -> ../init.d/cron
rc4.d/S20anacron -> ../init.d/anacron
rc4.d/S89cron -> ../init.d/cron
rc5.d/S20anacron -> ../init.d/anacron
rc5.d/S89cron -> ../init.d/cron
rc6.d/K11cron -> ../init.d/cron
Losservicioscronyanacronsonserviciosqueyahemostratadoenun
captulo anterior. Observe que estos servicios de forma similar a la
mayora de los servicios se arrancan y paran desde 'init.d/cron' y
'init.d/anacron' respectivamente.Observequelosenlacessimblicosde
arranqueapuntanalmismoscriptquelosenlacessimblicosdeparada.
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.
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.
Siedita'/etc/inittab'desdeelpropiosistemaelprocesoinitnotomaren
cuentaloscambiosmientrasnosearranqueomientrasnoseleinformede
ellomediante:
# init q
Siestonoleconvenceonoseleocurrenadamejorpuederearrancar
desdeunsistemadedisqueteparaeliminarlaentradaeninittabmientras
el problema no est solucionado. Ms adelante se explica como
solucionarunproblemadeolvidodepasswordderootybsicamenteen
estecasohabraquehacerlomismoperoenlugardeeditar'/etc/passwd'
habrqueeditar'/etc/inittab'.
Recuerdequelamodificacinde'/etc/inittab'esunaoperacincrticaque
puedeafectaralacapacidaddearranquedesusistema.
442
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
EnDebiansepuedeaadirunscriptasociadoaunniveldeejecucin
deseado. Paraellosecolocaelscripten/etc/init.d/ yluegoseejecuta
'updaterc.d(8)' con los argumentos adecuados que crear los enlaces
simblicoscorrespondientes.
Porejemplo:
CrearalosenlacessimblicosS88miscriptyK88miscriptparatodoslos
runlevels.
CrearaK83miscriptparalosniveles1235y6,yS85miscriptparalos
niveles23y5.
ParaeliminarserviciosinnecesariosenDebianpuedehacerlosiguiente:
1. Creeundirectorioporejempo'/etc/services_off/'
2. Guarde la informacin actua siguiente: 'ls l d rc*/* >
/etc/services_off/lsl.out', y despus mueva los scripts
correspondientesalosserviciosinnecesariosdesde'/etc/init.d/'a'/
etc/services_off/'.(Sepuedenenlugardeesoeliminarlosscripts
perodeestaformapodemosdarmarchaatrsconmsfacilidadsi
fueranecesario).
3. Para cada unos de los servicios eliminados hacer 'updaterc.d
nombre_servicioremove'.Conelloseeliminarnselectivamente
todos los links simblicos que apunten a
'/etc/init.d/nombre_servicio'desdelosdirectorios.
Continuamosconladescripcindelprocesoderranque.Cuandoarranca
elsistemaaparecenunosmensajesquepuedenseralteradoseditando'/etc/
443
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
motd','/etc/issue',y'/etc/issue.net'Quizslesorprendaverunoscaracteres
extraos pero son secuencias de escape destinadas a la consola. Si le
interesacomprenderlasconsultelapginamandeconsole_codes(4).
Elprimeroqueseejecutaenelcasodeinterpretesdecompatiblesconsh(
sh(1),bash(1),ksh(1),ash(1),..)ser'/etc/profile'
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.
444
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
# sync
# sync
# shutdown -r now
Algunasvecessearrancadeestaformacuandosesospechaqueelfichero
correspondiente al ejecutable 'init' pudiera estar daado impidiendo
totalmente el arranque pero podra ocurrir que arrancanco con 'sh'
tampocologremosnada.Tanto'init'como'sh'usanlibrerascompartidas
comunes y un dao en alguna de estas librera impedir el arranque
usandocualquieradelasversionesnormalestantode'init'comode'sh'.
Unalibreradinmicacompartidaconsisteenunconjuntodefunciones
que pueden cargarse en memoria una sola vez y ser aprovechadas y
compartidasporvariosprocesosfuncionandosimultaneamente.
Porejemplo'libc.so.6','/lib/ldlinux.so.2'sonlibrerascomunesamuchos
programasen Debian2.2.Puedecomprobarloconsultandolas librerias
compartidasusadaspor'init'y'sh'.Paraellohagalosiguiente:
Obtendrlosiguiente:
/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.
Deestaformalarecuperacinresultarmascompleta,msrpidaypuede
quenossirvaparapreveniruncasosimilarenelfuturo.
Parapoderarrancardeformaindependienteypoderiniciarlareparacin
delsistema,esparaloqueseusanlosdisquetesoCD'sderescate.
Si nuestro sistemanopuedearrancarenmodoalgunodesdeCDROM
habrqueconformarseconelusodeundisquetederescateperoenun
disquetederescatenocabendemasiadasutilidadesdeayuda.
447
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
EnDebiantambinpodemosintroducirelCDdeinstalacinyprogresar
hastaseleccionareltecladoyelidiomaparapodertrabajarcmodamente.
Despusdeestosepuedeabandonarlainstalacinycontinuarabriendo
unasesinnuevaenunseudoterminal.Porejemploycontinuarcomosi
estuviramosenmodorescateotambinsepuedearrancardesdeesteCD
usando distintas modalidades. Por ejemplo indicando la particin raz.
Desde un sistema Debian tambin se puede montar el cdrom de
instalacin y crear con ello un par de disquetes de rescate. Para ello
montamoselcdromen/cdromyponemosundisqueteformateadoenla
disqueterayluegohacemos:
Estocreaelrescuedisk,conelquesearrancaelequipo.
Conestootrosecreaelrootdiskquepedirmientrasarranque.
Siusamoslaparticinrazendiscodurosoloservirparacasosenlos
queelproblemasoloafecteaelementosmuyconcretosdelarranquetales
como kernel, cargador de arranque, etc. Pero no para casos donde la
propiaparticinrazestcomprometidaporalgnproblema.
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
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.
Eltiempogastadoendominarestostemasestiempoganado.Lonormal
enpersonasqueadministranellosmismossusequiposyquenodominan
estostemasesquetardeotempranopierdanunmontndedasosemanas
devaliosotrabajo.
LomejoresilustrarelusodelosdisquetesoCDsderescatemediante
medianteunejemploqueestodounclsico.Olvidarlapasswordderoot.
Olvidar la password de root
Nosepreocupe.
450
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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(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
Recuperarundiscodurodaado
Puedeocurrirqueunsistemasevuelvainestableysoliciteconfrecuencia
elchequeodealgunaparticin.Puedequeapesardequeaparentemente
el fsck solucione el problema este reaparezca nuevamente con mucha
frecuencia,oinclusoacadanuevoarranque.
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.
Usebadblocksdesdealgndiscoderescate.LosprimerosCDsdelas
distribucionessuelenofrecerlaopcindearrancarenmodorescue.
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).
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.
EnlaactualidadlosncleosdeLinuxsonmodulares.Esdecir,haypartes
delkernelquepuedenresidirendiscoysolosecarganenelmomentoque
resultenecesario.Sellamanmduloscargables ygeneralmentehayun
programallamado'kerneld'encargadodesucargaydescarga.
Lasversionesdelkernel
Haydoslneasdefuentesdelncleo.Lasdeproduccinquesonestables
ylasdedesarrolloquenoloson.Lasdedesarrollosonadecuadasparalos
programadoresquedeseanexperimentarconfuncionalidadesnuevasdel
kernel,oparalosusuariosquecompraronhardwarequenoestsoportado
deunamaneratotalmentesegurayprobadaenelkernel.
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
Quizsalgodeloqueacabamosdedecirseatotalmenteexactoperosi
que le permite entender bastante bien todo lo que significa esta
nomenclatura.
Cuandoconvienesubirlaversindeunkernel?
Otracosaesrecompilarlamismaversindelkernelsimplementepara
cambiaralgunascosasaefectodeoptimizarlo.Detodasformassitiene
ustednoticiadequeciertoproblemaocarenciasesolucionausandouna
versin superior del kernel recuerde que mantener los dos primeros
nmerosdelaversindelkernelesmuchomssencilloquepasarauna
459
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
seriesuperiorenlaqueelsegundonmeroessuperioryrecuerdeusar
siempreversionesparesestables.
Cuandoconvieneusarmdulos
Alahoradeconfigurarelkerneltendrqueirleyendodetenidamenteel
significado decadaopcinyverqueparaalgunas opciones resultar
posiblenicamenteincluirlasonoincluirlasdeformaesttica.Esdecir
solopodrnestarenelkerneldeformapermanenteonoestar.Porel
contrario otras opciones admiten una tercera posibilidad que es su
inclusincomomduloyaquvienelapreguntainteresante.Cualesla
mejor formadeincluirlo ?Larespuestaesquetodoloquepuedaser
puestocomomduloestarmejorcomomduloanoserqueincluirlode
formapermanenteresulteimprescindibleparaarrancaroquesuusovaya
asercasicontinuo.Tengaencuentaquesisukernelesporejemploun
2.2.17losmdulosserncargadosdesde'/lib/modules/2.2.17/'peropara
esolaparticinrazdebedeestarmontadaysiustedtienesuparticin
raz en un disco ide necesitar que las opciones correspondientes a
BLK_DEV_IDE,BLK_DEV_IDEDISKdebendeestarenmodoesttico
(permanente)porquesiestncomomduloscargableselsistemajams
podra arrancar desde un disco ide. Hay otras opciones que tambin
pueden ser necesarias en modo esttico EXT2_FS, BINFMT_ELF,
VT_CONSOLE,PROC_FS,etc
Porelcontrarioestaclaroquelaunidaddecdrom,laimpresora,sistemas
de ficheros que se usen de forma ocasional, etc. pueden y deben ser
configuradoscomomdulos.Sitienedudasdeberleerparaquesirven
intentandodeducirsisonnecesariosparaarrancarono.EXT2_FSespara
sistemadeficherosLinuxylgicamenteesimprescindible.PROC_FSes
un sistema deficheros que se monta en /proc yque es usado porun
montn de programas de forma casi continua. BINFMT_ELF permite
ejecutar la inmensa mayora de los binarios de Linux y por ello es
imprescindible,etc.Sinoescapazdellegaraunaconclusinsobresies
imprescindible,convienequelopongacomoestticolaprimeravezque
lointente,ysitodovabienpuedeenunfuturoprobaraponerlocomo
460
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
mduloperosiendoconscientedequequizsnoarranque.Todosestos
cambiosdebenhacerseteniendomuyclarocomovolveralasituacin
anteriorusandoelkernelantiguo.
Primeraprueba
Suponiendo que usted est usando arranque desde disco duro con el
cargadorLILOleproponemospracticarlosiguiente:
1. Repaselasleccionesanterioresquetratansobreelarranque.
2. Localicesukernelactualmirando/etc/lilo.conf.
3. Saqueunacopiadesukernelconotronombredistinto.
4. Editesu/etc/lilo.confaadiendounaentradaparausarlanueva
copiadelkernel.
5. !!Importante!!.Ejecuteelcomando'lilo'.
6. Rearranqueusandoalternativamenteunacopiadelkerneluotra.
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
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
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.
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
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
465
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
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.
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.
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
Sinoentendemosnadadeloqueponeynotenemosniideadeloquenos
convienehacerlomejoresvolveraleerlaltimapartedeesaexplicacin
donde se explica cual es la opcin ms recomendable en caso de no
tenerloclaro.
Vuelvaalmenprincipalusandolatecla'ESC'opulsandoelbotn'Exit'.
Seleccioneacontinuacinlasegundaopcin:
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
o Kernelcore
473
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
DebeserELF
o kernelsuportforELFbinaries
Incluyalacomoparteestticausando'Y'.Nodebeestarcomo
mdulo.
Blockdevices
Cualquierdispositivoqueresultenecesarioparaarrancarymontarla
particinrazdebesercompiladoestticamente.Sinosecompilaoso
compilacomomdulonoarrancar.
Characterdevices
Sernnecesarioscomomnimolassiguientesopciones:
o Virtualterminal
o Suportforconsoleonvirtualterminal
o UNIX98PTYsuport
Filesystems
Comomnimodeberincluirsoporteparaelsistemadeficherosdel
sistema de ficheros raz que generalmente es ext2, y sea cual sea
deberestarincluidoestticamenteynocomomdulo.
Consoledrivers
o VGAtextconsole
InstalarunnuevokernelpersonalizadoenDebian
TodolodichosirvetambinparaDebianperoenDebianexisteunaforma
alternativamuyinteresante.
474
AntonioCastroSnurmacher(2000)http://www.ciberdroide.com/LLC/LLC.html
AntesdelaaparicindelkernelmodularenLinuxunkernelcompletoera
unsimplefichero.Estasencillezpermitaporejemplomigrarunkernelde
unamquinaaotrasimplementecopiandoestefichero.Esloquesucede
ahora si compilamos un kernel en modo totalmente esttico. Es decir
obtenemosungranypesadokernel,totalmentecompletoyfuncionalpero
sinsoporteparacargarmdulos.
Parapodermigrarunkernelcompletoenelcasogeneraldequetenga
soporte para mdulos habra que trasladar como mnimo el fichero
compiladoestticamenteycomomnimotodossusmdulos.
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.
476