home.social

Search

1000 results for “VCDeV”

  1. Programmer with no time or will to exercise? Start developing for VR, and you will be forced to stand up and move for debugging purposes!

    youtube.com/watch?v=H9WJ_zWQIW

    #DevLog coming in the weekend :)

    #ParticularReality #bodytracking #buggy #motiontracking #mocap #gamedev #vrdev

  2. Wanted to post a quick #introduction before going to bed, as I cannot import my following list (says it's corrupted) and I don't want ppl to see an empty page.

    I'm PM, a #Disabled, #Ace and #Nonbinary #VNdev currently working on our #Amare/#Otome #GothicRomance #InBloodVN

    I love #Worldbuilding, #SciFi, #Robots, #NarrativeDrivenGames #PointandClick #AGs and more!

    Otherwise I spend my time dealing with my energy-zapping #ChronicIllness while trying to do #Disability and #Queer #Activism.

    #Youtube is my daily distraction, it's on almost all the time, either watching #LetsPlays, weird challenges, #BritishPanelShows or really anything not too shouty.

    Hmm, what more -
    #Environmentalist
    #CozyCrime
    #BritishCrime
    #LGBTQIA+
    #Geek

    I would post a pic of our game but I don't have the energy to alt-text all the characters, would you mind a link?

    scribbles.itch.io/inblood

  3. Recensione “Stranger Things 2” (2017)

    Il 2017 sarà ricordato come l’anno delle grandi attese. L’attesa per It ci ha tenuto in sospeso per anni, mentre quella per il nuovo episodio di Star Wars ci sta ancora attanagliando. Dalla scorsa estate però, per quanto riguarda le serie tv, c’è stato solo un titolo capace di farci sbavare dall’ansia dell’attesa: Stranger Things. Il seguito dell’acclamato prodotto Netflix firmato dai fratelli Duffer è finalmente arrivato e noi non vedevamo l’ora di vederlo e di parlarne. Prima di cominciare faccio presente che questo paragrafo introduttivo è assolutamente privo di spoiler, quando arriveremo in zona pericolo sarete ovviamente avvisati in tempo.

    Innanzitutto togliamoci questo dente, lo sapevamo già da un anno, ma è giusto dirlo: la seconda stagione non è e non poteva assolutamente essere all’altezza della prima. Non per fare paragoni, ma era davvero lapalissiano: nel 2016 Stranger Things è stato LA novità, il ritorno degli anni 80, il cinema della nostalgia, la scoperta di personaggi memorabili e molti altri elementi che hanno contribuito a rendere questa serie un punto di riferimento all’interno del panorama seriale. A questa seconda stagione, in quanto sequel, mancava proprio l’elemento di freschezza rappresentato dalla novità, uno dei punti di forza della first season. Ad ogni modo, a me è piaciuta: ve ne parlerò a partire dal prossimo paragrafo, così pieno di spoiler che se andrete avanti nella lettura senza aver visto la seconda stagione vi ritroverete automaticamente nel sottosopra. Io vi ho avvisato.

    La seconda stagione di Stranger Things comincia quasi un anno dopo i fatti della prima (Will Byers era sparito il 6 novembre dell’83, in questa stagione ci troviamo ad Halloween del 1984): nell’ultima sequenza Will, nel bagno di casa sua, sembrava non esser uscito totalmente dal Sottosopra. Se la prima stagione si poteva intendere come un film lungo 6 ore e mezza, questo secondo appuntamento con la serie sembra avvicinarla maggiormente ai canoni televisivi (dedicando addirittura un intero episodio alla fuga di Eleven). Non vado oltre con la trama perché se state leggendo queste righe significa che avrete già visto la seconda stagione: bentornati a Hawkins.

    KIDS
    I ragazzini terribili sono tornati. Stavolta c’è una Eleven di meno, all’incirca, ma c’è Will che è tornato nel gruppo. I quattro nerd (Mike, Dustin, Lucas e appunto Will) sono sempre l’elemento chiave del successo della serie e la lontananza di Eleven/Jane non è per niente un problema: renderà ancora più bello il suo ritorno in una splendida scena in cui la ragazzina arriva come un deus ex machina per salvare capra e cavoli (e tutti i suoi amici). Stavolta il gruppo si divide in più sottogruppi, se così si può dire: da una parte ci sono Mike e Will, ognuno alle prese con i suoi demoni (il primo con l’assenza di Elle, il secondo ospita il mostro del Sottosopra). Dall’altra Dustin e Lucas sono scatenati, anche a causa dello sconvolgimento emotivo portato dalla presenza della nuova arrivata Max, di cui parleremo dopo. Ad ogni modo il gruppetto di amici è sempre la garanzia di questa serie.

    ADOLESCENTI
    Si rinnova il triangolo tra Nancy, Steve e Jonathan. Nancy, anche e soprattutto a causa della morte di Barb (personaggio più sopravvalutato della serie, basta con ‘sta Barb!), scazza con Steve, che sparisce da questa “categoria” per ritrovarsi a badare ai ragazzi (in particolar modo a Dustin, Lucas e Max). Nancy e Jonathan si ritrovano nuovamente insieme e stavolta finiscono a letto, per la felicità dei fan della serie. Anche in questa categoria troviamo una new entry: Billy, il fratello di Max. Billy a parte, personaggio inutile anche se molto eighties, la parte sugli adolescenti funziona anche stavolta, per quanto si continuino a ripetere gli stessi schemi della prima stagione (triangolo amoroso, Nancy e Jonathan cercano risposte insieme, Steve in qualche modo cerca sempre di riscattarsi…).

    ADULTI
    Da questo punto di vista ci troviamo di fronte una grande new entry: Sean Astin. L’indimenticato Mickey de I Goonies è il compagno di Joyce (Winona Ryder) e il suo è davvero un grande ruolo, con la sua simpatia e ingenua dolcezza riuscirà infatti a risolvere più volte la situazione: interpreta la “mappa” di Will, salvando così la vita a Hopper, quindi riattiva l’elettricità nei laboratori permettendo a tutti quanti di fuggire. Winona è sempre “mamma coraggio” e si fa adorare per questo, Hopper invece stavolta è meno cool rispetto alla prima stagione: è diventato una sorta di “Sceriffo Extraterrestre”, infatti è praticamente diventato il padrino di Eleven, un po’ come Bud Spencer era il tutore di H725 nel film di Michele Lupo (il suo balletto di fronte a Eleven però è già cult). Tra gli altri, non male la presenza di Murray Bauman, il complottista che vede ovunque la minaccia russa. Diverte la mamma di Dustin, mentre i genitori di Mike come al solito sono inutili (anche se lo scambio tra la signora Wheeler e Billy è memorabile).

    NUOVI PERSONAGGI
    Di Bob abbiamo già parlato abbastanza: un grande personaggio per Sean Astin, che purtroppo è stato eliminato dalla serie troppo presto (ma immaginiamo che sia stato ucciso dagli autori anche per permettere a Joyce ed Hopper di finire finalmente insieme: nella prossima stagione vedremo se sarà così). Altro personaggio irresistibile è la piccola Erica, sorellina di Lucas: divertente e cinica al punto giusto, è una nuova linea comica perfettamente inserita nella storia e mai invadente. Murray Bauman risulterà decisivo per l’unione provvisoria di Nancy e Jonathan, oltre ad essere un personaggio interessante proprio per la sua vena complottista. Max, detta anche Mad Max, dalla firma che lascia nella classifica dei videogiochi, è uno dei personaggi più fichi tra quelli nuovi: il suo arrivo metterà scompiglio nel gruppetto dei ragazzini, Mike farà fatica ad accettarla perché la ritiene un surrogato di Eleven, Dustin e Lucas se la litigheranno (con l’ultimo che otterrà risultati decisamente migliori, nonostante le “perle irresistibili” di Dustin). Max rappresenta il profano di Stranger Things, lo scettico che si è avvicinato alla serie con colpevole ritardo e che fatica a cedere all’entusiasmo dei suoi amici. Allo stesso tempo è una ragazza divertente, piacevole, ma dal passato difficile. Tra l’altro essere una nuova arrivata in una scuola media la rende un’outsider: tutto ciò le permette di inquadrarsi perfettamente nel gruppo dei “perdenti” (strizzatina d’occhio a It). Al contrario il suo fratellastro Billy è un personaggio pressoché inutile: toglie a Steve lo scettro di “Re della scuola”, ma ai fini della trama non serve davvero a nulla. Infine citiamo Dart, l’animaletto di cui si prende cura Dustin: a mio parere non è stata una trovata irresistibile, anche se la sua trasformazione in democane è stata esaltante (in particolare la presenza di questi democani mi è piaciuta molto).

    ELEVEN
    Rispetto alla scorsa stagione la ragazzina speciale ha un ruolo marginale, anche se come al solito fondamentale. Il suo rapporto con Hopper non mi ha fatto impazzire e la sua linea narrativa è fin troppo zeppa di lungaggini (per quanto il ritrovamento della madre sia stato un momento davvero alto). Parlando di lungaggini non si può non citare in blocco l’intero Episodio 7, che è stato quello che ha creato più scalpore e senza dubbio malumore. Una puntata intera persa dietro ad una linea narrativa folle, che ha come unico scopo quello di restituire Eleven ai suoi amici dello scorso anno (a Mike in particolare). Scopriamo qui che il Dottor Brennan di Matthew Modine è ancora vivo, ne sapremo senz’altro di più nella prossima stagione. Come già detto prima, bellissimo il momento del suo ritorno (anche se l’abbigliamento alla Matrix mi ha lasciato alquanto interdetto).

    CITAZIONI
    Neanche a dirlo, anche in questa stagione le citazioni anni 80 sono uno dei punti forti della serie: i Ghostbusters e Indiana Jones stavolta sono forse i riferimenti più evidenti, ma come sempre ce ne sono a iosa. L’animaletto che Dustin si porta a casa non può non far pensare ai Gremlins, così come Will che, aprendo la porta di casa, ricorda da vicino il piccolo protagonista di Incontri Ravvicinati del Terzo Tipo (già citato ampiamente nella prima stagione). Per quanto riguarda gli horror, torna il riferimento a It (le cicatrici sulle mani di Nancy e Jonathan) ed è chiaro quello a L’Esorcista (quando Will viene liberato dal mostro che lo controlla). En passant, vanno citati ovviamente I Goonies (quant’è bello quando Sean Astin domanda se sotto la X si trova il tesoro dei pirati?), Mad Max e Jurassic Park che, pur non essendo un film degli anni 80, è comunque un cult di quella generazione. Se volete approfondire la faccenda non perdetevi il post dedicato a tutte le citazioni di Stranger Things!

    COLONNA SONORA
    Altro punto forte della serie. Non sarà una soundtrack spettacolare come quella della stagione precedente, ma anche qui abbiamo ottime chicche. Ho amato trovarmi Hammer to Fall dei Queen nello stereo della macchina di Steve ed è stato gagliardo chiudere la seconda puntata con il classico tema dei Ghostbusters, firmato da Ray Parker Jr. Ci sono gli Scorpions con Rock You Like a Hurricane e i DEVO con Whip It, Bon Jovi con Runaway e i Metallica con The Four Horsemen. Tra gli altri capisaldi degli ’80 non manca Time After Time di Cindy Lauper (autrice del tema dei Goonies, tra l’altro) e Every Breath You Take dei Police. Queste solo per citarne alcune.

    FINALE
    In conclusione, non si può non commentare il finale di stagione. Soddisfacente, senza dubbio: il laboratorio è stato smantellato, Barb ha avuto un funerale, l’entrata per il Sottosopra ricucita (questa scena non mi ha fatto impazzire devo dire), Dustin balla con Nancy (chiusura ideale di quella scena in cui un sorridente Dustin, nella prima puntata dello scorso anno, chiedeva a Nancy se voleva un po’ di pizza), Mike bacia Eleven, Lucas bacia Max, Will trova anche lui una dama e Hopper si fa una sigaretta nel parcheggio insieme a Joyce. Sotto di loro però il Mind Flyer incombe minaccioso su Hawkins. Forse non sarà stata una stagione all’altezza della prima, ma io non riesco a non sentirmi legato a questi personaggi e a queste atmosfere. Che ve lo dico a fare: non vedo l’ora della terza stagione.

    [Se l’articolo ti è piaciuto, offrimi un caffè o magari una colazione,
    una piccola mancia per aiutarmi a sostenere il sito!]

    #attori #canzoni #Cinema #citazioni #colonnaSonora #democani #film #mostro #Musica #Netflix #personaggi #ragazzi #soundtrack #spiegazione #storia #strangerThings #strangerThings2 #terzaStagione

  4. 26 dicembre 1965

    "Io non sono di proprietà di nessuno"

    Franca Viola rappresenta un simbolo di coraggio e cambiamento nella storia italiana recente, il suo rifiuto del matrimonio riparatore nel 1965 ha contribuito a smantellare una norma arcaica che perpetuava la violenza sulle donne.

    Negli anni Sessanta, in Sicilia, il matrimonio riparatore era previsto dall'articolo 544 del Codice Rocco: chi rapiva una donna a scopo di matrimonio poteva evitare la condanna sposandola, estinguendo il reato. Questa pratica rifletteva una cultura patriarcale che vedeva la donna come "proprietà" familiare, specialmente in contesti rurali e mafiosi come Alcamo, in provincia di Trapani.

    Franca Viola, una ragazza di 17 anni, sfidò questa logica con il suo "no", aprendo la strada alla legge Fortuna-Baslini del 1968 che abolì tale istituto.

    Ad Alcamo, negli anni '60, il clan Rimi dominava: Filippo Melodia, nipote del boss, incarnava quel mix di potere criminale e codici d'onore arcaici.

    Il 26 dicembre 1965, Filippo Melodia, ex fidanzato di Franca, irruppe nella casa della ragazza ad Alcamo con 12 complici, devastarono l'abitazione, aggredendo la madre che tentava di difenderla e rapirono anche il fratellino di 8 anni, poi rilasciato.

    Franca fu segregata per otto giorni in un casolare isolato e poi nella casa della sorella di Melodia: subì violenze fisiche, sessuali e fu lasciata a digiuno.

    Il giorno di Capodanno, i parenti di Melodia contattarono il padre di Franca per la "paciata", un incontro per imporre le nozze riparatorie. I genitori, in accordo segreto con la polizia, finsero di accettare e all'alba del 2 gennaio 1966, le forze dell'ordine fecero irruzione, liberando la ragazza e arrestando il rapitore e i complici.​

    A giugno del 1966, il tribunale di Alcamo processa Melodia per ratto, violenza carnale e legami mafiosi: il PM chiede oltre 22 anni. Condannato a 11 anni, esce nel 1976 ma muore assassinato nel 1978 vicino Modena, forse per vendette mafiose.

    Il "no" di Franca ispirò la legge 442/1968, abolendo il matrimonio riparatore e aprendo al divorzio (1970).

    Simbolo femminista, la sua storia educa generazioni su consenso e autonomia, specie in Sicilia dove mafia e patriarcato si intrecciano ancora.

    Oggi, a 76 anni, Franca vive serena con la sua famiglia, ma il suo coraggio resta indelebile.

    #palermo #panormus #alcamo #sicilia #sicily #italy #europe #world #picoftheday #picture #image #immagine #photo #photography #fotografia #storia #story #cultura #culture #arte #aspassoneltempo #aspassonellastoria #memorie #coraggio #lamafiaeunamontagnadimerda

  5. [New Tool] Live2D ATL for Ren'Py by Studio Instrumentality

    Animate Live2D model parameters using Ren'Py ATL.

    Get it on itch.io

    @[email protected]

    #RenPy #VNDev #IndieDev #Live2D

  6. I think my favorite part about being a #Writer more specifically a #GameWriter is that I make my stories as serious or as absurd as possible. For example, in my upcoming #VisualNovel #DatingSim Winning Hearts: Wrestling Otome, there are four love interests (3 male, one female). One lives in a flat with bright yellow, banana decor. Another is a talking #ProfessionalWrestling belt. 🤣

    #OtomeGame #Otome #Amare #VNDev #GameDev

  7. I made a quick #animation to demonstrate my method of synergizing #CharacterArt & #BackgroundArt by using the same darkest color throughout... in the darkness of the underworld, I envision these characters blending in and out of the shadows, so hopefully this method I've developed creates some visual and narrative harmony...

    #PixelArt #IndieDev #VisualNovel #WIP #DungeonOfDeparture #RenPy #PixelFed #Dungeon #Cave #Lighting #ColorTheory #IndieGame #VNdev #Tutorial #ShowYourWork

  8. My ZFS snapshot and replication setup on Ubuntu ft. sanoid and syncoid

    I have known about ZFS since 2009, when I was working for Sun Microsystems as a campus ambassador at my college. But it wasn’t until I started hearing Jim Salter (on the TechSNAP and 2.5 Admins podcasts) and Allan Jude (on the 2.5 Admins podcast) evangelize ZFS that I became interested in using it on my computers and servers. With Ubuntu shipping ZFS in the kernel for many years now, I had access to native ZFS!,

    Here is an overview of my setup running Ubuntu + ZFS before I explain and document some of the details.

    • cube – A headless server running Ubuntu 24.04 LTS (at the time of writing) with ZFS on root and a lot of ZFS storage powered by mirror vdevs. Has sanoid for automatic snapshots.
    • Desktops and laptops in my home run (K)Ubuntu (24.04 or later; versions vary) with encrypted (ZFS native encryption) ZFS on root and ZFSBootMenu. These computers also use sanoid for automatic snapshots.

    Sanoid configuration

    On my personal computers, I use a minimal sanoid configuration that looks like

    ############# datasets #############[zroot]        use_template = production        recursive = zfs############## templates ##############[template_production]        frequently = 0        hourly = 26        daily = 30        monthly = 3        yearly = 0        autosnap = yes        autoprune = yes[template_ignore]        autoprune = no        autosnap = no        monitor = no

    On servers, the sanoid configuration has some additional tweaks, like the following template to not snapshot replicated datasets.

    [template_backup]        frequently = 0        hourly = 36        daily = 30        monthly = 3        yearly = 0        # don't take new snapshots - snapshots        # on backup datasets are replicated in        # from source, not generated locally        autosnap = no

    Pre-apt snapshots

    While sanoid provides periodic ZFS snapshots, I also wanted to wrap apt transactions in ZFS snapshots for the ability to roll back any bad updates/upgrades. For this, I used the following shell script,

    #!/usr/bin/env bashDATE="$(/bin/date +%F-%T)"zfs snapshot -r zroot@snap_pre_apt_"$DATE"

    with the following apt hook in /etc/apt/apt.conf.d/90zfs-pre-apt-snapshot.

    // Takes a snapshot of the system before package changes.DPkg::Pre-Invoke {"[ -x /usr/local/sbin/zfs-pre-apt-snapshot ] && /usr/local/sbin/zfs-pre-apt-snapshot || true";};

    This handles taking snapshots before apt transactions but doesn’t prune the snapshots at all. For that, I used the zfs-prune-snapshots script (from https://github.com/bahamas10/zfs-prune-snapshots) in a wrapper cron shell (schedule varies per computer) script that looks like

    #!/bin/sh/usr/local/sbin/zfs-prune-snapshots \    -p 'snap_pre_apt_' \    1w 2>&1 | logger \    -t cleanup-zfs-pre-apt-snapshots

    Snapshot replication

    The cube server has sufficient disk space to provide a replication target for all my other personal computers using ZFS. It has a pool named dpool, which will be referenced in the details to follow.

    For automating snapshot replication, I chose to use syncoid from the same sanoid package. To avoid giving privileged access to the sending and the receiving user accounts, my setup closely follows the path in https://klarasystems.com/articles/improving-replication-security-with-openzfs-delegation/.

    On my personal computer, I granted my unprivileged (but has sudo 🤷‍♂️) local user account the hold and send permissions on the root dataset, zroot.

    sudo zfs allow send-user hold,send zrootzfs allow zroot---- Permissions on zroot --------------------------------------------Local+Descendent permissions:        user send-user hold,send

    On the cube server, I created an unprivileged user (no sudo permissions here 😌) and granted it the create,mount,receive permissions temporarily on the parent of the target dataset, dpool.

    Then I performed an initial full replication of a local snapshot by running the following commands as the unprivileged user.

    zfs send \  zroot@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostnamezfs send \  zroot/ROOT@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/ROOTzfs send \  zroot/ROOT/os-name@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \    dpool/local-hostname/ROOT/os-namezfs send \  zroot/home@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/home

    The -u flag in the zfs receive commands above will prevent it from trying to mount the remote dataset. The target remote dataset must not exist when running this initial full replication.

    As it is not a good practice to allow unprivileged users to mount filesystems, I disabled automatic mounting by running

    zfs set mountpoint=none dpool/local-hostname

    as the sudo user on the target server.

    Then I narrowed down the permissions of the receiving user to only its own dataset by running

    zfs unallow remote-user \  create,mount,receive dpoolzfs allow remote-user \  create,mount,receive dpool/local-hostname

    on the target server.

    Next, I tried to test the snapshot replication by running syncoid manually like

    syncoid -r \  --no-privilege-elevation \  --no-sync-snap \  zroot \  remote-user@cube:dpool/local-hostname

    and it replicated all the other snapshots all on the local datasets (we had only replicated one snapshot previously).

    The sanoid package in Debian and Ubuntu does not ship with a systemd timer for syncoid. So I created a user service and a timer that look like the following examples.

    # ~/.config/systemd/user/syncoid.service[Unit]Description=Replicate sanoid snapshots[Service]Type=oneshotExecStart=/usr/sbin/syncoid -r --no-privilege-elevation --no-sync-snap zroot remote-user@cube:dpool/local-hostname
    # ~/.config/systemd/user/syncoid.timer[Unit]Description=Run Syncoid to replicate ZFS snapshots to cube[Timer]OnCalendar=*:0/15Persistent=true[Install]WantedBy=timers.target

    Then I reloaded systemd, enabled and started the above timer to have everything working smoothly.

    #sanoid #snapshotReplication #syncoid #ZFS #zfsbootmenu

  9. My ZFS snapshot and replication setup on Ubuntu ft. sanoid and syncoid

    I have known about ZFS since 2009, when I was working for Sun Microsystems as a campus ambassador at my college. But it wasn’t until I started hearing Jim Salter (on the TechSNAP and 2.5 Admins podcasts) and Allan Jude (on the 2.5 Admins podcast) evangelize ZFS that I became interested in using it on my computers and servers. With Ubuntu shipping ZFS in the kernel for many years now, I had access to native ZFS!,

    Here is an overview of my setup running Ubuntu + ZFS before I explain and document some of the details.

    • cube – A headless server running Ubuntu 24.04 LTS (at the time of writing) with ZFS on root and a lot of ZFS storage powered by mirror vdevs. Has sanoid for automatic snapshots.
    • Desktops and laptops in my home run (K)Ubuntu (24.04 or later; versions vary) with encrypted (ZFS native encryption) ZFS on root and ZFSBootMenu. These computers also use sanoid for automatic snapshots.

    Sanoid configuration

    On my personal computers, I use a minimal sanoid configuration that looks like

    ############# datasets #############[zroot]        use_template = production        recursive = zfs############## templates ##############[template_production]        frequently = 0        hourly = 26        daily = 30        monthly = 3        yearly = 0        autosnap = yes        autoprune = yes[template_ignore]        autoprune = no        autosnap = no        monitor = no

    On servers, the sanoid configuration has some additional tweaks, like the following template to not snapshot replicated datasets.

    [template_backup]        frequently = 0        hourly = 36        daily = 30        monthly = 3        yearly = 0        # don't take new snapshots - snapshots        # on backup datasets are replicated in        # from source, not generated locally        autosnap = no

    Pre-apt snapshots

    While sanoid provides periodic ZFS snapshots, I also wanted to wrap apt transactions in ZFS snapshots for the ability to roll back any bad updates/upgrades. For this, I used the following shell script,

    #!/usr/bin/env bashDATE="$(/bin/date +%F-%T)"zfs snapshot -r zroot@snap_pre_apt_"$DATE"

    with the following apt hook in /etc/apt/apt.conf.d/90zfs-pre-apt-snapshot.

    // Takes a snapshot of the system before package changes.DPkg::Pre-Invoke {"[ -x /usr/local/sbin/zfs-pre-apt-snapshot ] && /usr/local/sbin/zfs-pre-apt-snapshot || true";};

    This handles taking snapshots before apt transactions but doesn’t prune the snapshots at all. For that, I used the zfs-prune-snapshots script (from https://github.com/bahamas10/zfs-prune-snapshots) in a wrapper cron shell (schedule varies per computer) script that looks like

    #!/bin/sh/usr/local/sbin/zfs-prune-snapshots \    -p 'snap_pre_apt_' \    1w 2>&1 | logger \    -t cleanup-zfs-pre-apt-snapshots

    Snapshot replication

    The cube server has sufficient disk space to provide a replication target for all my other personal computers using ZFS. It has a pool named dpool, which will be referenced in the details to follow.

    For automating snapshot replication, I chose to use syncoid from the same sanoid package. To avoid giving privileged access to the sending and the receiving user accounts, my setup closely follows the path in https://klarasystems.com/articles/improving-replication-security-with-openzfs-delegation/.

    On my personal computer, I granted my unprivileged (but has sudo 🤷‍♂️) local user account the hold and send permissions on the root dataset, zroot.

    sudo zfs allow send-user hold,send zrootzfs allow zroot---- Permissions on zroot --------------------------------------------Local+Descendent permissions:        user send-user hold,send

    On the cube server, I created an unprivileged user (no sudo permissions here 😌) and granted it the create,mount,receive permissions temporarily on the parent of the target dataset, dpool.

    Then I performed an initial full replication of a local snapshot by running the following commands as the unprivileged user.

    zfs send \  zroot@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostnamezfs send \  zroot/ROOT@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/ROOTzfs send \  zroot/ROOT/os-name@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \    dpool/local-hostname/ROOT/os-namezfs send \  zroot/home@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/home

    The -u flag in the zfs receive commands above will prevent it from trying to mount the remote dataset. The target remote dataset must not exist when running this initial full replication.

    As it is not a good practice to allow unprivileged users to mount filesystems, I disabled automatic mounting by running

    zfs set mountpoint=none dpool/local-hostname

    as the sudo user on the target server.

    Then I narrowed down the permissions of the receiving user to only its own dataset by running

    zfs unallow remote-user \  create,mount,receive dpoolzfs allow remote-user \  create,mount,receive dpool/local-hostname

    on the target server.

    Next, I tried to test the snapshot replication by running syncoid manually like

    syncoid -r \  --no-privilege-elevation \  --no-sync-snap \  zroot \  remote-user@cube:dpool/local-hostname

    and it replicated all the other snapshots all on the local datasets (we had only replicated one snapshot previously).

    The sanoid package in Debian and Ubuntu does not ship with a systemd timer for syncoid. So I created a user service and a timer that look like the following examples.

    # ~/.config/systemd/user/syncoid.service[Unit]Description=Replicate sanoid snapshots[Service]Type=oneshotExecStart=/usr/sbin/syncoid -r --no-privilege-elevation --no-sync-snap zroot remote-user@cube:dpool/local-hostname
    # ~/.config/systemd/user/syncoid.timer[Unit]Description=Run Syncoid to replicate ZFS snapshots to cube[Timer]OnCalendar=*:0/15Persistent=true[Install]WantedBy=timers.target

    Then I reloaded systemd, enabled and started the above timer to have everything working smoothly.

    #sanoid #snapshotReplication #syncoid #ZFS #zfsbootmenu

  10. My ZFS snapshot and replication setup on Ubuntu ft. sanoid and syncoid

    I have known about ZFS since 2009, when I was working for Sun Microsystems as a campus ambassador at my college. But it wasn’t until I started hearing Jim Salter (on the TechSNAP and 2.5 Admins podcasts) and Allan Jude (on the 2.5 Admins podcast) evangelize ZFS that I became interested in using it on my computers and servers. With Ubuntu shipping ZFS in the kernel for many years now, I had access to native ZFS!,

    Here is an overview of my setup running Ubuntu + ZFS before I explain and document some of the details.

    • cube – A headless server running Ubuntu 24.04 LTS (at the time of writing) with ZFS on root and a lot of ZFS storage powered by mirror vdevs. Has sanoid for automatic snapshots.
    • Desktops and laptops in my home run (K)Ubuntu (24.04 or later; versions vary) with encrypted (ZFS native encryption) ZFS on root and ZFSBootMenu. These computers also use sanoid for automatic snapshots.

    Sanoid configuration

    On my personal computers, I use a minimal sanoid configuration that looks like

    ############# datasets #############[zroot]        use_template = production        recursive = zfs############## templates ##############[template_production]        frequently = 0        hourly = 26        daily = 30        monthly = 3        yearly = 0        autosnap = yes        autoprune = yes[template_ignore]        autoprune = no        autosnap = no        monitor = no

    On servers, the sanoid configuration has some additional tweaks, like the following template to not snapshot replicated datasets.

    [template_backup]        frequently = 0        hourly = 36        daily = 30        monthly = 3        yearly = 0        # don't take new snapshots - snapshots        # on backup datasets are replicated in        # from source, not generated locally        autosnap = no

    Pre-apt snapshots

    While sanoid provides periodic ZFS snapshots, I also wanted to wrap apt transactions in ZFS snapshots for the ability to roll back any bad updates/upgrades. For this, I used the following shell script,

    #!/usr/bin/env bashDATE="$(/bin/date +%F-%T)"zfs snapshot -r zroot@snap_pre_apt_"$DATE"

    with the following apt hook in /etc/apt/apt.conf.d/90zfs-pre-apt-snapshot.

    // Takes a snapshot of the system before package changes.DPkg::Pre-Invoke {"[ -x /usr/local/sbin/zfs-pre-apt-snapshot ] && /usr/local/sbin/zfs-pre-apt-snapshot || true";};

    This handles taking snapshots before apt transactions but doesn’t prune the snapshots at all. For that, I used the zfs-prune-snapshots script (from https://github.com/bahamas10/zfs-prune-snapshots) in a wrapper cron shell (schedule varies per computer) script that looks like

    #!/bin/sh/usr/local/sbin/zfs-prune-snapshots \    -p 'snap_pre_apt_' \    1w 2>&1 | logger \    -t cleanup-zfs-pre-apt-snapshots

    Snapshot replication

    The cube server has sufficient disk space to provide a replication target for all my other personal computers using ZFS. It has a pool named dpool, which will be referenced in the details to follow.

    For automating snapshot replication, I chose to use syncoid from the same sanoid package. To avoid giving privileged access to the sending and the receiving user accounts, my setup closely follows the path in https://klarasystems.com/articles/improving-replication-security-with-openzfs-delegation/.

    On my personal computer, I granted my unprivileged (but has sudo 🤷‍♂️) local user account the hold and send permissions on the root dataset, zroot.

    sudo zfs allow send-user hold,send zrootzfs allow zroot---- Permissions on zroot --------------------------------------------Local+Descendent permissions:        user send-user hold,send

    On the cube server, I created an unprivileged user (no sudo permissions here 😌) and granted it the create,mount,receive permissions temporarily on the parent of the target dataset, dpool.

    Then I performed an initial full replication of a local snapshot by running the following commands as the unprivileged user.

    zfs send \  zroot@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostnamezfs send \  zroot/ROOT@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/ROOTzfs send \  zroot/ROOT/os-name@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \    dpool/local-hostname/ROOT/os-namezfs send \  zroot/home@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/home

    The -u flag in the zfs receive commands above will prevent it from trying to mount the remote dataset. The target remote dataset must not exist when running this initial full replication.

    As it is not a good practice to allow unprivileged users to mount filesystems, I disabled automatic mounting by running

    zfs set mountpoint=none dpool/local-hostname

    as the sudo user on the target server.

    Then I narrowed down the permissions of the receiving user to only its own dataset by running

    zfs unallow remote-user \  create,mount,receive dpoolzfs allow remote-user \  create,mount,receive dpool/local-hostname

    on the target server.

    Next, I tried to test the snapshot replication by running syncoid manually like

    syncoid -r \  --no-privilege-elevation \  --no-sync-snap \  zroot \  remote-user@cube:dpool/local-hostname

    and it replicated all the other snapshots all on the local datasets (we had only replicated one snapshot previously).

    The sanoid package in Debian and Ubuntu does not ship with a systemd timer for syncoid. So I created a user service and a timer that look like the following examples.

    # ~/.config/systemd/user/syncoid.service[Unit]Description=Replicate sanoid snapshots[Service]Type=oneshotExecStart=/usr/sbin/syncoid -r --no-privilege-elevation --no-sync-snap zroot remote-user@cube:dpool/local-hostname
    # ~/.config/systemd/user/syncoid.timer[Unit]Description=Run Syncoid to replicate ZFS snapshots to cube[Timer]OnCalendar=*:0/15Persistent=true[Install]WantedBy=timers.target

    Then I reloaded systemd, enabled and started the above timer to have everything working smoothly.

    #sanoid #snapshotReplication #syncoid #ZFS #zfsbootmenu

  11. My ZFS snapshot and replication setup on Ubuntu ft. sanoid and syncoid

    I have known about ZFS since 2009, when I was working for Sun Microsystems as a campus ambassador at my college. But it wasn’t until I started hearing Jim Salter (on the TechSNAP and 2.5 Admins podcasts) and Allan Jude (on the 2.5 Admins podcast) evangelize ZFS that I became interested in using it on my computers and servers. With Ubuntu shipping ZFS in the kernel for many years now, I had access to native ZFS!,

    Here is an overview of my setup running Ubuntu + ZFS before I explain and document some of the details.

    • cube – A headless server running Ubuntu 24.04 LTS (at the time of writing) with ZFS on root and a lot of ZFS storage powered by mirror vdevs. Has sanoid for automatic snapshots.
    • Desktops and laptops in my home run (K)Ubuntu (24.04 or later; versions vary) with encrypted (ZFS native encryption) ZFS on root and ZFSBootMenu. These computers also use sanoid for automatic snapshots.

    Sanoid configuration

    On my personal computers, I use a minimal sanoid configuration that looks like

    ############# datasets #############[zroot]        use_template = production        recursive = zfs############## templates ##############[template_production]        frequently = 0        hourly = 26        daily = 30        monthly = 3        yearly = 0        autosnap = yes        autoprune = yes[template_ignore]        autoprune = no        autosnap = no        monitor = no

    On servers, the sanoid configuration has some additional tweaks, like the following template to not snapshot replicated datasets.

    [template_backup]        frequently = 0        hourly = 36        daily = 30        monthly = 3        yearly = 0        # don't take new snapshots - snapshots        # on backup datasets are replicated in        # from source, not generated locally        autosnap = no

    Pre-apt snapshots

    While sanoid provides periodic ZFS snapshots, I also wanted to wrap apt transactions in ZFS snapshots for the ability to roll back any bad updates/upgrades. For this, I used the following shell script,

    #!/usr/bin/env bashDATE="$(/bin/date +%F-%T)"zfs snapshot -r zroot@snap_pre_apt_"$DATE"

    with the following apt hook in /etc/apt/apt.conf.d/90zfs-pre-apt-snapshot.

    // Takes a snapshot of the system before package changes.DPkg::Pre-Invoke {"[ -x /usr/local/sbin/zfs-pre-apt-snapshot ] && /usr/local/sbin/zfs-pre-apt-snapshot || true";};

    This handles taking snapshots before apt transactions but doesn’t prune the snapshots at all. For that, I used the zfs-prune-snapshots script (from https://github.com/bahamas10/zfs-prune-snapshots) in a wrapper cron shell (schedule varies per computer) script that looks like

    #!/bin/sh/usr/local/sbin/zfs-prune-snapshots \    -p 'snap_pre_apt_' \    1w 2>&1 | logger \    -t cleanup-zfs-pre-apt-snapshots

    Snapshot replication

    The cube server has sufficient disk space to provide a replication target for all my other personal computers using ZFS. It has a pool named dpool, which will be referenced in the details to follow.

    For automating snapshot replication, I chose to use syncoid from the same sanoid package. To avoid giving privileged access to the sending and the receiving user accounts, my setup closely follows the path in https://klarasystems.com/articles/improving-replication-security-with-openzfs-delegation/.

    On my personal computer, I granted my unprivileged (but has sudo 🤷‍♂️) local user account the hold and send permissions on the root dataset, zroot.

    sudo zfs allow send-user hold,send zrootzfs allow zroot---- Permissions on zroot --------------------------------------------Local+Descendent permissions:        user send-user hold,send

    On the cube server, I created an unprivileged user (no sudo permissions here 😌) and granted it the create,mount,receive permissions temporarily on the parent of the target dataset, dpool.

    Then I performed an initial full replication of a local snapshot by running the following commands as the unprivileged user.

    zfs send \  zroot@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostnamezfs send \  zroot/ROOT@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/ROOTzfs send \  zroot/ROOT/os-name@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \    dpool/local-hostname/ROOT/os-namezfs send \  zroot/home@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/home

    The -u flag in the zfs receive commands above will prevent it from trying to mount the remote dataset. The target remote dataset must not exist when running this initial full replication.

    As it is not a good practice to allow unprivileged users to mount filesystems, I disabled automatic mounting by running

    zfs set mountpoint=none dpool/local-hostname

    as the sudo user on the target server.

    Then I narrowed down the permissions of the receiving user to only its own dataset by running

    zfs unallow remote-user \  create,mount,receive dpoolzfs allow remote-user \  create,mount,receive dpool/local-hostname

    on the target server.

    Next, I tried to test the snapshot replication by running syncoid manually like

    syncoid -r \  --no-privilege-elevation \  --no-sync-snap \  zroot \  remote-user@cube:dpool/local-hostname

    and it replicated all the other snapshots all on the local datasets (we had only replicated one snapshot previously).

    The sanoid package in Debian and Ubuntu does not ship with a systemd timer for syncoid. So I created a user service and a timer that look like the following examples.

    # ~/.config/systemd/user/syncoid.service[Unit]Description=Replicate sanoid snapshots[Service]Type=oneshotExecStart=/usr/sbin/syncoid -r --no-privilege-elevation --no-sync-snap zroot remote-user@cube:dpool/local-hostname
    # ~/.config/systemd/user/syncoid.timer[Unit]Description=Run Syncoid to replicate ZFS snapshots to cube[Timer]OnCalendar=*:0/15Persistent=true[Install]WantedBy=timers.target

    Then I reloaded systemd, enabled and started the above timer to have everything working smoothly.

    #sanoid #snapshotReplication #syncoid #ZFS #zfsbootmenu

  12. My ZFS snapshot and replication setup on Ubuntu ft. sanoid and syncoid

    I have known about ZFS since 2009, when I was working for Sun Microsystems as a campus ambassador at my college. But it wasn’t until I started hearing Jim Salter (on the TechSNAP and 2.5 Admins podcasts) and Allan Jude (on the 2.5 Admins podcast) evangelize ZFS that I became interested in using it on my computers and servers. With Ubuntu shipping ZFS in the kernel for many years now, I had access to native ZFS!,

    Here is an overview of my setup running Ubuntu + ZFS before I explain and document some of the details.

    • cube – A headless server running Ubuntu 24.04 LTS (at the time of writing) with ZFS on root and a lot of ZFS storage powered by mirror vdevs. Has sanoid for automatic snapshots.
    • Desktops and laptops in my home run (K)Ubuntu (24.04 or later; versions vary) with encrypted (ZFS native encryption) ZFS on root and ZFSBootMenu. These computers also use sanoid for automatic snapshots.

    Sanoid configuration

    On my personal computers, I use a minimal sanoid configuration that looks like

    ############# datasets #############[zroot]        use_template = production        recursive = zfs############## templates ##############[template_production]        frequently = 0        hourly = 26        daily = 30        monthly = 3        yearly = 0        autosnap = yes        autoprune = yes[template_ignore]        autoprune = no        autosnap = no        monitor = no

    On servers, the sanoid configuration has some additional tweaks, like the following template to not snapshot replicated datasets.

    [template_backup]        frequently = 0        hourly = 36        daily = 30        monthly = 3        yearly = 0        # don't take new snapshots - snapshots        # on backup datasets are replicated in        # from source, not generated locally        autosnap = no

    Pre-apt snapshots

    While sanoid provides periodic ZFS snapshots, I also wanted to wrap apt transactions in ZFS snapshots for the ability to roll back any bad updates/upgrades. For this, I used the following shell script,

    #!/usr/bin/env bashDATE="$(/bin/date +%F-%T)"zfs snapshot -r zroot@snap_pre_apt_"$DATE"

    with the following apt hook in /etc/apt/apt.conf.d/90zfs-pre-apt-snapshot.

    // Takes a snapshot of the system before package changes.DPkg::Pre-Invoke {"[ -x /usr/local/sbin/zfs-pre-apt-snapshot ] && /usr/local/sbin/zfs-pre-apt-snapshot || true";};

    This handles taking snapshots before apt transactions but doesn’t prune the snapshots at all. For that, I used the zfs-prune-snapshots script (from https://github.com/bahamas10/zfs-prune-snapshots) in a wrapper cron shell (schedule varies per computer) script that looks like

    #!/bin/sh/usr/local/sbin/zfs-prune-snapshots \    -p 'snap_pre_apt_' \    1w 2>&1 | logger \    -t cleanup-zfs-pre-apt-snapshots

    Snapshot replication

    The cube server has sufficient disk space to provide a replication target for all my other personal computers using ZFS. It has a pool named dpool, which will be referenced in the details to follow.

    For automating snapshot replication, I chose to use syncoid from the same sanoid package. To avoid giving privileged access to the sending and the receiving user accounts, my setup closely follows the path in https://klarasystems.com/articles/improving-replication-security-with-openzfs-delegation/.

    On my personal computer, I granted my unprivileged (but has sudo 🤷‍♂️) local user account the hold and send permissions on the root dataset, zroot.

    sudo zfs allow send-user hold,send zrootzfs allow zroot---- Permissions on zroot --------------------------------------------Local+Descendent permissions:        user send-user hold,send

    On the cube server, I created an unprivileged user (no sudo permissions here 😌) and granted it the create,mount,receive permissions temporarily on the parent of the target dataset, dpool.

    Then I performed an initial full replication of a local snapshot by running the following commands as the unprivileged user.

    zfs send \  zroot@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostnamezfs send \  zroot/ROOT@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/ROOTzfs send \  zroot/ROOT/os-name@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \    dpool/local-hostname/ROOT/os-namezfs send \  zroot/home@snapshot-name | ssh \  remote-user@cube \  zfs receive -u \  dpool/local-hostname/home

    The -u flag in the zfs receive commands above will prevent it from trying to mount the remote dataset. The target remote dataset must not exist when running this initial full replication.

    As it is not a good practice to allow unprivileged users to mount filesystems, I disabled automatic mounting by running

    zfs set mountpoint=none dpool/local-hostname

    as the sudo user on the target server.

    Then I narrowed down the permissions of the receiving user to only its own dataset by running

    zfs unallow remote-user \  create,mount,receive dpoolzfs allow remote-user \  create,mount,receive dpool/local-hostname

    on the target server.

    Next, I tried to test the snapshot replication by running syncoid manually like

    syncoid -r \  --no-privilege-elevation \  --no-sync-snap \  zroot \  remote-user@cube:dpool/local-hostname

    and it replicated all the other snapshots all on the local datasets (we had only replicated one snapshot previously).

    The sanoid package in Debian and Ubuntu does not ship with a systemd timer for syncoid. So I created a user service and a timer that look like the following examples.

    # ~/.config/systemd/user/syncoid.service[Unit]Description=Replicate sanoid snapshots[Service]Type=oneshotExecStart=/usr/sbin/syncoid -r --no-privilege-elevation --no-sync-snap zroot remote-user@cube:dpool/local-hostname
    # ~/.config/systemd/user/syncoid.timer[Unit]Description=Run Syncoid to replicate ZFS snapshots to cube[Timer]OnCalendar=*:0/15Persistent=true[Install]WantedBy=timers.target

    Then I reloaded systemd, enabled and started the above timer to have everything working smoothly.

    #sanoid #snapshotReplication #syncoid #ZFS #zfsbootmenu

  13. @rasterweb until recently you couldn’t add a bare disk. You had to create a vdev with the new disk, and add the vdev to a storage pool.

    I believe vdev expansion came in with Electric Eel, so is relatively new (to TrueNAS, at least; it’s been in ZFS for a couple of years). Take a backup before proceeding #hereBeDragons 😀

    diskinternals.com/raid-recover

    forums.truenas.com/t/raidz-exp