Introducción a Plan 9

Plan 9 de los Laboratorios Bell es un sistema de investigación desarrollado en los laboratorios Bell a finales de 1980s. Sus diseñadores originales son Ken Thompson, Rob Pike, Dave Presotto y Phil Winterbottom.

A fines de la década de 1990, el nuevo propietario de Bell Labs, Lucent Technologies, abandonó el soporte comercial para el proyecto y en 2000, se distribuyó una tercera versión bajo una licencia de código abierto. Un cuarto lanzamiento bajo una nueva licencia de software libre se produjo en 2002. En 2015, se produjo el último lanzamiento oficial final de Plan 9.

Una comunidad de usuarios y desarrolladores, que incluía personal actual y anterior de Bell Labs, produjo versiones derivada, como 9Legacy y 9Front.

En 2021, el desarrollo se reanudó tras la transferencia de los derechos de autor de Bell Labs a la Fundación Plan 9.

Arquitectura de Plan 9

El sistema puede parecer tentador a los usuarios de unix, pero extraño al mismo tiempo.

Plan 9 es un kernel de sistema operativo, pero también una colección de software que lo acompaña. La mayoría del software es predominantemente nuevo, escrito para Plan 9 en vez de importar de Unix u otros sistemas. El sistema de ventanas, compiladores, servidor de archivos y servicios de red fueron escritos para Plan 9. Aunque programas clásicos de Unix, como dc, ed incluso troff han sido incluidos, pero actualizados, por ejemplo para manejar UTF-8 como hace el resto del sistema.

Plan 9 es un sistema distribuido capaz de usar diferentes tipos de recursos y servidores distribuidos a través de casi cualquier red. requiere pocos recursos comparado a la mayoría de los sistemas.

Todos los recursos en Plan 9 son presentados como archivos (en oposición a Unix, donde casi todo son archivos, pero no todos los archivos son verdaderos archivos y el sistema utiliza un método común para acceder a todos los recursos. (9P Styx).

Instalación de Plan 9

(4th edition 2015, última publicada por Bell Labs)

  • Inicia desde el CD-ROM
  • Selecciona 1. Install Plan 9 from this CD
  • Selecciona [yes] cuando el instalador pregunte por DMA. solo si tienes problemas durante la instalación, deberías seleccionar ‘no’
  • Enseguida el instalador pregunta por el puerto del mouse, si tienes un mouse USB ignora la pregunta. No podrás usar el mouse durante la instalación, pero no hay problema.
  • El instalador pregunta por la resolución de la tarjeta VGA. El default esta bien para la instalación, puedes cambiar esto una vez que el sistema esté instalado.
  • Rio la intefáz gráfica de Plan 9 debe iniciar.
  • Selecciona el sistema de archivos, [configfs] (fossil) o venti. Fosil esta bien.
  • Edita la tabla de partición del disco duro [partdisk]
  • Selecciona el dispositivo [sdc)] o el que diga Hard Disk.
  • Escribe 'y' para instalar mbr
  • Enseguida se ejecuta fdisk, este automáticamente crea (pero no escribe) una partición para Plan 9, si encuentra espacio libre suficiente. Escribe 'w' para guardar la tabla de particiones y 'q' para salir de fdisk
  • En [prepdisk] subdivide la partición recién creada [/dev/sdC0/plan9]. Igual que en fdisk usa 'w’ y 'q’ para guardar y salir
    • p9fat, debe ser la primera partición del disco
    • nvram
    • fossil
    • swap
  • Formato del sistema de archivos [fmtfossil]. Selecciona el default [/dev/sdC0/fossi]
  • En [mountfs] selecciona la partición fossil que acabas de fromatear.
  • configdist, pregunta por la localización del archivo de la distribución; como estas instalando desde el CD, selecciona 'local
  • mountdist explora los dispositivos y te da una lista de los dispositivos donde encuentra el archivo de la distribución. Escribe /dev/sdD0/data' o el que esté descrito como (iso9660 cdrom)
  • Enseguida el instalador pregunta cual directorio contiene los archivos de la distribución, y te pone en el shell rc solo escribe exit y presiona ****.
  • Una vez que el archivo de la distribución es localizado, inicia la tarea [copydist].
  • [bootsetup] configura el disco duro para iniciar Plan 9, cuando te pregunte; especifica la partición del disco duro /dev/sdC0/9fat
  • En Enable boot method escribe plan9
  • En Install the Plan 9 master boot record, escribe y
  • La instalación ha terminado, re-inicia la PC y saca el CD-ROM para que Plan 9 inicie desde el disco duro
  • Cuando el bootloader pida el usuario, usa glenda (9legacy no pregunta el usuario)

9front

  • bootargs, `local!/dev/sdE2/data
  • user glenda
  • vgasize
  • monitor vesa
  • mouse ps2
  • inst/start

Inicia el servidor de autenticación para continuar la instalción en drawterm en caso de usar una máquina virtual o VNC.

echo 'key proto=dp9ik dom=p9 user glenda !password=secret' \
    > /mnt/factotum/ctl
aux/listen1 -t tcp!*!rcpu /rc/bin/service/tcp17019

Inicia la instalación con inst/start

Al finalizar la instalación continua agregando un usuario después de reiniciar.

Después de agregar el nuevo usuario reinicia y ejecuta sys/lib/newuser para inicializar el directorio del usuario.

Para que el receptor de CPU se inicie al arrancar, basta con configurar el parámetro service= en plan9.ini:

service=cpu

Configuración del arranque sin intervención

Durante el arranque, el sistema solicitará varios parámetros, como la partición del disco que se va a montar, el nombre de usuario y la contraseña, y posiblemente otros. Esto supone un problema para los servidores con CPU, que suelen arrancar a ciegas, sin nadie presente en la consola para confirmar los valores predeterminados. En su lugar, queremos especificar y confirmar estos parámetros por adelantado.

Primero, queremos omitir el mensaje de bootargs que nos pide seleccionar la partición desde la que arrancar. Esto se consigue cambiando la clave de plan9.ini “bootargs=” a “nobootprompt=”; el valor permanece igual.

bootargs=local!/dev/sdF0/fscache
# cambiar a:
nobootprompt=local!/dev/sdF0/fscache

A continuación, almacenaremos las credenciales de autenticación del propietario del host. Estas deben almacenarse en la NVRAM, que en los sistemas PC es simplemente una pequeña partición de disco. Podemos escribir en ella con el comando auth/wrkey(8).

NOTA: Asegúrese de introducir la información correcta cuando se le solicite. Es muy común escribir mal la contraseña o especificar un dominio de autenticación o incluso un nombre de usuario incorrecto, lo que puede causar problemas muy difíciles de diagnosticar posteriormente. Esta misma información se solicitará más adelante al crear un usuario de autenticación y configurar el servidor de autenticación.

NOTA 2: Si ha seguido el paso 1, es mejor especificar explícitamente la partición NVRAM en la que desea escribir. En PC, se utiliza un proceso automático para encontrar una partición adecuada. Es muy probable que este proceso se equivoque. Utilice la variable de entorno nvram= para seleccionar la partición correcta:

// TODO

Configuración del servidor de autenticación

Ya casi hemos terminado y estamos listos para reiniciar, pero casi ninguna de las configuraciones anteriores funcionará sin que se ejecute un servidor de autenticación.

Primero, debemos asegurarnos de que el proceso del servidor de autenticación se inicie durante el arranque. Esto se realiza automáticamente mediante el procedimiento de arranque de la CPU si detecta que debe ser el servidor de autenticación. Para ello, añadimos una entrada en la base de datos de red del sistema que asocia la máquina (el servidor de autenticación) con el dominio de autenticación al que prestará servicio.

Añadimos la siguiente entrada en una línea independiente del archivo /lib/ndb/local, sustituyendo el dominio por un dominio o una cadena de su elección:

auth=dum authdom=a-b.xyz

Esto asocia la máquina llamada dum con el dominio de autenticación a-b.xyz. Recordemos que este era el mismo authdom: que almacenamos en la NVRAM de la máquina con auth/wrkey.

NOTA: Esta entrada es independiente del resto del archivo. No la añada ni a la entrada ipnet= ni a la línea sys=.

En el siguiente reinicio, la máquina dum identificará que se supone que es un servidor de autenticación e iniciará los servicios necesarios para actuar como tal.

Ahora podemos agregar usuarios al servidor de autenticación. Para ello, inicie un keyfs(4) temporal y luego use el comando auth/changeuser(8) para agregar usuarios:

// TODO

El paso final consiste en permitir que nuestro nuevo usuario “hable por” otros usuarios. Esto es necesario si el propietario del host de la máquina que ejecuta el servidor de autenticación no es glenda, como es el caso.

Simplemente agregue la siguiente entrada al archivo /lib/ndb/auth:

// TODO

Reiniciar

// tODO

Tras reiniciar, la máquina debería iniciarse automáticamente y permitirle conectarse mediante drawterm o rcpu.

Videos de Instalación

Virtualización de Plan 9

KVM (Gnome Boxes)

9front

Se pueden utilizar los dispositivos VirtIO, el CDROM aparece como /dev/sdE2 y el disco duro como /dev/sdF0

Plan 9 y 9legacy

Asegurate de configurar el disco duro como el primer dispositivo en el controllador IDE.

<devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
        <disk type="file" device="disk">
            <driver name="qemu" type="qcow2" discard="unmap"/>
            <source
                file="/home/<user>/.local/share/libvirt/images/linux2016.qcow2"/>
            <target dev="hda" bus="ide"/>
                <address type="drive" controller="0"
            bus="0" target="0" unit="0"/>
        </disk>
        <disk type="file"
            device="cdrom">
            <driver name="qemu"
                type="raw"/>
            <target dev="hdb"
                bus="ide"/>
            <readonly/>
            <address
                type="drive"
                controller="0"
                bus="0"
                target="0"
                unit="1"/>
        </disk>
        <controller
            type="usb"
            index="0"
            model="ich9-ehci1">
            <address
                type="pci"
                domain="0x0000"
                bus="0x00"
                slot="0x05"
                function="0x7"/>
        </controller>
            <controller
            type="ide"
            index="0">
            <address
                type="pci"
                domain="0x0000"
                bus="0x00"
                slot="0x01"
                function="0x1"/>
        </controller>
</devices>

Qemu

Ejecutar qemu como root o con privilegios elevados (sudo).

qemu-img create -f qcow2 plan9.qcow2 2G
sudo qemu-system-i386 -m 2G -hda plan9.qcow2 \
    -cdrom ../Downloads/plan9.iso \
    -net nic -net tap,ifname=tap1,script=no -boot d
sudo qemu-system-i386 -m 2G -hda plan9.qcow2 \
    -cdrom ../Downloads/plan9.iso \
    -net nic -net tap,ifname=tap1,script=no -boot d

VirtualBox

  • VirtualBox 5.0.8
  • 512 MB RAM, 8 GB Disco Duro
  • SoundBlaster 16
  • Intel PRO/1000 MT Server Bridged

Drawterm

Drawterm es el emulador de la terminal de Plan9.

drawterm -c 192.168.0.10 -a 192.168.0.10 -u glenda
# o
drawterm -h 192.168.0.10 -a 192.168.0.10 -u glenda

Administración del Sistema

Sistemas de Archivos

Montar dispositivos de alamacenamiento en una nueva sesión de cpu/drawterm.

bind -a '#S' /dev

rimport

rimport -u youruser -p 9p.sdf.org / /n/sdf
srv -t tcp!9p.sdf.org!17019 sdf
mount /srv/sdf /n/sdf
bind -a /n/sdf/amd64/bin /bin

SDF may drop idle 9P connections. To keep it “hot” while you’re working in a Drawterm session, you can run a simple “keep-alive” in a hidden window or a background task: Code snippet

@{ while(sleep 300) { ls /n/sdf >/dev/null } } &

Estructura de Directorios

TODO

Procesos

TODO

Shell

TODO

Editores de Texto

sam

TODO

acme

TODO

Gráficos

Lista los modos vesa soportados y configura a 1024x768x24.

aux/vga -m vesa -p
aux/vga -m vesa -l 1024x768x24

Configura Regional

Inicia sesión como 'adm

cp /adm/timezone/Mexico_General /adm/timezone/local

Configuración de Red

⚠ Estos 3 pasos son temporales y se pierden si el sistema reinicia, para hacerlos permanentes; agregalos en el archivo /rc/bin/termrc

ip/ipconfig -g 192.94.73.1 ether /net/ether0 YOUR_IP 255.255.255.0
echo 'key proto=p9sk1 dom=plan9 user=glenda !password=YOUR_PASSWORD' >/mnt/factotum/ctl
aux/listen1 -t tcp!*!ncpu /bin/cpu -R & # PLan9/9legacy

Configuración DNS

echo 'ip=<YOUR_IP> sys=<YOUR_SYSNAME> dom=<YOUR_FQDN> dns=<DNS_IP>' >> /lib/ndb/local

ndb/cs es un servidor utilizado por para traducir nombres de red. Se inicia junto con el sistema.

ndb/dns le sirve a ndb/cs y sistemas remotos traduciendo nombres de dominio de Internet. La opción -r indica que actúa solo como resolver: envía consultas recursivas pidiendo a otros servidores completar la búsqueda.

ndb/cs
ndb/dns -r
mkdir /cfg/<sysname>
dircp /cfg/example /cfg/<sysname>
chmod 750 /cfg/<sysname>/*rc
ip/ipconfig -g <YOUR_GATEWAY> ether /net/ether0 <YOUR_IP> <YOUR_NETMASK>
ndb/cs
ndb/dns -r

echo 'hwaccel off' > /dev/vgactl

Configuración IP

Configuración automática de la red

ip/ipconfig
cat /net/ndb

Configuración manual de la red

/lib/ndb/local

database=
	file=/lib/ndb/local
	file=/lib/ndb/common

auth=sources.cs.bell-labs.com authdom=outside.plan9.bell-labs.com

ip=127.0.0.1 sys=localhost dom=localhost
ip=<YOUR_IP> sys=<YOUR_SYSNAME> dom=<YOUR_FQDN> dns=<DNS_IP>

Agregar nuevo usuario

Firmado como glenda ejecuta los comandos siguientes para crear un usuario del sistema.

Plan 9 / 9legacy

con -l /srv/fscons
uname <usuario> <usuario>
uname sys +<usuario>

9front

con -C /srv/cwfs.cmd
uname <usuario>
uname sys +<usuario>
uname adm +<usuario>
uname upas +<usuario>

Para salir de fscons presiona CTRL+\ <ENTER> y escribe q en el indicador >>>

Copiar directorio de glenda

dircp /usr/glenda /usr/newuser

Hacer usuario administrador

con -l /srv/fscons
prompt: uname sys +<usuario>

La primera vez que el usuario accede al sistema, ejecuta el siguiente comando para poblar su directorio.

/sys/lib/newuser

Autenticación

echo 'key proto=p9sk1 dom=plan9me user=glenda !password=secret' >/mnt/factotum/ctl
aux/listen1 -t tcp!*!ncpu /bin/cpu -R &

Actualiza Plan 9

-c previene que la actualización modificque cambios locales.


9fs sources
pull -c /rc/bin/termrc

Correo Electrónico

Crear mailbox

upas/nedmail -c

IMAPS e-mail

echo 'key proto=pass server=mx.sdf.org service=imap user=ecelis !password=<SOMEPASSWD>' >> /mnt/factotum/ctl
aux/listen1 -t tcp!*!ncpu /bin/cpu -R &
upas/fs -f/<proto>/<mail.server.address>/<username>
upas/fs impas: server certificate 22471E10D5C1E41768048EF5567B27F532F33 not recognized
upas/fs: opening mailbox: bad server certificate
echo 'x509 sha1=22471E10D5C1E41768048EF5567B27F532F33' > /sys/lib/tls/mail

IRC

Plan 9 cuenta con varios clientes de irc

En 9p.sdf.org está instalado ircrc

irc.libera.chat

  • #plan9 - Para debates sobre Plan 9. Enlace
  • #inferno - Para debates sobre Inferno y Limbo.
  • #plan9-gsoc - Para debates específicos sobre la participación de Plan 9 en el Summer of Code de Google.

orc.oftc.net

  • #cat-v - Para debates sobre 9front, werc y otros proyectos de cat-v.org.

irc.sdf.org

  • #plan9

ircrc

ircrc se conecta por default a irc.oftc.net, pero puedes especificar el servidor de tu preferencia.

ircrc irc.sdf.org

No toma comandos completos (/join), usa solo la primera letra de cada comando:

Comando Acción
/j /JOIN
/m /PRIVMSG
/n /NICK
/q cmd Envía en comando directo al servidor IRC
/t target Fija el canal en que hablas
/x /QUIT

Aplicaciones

Para instalar contrib

9fs sources
/n/sources/contrib/fgb/root/rc/bin/contrib/install fgb/contrib

Software marcado con fbg's contrib se instala:

contrib/install <user>/<package>

Dependencias básicas

contrib/install fgb/z
contrib/install fgb/bz2
contrib/install fgb/openssl

mercurial y ptyon

contrib/install bichued/python
contrib/install bichued/hg

Escritorio (Rio)

Captura de Pantalla

cat /dev/screen > screenshot

Conversión a PNG

cat /dev/screen > screenshot | topng > screenshot.png

Conversión a JPG

tojpg < /dev/window > window.jpg

Paginador

man hget | page

Web

TODO

Utilerias

lsrupd Script para hacer copia de /n/sources, no disponible donde la wiki deice que debe estar.

switch($#*) {
	case 2
		basehier=$1^/;
		basedort=$2^/;
	case *
		echo usage: lsrupd to from >[1=2]
		exit
}

ramfs;


begin=`{date};
echo $begin;
cd $basehier;
lsr -dt > /tmp/lsr;
if(! test -e $basedort^lsr) {
	echo -n creating other lsr ...;
	cd $basedort;
	lsr -dt > /tmp/lsr.dort;
	echo done;
}
if not {
	cp $basedort^lsr /tmp/lsr.dort;
}
comm -3 /tmp/lsr /tmp/lsr.dort | @{
	while() {
		next=`{awk '{print $1; exit;}'};
		if(~ $next './') {
			next=`{awk '{print $1; exit;}'};
		}
		if(~ $next `) {
			exit
		}

		echo -n trying: $next ...;

		hier=$basehier^$next;
		dort=$basedort^$next;

		hasfiles=0;
		isdirectory=0;
		hierexist=0;
		if( test -e $hier) {
			hierexist=1;
			if( test -d $hier) {
				hasfiles=1;
				dirfiles=`{ls $hier};
				if(~ $dirfiles `)
					hasfiles=0;
			}
		}
		dortexist=1;
		if( ! test -e $dort)
			dortexist=0;
		if( ~ $hierexist 1 && ~ $dortexist 0) {
			if(! ~ $hasfiles 1) {
				echo rm $hasfiles : $next;
				rm -rf $hier;
			}
		}
		if not {
			if( ~ $dortexist 1) {
				dortnewer=0;
				if( test $dort -nt $hier) {
					dortnewer=1;
					if(! ~ $hasfiles 1) {
						echo rm $hasfiles : $next;
						rm -rf $hier;
					}
				}
				if( test -d $dort) {
					if( ~ $dortnewer 1 || ~ $hierexist 0) {
						mkdir -p $hier;
						echo mkdir: $next;
					}
				}
				if not {
					if( ~ $dortnewer 1 || ~ $hierexist 0) {
						base=`{basename -d $hier};
						if( ! test -e $base) {
							mkdir -p $base;
							echo mkdir: $next;
						}
						if( ! test -r $dort) {
							echo touch: $next;
							touch $hier;
						}
						if not {
							echo fcp $dortnewer $hierexist : $next;
							fcp -x $dort $hier;
						}
					}
				}
			}
		}
		echo done;
	}
}
echo started: $begin;
echo ended: `{date};

unmount /tmp;

Solución de Problemas

Para solucionar el problema de la conexión de rcpu

  1. Verificar el servidor de conexión (cs)

El error “cs: can’t translate address” significa que el servidor de conexión no sabe cómo asignar “cpu.domain.tld” a una IP y un puerto de servicio. Puedes omitir cs manualmente para comprobar si se trata de un problema de DNS escribiendo directamente en el dispositivo cs:

cat /net/cs
echo 'net!9p.sdf.org!ticket' > /net/cs
cat /net/cs
  1. accesibilidad del servidor de autenticación

Para comprobar si el sistema puede acceder específicamente al servidor de autenticación (que rcpu requiere para la autenticación), puede usar ndb/dnsquery para garantizar que la IP se resuelva correctamente en el entorno de Plan 9:

ndb/dnsquery
> 9p.sdf.org

Si funciona, intente hacer ping al puerto de autenticación específico (normalmente el 567) mediante dial:iiiiiiiiiiiii

/bin/ip/dial tcp!9p.sdf.org!567
  1. Actualizar /lib/ndb/local

Si cs presenta problemas, suele ser útil definir explícitamente el servidor de autenticación SDF en la base de datos de la red local para que Plan 9 no tenga que adivinar. Agregue esto a /lib/ndb/local:

auth=9p.sdf.org authdom=9p.sdf.org

Luego, fuerce una actualización de la base de datos:

ndb/csquery
  1. Marcación directa con rcpu

A veces, rcpu tiene problemas con el nombre simbólico si la configuración de DNS en /lib/ndb/local no es correcta. Intente forzar el protocolo en el comando rcpu:

rcpu -h tcp!9p.sdf.org

Referencias