En el principio fue la línea de comandos

por Neal Stephenson

Shock de Sistema Operativo

Los jóvenes estadounidenses que dejan su gran país homogéneo y visitan otra parte del mundo típicamente sufren varios grados de shock cultural: primero, inmenso asombro. Luego un acercamiento tentativo a las costumbres, cocina, sistemas públicos de circulación y retretes del nuevo país, lo cual lleva a un breve periodo de confianza fatua en que son expertos instantáneos en el nuevo país. A medida que continua la visita, empieza la morriña, y el viajero empieza a apreciar, por primera vez, cuánto daba por sentado en casa. Al mismo tiempo, empieza a resultar obvio que las propias culturas y tradiciones son esencialmente arbitrarias; conducir por la derecha, por ejemplo. Cuando el viajero vuelve a casa y hace de la experiencia, puede haber aprendido bastante más sobre los Estados Unidos que sobre el país que fueron a visitar.

Por los mismos motivos, merece la pena probar Linux. Ciertamente, es un país extraño, pero no hay por qué vivir ahí; una breve estancia basta para experimentar el gusto del lugar y - lo cual es más importante - revelar todo lo que se da por sentado, y todo lo que se podría haber hecho de modo distinto, en Windows o MacOS.

No se puede probar sin instalarlo. Con cualquier otro sistema operativo, instalarlo sería una transacción sencilla: a cambio de dinero, una compañía te daría un CD-ROM, y ya está. Pero hay un montón de cosas subsumidas bajo ese tipo de transacción, y hay que verlas y diferenciarlas.

En Estados Unidos nos gustan los tratos simples y las transacciones sin complicaciones. Si vas a Egipto y, pongamos, tomas un taxi en algún sitio, te conviertes en parte de la vida del taxista; se niega a aceptar tu dinero porque rebajaría vuestra amistad, te sigue por la ciudad, y llora como un crío cuando te metes en el taxi de otro. Acabas por conocer a sus hijos en algún momento, y tienes que ingeniártelas para hallar algún modo de compensarle sin insultar su honor. Es agotador. A veces simplemente quieres tomar un taxi como en Manhattan.

Pero para tener un sistema de estilo estadounidense, en el que puedes salir, parar un taxi, y ya está, tiene que haber todo un aparato de licencias, inspectores, comisiones, etc. - lo cual está muy bien siempre que los taxis sean baratos y siempre puedas llamar a uno. Cuando el sistema no funciona de alguna manera, resulta misterioso y enervantes y convierte a personas habitualmente razonables en teóricos de la conspiración. Pero cuando el sistema egipcio se viene abajo, se viene abajo de forma transparente. No puedes tomar un taxi, pero aparecerá el sobrino del taxista, a pie, para explicarte el problema y disculparse.

Microsoft y Apple hacen las cosas al estilo de Manhattan, con una vsta complejidad ocutla tras el muro de la interfaz. Linux hace las cosas al estilo de Egipto, con una vasta complejidad desperdigada por todo el paisaje. Si acabas de llegar de Manhattan, tu primer impulso será llevarte las manos a la cabeza diciendo ¡Esto es de locos! ¿Por qué narices no os comportáis como es debido?. Pero esto no te granjeará más amigos en Linuxlandia de lo que lo haría en Egipto.

Se puede extraer Linux del aire mismo, por así decir, descargando los archivos adcuados y poniéndolos en los lugares adecuados, pero posiblemente no más de unos pocos cientos de personas en el mundo podrían crean un sistema Linux funcional de ese modo. Lo que realmente se necesita es una distribución de Linux, lo cual quiere decir un conjunto preempaquetado de archivos. Pero las distribuciones son una cosa distinta de Linux per se.

Linux per se no es un conjunto específico de unos y ceros, sino una subcultura autoorganizada de la Red. El resultado final de sus elucubraciones colectivas es un vasto cuerpo de código fuente, casi todo escrito en C (el lenguaje de programación dominante). El código fuente es sencillamente un programa de ordenador escrito y editado por algún hacker. Si está en C, el nombre del archivo probablemente llevará .c o .cpp al final, dependiendo del dialecto empleado; si está en otro lenguaje llevará otro sufijo. A menudo, este tipo de archivos pueden encontrarse en un directorio con el nombre /src, que es la abreviatura hebraica del hacker para source, fuente.

Los archivos fuente son inútiles para el ordenador, y de poco interés para la mayoría de usuarios, pero tienen una enorme significación cultural y política, porque Microsoft y Apple los mantienen en secreto, mientras que Linux los hace públicos. Son las joyas de la familia. Son el tipo de cosa que en los thrillers de Hollywood se usa como McGuffin: el núcleo de la bomba de plutonio, los planos de alto secreto, el maletín lleno de documentos financieros, el microfilm. Si los archivos fuente de Windows o MacOS se hicieran públicos en la Red, esos sistemas operativos se volverían gratuitos, como Linux - sólo que no tan buenos, porque no habría nadie para arreglar los fallos y responder a las preguntas. Linux es software de fuente abierta (open source), lo cual sencillamente quiere decir que cualquiera puede obtener copias de sus archivos de código fuente.

Un ordenador no necesita código fuente más de lo que lo necesita usted; necesita código objeto. Los archivos de código objeto típicamente llevan el sufijo .o y son ilegibles para todo el mundo salvo unos pocos humanos altamente extraños, porque consisten en unos y ceros. En consecuencia, este tipo de archivo normalmente aparece en un directorio con el nombre /bin, por binario.

Los archivos fuente son sencillamente archivos de texto ASCII. ASCII denota un modo particular de codificar las letras en patrones de bits. En un archivo ASCII, cada carácter tiene ocho bits para él solito. Esto crea un alfabeto potencial de 256 caracteres distintos, dado que ocho dígitos binarios pueden formar ese número de patrones únicos. En la práctica, por supuesto, nos limitamos a las letras y dígitos familiares. Los patrones de bits empleados para representar esas letras y dígitos son los mismos que se introducían físicamente agujereando la cinta de papel de mi teletipo del instituto, que a su vez eran los mismos que había usado antes la industria telegráfica durante décadas. Los archivos de texto ASCII, en otras palabras, son telegramas, y como tales no tienen adornos tipográficos. Pero por eso mismo son eternos, porque el código nunca cambia, y universales, porque todo software de edición y procesamiento de textos jamás escrito conoce este código.

Por tanto, se puede usar cualquier software para crear, editar, o leer archivos de código fuente. Los archivos de código objeto, entonces, son creados a partir de estos archivos fuente por un software llamado compilador, y son convertidos en una aplicación funcional por otro software llamado enlazador.

La triada de editor, compilador, y enlazador, tomados juntos, constituye el núcleo de un sistema de desarrollo de software. Ahora es posible gastarse un montón de dinero en sistemas de desarrollo envueltos en plástico, con preciosas interfaces gráficas de usuario y diversas mejoras ergonómicas. En algunos casos puede que hasta resulte un modo bueno y razonable de gastar el dinero. Pero en este lado de la carretera, por así decir, el mejor software es a menudo el gratuito. Editor, compilador y enlazador son a los hackers lo que ponies, estribos, y arcos y flechas eran a los mongoles. Los hackers viven a caballo, y hackean sus propias herramientas incluso mientras las usan para crear nuevas aplicaciones. Resulta bastante inconcebible que herramientas superiores de hacking pudieran haber sido creadas en una hoja en blanco por ingenieros informáticos. Incluso aunque fueran los ingenieros más inteligentes del mundo, se verían sencillamente superados.

En el mundo de GNU/Linux hay dos grandes programas de edición de textos: el minimalista vi (conocido en algunas implementaciones como elvis) y el maximalista emacs. Yo uso emacs, que puede considerarse un procesador de textos termonuclear. Fue creado por Richard Stallman; y con esto ya está todo dicho. Está escrito en Lisp, que es el único lenguaje de ordenador que es hermoso. Es colosal, y sin embargo sólo edita archivos de texto ASCII, lo cual significa: nada de fuentes, nada de negrita, nada de subrayado. En otras palabras, las horas que dedicaron los ingenieros, en el caso de Windows, a cosas como la fusión de correo, y la capacidad de incrustar películas de dos horas en memorándums de empresa, se dedicaron, en el caso de emacs, con intensidad maníaca al engañosamente simple problema de editar texto. Si eres un escritor profesional - i.e. si otra persona está siendo pagada para preocuparse de cómo se formatean e imprimen tus palabras - emacs hace sombra a cualquier otro software de edición más o menos del mismo modo que el sol de mediodía hace sombra a las estrellas. No sólo es mayor y más luminosos; sencillamente hace que todo lo demás se desvanezca. Para la configuración de la página se puede usar TeX: hay un vasto corpus de información tipográfica escrito en C y también disponible de modo gratuito en la Red.

Podría decir un montón de cosas sobre emacs y TeX, erpo ahora mismo trato de contar una historia acerca de cómo instalar de hecho Linux en el ordenador. El enfoque de pura supervivencia sería descargarse un editor como emacs, y las herramientas GNU - el compilador y el enlazador - que son tan pulidas y elegantes como emacs. Equipado con esto, uno ya puede empezar a descargar archivos de código fuente en ASCII (/src) y a compilarlos en archivos de código objeto binario (/bin) ejecutables por el ordenador. Pero para llegar siquiera a este punto - para ejecutar emacs, por ejemplo - hay que tener Linux instalado y funcionando en el ordenador. E incluso un sistema operativo mínimo de Linux requiere miles de archivos binarios actuando en concierto, dispuestos y vinculados para que lo hagan.

Por tanto, diversas entidades se han ocupado de crear distribuciones de Linux. Por extender algo más la analogía con Egipto, estas entidades se parecen algo a los guías turísticos que te reciben en el aeropuerto, hablan tu idioma, y te ayudan con el shock cultural inicial. Si uno es egipcio, claro, se puede ver del otro modo; los guías turísticos existen para evitar que los brutos extranjeros se metan en las mezquitas haciendo las mismas preguntas una y otra y otra vez.

Algunos de estos guías turísticos son organizaciones comerciales, como Red Hat Software, que fabrica una distribución llamada Red Hat que tiene un cierto aire comercial. En la mayoría de casos metes un CD-ROM de Red Hat en el PC, lo inicias, y él solito maneja todo lo demás. Así como el guía turístico egipcio esperará algún tipo de compensación por sus servicios, hay que pagar por las distribuciones comerciales. En la mayoría de los casos no cuestan casi nada y merece la pena.

Yo uso una distribución llamada Debian (la palabra es una contracción de Deborah e Ian), que es no-comercial. Está organizada (o más bien debiera decir se ha organizado) siguiendo las mismas líneas que Linux en general, esto es, consiste en voluntarios que colaboran en la Red, casa uno responsable de cuidar de un pedazo distinto del sistema. Estas personas han dividido Linux en diversos paquetes, que son archivos comprimidos que pueden descargarse a un sistema Linux de Debian ya en funcionamiento, luego se abren y descomprimen usando una aplicación gratuita de instalación. Por supuesto, como tal, Debian no tiene rama comercial - no tiene mecanismo de distribución. Se pueden descargar todos los paquetes de Debian por Internet, pero la mayoría de la gente prefiere tenerlos en CD-ROM. Diversas compañías se han ocupado de meter todos los actuales paquetes de Debian en CD-ROMs y venderlos. Yo compré el mío de Linux Systems Labs. Un conjunto ! de tres discos, que contenía Debian completo, me costó menos de tres dolares. Pero (y ésta es una distinción importante) ni un centavo de esos tres dólares va a parar a ninguno de los programadores que codificaron Linux, ni a los empaquetadores de Debian. Va a parar a Linux Systems Labs y no paga el software ni los paquetes, sino el coste de imprimir los CD-ROMs.

Toda distribución de Linux encarna algún truco más o menos astuto para evitar el proceso normal de encendido y hacer que cuando el ordenador arranque se organice no como un PC ejecutando Windows, sino como un huésped que ejecuta Unix. Esto resulta algo alarmante la primera vez que se ve, pero es completamente inofensivo. Cuando se inicia un PC, lleva a cabo una pequeña autocomprobación de rutina, realizando un inventario de los discos y memoria disponibles, y luego empieza a buscar un disco desde el que arrancar. En cualquier ordenador Windows normal, ese disco será el disco duro. Pero si el sistema está bien configurado, primero buscará un diskette o un disco de CD-ROM, y arrancará a partir de ése si está disponible.

Linux explota esta rendija en las defensas. El ordenador percibe un disco de inicio en la disquetera o el drive del CD-ROM, carga el código objeto de ese disco, y ciegamente empieza a ejecutarlo. Pero no es código de Microsoft o Apple, es código Linux, así que en este punto el ordenador se empieza a comportar de un modo muy distinto al acostumbrado. Empiezan a aparecer mensajes crípticos en pantalla. Si se hubiera iniciado desde un sistema operativo comercial, en este momento se vería un dibujito de Bienvenido a MacOS, o una pantalla llena de nubes en el cielo azul, y el logo de Windows. Pero con Linux aparece un largo telegrama impreso en crudas letras blancas en una pantalla negra. No hay ningún mensaje de bienvenida. La mayor parte del telegrama tiene el semiescrutable aire amenazante de los graffitis.

Dec 14 15:04:15 theRev syslogd 1.3-3#17: restart. Dec 14 15:04:15 theRev kernel: klogd 1.3-3, log source = /proc/kmsg started. Dec 14 15:04:15 theRev kernel: Loaded 3535 symbols from /System.map. Dec 14 15:04:15 theRev kernel: Symbols match kernel version 2.0.30. Dec 14 15:04:15 theRev kernel: No module symbols loaded. Dec 14 15:04:15 theRev kernel: Intel MultiProcessor Specification v1.4 Dec 14 15:04:15 theRev kernel: Virtual Wire compatibility mode. Dec 14 15:04:15 theRev kernel: OEM ID: INTEL Product ID: 440FX APIC at: 0xFEE00000 Dec 14 15:04:15 theRev kernel: Processor #0 Pentium(tm) Pro APIC version 17 Dec 14 15:04:15 theRev kernel: Processor #1 Pentium(tm) Pro APIC version 17 Dec 14 15:04:15 theRev kernel: I/O APIC #2 Version 17 at 0xFEC00000. Dec 14 15:04:15 theRev kernel: Processors: 2 Dec 14 15:04:15 theRev kernel: Console: 16 point font, 400 scans Dec 14 15:04:15 theRev kernel: Console: colour VGA+ 80x25, 1 virtual console (max 63) Dec 14 15:04:15 theRev kern! el: pcibios_init : BIOS32 Service Directory structure at 0x000fdb70 Dec 14 15:04:15 theRev kernel: pcibios_init : BIOS32 Service Directory entry at 0xfdb80 Dec 14 15:04:15 theRev kernel: pcibios_init : PCI BIOS revision 2.10 entry at 0xfdba1 Dec 14 15:04:15 theRev kernel: Probing PCI hardware. Dec 14 15:04:15 theRev kernel: Warning : Unknown PCI device (10b7:9001). Please read include/linux/pci.h Dec 14 15:04:15 theRev kernel: Calibrating delay loop.. ok - 179.40 BogoMIPS Dec 14 15:04:15 theRev kernel: Memory: 64268k/66556k available (700k kernel code, 384k reserved, 1204k data) Dec 14 15:04:15 theRev kernel: Swansea University Computer Society NET3.035 for Linux 2.0 Dec 14 15:04:15 theRev kernel: NET3: Unix domain sockets 0.13 for Linux NET3.035. Dec 14 15:04:15 theRev kernel: Swansea University Computer Society TCP/IP for NET3.034 Dec 14 15:04:15 theRev kernel: IP Protocols: ICMP, UDP, TCP Dec 14 15:04:15 theRev kernel: Checking 386/387 coupling... Ok, fpu using exception ! 16 error reporting. Dec 14 15:04:15 theRev kernel: Checking 'hlt' instruction... Ok. Dec 14 15:04:15 theRev kernel: Linux version 2.0.30 (root@theRev) (gcc version 2.7.2.1) #15 Fri Mar 27 16:37:24 PST 1998 Dec 14 15:04:15 theRev kernel: Booting processor 1 stack 00002000: Calibrating delay loop.. ok - 179.40 BogoMIPS Dec 14 15:04:15 theRev kernel: Total of 2 processors activated (358.81 BogoMIPS). Dec 14 15:04:15 theRev kernel: Serial driver version 4.13 with no serial options enabled Dec 14 15:04:15 theRev kernel: tty00 at 0x03f8 (irq = 4) is a 16550A Dec 14 15:04:15 theRev kernel: tty01 at 0x02f8 (irq = 3) is a 16550A Dec 14 15:04:15 theRev kernel: lp1 at 0x0378, (polling) Dec 14 15:04:15 theRev kernel: PS/2 auxiliary pointing device detected -- driver installed. Dec 14 15:04:15 theRev kernel: Real Time Clock Driver v1.07 Dec 14 15:04:15 theRev kernel: loop: registered device at major 7 Dec 14 15:04:15 theRev kernel: ide: i82371 PIIX (Triton) on PCI bus 0 function 57 Dec 1! 4 15:04:15 theRev kernel: ide0: BM-DMA at 0xffa0-0xffa7 Dec 14 15:04:15 theRev kernel: ide1: BM-DMA at 0xffa8-0xffaf Dec 14 15:04:15 theRev kernel: hda: Conner Peripherals 1275MB - CFS1275A, 1219MB w/64kB Cache, LBA, CHS=619/64/63 Dec 14 15:04:15 theRev kernel: hdb: Maxtor 84320A5, 4119MB w/256kB Cache, LBA, CHS=8928/15/63, DMA Dec 14 15:04:15 theRev kernel: hdc: , ATAPI CDROM drive Dec 15 11:58:06 theRev kernel: ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 Dec 15 11:58:06 theRev kernel: ide1 at 0x170-0x177,0x376 on irq 15 Dec 15 11:58:06 theRev kernel: Floppy drive(s): fd0 is 1.44M Dec 15 11:58:06 theRev kernel: Started kswapd v 1.4.2.2 Dec 15 11:58:06 theRev kernel: FDC 0 is a National Semiconductor PC87306 Dec 15 11:58:06 theRev kernel: md driver 0.35 MAX_MD_DEV=4, MAX_REAL=8 Dec 15 11:58:06 theRev kernel: PPP: version 2.2.0 (dynamic channel allocation) Dec 15 11:58:06 theRev kernel: TCP compression code copyright 1989 Regents of the University of California Dec 15 11:58:06 theRev! kernel: PPP Dynamic channel allocation code copyright 1995 Caldera, Inc. Dec 15 11:58:06 theRev kernel: PPP line discipline registered. Dec 15 11:58:06 theRev kernel: SLIP: version 0.8.4-NET3.019-NEWTTY (dynamic channels, max=256). Dec 15 11:58:06 theRev kernel: eth0: 3Com 3c900 Boomerang 10Mbps/Combo at 0xef00, 00:60:08:a4:3c:db, IRQ 10 Dec 15 11:58:06 theRev kernel: 8K word-wide RAM 3:5 Rx:Tx split, 10base2 interface. Dec 15 11:58:06 theRev kernel: Enabling bus-master transmits and whole-frame receives. Dec 15 11:58:06 theRev kernel: 3c59x.c:v0.49 1/2/98 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html Dec 15 11:58:06 theRev kernel: Partition check: Dec 15 11:58:06 theRev kernel: hda: hda1 hda2 hda3 Dec 15 11:58:06 theRev kernel: hdb: hdb1 hdb2 Dec 15 11:58:06 theRev kernel: VFS: Mounted root (ext2 filesystem) readonly. Dec 15 11:58:06 theRev kernel: Adding Swap: 16124k swap-space (priority -1) Dec 15 11:58:06 theRev kernel: EXT2-fs warning: maximal mou! nt count reached, running e2fsck is recommended Dec 15 11:58:06 theRev kernel: hdc: media changed Dec 15 11:58:06 theRev kernel: ISO9660 Extensions: RRIP_1991A Dec 15 11:58:07 theRev syslogd 1.3-3#17: restart. Dec 15 11:58:09 theRev diald[87]: Unable to open options file /etc/diald/diald.options: No such file or directory Dec 15 11:58:09 theRev diald[87]: No device specified. You must have at least one device! Dec 15 11:58:09 theRev diald[87]: You must define a connector script (option 'connect'). Dec 15 11:58:09 theRev diald[87]: You must define the remote ip address. Dec 15 11:58:09 theRev diald[87]: You must define the local ip address. Dec 15 11:58:09 theRev diald[87]: Terminating due to damaged reconfigure.

Las únicas partes de esto que resultan legibles para las personas normales son los mensajes de error y las advertencias. Y sin embargo, es notable que Linux no se detiene, o se viene abajo, cuando encuentra un error; escupe un gemido quejumbroso, abandona los procesos dañados, y sigue adelante. Decididamente, esto no era así en las primeras versiones de los sistemas operativos de Apple y Microsoft, por el sencillo motivo de que un sistema operativo que no es capaz de andar y mascar chicle a la vez no puede recobrarse de los errores. Buscar y solucionar errores requiere un proceso aparte que corra en paralelo al que ha fallado. Una especie de superego, si lo prefieren, que mantiene vigilados a los demás y entra en acción cuando uno se desvía. Ahora que MacOS y Windows pueden hacer más de una cosa a la vez se les da mucho mejor tratar con los errores que antes, pero no se aproximan siquiera a Linux o los demás sistemas Unix en este aspecto; y su mayor complejidad les ha hecho ! vulnerables a nuevos tipos de error.

Siguiente capítulo
Neal Stephenson: En el principio fue la línea de comandos