Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Publicaciones sobre linux (publicaciones antiguas, página 20)

Owning a Pet Server in 2022 (Part 2)

Owning a Pet Server in 2022 (Part 2)

In part 1 I de­scribed why I want­ed this server, and some of the trade­offs and de­ci­sions I had to make to make it hap­pen and work nice­ly.

This is an up­date af­ter re­view­ing some of those de­ci­sion­s, and adding some more soft­ware.

Hardware Changes

  • I added a pow­ered hub. This makes the two-HDD sit­u­a­­tion much more man­age­able avoid­ing un­der­­volts that could harm the hard­ware. I used a cheap pow­ered USB HUB.

  • I tried us­ing a Pi 4 with 4GB of RAM, USB 3 and faster CPU and ... there was no per­­ceiv­able dif­fer­­ence in per­­for­­mance. So, it's back to a Pi 3B+ with 1GB of RAM.

Mem­o­ry us­age hov­ers around 500MB so no prob­lem there.

  • I will get a 4-­port white HUB and in­te­grate it in­to the case (or do a new case) at some point.

Software Changes

  • Moved all ser­vices to run dock­er­ized.

I was re­luc­tant at first, sus­pect­ing a per­for­mance im­pact. Well, it's neg­li­gi­ble and it makes run­ning things MUCH sim­pler.

Spe­cial h/t to lin­uxserv­er.io for their nice, qual­i­ty con­tain­er­s.

  • Added Hedge­­Doc a kick­­ass mark­­down ed­i­­tor / note-­­tak­ing ap­­pli­­ca­­tion / many oth­­er things. Us­ing it to write this!

  • Added FreeRSS as a re­­place­­ment for my us­age of In­­ore­ad­er.

  • Added Medusa, Tran­s­mis­­sion and Jel­­lyfin which com­bined turn in­­­to a nice "hey, I want to watch this TV show" so­lu­­tion.

  • THi­­sis in ad­di­­tion to a we­b­site, gitea and mux­imux to give a uni­­fied fron­­tend to ev­ery­thing.

How does it perform?

I can be stream­ing a video via Jel­lyfin (with transcod­ing) and read­ing news on FreshRSS with nice re­sponse times, and mem­o­ry us­age hov­ers around 500M­B, which CPU load is around 4.

So, I think this is about as far as I can push it, but it's a lot of func­tion­al­i­ty for a tiny, cheap, home serv­er.

Owning a Pet Server, in 2022

Introducción

El pén­du­lo más len­to de la tec­no­lo­gía es el que se mue­ve en­tre la cen­tra­li­za­ción y lo dis­tri­bui­do. To­ma años o dé­ca­das pa­ra os­ci­la­r. Por eso al­gu­na vez tu­vi­mos com­pu­ta­do­ras con ter­mi­na­les bo­ba­s, y des­pués com­pu­ta­do­ras per­so­na­le­s, que fui­mos con­vir­tien­do en ter­mi­na­les de in­ter­ne­t, que es adon­de es­ta­mos aho­ra.

Tal vez pa­rez­ca que no se va a mo­ver de ahí, pe­ro así se sen­tía tam­bién las ve­ces an­te­rio­res. Tal vez os­ci­le, tal vez no, quién sa­be, no soy fu­tu­ró­lo­go, pe­ro yo lo voy a mo­ver un po­qui­to, pa­ra mí, en un área es­pe­cí­fi­ca: no es­toy con­ten­to con que mis da­tos vi­van prin­ci­pal­men­te en gran­jas de ser­vers que tie­nen due­ños que no son yo.

Así que en vez de te­ner mis da­tos vi­vien­do en un ser­vi­dor "ga­na­do" en una gran­ja de ser­vi­do­res, aho­ra vi­ven prin­ci­pal­men­te en un ser­vi­dor mas­co­ta, en ca­sa.

Les pre­sen­to a ... pi­nk­y.

Foto de una pequeña compu de plástico blanco

Pi­nky no te va a asom­brar con sus ca­rac­te­rís­ti­ca­s, es tal vez el ser­ver prác­ti­co más len­to po­si­ble.

  • Ras­pbe­rry Pi 3b+, 1GB de RAM
  • tar­je­ta 16­GB SD
  • 2x500­GB HDD (es­pe­ja­do)

Pe­ro es más que su­fi­cien­te pa­ra al­gu­nos ti­pos es­pe­cí­fi­cos de tra­ba­jo que ne­ce­si­to. En es­te do­cu­men­to voy a tra­tar de ex­pli­car por qué los quie­ro ha­ce­r, des­cri­bir­lo­s, ex­pli­car las li­mi­ta­cio­nes y el pro­ce­so que me lle­vó a la de­ci­sión de adop­tar es­ta so­lu­ció­n.

Software

Una de las co­sas más im­por­tan­tes acá es Gi­tea.

Es di­fí­cil exa­ge­rar co­mo cam­bia las co­sas pa­ra un ti­po es­pe­cí­fi­co de usua­rio: Gi­tea ha­ce que te­ner tu ser­vi­dor de git sea fá­cil y ba­ra­to.

¿Y qué? pre­gun­ta­rá al­guno.

Bue­no, un ser­ver git es útil co­mo ba­ckend pa­ra mu­chas co­sas úti­le­s, aún si no te in­te­re­sa ha­cer de­sa­rro­llo de so­ftwa­re (que a mí si me in­te­re­sa).

Pass

Por ejem­plo, su­po­né­te que que­rés ma­ne­jar tus pro­pias pa­sswor­d­s, en vez de con­fiar en un ser­vi­cio de ter­ce­ro­s. Una ma­ne­ra de ha­cer­lo es usar pa­ss que es una im­ple­men­ta­ción open sour­ce so­por­ta­da por ca­si to­dos los bro­w­ser­s, apli­ca­cio­nes de es­cri­to­rio, ter­mi­na­les y que se yo.

Pe­ro si te­nés más de un dis­po­si­ti­vo ... ¿có­mo sin­cro­ni­zás tus pa­sswor­ds en­tre ello­s? Sí, usan­do un ser­ver gi­t.

Chezmoi

Y sí, uso más de una com­pu. Ten­go una en ca­sa, una en la ofi­ci­na, otra pa­ra tra­ba­ja­r, y me es­toy ha­cien­do al­gu­nas ca­se­ras con ras­pbe­rry pis, y quie­ro que al­gu­nas co­sas fun­cio­nen de la mis­ma ma­ne­ra en to­das ella­s.

Chez­moi Es una im­ple­men­ta­ción del con­cep­to de do­tfi­le­s.

Bá­si­ca­men­te le de­cís que ma­ne­ja al­gu­nos de tus ar­chi­vos de con­fi­gu­ra­ció­n, los que se guar­dan ver­sio­na­dos y com­par­ti­dos en­tre tus com­pus usan­do ... si, un ser­ver gi­t.

Me lle­vó un po­co de es­fuer­zo pa­ra de­jar­lo en un es­ta­do usa­ble, pe­ro creo que aho­ra le es­tá agre­gan­do va­lor a mis com­pus.

Mi Sitio

Si, ya sé, muy 2003. Pe­ro bue­no, a mí me sir­ve. Una ubi­ca­ción cen­tral pa­ra:

  • Co­sas que es­cri­bo (co­mo es­ta)
  • Li­bros que leo y co­men­to, via goodrea­ds
  • Vi­deos que ha­go, via you­tu­be

De nue­vo, una de las me­tas es que mis da­tos son míos así que to­das esas lis­tas de li­bro­s, co­men­ta­rios y ca­li­fi­ca­cio­nes y de­más ... ¿Por qué de­be­rían es­tar so­lo en goodrea­d­s? ¿Y si Ama­zon lo cie­rra?

Co­mo pue­do es­cri­bir so­ftwa­re, lo aga­rro to­do y lo pon­go en mi si­tio, y lis­to. Y cual es el lu­gar don­de es­tá to­do eso ... sí, un re­po gi­t, que se buil­dea y de­plo­yea au­to­má­ti­ca­men­te.

Acla­ra­ció­n: mi si­tio es­tá prin­ci­pal­men­te en una VPS que pa­go pa­ra otra co­sa, pe­ro hay un es­pe­jo en ho­me.­ral­si­na.­me que es­tá, efec­ti­va­men­te en pi­nk­y.

Gateway a la VPN de mi oficina / casa

Es­tos ser­vi­cios ne­ce­si­tan ac­ce­der­se des­de al­gu­na par­te. Usan­do unos ge­ne­ro­sos ser­vi­cios gra­tui­tos de fly y [tailsca­le])(h­ttp­s://­tailsca­le.­co­m) mas un po­co de es­fuer­zo de con­fi­gu­ra­ción pue­do, des­de cual­quie­ra de mis com­pus o mi ce­lu­la­r, ac­ce­der a to­dos los de­má­s, no im­por­ta don­de es­tén siem­pre y cuan­do ten­gan al­gún ti­po de co­ne­xión a in­ter­ne­t.

Hardware

¿Por qué ESTE hardware?

Por­que ya lo te­nía.

  • La ras­pbe­rry jun­ta­ba tie­rra des­de pro­yec­tos an­te­rio­res.
  • Dos HDD de 500­GB que me re­ga­la­ron o de no­te­books vie­ja­s.

Tu­ve que com­prar 2 ca­bles US­B-S­ATA (mas o me­nos 1000 pe­so­s) y un ca­ble mi­cro­-usb mas lin­do (200 pe­so­s) por­que era lin­do.

Performance

¿Es len­to, pe­ro ... es len­to?

La ras­pbe­rry pi 3b+ tie­ne 4 co­res, así que pue­de eje­cu­tar gi­tea, un web ser­ver y al­gu­nas otras co­sas sin pro­ble­ma.

Tam­bién es USB 2.0, así que el ac­ce­so a dis­co es ... len­ti­to.

Por otro la­do, la ma­yor par­te del tiem­po ac­ce­do a co­sas chi­cas (un git pu­ll es muy efi­cien­te) o por un en­la­ce len­to (30M­bp­s) así que el cue­llo de bo­te­lla ca­si nun­ca va a ser el dis­co.

Una co­sa es­pe­cí­fi­ca que no tie­ne sen­ti­do en es­te ser­ver es es­pe­ja­do por RAI­D, por­que el te­ner que ha­cer los wri­tes dos ve­ces lo ha­ría to­do más len­to.

So­lu­ció­n: apa­go uno de los dis­cos (a­sí no se gas­ta) y lo pren­do a la no­che pa­ra ba­cku­pear el ser­ve­r.

Adi­cio­nal­men­te una vez por se­ma­na sa­co el dis­co se­cun­da­rio y lo co­pio offsi­te.

Electricidad

A to­do lo que da, mi co­si­to USB pa­ra me­dir el con­su­mo que com­pré por un dó­lar (no le creo mu­cho) di­ce que pue­de lle­gar a usar 1.1A a 5v así que en pro­me­dio es­tá usan­do al­go co­mo 4W.

Con mi bo­le­ta de EDE­NO­R, eso es apro­xi­ma­da­men­te 10 cen­ta­vos de dó­lar al me­s.

La Carcaza

Aga­rré una car­ca­za "s­lee­ve" pa­ra ras­pbe­rr­y, 2 car­ca­zas "s­lee­ve" pa­ra dis­cos de 2.5, las pe­go­teé con pa­ra­le­le­pí­pe­do­s, im­pri­mí to­do en la im­pre­so­ra 3D más ba­ra­ta que pue­de com­prar el di­ne­ro. Salió bár­ba­ro.

Co­mo es una Pi 3 y no una Pi 4 so­por­ta cooling pa­si­vo sin pro­ble­ma­s. Las car­ca­zas de los HDD los im­pri­mí a 50% in­fi­ll pa­ra que amor­ti­güen un po­co el rui­do. Se es­cu­cha a ve­ces un cli­ck de los dis­co­s, pe­ro es bá­si­ca­men­te si­len­cio­so.

Tam­bién es chi­quiti­to, mas o me­nos 10­cm en ca­da di­men­sió­n.

Conclusión

Lle­va un mes an­dan­do (sin la car­ca­za, eso es nue­vo) sin pro­ble­ma­s. Tie­ne up­da­tes au­to­má­ti­cos de so­ftwa­re pa­ra to­do, y si se lle­ga a rom­per al­go no pa­sa na­da, pue­do es­tar días sin el ser­ve­r.

En re­su­men, lo ca­li­fi­co co­mo un éxi­to ro­tun­do.

El server mas barato del universo

Intro

Es­ta es la his­to­ria de co­mo te­ner tu pro­pio ser­ver de apps we­b, de la ma­ne­ra más ba­ra­ta, sen­ci­lla y fun­cio­na­l.

Su­pon­ga­mos que por el mo­ti­vo que fue­ra uno tie­ne al­gu­nas apps que quie­re usar. En mi ca­so, di­ga­mos que son do­s:

  • Gi­­tea: al­­go co­­­mo tu pro­­­pio Gi­­tHu­­b. ¿Por qué? Po­r­­que es­­tá bien ser due­­ño de tus pro­­­pios da­­to­­s, me pa­­re­­ce. En­­to­n­­ces quie­­ro te­­ner la PO­­­SI­­BI­­LI­­DAD de te­­ner mi pro­­­pio se­r­­ve­­r. Ta­m­­bién pe­r­­mi­­te clo­­­nar el re­­po a Gi­­tHub así que no pe­r­­dés na­­da.

  • Mi si­­tio: Po­r­­que, de nue­­vo, lo que yo es­­cri­­bo es mío, y por qué no lo voy a te­­ner yo en vez de po­­­ne­r­­lo en Me­­dium o al­­gún otro si­­tio ma­­li­g­no. Apa­r­­te, lo ten­­go ha­­ce más de 20 año­­s, no voy a pa­­rar aho­­­ra.

Pe­ro po­dría ser cual­quier co­sa! Una app que es­tás ha­cien­do, al­go que que­rés pro­ba­r, Own­Cloud o lo que se te can­te, si sos el ti­po de nerd que quie­re te­ner su pro­pia app/­si­tio ... se pue­de.

Así que va­mos a cons­trui­r, des­de ce­ro, to­do lo ne­ce­sa­rio pa­ra po­der ac­ce­der a esos si­tio­s/a­pp­s.

Level 1: self hosting

Si que­rés te­ner tus pro­pias app­s, en­ton­ces vas a ne­ce­si­tar har­dwa­re en el cual eje­cu­tar­la­s. Cuál es la com­pu­ta­do­ra de uso ge­ne­ral más ba­ra­ta a la cual se pue­de ac­ce­der que tie­ne al­gún ti­po de re­d?

Una Ras­pbe­rry Pi Ze­ro W ... sa­le 10 dó­la­res, si se pu­die­se con­se­gui­r, cla­ro. Pe­ro bue­no, yo ten­go una. O sei­s. la que voy a usar se lla­ma pi­nk­y.

Si no te­né­s, o no que­rés una de es­as, po­dés usar cual­quier co­sa que ten­ga Li­nu­x. O Win­do­ws. O Ma­cO­S, pe­ro yo lo hi­ce con Li­nu­x, así que me­jor si usás Li­nux por aho­ra. Pue­de ser li­te­ral­men­te cual­quier com­pu no hay com­pu muy len­ta pa­ra es­to.

O sí, de­pen­dien­do de lo que quie­ras po­ner ahí, pe­ro pro­ba­ble­men­te cual­quier com­pu sir­va.

No voy a en­trar en de­ta­lle­s, pe­ro ins­ta­lá lo que sea que que­rés ha­cer an­da­r, y ha­ce­lo an­da­r. En mi ca­so la de­fi­ni­ción de "an­da" es:

  • Gi­tea: pue­do ac­ce­der a http://­pi­nk­y.­lo­ca­l:3000 y ver gi­tea an­dan­do.
  • Mi si­tio: pue­do ac­ce­der a http://­pi­nk­y.­lo­ca­l:8000 y ver mi si­tio.

Así que bus­cá las ins­truc­cio­nes pa­ra lo que que­rés y ha­cé­lo an­da­r, che.

Si po­dés ac­ce­der y usar­lo des­de la mis­ma red en la que es­tá tu ser­ve­r? Lis­to. Le­vel UP.

Level 2: remote access

¿Pe­ro que pa­sa si que­rés ac­ce­der a ese si­tio y no es­tás en la mis­ma re­d?

Bue­no, no an­da. Ob­vio que http://­pi­nk­y.­lo­ca­l:3000 so­lo an­da en la red lo­cal así que va­mos a so­lu­cio­nar­lo.

Hay va­rias ma­ne­ra­s, pe­ro voy a mos­trar la que quie­ro mos­tra­r: tailsca­le, en par­ti­cu­la­r, la ver­sión gra­tis, pa­ra una per­so­na.

¿Qué es tailsca­le? Es una VP­N.

En par­ti­cu­la­r, es una VPN "per­so­na­l". Si te re­gis­trás y lo ins­ta­lás en un par de má­qui­nas crea una red que co­nec­ta am­bas má­qui­nas en­tre sí, aun­que esas má­qui­nas no es­tén en la mis­ma red fí­si­ca.

Así que si uno ins­ta­la tailsca­le en el ser­ver (en mi ca­so se­ría pi­nk­y) y en la má­qui­na que uso to­do el tiem­po (en mi ca­so sal­ma) ... en­ton­ces esas má­qui­nas siem­pre pue­den ver­se usan­do nom­bres es­pe­cia­les que te da tailsca­le.

Tailscale dashboard

Si ha­go cli­ck en una de las má­qui­nas me da in­for­ma­ción so­bre ella.

Tailscale machine details

Y ahí podemos ver que pinky también tiene otro nombre, que le da tailscale: pinky.ralsina.github.beta.tailscale.net

No in­ten­ten ac­ce­der­la por­que no fun­cio­na a me­nos que us­te­des es­tén en mi VPN y no lo es­tán ni lo van a es­tar :-)

¡Pe­ro yo sí!

gitea via tailscale

Tal vez es­to sea su­fi­cien­te. En es­te mo­men­to po­dés ac­ce­der a tus ser­vers des­de cual­quier la­do mien­tras ten­gas co­ne­xión a la VPN de tailsca­le. Ni­ce!

Pe­ro ... y si quie­ro que ac­ce­da más gen­te? En­ton­ces LE­VEL UP.

Level 3: Ingress Rules

Nue­va­men­te hay va­rias ma­ne­ras de dar­le a ter­ce­ros ac­ce­so a tu ser­ve­r. Pe­ro yo te voy a mos­trar una que me gus­ta a mí: fl­y.io

Fl­y.io es una em­pre­sa que te da la po­si­bi­li­dad de eje­cu­tar "co­sas" en má­qui­nas vir­tua­les "gra­tis" den­tro de cier­tos lí­mi­tes. En par­ti­cu­la­r, no más de 160­GB al me­s, des­pués te co­bran.

Así que ... ima­gi­ne­mos que una de esas VMs es­tu­vie­ra co­nec­ta­da a nues­tra VPN de tailsca­le.

Y que es­tá eje­cu­tan­do un pro­xy in­ver­so de ma­ne­ra que cual­quie­ra pue­de co­nec­tar­se a esa má­qui­na vir­tual que ha­ría de in­ter­me­dia­rio y ex­pon­dría nues­tro ser­ver pa­ra que se pue­da ac­ce­der des­de afue­ra? Eh?

Bue­no. Acá es­tá la do­cu­men­ta­ción ne­ce­sa­ria pa­ra co­nec­tar una VM de fl­y.io a nues­tra VP­N.

Y acá es­tá mi ver­sión, que ins­ta­la un Ngi­nx

Mo­di­fi­cá el ngi­n­x.­conf pa­ra que man­de las co­sas adon­de vos que­rés que va­yan.

Por ahora no sería posible usar dos hostnames distintos (después vemos) y el server_name debería ser el hostname público que te da fly.io, por ejemplo en mi caso eso era white-wave-7409.fly.dev

dashboard de fly.io

Una vez he­cho eso de­be­rías po­der ac­ce­der a uno de tus ser­vi­cios usan­do ese hos­tna­me:

Mi sitio funcionando en esa URL

Nó­te­se que es­tá co­nec­ta­do via HTTP­S, por­que fl­y.io en rea­li­dad tie­ne un pro­xy "mas afue­ra" que ha­ce la ter­mi­na­ción HTTP­S, así que no ne­ce­si­ta­mos crear cer­ti­fi­ca­dos ni na­da.

Y con eso te­ne­mos un si­tio we­b, ac­ce­si­ble des­de cual­quier dis­po­si­ti­vo co­nec­ta­do a In­ter­ne­t, y es gra­tis por los pri­me­ros 160­GB! Mi­sión cum­pli­da!

Pe­ro que pa­sa si que­re­mos una URL más bo­ni­ta? Por ejem­plo, yo quie­ro que Gi­tea es­té en gi­t.­ral­si­na.­me y mi si­tio en ho­me.­ral­si­na.­me ...

Bue­no, si que­rés eso, LE­VEL UP.

Level 4: Custom DNS

Co­mo siem­pre, hay mu­chas ma­ne­ras de re­sol­ver­lo. Pe­ro es­ta es la que yo uso. Clou­dfla­re da DNS gra­tis. Si te­nés un do­mi­nio, lo con­fi­gu­rás pa­ra que use clou­dfla­re de DNS y lis­to.

Si no te­nés un do­mi­nio, com­prá o con­se­guí uno, que se yo.

Una vez que lo te­né­s, y lo con­fi­gu­ras­te en Clou­dfla­re o en el ser­ver de DNS que más te gus­te ... con­fi­gu­rá to­dos los CNA­ME que quie­ra­s.

Yo en par­ti­cu­lar hi­ce do­s:

CNAMEs en cloudflare

Tan­to gi­t.­ral­si­na.­me co­mo ho­me.­ral­si­na.­me apun­tan al nom­bre que me dió fl­y.io (whi­te-wa­ve-7409.­fl­y.­de­v), así que aho­ra "re­suel­ven" así:

> host git.ralsina.me
git.ralsina.me is an alias for white-wave-7409.fly.dev.
white-wave-7409.fly.dev has address 37.16.0.181
white-wave-7409.fly.dev has IPv6 address 2a09:8280:1::6:3716

Si usás clou­dfla­re, tie­nen que es­tar co­mo "D­NS On­l­y"

El si­guien­te pa­so es in­for­mar a fl­y.io que va­mos a ma­ne­jar esos nom­bres a tra­vés nues­tra app con es­tos co­man­dos (cam­biar co­mo co­rres­pon­da) en la má­qui­na don­de ma­ne­ja­mos nues­tra app de fl­y.io

> flyctl certs create git.ralsina.me
> flyctl certs create home.ralsina.me

Cam­bia­mos nue­va­men­te la con­fi­gu­ra­ción de ngi­nx pa­ra que en­víe ca­da ser­vi­cio don­de co­rres­pon­da en ba­se al ser­ver na­me y ya es­tá. Con es­to te­ne­mos to­do fun­cio­nan­do.

¿Qué lo­gra­mo­s?

  • Ser­vers ac­ce­si­bles des­de cual­quier la­do: Gi­tea y Mi si­tio
  • Ser­vi­cios co­rrien­do en la com­pu más ba­ra­ta del mun­do
  • Con URLs lin­das
  • Gra­tis
  • Sin con­fi­gu­ra­r/a­gu­je­rear fi­rewa­lls

Creo que na­die tie­ne pu­bli­ca­da una guía pa­ra lo­grar to­do es­to, oja­lá le sir­va a al­guien.

Booting a Raspberry Pi Zero without a SD card

I have been work­ing on a many-rasp­ber­ries clus­ter, and one of the parts I want­ed to get right is set­ting up rasp­ber­ry pi ze­ros to boot with­out any stor­age.

So, I doc­u­ment­ed it. It's all here: http­s://github.­com/ralsi­na/ze­ro-n­f­s­root

The perfect Raspberry Pi setup

I am do­ing some semi-se­ri­ous Rasp­ber­ry Pi de­vel­op­men­t, so it was time I fig­ured out how to do it com­fort­ably.

My desk­top set­up is a two-­mon­i­tor con­fig­u­ra­tion, with my note­book on the ta­ble and a larg­er mon­i­tor above it. I like it, it's nice. The point­er nat­u­ral­ly goes from one screen to the oth­er in the ob­vi­ous way.

Desktop setup

Spe­cial­ly nice is that the lap­top's screen is touch and has an ac­tive pen, so I can use it nat­u­ral­ly.

But now, with the Rasp­ber­ry, I want to oc­ca­sion­al­ly show its dis­play. And that means switch­ing the mon­i­tor to it. Since I hate plug­ging and un­plug­ging things, I use one of the­se:

HDMI switch

It's a cheap tiny black plas­tic box that takes up to 5 HD­MI in­puts and switch­es be­tween them to its one out­put by click­ing a but­ton. It on­ly goes through the in­puts that have sig­nal, so since I on­ly have the lap­top's and the Pi's the but­ton tog­gles be­tween them.

If your mon­i­tor has more than one HD­MI in­put you can prob­a­bly just use that, but mine has just one.

But... what about key­board and mouse?

I could get a mul­ti­de­vice key­board and mouse, but I like the ones I have.

I could use a USB switch and tog­gle be­tween the two de­vices, but ... I don't have one.

So, I use bar­ri­er and con­fig­ure it in both the rasp­ber­ry pi and in the lap­top so that when my point­er goes "up" in­put goes to the Pi, and when it goes "down" in­put goes to the lap­top. That's ex­act­ly the same as with the du­al-dis­play se­tup, but with two com­put­er­s. Neat!

So, go ahead and con­fig­ure bar­ri­er. It's easy and there are tons of tu­to­ri­al­s.

Nex­t, make sure bar­ri­er starts when I lo­gin in­to both com­put­er­s. They way I pre­fer to do these things is us­ing sys­temd.

Put this in ~/.local/share/systemd/user/barrier.service in both machines:

[Unit]
Description=Barrier server
[Service]
Environment=DISPLAY=:0
Type=simple
TimeoutStartSec=0
ExecStart=/usr/bin/barrier
[Install]
WantedBy=default.target

Now you can make it start with systemctl --user start barrier or stop with systemctl --user stop barrier and make it start on every login with systemctl --user enable barrier

But while this is nice, it presents a prob­lem. When I am us­ing both dis­plays for the lap­top, I don't want bar­ri­er run­ning! Since I can't see the Pi's dis­play, it makes no sense.

So, I want to start bar­ri­er when the lap­top is us­ing one mon­i­tor, and stop it when it's us­ing two.

To do that, the trick is udev in the laptop. Put this (replacing my username with yours) in /etc/udev/rules.d/90-barrier.rules:

ACTION=="change", \
    KERNEL=="card0", \
    SUBSYSTEM=="drm", \
    ENV{DISPLAY}=":0", \
    ENV{XAUTHORITY}="/home/ralsina/.Xauthority", \
    ENV{XDG_RUNTIME_DIR}="/run/user/1000", \
    RUN+="/home/ralsina/bin/monitors-changed"

Basically that means "when there is a change in the configuration of the video card, run monitors-changed. Change the 1000 by your user ID, too.

The last piece of the puzzle is the monitors-changed script:

if `xrandr --listmonitors | grep -q HDMI`
then
    # The HDMI output is connected, stop barrier
    su ralsina -c '/usr/bin/systemctl stop --user barrier'
else
    # The Pi is using the monitor, start barrier
    su ralsina -c '/usr/bin/systemctl start --user barrier'
fi

And that's it!

This is the be­hav­iour now:

  • When the lap­­top is us­ing both dis­­­plays, they work nor­­mal­­ly in a "ex­­tend­ed dis­­­play" con­­fig­u­ra­­tion. They be­have like a sin­­gle large screen.

  • When I click on the HD­­MI switch and change the top dis­­­play to show the Pi's desk­­top, au­­to­­mat­i­­cal­­ly bar­ri­er starts in the lap­­top, and now the point­er and key­board change from one com­put­er to the oth­­er when the point­er moves from one mon­i­­tor to the nex­t.

  • If I click on the HD­­MI switch again, bar­ri­er stops on the lap­­top and I have a sin­­gle two-screen desk­­top again.

Ev­ery­thing be­haves per­fect­ly and I can switch be­tween com­put­ers by click­ing a but­ton.

Al­ter­na­tive­ly, we could start the bar­ri­er client when the rasp­ber­ry pi "get­s" the dis­play, and stops it when it goes away. The re­sult should be the same ex­cept for some cor­ner cas­es, but it has the added ben­e­fit of al­low­ing for a set­up with up to 5 de­vices :-)


Contents © 2000-2023 Roberto Alsina