Χρήστος Μαργιώλης: τεχνολογία Χρήστος Μαργιώλης https://margiolis.net/gr/tags/%CF%84%CE%B5%CF%87%CE%BD%CE%BF%CE%BB%CE%BF%CE%B3%CE%AF%CE%B1/ Σεττάρισμα CPU server στο 9front https://margiolis.net/gr/w/9front_cpu/ Mon, 07 Mar 2022 00:00:00 +1200 <p>Τα περιεχόμενα του <code>/net/ndb</code> θα είναι χρήσιμα κατά την διάρκεια όλης της διαδικασίας, οπότε έχετέ τα ορατά σε κάποιο άλλο παράθυρο:</p> <pre tabindex="0"><code>; ip/ipconfig ; cat /net/ndb ip=192.168.1.152 ipmask=255.255.255.0 ipgw=192.168.1.3 sys=cirno dns=192.168.1.1 dns=192.168.1.1 </code></pre><h2 id="ρυθμίσεις-εκκίνησης">Ρυθμίσεις εκκίνησης</h2> <p>Το <code>9fat</code> partition περιέχει το kernel, bootloader, καθώς και τις ρυθμίσεις εκκίνησης. Εισάγετε τις παρακάτω γραμμές στο <code>plan9.ini</code>. Σιγουρευτείτε ότι οι τιμές ταιριάζουν στις δικές σας ρυθμίσεις:</p> <pre tabindex="0"><code>; 9fs 9fat ; cd /n/9fat ; cat &gt;&gt; plan9.ini user=glenda cpu=192.168.1.152 auth=192.168.1.152 authdom=someauth service=cpu ^D </code></pre><p>Ο <code>user</code> είναι κάτι σαν τον root χρήστη στα συστήματα UNIX, τα <code>cpu</code> και <code>auth</code> ορίζουν τις διευθύνσεις IP των CPU και auth servers αντίστοιχα, το <code>authdom</code> είναι το domain name του server, και το <code>service=cpu</code> ξεκινάει τον CPU listener κατά την εκκίνηση.</p> <p>Επειδή θέλουμε το 9front να bootάρει αυτόματα, το prompt <code>bootargs</code> πρέπει να προσπεραστεί. Για να το κάνετε αυτό, αλλάξτε την μεταβλητή <code>bootargs</code> (οι τιμές της μπορεί να είναι διαφορετικές) στο <code>plan9.ini</code>:</p> <pre tabindex="0"><code>bootargs=local!/dev/sdE0/fs # change to... nobootprompt=local!/dev/sdE0/fs -m 291 -A -a tcp!*!564 </code></pre><h2 id="auth-server">Auth server</h2> <p>Ορίστε όνομα και κωδικό για τον διαχειριστή του auth server &mdash; τα <code>authid</code> και <code>authdom</code> πρέπει να ταιριάζουν με αυτά του <code>plan9.ini</code>:</p> <pre tabindex="0"><code>; auth/wrkey bad nvram des key bad authentication id bad authentication domain authid: glenda authdom: someauth secstore key: password: &lt;your_pass&gt; </code></pre><p>Ορίστε τον κωδικό της <code>glenda</code>. Αυτός <em>πρέπει</em> να είναι ίδιος με αυτόν που ορίσατε στο wrkey(8). Πάντα να τρέχετε το keyfs(4) προτού επεξεργάζεστε κλειδιά:</p> <pre tabindex="0"><code>; auth/keyfs ; auth/changeuser glenda Password: &lt;your_pass&gt; Confirm password: &lt;your_pass&gt; assign new Inferno/POP secret? [y/n]: y make it the same as Plan 9 password? [y/n]: y Expiration date (YYYYMMDD or never)[never]: Post id: User&#39;s full name: Department #: User&#39;s email address: user glenda installed for Plan 9 ; auth/enable glenda </code></pre><h2 id="βάση-δεδομένων-δικτύου">Βάση δεδομένων δικτύου</h2> <p>Εισάγετε τις παρακάτω γραμμές στο <code>/lib/ndb/local</code> (προσοχή στις λεπτομέρειες, ειδικά στο <code>ip=</code>):</p> <pre tabindex="0"><code>; cat &gt;&gt; /lib/ndb/local authdom=someauth auth=192.168.1.152 ipnet=iphome ip=192.168.1.0 ipmask=255.255.255.0 ipgw=192.168.1.3 auth=192.168.1.152 authdom=someauth fs=192.168.1.152 cpu=192.168.1.152 dns=192.168.1.1 ^D </code></pre><p>Το <code>ipnet</code> μπορεί να είναι οτιδήποτε.</p> <p>Συγχρονίστε τις αλλαγές και επανεκκινήστε το σύστημα:</p> <pre tabindex="0"><code>; echo sync &gt;&gt; /srv/hjfs.cmd ; fshalt -r </code></pre><h2 id="μετά-την-επανεκκίνση">Μετά την επανεκκίνση</h2> <p>Ενεργοποιήστε το δίκτυο:</p> <pre tabindex="0"><code>; bind -a &#39;#l0&#39; /net ; ip/ipconfig ; ip/ipconfig ether /net/ether0 </code></pre><p>Συνδεθείτε στον server με την χρήση του drawterm ως <code>glenda</code>:</p> <pre tabindex="0"><code>$ drawterm -u glenda cpu[cpu]: 192.168.1.152 auth[192.168.1.152]: glenda@someauth dp9ik password: &lt;your_pass&gt; </code></pre><p>Ξεκινήστε τον rio(1):</p> <pre tabindex="0"><code>cpu% rio -s -i riostart </code></pre><p>Το <code>/cfg/$sysname/cpustart</code> περιέχει εντολές οι οποίες τρέχουν κατά την εκκίνηση. Μπορείτε να προσθέσετε οτιδήποτε θέλετε εκεί &mdash; εγώ θα βάλω τις εντολές που τρέξαμε μετά την επανεκκίνηση για να κάνω την ζωή μου πιο εύκολη:</p> <pre tabindex="0"><code>; mkdir /cfg/$sysname ; cat &gt; /cfg/$sysname/cpustart bind -a &#39;#l0&#39; /net ip/ipconfig ip/ipconfig ether /net/ether0 cat /net/ndb ^D </code></pre><h2 id="νέος-χρήστης">Νέος χρήστης</h2> <p>Προσθέστε έναν νέο χρήστη στον file server, ορίστε τον σε μερικά συνηθισμένα groups, και ορίστε του κωδικό:</p> <pre tabindex="0"><code>; echo newuser christos &gt;&gt; /srv/hjfs.cmd ; echo newuser sys +christos &gt;&gt; /srv/hjfs.cmd ; echo newuser adm +christos &gt;&gt; /srv/hjfs.cmd ; echo newuser upas +christos &gt;&gt; /srv/hjfs.cmd ; echo newuser cron +christos &gt;&gt; /srv/hjfs.cmd ; auth/keyfs ; auth/changeuser christos ; auth/enable christos ; cat &gt;&gt; /lib/ndb/auth hostid=christos uid=!sys uid=!adm uid=* ^D </code></pre><p>Κάντε επανεκκίνηση ώστε να τεθούν σε ισχύ οι αλλαγές:</p> <pre tabindex="0"><code>; fshalt -r </code></pre><p>Συνδεθείτε με το drawterm ως <code>christos</code> και τρέξτε το newuser(8) ώστε να ορίσετε το home directory του:</p> <pre tabindex="0"><code>$ drawterm -u christos ... ; /sys/lib/newuser </code></pre> Σημειώσεις για τον Acme editor https://margiolis.net/gr/w/acme_notes/ Sun, 06 Mar 2022 00:00:00 +1200 <p><img src="https://margiolis.net/files/acme.webp" alt="acme"></p> <h2 id="πόροι">Πόροι</h2> <ul> <li><a href="https://www.youtube.com/watch?v=dP1xVpMPn8M">A Tour of the Acme Editor</a> - Δείτε το εάν δεν έχετε ιδέα.</li> <li><a href="https://acme.cat-v.org/">The Acme User Interface for Programmers</a></li> <li><a href="https://www.youtube.com/watch?v=dopu3ZtdCsg">Plan9 Acme Intro - Part 1</a></li> <li><a href="https://chai.guru/pub/plan9/mirrors/tao-of-acme.html">The Tao of Acme</a></li> <li><a href="https://mostlymaths.net/2013/03/extensibility-programming-acme-text-editor.html/">Extensibility in the Acme text editor</a></li> </ul> <h2 id="χρήση-ποντικιού">Χρήση ποντικιού</h2> <p>Ο Acme χρειάζεται ποντίκι 3 κουμπιών για να δουλέψει πλήρως. Όλα τα κουμπιά μπορούν να χρησιμοποιηθούν για επιλογή κειμένου, αλλά η λειτουργία του καθενός είναι διαφορετική αφότου αφεθεί. Το αριστερό κουμπί χρησιμοποιείται απλώς για επιλογή κειμένου. Το μεσαίο κουμπί για εκτέλεση του επιλεγμένου κειμένου. Το δεξί κουμπί για αναζήτηση του επιλεγμένου κειμένου καθώς και φόρτωση αρχείων και άνοιγμα directories. Το κείμενο δεν χρειάζεται να επιλεγεί πρώτα όταν χρησιμοποιείται το κουμπί 2 και 3 (μεσαίο και δεξί), εάν η επιλογή είναι μόνο μία λέξη.</p> <p>Ο Acme επίσης υποστηρίζει «συγχορδίες» κουμπιών, δηλαδή ταυτόχρονο πάτημα περισσοτέρων ενός κουμπιού.</p> <table> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td>Κουμπία 1-2</td> <td>Αποκοπή.</td> </tr> <tr> <td>Κουμπιά 1-3</td> <td>Επικόλληση.</td> </tr> <tr> <td>Επιλογή κειμένου + Κουμπιά 2-1</td> <td>Εκτέλεση με την επιλογή ως όρισμα.</td> </tr> </tbody> </table> <h2 id="μετακίνηση-εντός-του-κειμένου">Μετακίνηση εντός του κειμένου</h2> <table> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td><code>:2</code></td> <td>Μετακίνηση στην 2η γραμμή.</td> </tr> <tr> <td><code>:0</code></td> <td>Μετακίνηση στην αρχή του αρχείου.</td> </tr> <tr> <td><code>:$</code></td> <td>Μετακίνηση στο τέλος του αρχείου.</td> </tr> <tr> <td><code>CTRL-A</code></td> <td>Μετακίνηση στην αρχή της γραμμής.</td> </tr> <tr> <td><code>CTRL-E</code></td> <td>Μετακίνηση στο τέλος της γραμμής.</td> </tr> <tr> <td><code>CTRL-F</code></td> <td>Αυτόματη συμπλήρωση path αρχείου.</td> </tr> <tr> <td><code>Edit =</code></td> <td>Εύρεση αριθμού της τρέχουσας γραμμής.</td> </tr> </tbody> </table> <h2 id="αναζήτηση-και-επιλογή">Αναζήτηση και επιλογή</h2> <table> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td><code>:,</code></td> <td>Επιλογή όλων των γραμμών.</td> </tr> <tr> <td><code>Edit ,</code></td> <td>Επιλογή όλων των γραμμών.</td> </tr> <tr> <td><code>:1,5</code></td> <td>Επιλογή γραμμών 1 έως 5.</td> </tr> <tr> <td><code>Edit 1,5</code></td> <td>Επιλογή γραμμών 1 έως 5.</td> </tr> <tr> <td><code>:/regexp/</code></td> <td>Επιλογή γραμμών που περιέχουν το <code>regexp</code>.</td> </tr> <tr> <td><code>:/regexp1/,/regexp2/</code></td> <td>Επιλογή γραμμών ανάμεσα σε <code>regexp1</code> και <code>regexp2</code>.</td> </tr> <tr> <td><code>Edit + /foo</code></td> <td>Αναζήτηση προς τα εμπρός.</td> </tr> <tr> <td><code>:/foo</code></td> <td>Αναζήτηση προς τα εμπρός.</td> </tr> <tr> <td><code>:foo</code></td> <td>Αναζήτηση προς τα εμπρός.</td> </tr> <tr> <td>Right click kon word.</td> <td>Αναζήτηση προς τα εμπρός.</td> </tr> <tr> <td><code>Edit -/foo</code></td> <td>Αναζήτηση προς τα πίσω.</td> </tr> <tr> <td><code>:-/foo</code></td> <td>Αναζήτηση προς τα πίσω.</td> </tr> <tr> <td><code>-/foo</code></td> <td>Αναζήτηση προς τα πίσω.</td> </tr> </tbody> </table> <h2 id="επεξεργασία-κειμένου">Επεξεργασία κειμένου</h2> <table> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td><code>CTRL-U</code></td> <td>Διαγραφή από τον κέρσορα έως την αρχή της γραμμής.</td> </tr> <tr> <td><code>CTRL-W</code></td> <td>Διαγραφή πριν από τον κέρσορα.</td> </tr> <tr> <td><code>CTRL-H</code></td> <td>Διαγραφή χαρακτήρα πριν τον κέρσορα.</td> </tr> <tr> <td><code>Edit , d</code></td> <td>Καθάρισμα παραθύρου.</td> </tr> <tr> <td><code>Edit , s/foo/bar/g</code></td> <td>Καθολική αντικατάσταση.</td> </tr> <tr> <td><code>Edit , | sed 's/foo/bar/g'</code></td> <td>Καθολική αντικατάσταση.</td> </tr> <tr> <td><code>Edit s/foo/bar/g</code></td> <td>Αντικατάσταση στην επιλογή.</td> </tr> <tr> <td><code>Edit 2 d</code></td> <td>Διαγραφή 2ης γραμμής.</td> </tr> <tr> <td><code>Edit 2 c/foo</code></td> <td>Αλλαγή 2ης γραμμής.</td> </tr> <tr> <td><code>Edit 2 a/foo</code></td> <td>Προσθήκη μετά την 2η γραμμή.</td> </tr> <tr> <td><code>Edit 2 i/foo</code></td> <td>Προσθήκη πριν την 2η γραμμή.</td> </tr> </tbody> </table> <h2 id="χρήση-εξωτερικών-εντολών">Χρήση εξωτερικών εντολών</h2> <table> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td><code>cmd</code></td> <td>Εκτέλεση <code>cmd</code>.</td> </tr> <tr> <td><code>|cmd</code></td> <td>Σωλήνωση επιλογής μέσω του <code>cmd</code> καθώς και εφαρμογή αλλαγών.</td> </tr> <tr> <td><code>&gt;cmd</code></td> <td>Αποστολή επιλογής στο <code>cmd</code> και εμφάνιση αποτελέσματος σε προσωρινό νέο παράθυρο.</td> </tr> <tr> <td><code>&lt;cmd</code></td> <td>Επικόλληση εξόδου του <code>cmd</code> στο τρέχον παράθυρο (δεν χρειάζεται υπάρχουσα επιλογή).</td> </tr> </tbody> </table> <p>Μπορεί να χρησιμοποιηθεί οποιαδήποτε εντολή, αυτά είναι απλώς μερικά παραδείγματα.</p> <table> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td><code>Edit , &lt; echo foo</code></td> <td>Αντικατάσταση σώματος του παραθύρου με κάποιο κείμενο (λειουργεί με οποιαδήποτε εντολή).</td> </tr> <tr> <td><code>echo foo | 9p write acme/$winid/body</code></td> <td>Προσθήκη στο τέλος του σώματος του τρέχοντος παραθύρου.</td> </tr> <tr> <td><code>Edit , &gt; wc -l</code></td> <td>Μέτρηση γραμμών.</td> </tr> <tr> <td><code>Edit , | sort</code></td> <td>Ταξινόμηση γραμμών.</td> </tr> <tr> <td><code>Edit ,x/regexp/ &lt; date</code></td> <td>Αντικάτασταση <code>regexp</code> με την έξοδο του date(1).</td> </tr> <tr> <td>Επιλογή κειμένου + <code>| sed '' &gt; foo.txt</code></td> <td>Αποκοπή στο <code>foo.txt</code>.</td> </tr> <tr> <td>Επιλογή κειμένου + <code>&gt; sed '' &gt; foo.txt</code></td> <td>Αντιγραφή στο <code>foo.txt</code>.</td> </tr> </tbody> </table> <h2 id="αρχεία">Αρχεία</h2> <p>Όπως αναφέρθηκε νωρίτερα, τα αρχεία ανοίγονται με το δεξί κουμπί του ποντικιού.</p> <table> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td><code>foo.c</code></td> <td>Άνοιγμα αρχείου.</td> </tr> <tr> <td><code>foo.c:3</code></td> <td>Άνοιγμα αρχείου στην γραμμή 3.</td> </tr> <tr> <td><code>foo.c:3:9</code></td> <td>Άνοιγμα αρχείου στην γραμμή 3 στήλη 9.</td> </tr> <tr> <td><code>foo.c:/^func</code></td> <td>Άνοιγμα αρχείου στην γραμμή που αρχίζει με <code>func</code>.</td> </tr> <tr> <td><code>foo.c:/bar/,/baz/</code></td> <td>Άνοιγμα αρχείου με επιλογή από το <code>bar</code> έως <code>baz</code>.</td> </tr> </tbody> </table> <h2 id="χρήσιμες-εσωτερικές-εντολές-acme">Χρήσιμες εσωτερικές εντολές Acme</h2> <table> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td><code>win</code></td> <td>Άνοιγμα shell σε νέο παράθυρο.</td> </tr> <tr> <td><code>web URL</code></td> <td>Άνοιγμα <code>URL</code> στον browser.</td> </tr> <tr> <td><code>Dump</code></td> <td>Αποθήκευση τρέχουσας κατάστασης.</td> </tr> <tr> <td><code>Load</code></td> <td>Φόρτωση dump.</td> </tr> <tr> <td><code>Tab 8</code></td> <td>Ορισμός πλάτους tab σε 8 χαρακτήρες.</td> </tr> </tbody> </table> <h2 id="μεταβλητές">Μεταβλητές</h2> <table> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td><code>$%</code></td> <td>Όνομα τρέχοντος αρχείου.</td> </tr> <tr> <td><code>$samfile</code></td> <td>Όνομα τρέχοντος αρχείου.</td> </tr> <tr> <td><code>$winid</code></td> <td>Τρέχον παράθυρο.</td> </tr> </tbody> </table> Ροή εργασίας με Git μέσω email https://margiolis.net/gr/w/email_git/ Sun, 16 Jan 2022 00:00:00 +1200 <p>Βασική ρύθμιση Git (σε περίπτωση που δεν το έχετε κάνει ήδη αυτό):</p> <pre tabindex="0"><code>$ git config --global user.email you@example.org $ git config --global user.name &#34;Your Name&#34; </code></pre><p>Ρύθμιση email Git:</p> <pre tabindex="0"><code>$ git config --global sendemail.smtpserver your_mail_server $ git config --global sendemail.smtpuser you@example.org $ git config --global sendemail.smtpserverport your_smtp_port $ git config --global sendemail.smtpencryption your_encryption_type </code></pre><h2 id="παραδείγματα">Παραδείγματα</h2> <p>Εφαρμογή patch (ή απλώς κάντε ένα commit) και αποστολή αυτού σε κάποια διεύθυνση email:</p> <pre tabindex="0"><code>$ git am &lt; some_patch $ git send-email --to=list@example.org HEAD^ </code></pre><p>Διόρθωση τελευταίου commit και αποστολή:</p> <pre tabindex="0"><code>$ git commit -a --amend $ git send-email --annotate -v2 HEAD^ </code></pre><p>Αποστολή 3 τελευταίων commits (βλέπε <a href="https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection">Revision Selection</a> για περισσότερες πληροφορίες σχετικά με αυτήν την γραφή):</p> <pre tabindex="0"><code>$ git send-email HEAD~3 </code></pre><p>Αποστολή τελευταίου commit στην διεύθυνση list@example.org με θέμα &ldquo;<code>[reponame][PATCH] commitmsg</code>&rdquo;. Αυτό είναι χρήσιμο για αποστολές σε λίστες αλληλογραφίας ή προγραμματιστές με πολλά projects:</p> <pre tabindex="0"><code>$ git send-email --subject-prefix=&#34;${PWD##*/}][PATCH&#34; \ --to=list@example.org -1 </code></pre><h2 id="επιπλέον-υλικό">Επιπλέον υλικό</h2> <ol> <li><a href="https://begriffs.com/posts/2018-06-05-mailing-list-vs-github.html">Mailing lists vs GitHub</a></li> <li><a href="https://web.archive.org/web/20180522180815/https://dpc.pw/blog/2017/08/youre-using-git-wrong/">You&rsquo;re using Git wrong</a></li> <li><a href="https://drewdevault.com/2018/07/02/Email-driven-git.html">The advantages of an email-driven Git workflow</a></li> <li><a href="https://git-send-email.io/">https://git-send-email.io/</a></li> <li><a href="https://linux.die.net/man/1/git-send-email">git-send-email(1) man page</a></li> </ol> Στυλ γραφής C κώδικα https://margiolis.net/gr/w/cstyle/ Sat, 01 Jan 2022 00:00:00 +1200 <p>Πρώτα απ&rsquo; όλα, θα ήθελα να ευχηθώ σε όλους τους 0 αναγνώστες αυτής της ιστοσελίδας ευτιχισμένο το νέο έτος! Δεν υπάρχει λόγος να γράψω ολόκληρο άρθρο επαναλαμβάνοντας όσα έχουν γράψει ήδη σε καλύτερα άρθρα, οπότε ορίστε μία λίστα με οδηγίες καλού στυλ γραφής C κώδικα:</p> <ul> <li><a href="https://www.lysator.liu.se/c/pikestyle.html">Notes on Programming in C</a> από τον Rob Pike.</li> <li><a href="https://man.openbsd.org/style">OpenBSD style guide</a></li> <li><a href="https://suckless.org/coding_style/">suckless.org style guide</a></li> <li><a href="https://www.kernel.org/doc/Documentation/process/coding-style.rst">Linux kernel coding style</a></li> </ul> <p><img src="https://margiolis.net/files/dmr.webp" alt="dmr"></p> 9front χρησιμοποιώντας τον bhyve(8) στο FreeBSD https://margiolis.net/gr/w/9front_bhyve/ Tue, 23 Nov 2021 00:00:00 +1200 <p>Το άρθρο αυτό βρίσκεται επίσης στα <a href="https://wiki.freebsd.org/bhyve/9front">FreeBSD Wiki</a> και <a href="http://wiki.9front.org/freebsd-bhyve">9front Wiki</a>.</p> <p>Προαπαιτούμενα ports:</p> <pre tabindex="0"><code>sysutils/bhyve-firmware sysutils/uefi-edk2-bhyve net/tigervnc-viewer </code></pre><p>Εισάγετε τις παρακάτω γραμμές στο <code>/etc/rc.conf</code>. Αντικαταστήστε το <code>re0</code> με το δικό σας network interface. Είναι καλή πρκατική να ορίζετε ένα ξεχωριστό <code>tap</code> interface για κάθε VM, σε περίπτωση που θέλετε να τρέξετε πολλαπλά VMs ταυτόχρονα. Χάρην απλότητας, το συγκεκριμένο setup χρησιμοποιεί μόνο ένα <code>tap</code>:</p> <pre tabindex="0"><code>if_bridge_load=&#34;YES&#34; if_tap_load=&#34;YES&#34; cloned_interfaces=&#34;bridge0 tap0&#34; ifconfig_bridge0=&#34;DHCP addm re0 addm tap0&#34; ifconfig_bridge0_alias0=&#34;inet 10.0.0.1/24&#34; </code></pre><p>Κατεβάστε ένα <a href="http://9front.org/releases/">9front ISO</a> και στο μεταξύ επανεκκινήστε το δίκτυο:</p> <pre tabindex="0"><code># service routing restart # service netif restart </code></pre><p>Δημιουργήστε ένα directory στο οποίο θα αποθηκεύσετε τα πάντα σχετικά με το 9front. Προσωπικά έχω όλα τα <a href="https://www.freebsd.org/cgi/man.cgi?query=bhyve&amp;sektion=8">bhyve(8)</a> VMs σε ένα <a href="https://docs.freebsd.org/en/books/handbook/zfs/">ZFS dataset</a>:</p> <pre tabindex="0"><code>$ cd /path/to/vms/ $ mkdir 9front $ mv /path/to/9front_iso 9front.iso </code></pre><p>Δημιουργήστε ένα άδειο αρχείο το οποίο θα χρησιμοποιηθεί ως ο σκληρός δίσκος του VM. 10G θα είναι παραπάνω από αρκετά:</p> <pre tabindex="0"><code>$ truncate -s 10G disk.img </code></pre><p>Δημιουργήστε ένα script εκκίνησης. Μπορείτε να τροποποιήσετε τις μεταβλητές για να ταιριάξουν στο δικό σας setup. Προφανώς, όταν τελειώσετε την εγκατάσταση του 9front από το ISO, θα πρέπει να τρέχετε το script χωρις την γραμμή <code>-s 3,...</code>:</p> <pre tabindex="0"><code>$ cat 9front_start #!/bin/sh name=&#34;9front&#34; cpu=&#34;2&#34; mem=&#34;2G&#34; iso=&#34;9front.iso&#34; disk=&#34;disk.img&#34; tap=&#34;tap0&#34; ifconfig ${tap} up bhyve -c ${cpu} -m ${mem} -wH \ -s 0,hostbridge \ -s 3,ahci-cd,${iso} \ -s 4,ahci-hd,${disk} \ -s 5,virtio-net,${tap} \ -s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait \ -s 30,xhci,tablet \ -s 31,lpc \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \ ${name} </code></pre><p>Δημιουργήστε ένα script κλεισίματος ώστε ο bhyve(8) να κλείσει σωστά:</p> <pre tabindex="0"><code>$ cat 9front_stop #!/bin/sh name=&#34;9front&#34; tap=&#34;tap0&#34; ifconfig ${tap} down bhyvectl --force-poweroff --vm=${name} bhyvectl --destroy --vm=${name} </code></pre><p>Κάντε τα scripts εκτελέσιμα και ξεκινήστε το VM:</p> <pre tabindex="0"><code>$ chmod +x 9front_start 9front_stop # ./9front_start; ./9front_stop </code></pre><p>Τρέξτε τον vncviewer(1) για να συνδεθείτε στην οθόνη του VNC:</p> <pre tabindex="0"><code>$ vncviewer 0.0.0.0 </code></pre><p>Όταν σας ζητηθεί ο τύπος του monitor κατά την εκκίνηση, επιλέξτε <code>xga</code>.</p>