FAQ

Da Wiki di NetBSD Italia.

Questa (incompleta) raccolta di FAQ cerca di rispondere alle domande più comuni poste dagli utenti su IRC o nelle varie mailing list. L'obiettivo è quello di evitare lunghe e noiose ricerce sul web avendo "sempre" la risposta a portata di mano. Fondamentalmente ci auguriamo che questa pagina possa essere d'aiuto tanto all'utente inesperto quanto allo smanettone con anni di esperienza.

Per una raccolta di domande poste un po' meno frequentemente, consultare la pagina INFAQ.


Aabbiamo bisogno di te! NetBSD Italia necessita di tutto l'aiuto possibile per maturare una documentazione di alto livello. Offri il tuo contributo ampliando questa pagina o altri documenti presenti in questo wiki secondo le convenzioni di NetBSD Italia. La comunità te ne sarà grata.



Indice

Domande generali

Come faccio a spegnere la macchina da utente normale?

Tutti gli utenti che fanno parte del gruppo operator possono eseguire shutdown(8), se il vostro utente non fa parte di questo gruppo:

# usermod -G operator utente

L'altra alternativa è security/sudo.

Ho provato ad utilizzare ls --color ma non sembra funzionare. Come abilito i colori per l'output di ls?

Nonostante su NetBSD il comando ls abbia alcune caratteristiche di maggior interesse rispetto a GNU ls come la flag -o (apparte alcune scelte implementative), di sicuro una richiesta molto comune da parte degli utenti che migrano da sistemi come GNU/Linux, non presente nella implementazione di NetBSD, è il supporto per i colori. Per ovviare al problema basta installare la versione GNU di ls, ovvero quella inclusa in tutte le distribuzioni GNU/Linux, la quale supporta i colori.

Supponendo che sia già stata configurata la variabile PKG_PATH, installare GNU ls come segue:

# pkg_add -v gnuls

A questo punto non resta che fare in modo che venga eseguito automaticamente GNU ls (/usr/pkg/bin/gls) al posto di /usr/bin/ls mettendo, all'interno del file di configurazione della propria shell, un alias, come segue:

alias ls="/usr/pkg/bin/gls --color"

Per conoscere i file di configurazione della propria shell consultare la sezione FILES della pagina di manuale relativa alla shell attualmente in uso, richiamabile tramite il seguente comando:

$ man $(basename $SHELL)


Perchè alcuni comandi funzionano solo se li eseguo specificando il percorso completo?

Il problema è molto semplice: la directory all'interno della quale risiede il comando non è inclusa nella lista dei percorsi di ricerca della shell. Per aggiungerla è sufficiente appenderla alla suddetta lista contenuta nella variabile relativa (generalmente $PATH o $path) in questo modo:

  • Bourne
  $ export PATH=$PATH:NUOVO_PERCORSO
  • Csh
  % set path = ($path NUOVO_PERCORSO)

dove NUOVO_PERCORSO corrisponde al percorso assoluto della directory in questione. Ad esempio, per aggiungere la directory /usr/pkg/bin/ è sufficiente eseguire il seguente comando:

  • Bourne
  $ export PATH=$PATH:/usr/pkg/bin
  • Csh
  % set path = ($path /usr/pkg/bin)

A questo punto non sarà iù necessario utilizzare i percorsi completi per i programmi contenuti in tale elenco, il quale può comunque essere visualizzato per esteso con il comando

  • Bourne
  $ echo $PATH
  • Csh
  % echo $path

Perchè il completamento automatico della shell non funziona con alcuni comandi?

Vedi la FAQ 1.2.

Perchè quando eseguo perl ottengo una serie di messaggi d'avviso relativi ai locale? Come posso risolvere il problema?

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LC_ALL = (unset),
        LANG = "it_IT.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

Silenziare gli avvertimenti

Una possibile soluzione è di dire all'interprete Perl di ignorare questo tipo di errori, lo si può fare esportando l'apposita variabile di ambiente PERL_BADLANG nel seguente modo:

  • Sintassi Bourne
$ export PERL_BADLANG=0
  • Sintassi csh
% set PERL_BADLANG 0

In questo modo non risolveremo il problema del locale ma non avremo più questa serie di warning. Volendo si potrebbe rendere tutto ciò permanente mettendolo nel nostro .profile

  • Sintassi Bourne
$ echo 'export PERL_BADLANG=0' >> $HOME/.profile
  • Sintassi csh
% echo 'set PERL_BADLANG 0' >> ~/.cshrc

Modificare la variabile d'ambiente LANG

Un'altra possibilità è quella di impostare il valore della variabile d'ambiente LANG impostandola su un valore riconosciuto dall'interprete perl. L'esempio assume una shell bourne, il procedimento è analogo per tutti gli altri tipi.

$ export LANG=C

Per maggiori informazioni si prega di consultare l'apposito POD:

$ perldoc perllocale

Dove posso trovare i sorgenti relativi alla mia versione del sistema operativo?

All'interno del mirror FTP, fra le varie architetture hardware (i386, amd64, etc.) è presente anche la directory source la quale contiene i sorgenti dell'intero sistema operativo, relativi (chiaramente) a tutte le architetture.

Come faccio ad avviare un servizio manualmente senza che questo parta anche all'avvio del sistema?

Bisogna forzare l'avvio del servizio, saltando il controllo del file /etc/rc.conf, utilizzando al posto dei normali start e stop, le direttive forcestart e forcestop come negli esempi seguenti:

  • Avvio del servizio
/etc/rc.d/SERVIZIO forcestart
  • Arresto del servizio
/etc/rc.d/SERVIZIO forcestop

Dove SERVIZIO corrisponde allo script associato al servizio che si stà cercando di controllare. Un esempio pratico, utilizzando il server SSH (sshd) è il seguente:

  • Avvio del server SSH
/etc/rc.d/sshd forcestart
  • Arresto del server SSH
/etc/rc.d/sshd forcestop

Come faccio a cambiare shell?

Per cambiare la shell di root (ad esempio per ksh(1):

# chsh -s /bin/ksh

Per cambiare la shell dell'utente pippo (ad esempio per utilizzare shells/bash:

# chsh -s /usr/pkg/bin/bash pippo

Come faccio ad installare un set senza dover riavviare o reinstallare tutto?

Basta un semplice tar(1), ad esempio se si desidera installare il set text:

# tar pxzf text.tgz -C /

Da notare l'utilizzo dell'opzione -p che serve per evitare errori riguardo ai permessi dei file estratti dal set.

Sistema dei pacchetti

Perché pkgsrc mi dà un errore relativo a PKG_PATH?

Quando si configura la variabile PKG_PATH per l'installazione dei pacchetti binari, bisogna ricordarsi di svuotarla prima di utilizzare pkgsrc, altrimenti ci si trova davanti un errore del genere:

ERROR: Please unset PKG_PATH before doing pkgsrc work!

Per tanto, qualora tale variabile fosse impostata, rimuoverla come segue:

unset PKG_PATH

Infine passare all'installazione del pacchetto attraverso il normale utilizzo di pkgsrc.

Come posso rimuovere tutti i pacchetti installati?

Basta eseguire il seguente comando:

# pkg_delete -df \*

Il carattere di escape che precede l'asterisco è indispensabile al fine di prevenire l'espensione della wildcard da parte della shell (il cosiddetto globbing). Per maggiori informazioni su questa funzionalità consultare il manuale della shell utilizzata.

NOTA: qualora la variabile PKG_PATH fosse impostata si otterrebbe un errore il quale può eventualmente essere risolto come spiegato nella relativa FAQ.

Perchè quando compilo un pacchetto ottengo l'errore: 'ld: cannot find -lxxxx' ?

È un errore che si verifica quando il linker non riesce a trovare una determinata libreria necessaria alla compilazione. Dal nome della libreria mancante si può risalire al pacchetto della libreria. Per prima cosa è buona norma provare ad installarla (se non già presente), e vedere se l'errore si ripresenta. In caso contrario c'è quasi sicuramente un bug, che nella maggior parte dei casi è possibile risolvere facilmente. Se si sta compilando un pacchetto in pkgsrc, è molto probabile che necessiti di una libreria anch'essa presente in pkgsrc (che è una dipendenza del pacchetto). Le librerie presenti in pkgsrc vengono copiate in /usr/pkg/lib. A volte può capitare che la directory /usr/pkg/lib/ (dove risiedono tali librerie) non sia conosciuta dal linker. Il percorso di ricerca di file header e di librerie può essere controllato attraverso variabili d'ambiente nella shell. Queste possono essere settate temporaneamente, valide quindi solo per la sessione corrente, oppure settate automaticamente ad ogni sessione, inserendole per esempio nel file /etc/profile. Directory addizionali dove il linker deve ricercare librerie possono essere aggiunge attraverso la variabile d'ambiente LIBRARY_PATH. Per prima cosa è utile vedere quale directory sono già incluse con questo comando:

# env |grep LIBRARY_PATH

se il comando non da risultati, vuol dire che LIBRARY_PATH non è stata settata, e possiamo farlo ora con:

# LIBRARY_PATH="/usr/pkg/lib/"
# export LIBRARY_PATH

o più semplicemente:

# export LIBRARY_PATH="/usr/pkg/lib/"

Se LIBRARY_PATH è già presente, possiamo semplicemente aggiungere la directory /usr/pkg/lib/ alla lista in questo modo:

# LIBRARY_PATH="$LIBRARY_PATH:/usr/pkg/lib/"
# export LIBRARY_PATH

o più semplicemente:

# export LIBRARY_PATH="$LIBRARY_PATH:/usr/pkg/lib/"

Dove posso trovare gli script d'avvio dei programmi? Perchè non vengono installati assieme ai pacchetti?

In realtà li script vengono copiati nel sistema durante la fase di installazione del pacchetto. L'utente è però libero di scegliere se usarli come riferimento, non usarli affatto o usarli integralmente per gestire i servizi di sistema. Gli script risiedono generalmente nella directory /usr/pkg/share/examples/rc.d/ (eccetto i casi in cui la variabile $BASENAME sia stata cambiata prima dell'installazione del pacchetto) i cui nomi corrispondono esattamente al programma installato. Questi script possono essere copiati senza alcuna modifica nella directory /etc/rc.d/ ed essere subito utilizzati. Tuttavia, per chi generalmente lascia tali file invariati può essere noioso effettuarne la copia dopo ogni installazione. La soluzione in questo caso consiste nell'impostare la variabile PKG_RCD_SCRIPTS all'interno del file di configurazione di make(1), /etc/mk.conf, abilitando così la copia automatica degli script:

PKG_RCD_SCRIPTS=yes

Dal momento che questa operazione può non essere necessaria o anche del tutto scorretta in altri sistemi non BSD, al fine di ottenere una configurazione portabile, si consiglia di utilizzare un'istruzione condizionale in questo modo:

.ifdef BSD_PKG_MK
PKG_RCD_SCRIPTS=yes
.endif

In realtà arebbe bene includere tutti i parametri di configurazione relativi a pkgsrc all'interno di questa istruzione .ifdef. In quest'ultimo caso non sarà ecessario includerla nuovamente per la dichiarazione della variabile in questione, PKG_RCD_SCRIPTS.

A questo punto gli script di avvio saranno automaticamente copiati dopo l'installazione di ogni pacchetto.

NOTA: in caso di disinstallazione i file non verranno rimossi.

Posso rimpiazzare ftp(1) per ottenere i pacchetti?

Certo, la flessibilità i pkgsrc consente anche questo. Nel caso specifico di wget Basta includere nel file di configurazione di make, /etc/mk.conf quanto segue:

FETCH_CMD=wget
FETCH_BEFORE_ARGS=-nd
FETCH_OUTPUT_ARGS=-O

Per maggiori informazioni consultare la documentazione di pkgsrc leggendo il file pkgsrc/doc/pkgsrc.txt.

Come posso abilitare il resume per i pacchetti?

Diciamo subito che ftp(1) non supporta in alcuno modo tale funzionalit/à, per tanto è necessario rimpiazzarlo con un programma migliore. Una volta effettuata questa variazione sarà ufficiente abilitare il supporto informando il sistema per mezzo del file di configurazione di make, /etc/mk.conf:

PKG_RESUME_TRANSFERS=YES # Abilita il resume in pkgsrc

Infine specificare le flag necessarie ad abilitare il resume nel programma scelto (nella fattispecie wget) come segue:

FETCH_RESUME_ARGS=-c # Il flag resume di wget(1)

Posso fare in modo che pkgsrc utilizzi solo IPv4?

Sì, è possibile ma solo se si utilizza un programma che supporti tale funzionalità questo esclude a priori ftp(1)). Nello specifico caso di wget, basta istruire pkgsrc a passare la relativa flag (in questo caso -4) in fase di costruzione del comando per il fetching dei pacchetti, in questo modo:

FETCH_BEFORE_ARGS=-4

Modificare il valore di questa variabile in base alle proprie esigenze.

Come faccio a passare ad un altra versione di pkgsrc?

Una volta collocati nella ${PKGSRCDIR}, ad esempio:

$ cd /usr/pkgsrc/

Bisogna utilizzare cvs(1) nel seguente modo per passare ad una precisa versione di pkgsrc (ad esempio la versione 2007Q4):

$ cvs update -dAP -rpkgsrc-2007Q4

Come faccio a creare un pacchetto binario con software già installato?

Si può utilizzare pkg_tarup nel seguente modo (nel seguente esempio si pacchettiza modular-xorg-server e tutte le sue dipendenze, tramite l'opzione -a):

$ pkg_tarup -a -d ~/mypkgs modular-xorg-server

Dopo un paio di secondi (dipende dal pacchetto e dalla macchina) troveremo tutti i tarball nella directory ~/mypkgs.

Come faccio a rimuovere tutte le WRKSRC che ho creato?

Quando installiamo pacchetti viene sempre creata una directory temporanea dove ci sono tutti i contenuti dei distfile e altro, chiamata WRKSRC (la directory work/ di default), per eliminare tutte le directory WRKSRC possiamo utilizzare il comodo tool pkgtools/pkgclean nel seguente modo:

$ pkgclean

In alternativa si può definire la directory WRKOBJDIR in /etc/mk.conf:

WRKOBJDIR=/usr/pkgsrc-work     # path a piacere

in modo da avere tutte le directory temporanee con i risultati delle compilazioni in un albero separato da quello di pkgsrc.
La directory viene creata automaticamente al bisogno, quindi si può rimuovere e fare pulizia in un colpo solo.

Unico accorgimento: non rimuoverla mentre ci sono operazioni in corso che la stanno usando!

Rete

Come faccio ad impostare un MTA diverso da postfix?

Se vuoi cambiare il tuo MTA di default (molto utile ad esempio per send-pr(1)) puoi farlo editando il file /etc/mailer.conf, ad esempio per utilizzare mail/msmtp di default:

# mailer.conf
#

# Voglio msmtp come MTA di default
sendmail	/usr/pkg/bin/msmtp

Per maggiori informazioni si prega di consultare mailer.conf(5), grazie.

Come faccio ad impostare il gateway di default?

Puoi utilizzare route(8) nel seguente modo, ad esempio se l'indirizzo del gateway è 192.168.1.1:

# route add default 192.168.1.1

Senza dover digitare il comando ad ogni avvio si può aggiungere la seguente riga su /etc/rc.conf (anche qui il gateway ha IP 192.168.1.1):

# Nella nostra rete il gateway ha IP 192.168.1.1
#
defaultroute=192.168.1.1

X Window System

Perchè modular-xorg-server richiede i pacchetti x11 e gnome-config?

È un problema abbastanza famoso il quale non è ancora stato risolto. Si può aggirare il problema rimuovendo tutti i pacchetti che utilizzano X11. Per avere una lista completa di questi eseguire il seguente comando:

pkg_info -a |grep X |awk '{print $1}'

Multimedia

Come faccio a salvare le impostazioni dei mixer audio?

Il volume delle casse o del microfono si può salvare in un apposito file, /etc/mixerctl.conf, una volta impostato il volume secondo i nostri gusti generiamo il file ed aggiungiamo mixerctl su rc.conf(5):

# mixerctl -a > /etc/mixerctl.conf
# echo "mixerctl=YES" >> /etc/rc.conf

In questo modo ad ogni boot(8) verranno caricate le nostre impostazioni preferite.

Se invece vogliamo salvare e caricare le impostazioni precedenti del mixer:

# rm /etc/mixerctl.conf
# echo 'mixerctl=YES' >> /etc/rc.conf
# echo 'mixerctl_mixers="mixer0"' >> /etc/rc.conf

In questo modo ad ogni shutdown(8) verranno salvate le impostazioni ed ad ogni boot caricate le precedenti impostazioni: se ad esempio nella sessione precedente avevamo disattivato l'audio, l'audio rimarrà disattivato anche nella sessione successiva.

Memoria (RAM, Dischi, etc.)

Come posso salvare e ripristinare il contenuto del Master Boot Record (MBR)?

L'operazione richiede la gestione di soli 512 byte, dal momento che il MBR è di questa grandezza. I dati possono essere letti (e naturalmente scritti) con dd(1).

  • Salvare il contenuto del MBR su un file
# dd if=/dev/$DISK of=$DISK_mbr.bin bs=512 count=1
  • Ripristinare il contenuto del MBR da un file
# dd if=$DISK_mbr.bin of=wd0 bs=512 count=1

dove $DISK corrisponde al device del disco di cui si vuole effettuare (o ripristinare) il concenuto del MBR.

Esempio

Salvataggio e ripristino del MBR del disco rigido primario

# dd if=/dev/wd0a of=wd0a_mbr.bin bs=512 count=1 # Salvo
# dd if=wd0a_mbr.bin of=/dev/wd0a bs=512 count=1 # Ripristino

Come posso creare un filesystem di tipo swap? Dov'è finito mkswap(8)?

Su NetBSD un simile tool non ha motivo di esistere dal momento che dd(1) fa egregiamente il suo lavoro. Per tanto la creazione di un filesystem di tipo swap su un label precedentemente creato si effettua semplicemente così:

# dd if=/dev/zero of=DEVICE bs=512

dove DEVICE corrisponde al device della partizione swap sulla quale si desidera creare il filesystem.

Codifiche, caratteri e terminali

Perché sulla shell posso utilizzare i caratteri accentuati mentre sull'editor (n)vi ottengo delle sequenze strane?

Probabilmente questo problema si manifesta dipendentemente dall'emulatore di terminale utilizzato. Alcuni terminali non hanno determinate funzionalità o ne hanno di diverse (incompatibili) rispetto a quelle da noi richieste. In questo caso è possibile tentare di risolvere il problema cambiando il terminale:

export TERM=wsvt25

È difficile fornire ulteriori informazioni sul terminale in questione data la scarsa disponibilità di documentazione a riguardo. Una lista delle funzionalità supportate è disponibile all'interno del file /usr/share/misc/termcap, di cui la sezione inerente è la seguente:

# NetBSD "wscons" emulator in vt220 mode
# These are micro-minimal and probably need to be redone for real
# after the manner of the pcvt entries.
wsvt25|NetBSD wscons in 25 line DEC VT220 mode:\
        :Co#8:pa#64:it#8:ms:ut:\
        :@7=\E[8~:is=\E[r\E[25;1H:\
        :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:k6=\E[17~:\
        :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kh=\E[7~:F1=\E[23~:F2=\E[24~:\
        :AB=\E[4%dm:AF=\E[3%dm:op=\E[m:\
        :co#80:li#25:tc=vt220:

Come faccio ad impostare la lingua italiana?

Per impostare la lingua e la codifica basta impostare le apposite variabili, ad esempio per impostare la lingua italiana in una shell bourne:

$ export LANG="it_IT.UTF-8"
$ export LC_TYPE="it_IT.UTF-8"
$ export LC_ALL="it_IT.UTF-8"

Per controllare l'attuale configurazione basta utilizzare il comando locale(1):

$ locale
LANG="it_IT.UTF-8"
[...]

Come faccio a cambiare il layout della tastiera?

Puoi utilizzare wsconsctl(8) in questo modo (nel seguente modo si utilizzerà il layout dvorak):

# wsconsctl -w encoding=us.dvorak

Se vi trovate su X11 potete servirvi di x11/setxkbmap (anche in questo caso come esempio si imposterà il layout dvorak):

$ setxkbmap dvorak

Se la modifica è definitiva, non abbiamo bisogno di setxkbmap, ma possiamo direttamente editare il file /etc/X11/xorg.conf (se si utilizza x11/modular-xorg-server) o /etc/X11/XFree86.conf (se si utilizza XFree86) nel seguente modo (anche qui imposteremo il layout dvorak):

Section "InputDevice"
   [...]
   Option      "XkbLayout" "dvorak"
   [...]
EndSection

Come faccio ad aggiungere più terminali?

Nell'installazione di default i terminali virtuali attivi sono 4, accessibili per mezzo della combinazione di tasti Control + Alt + Fn dove n è un numero da 1 a 8). Per attivare piu' terminali virtuali basta editare i file /etc/ttys e /etc/wscons.conf.

Di default in /etc/ttys possiamo leggere qualche cosa di questo tipo:

[...]
ttyE2   "/usr/libexec/getty Pc"         vt220  on secure
ttyE3   "/usr/libexec/getty Pc"         vt220  on secure
tty00   "/usr/libexec/getty std.9600"   unknown off secure
[...]

La parte che ci interessa è proprio quella con ttyE*, perciò aggiungiamo altri terminali, in modo tale da avere 8 terminali:

[...]
ttyE3   "/usr/libexec/getty Pc"         vt220  on secure
ttyE4   "/usr/libexec/getty Pc"         vt220  on secure
ttyE5   "/usr/libexec/getty Pc"         vt220  on secure
ttyE6   "/usr/libexec/getty Pc"         vt220  on secure
ttyE7   "/usr/libexec/getty Pc"         vt220  on secure
tty00   "/usr/libexec/getty std.9600"   unknown off secure
[...]

Ora dobbiamo apportare qualche modifica anche a /etc/wscons.conf, il file originale dovrebbe contenere qualche cosa di questo genere:

[...]
#screen 0       -       vt100
screen  1       -       vt100
screen  2       -       vt100
screen  3       -       vt100
screen  4       -       -
[...]

Modifichiamo perciò anche questo file in modo tale da creare i 4 terminali aggiuntivi:

[...]
screen  3       -       vt100
screen  4       -       vt100
screen  5       -       vt100
screen  6       -       vt100
screen  7       -       -
[...]

Ora per creare questi terminali senza riavviare (su NetBSD non si riavvia mai!):

# /etc/rc.d/wscons restart
# /etc/rc.d/ttys restart

Al momento wscons permette di avere attivi solo 8 terminali, è comunque possibile ovviare a questo modificando una riga del file wsdisplay.c. Premetto che questa modifica richiede la ricompilazione del kernel.

Supponendo che la directory dei sorgenti sia /usr/src, effettuare le seguenti operazioni:

  • Aprire il file /usr/src/sys/dev/wscons/wsdisplay.c
  • Cercare la riga #define WSDISPLAY_MAXSCREEN 8
  • Cambiare il valore da 8 a 12
  • Salvare e chiudere il file

A questo punto si puo' passare alla compilazione del kernel. Per maggiori informazioni consultare il relativo tutorial.

Se ho abilitato il framebuffer il primo terminale (console) non è accessibile, come faccio a renderlo accessibile?

Si possono aggiungere le seguenti righe sul vostro file rc.local in modo tale da terminare lo splashboot e ripulire lo schermo:

[...]
#if [ -f /usr/pkg/etc/rc.d/apache ]; then
#	/usr/pkg/etc/rc.d/apache start
#fi

# Stop the splashboot
/sbin/wsconsctl -d -w splash.enable=0 >/dev/null 2>&1

# Clear the screen!
#
# XXX: we need to specify ${TERM} because when the rc.local is invoked ${TERM}
# is not initialized. 
TERM=vt220 /usr/bin/clear

echo '.'
[...]
Strumenti personali