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’ -
mountdistexplora 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
exity 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
- 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
- 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
- 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
- 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
