Posts Tagged debian
MySQL: controllare, ottimizzare, riparare
MySQL e’ un fantastico prodotto ormai giunto ad uno stato di maturità rasserenante. Puo’ capitare pero’ che in situazioni di altissimo traffico e in presenza di query `pesanti`una qualche tabella possa andare a $donnedifacilicostumi, in questi casi mysqlchek ci viene in contro! mi appunto qui di seguito qualche esempio di uso:
Controlla, ottimizza e ripara tutti i databases:
mysqlcheck -p -Aao --auto-repair
Controlla, ottimizza e ripara una precisa tabella
mysqlcheck -p -ao --auto-repair dbname table
Controlla ottimizza e ripara un preciso database:
mysqlcheck -p -ao --database dbname
HAProxy e gestione dei VirtualHost
L’unico modo per gestire i virtualhost su HAProxy (o meglio per legare un preciso vhost ad uno o piu’ precisi backend server) è quello di usare le ACL, mi appunto qui di seguito un conf di test (autoesplicativo) dove le ACL vengono implementate:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
frontend http-in
bind *:80
acl is_www_example_com hdr_end(host) -i example.com
acl is_www_domain_com hdr_end(host) -i domain.com
use_backend www_example_com if is_www_example_com
use_backend www_domain_com if is_www_domain_com
default_backend www_example_com
backend www_example_com
balance roundrobin
cookie SERVERID insert nocache indirect
option httpchk HEAD /check.txt HTTP/1.0
option httpclose
option forwardfor
server Server1 10.1.1.1:80 cookie A check
server Server2 10.1.1.2:80 cookie B check
backend www_domain_com
balance roundrobin
cookie SERVERID insert nocache indirect
option httpchk HEAD /check.txt HTTP/1.0
option httpclose
option forwardfor
server Server1 192.168.5.1:80 cookie A check
server Server2 192.168.5.2:80 cookie B check
Debian Sid VNC server
Dunque, ho sempre usato ‘vino’ con soddisfazione, semplice da configurare e ottima integrazione in Gnome, si forse un po’ eccessivo nel consumo delle risorse nelle prime versioni ma ultimamente è(ra) molto migliorato. L’ultima release presenta un bug già noto in una precedente versione: il demone sta in ascolto in tcp6, questo mi impedisce di connettermi rendendo (per me) questo software al momento inutilizzabile, alternative? Si, tightvncserver. Pessima integrazione ma di fatto funziona.
# apt-get install tightvncserver
$ tightvncserver
Output:
You will require a password to access your desktops.
Password:
Verify:
New 'X' desktop is debian:1
Creating default startup script ~/.vnc/xstartup
Starting applications specified in ~/.vnc/xstartup
Adesso, la configurazione di defaul non avvia assolutamente una sessione Gnome, per tanto dobbiamo andare ad editare ~/.vnc/xstartup per avviare Gnome e non avere il charset completamente a $donnedifacilicostumi ho dovuto inserire al suo interno:
#!/bin/sh
export XKL_XMODMAP_DISABLE=1
exec gnome-session &
Si, grezzo ma funziona! A questo punto creiamo lo script di avvio/gestione del demone: creiamo il file /etc/init.d/tightvncserver e inseriamo al suo interno quanto segue:
#!/bin/sh -e
### BEGIN INIT INFO
# Provides: vncserver
# Required-Start: networking
# Default-Start: S
# Default-Stop: 0 6
### END INIT INFO
PATH="$PATH:/usr/X11R6/bin/"
# The Username:Group that will run VNC
export USER="utente_che_vogliamo_usare"
#${RUNAS}
# The display that VNC will use
DISPLAY="1"
# Color depth (between 8 and 32)
DEPTH="16"
# The Desktop geometry to use.
#GEOMETRY="x"
#GEOMETRY="800x600"
GEOMETRY="1024x768"
#GEOMETRY="1280x1024"
# The name that the VNC Desktop will have.
NAME="my-vnc-server"
OPTIONS="-name ${NAME} -depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"
. /lib/lsb/init-functions
case "$1" in
start)
log_action_begin_msg "Starting vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver ${OPTIONS}"
;;
stop)
log_action_begin_msg "Stoping vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}"
;;
restart)
$0 stop
$0 start
;;
esac
Dove, da tenere ben presente, va modificato: export USER="utente_che_vogliamo_usare" inserendo il vostro utente. Adesso diamo un bel:
# chmod +x /etc/init.d/tightvncserver
# update-rc.d tightvncserver defaults
# /etc/init.d/tightvncserver restart
# netstat -tunap | grep LISTEN | grep Xtightvnc
Output:
tcp 0 0 0.0.0.0:5801 0.0.0.0:* LISTEN 2089/Xtightvnc
tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 2089/Xtightvnc
tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 2089/Xtightvnc
Accelaratore PHP – eAccelerator
Qui di seguito un esempio di implementazione di eAccelerator allo scopo di avere una cache di pagine HTML già pronte da fornire a chi le richiede senza dover necessariamente attendere la risposta (generazione della pagina) da parte dell’interprete PHP ogni volta, risparmiando anche cicli di CPU sul server:
Installiamo quanto necessario alla compilazione:
# apt-get install php5-dev build-essential
Scaricare l’archivio del software da internet reperibile su http://www.eaccelerator.net/ oppure:
# wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6-rc1.tar.bz2
# tar xvfj eaccelerator-0.9.6-rc1.tar.bz2
# cd eaccelerator-0.9.6-rc1
# /usr/bin/phpize
# ./configure
# make
# make install
Creiamo una directory che conterrà le pagine di cache e diamo permessi di lettura scrittura a $pigsANDdogs
# mkdir /var/cache/eaccelerator
# chmod 0777 /var/cache/eaccelerator
Adesso creiamo il file di configurazione:
# nano /etc/php5/conf.d/eaccelerator.ini
e inseriamo al suo interno quanto segue:
extension=”eaccelerator.so”
eaccelerator.shm_size=”16″
eaccelerator.cache_dir=”/var/cache/eaccelerator”
eaccelerator.enable=”1″
eaccelerator.optimizer=”1″
eaccelerator.check_mtime=”1″
eaccelerator.debug=”0″
eaccelerator.filter=”"
eaccelerator.shm_max=”0″
eaccelerator.shm_ttl=”0″
eaccelerator.shm_prune_period=”0″
eaccelerator.shm_only=”0″
eaccelerator.compress=”1″
eaccelerator.compress_level=”9″
Impostazioni di eAccelerator
eaccelerator.shm_size è il parametro che indica quanta memoria condivisa viene adoperata da eAccelerator per memorizzare la cache php. Il numero è in megabyte quindi eaccelerator.shm_size = “16″ significa attribuire 16 megabyte.
Eseguendo il comando:
cat /proc/sys/kernel/shmmax
Il numero restituito rappresenta la dimensione massima di memoria che un processo può allocare. Dividendolo per 1024 fissa il massimo valore per eaccelerator.shm_size. Ovvero eaccelerator.shm_size non deve mai superare (value di shmmax)/1024.
eaccelerator.cache_dir è la cartella dove eAccelerator salva la cache del codice php.
eaccelerator.enable se ha valore 1 allora eAccelerator è in funzione mentre se è a 0 (zero), il programma è disattivato. Questa funzione è molto utile perché consente di disabilitare temporaneamente la cache magari mentre si testano le performance del codice php appena sviluppato.
eaccelerator.optimizer funziona similmente a eaccelerator.enable; se impostato a 1, eAccelerator ottimizza le pagine mentre a zero l’esecuzione del codice php risulta lenta (come se non fosse in funzione il software).
eaccelerator.debug se attiva crea messaggi informativi nel file di log per il debugging.
eaccelerator.log_file qualora si voglia fare debugging è opportuno indicare dove memorizzare i log generati dal programma. eaccelerator.log_file = “/var/log/apache2/eaccelerator_log” memorizza un file testuale nella directory dei log usata anche da Apache.
eaccelerator.check_mtime assegnando 1 al parametro, eAccelerator controlla che la cache sia aggiornata, se è stata fatta una modifica ad una pagina questa deve essere ricompilata e memorizzata nuovamente. Disabilitando quest’opzione se una pagina già in cache viene modificata è necessario cancellare manualmente la cache per vedere la nuova versione della pagina. Ovviamente è consigliata l’attivazione.
eaccelerator.filter specifica quali file vengono memorizzati nella cache. Per esempio indicando eaccelerator.filter=”*.php”, solo i file con estensione .php saranno trattati dal programma. Con eaccelerator.filter=”!/home*”, eAccelerator non gestisce i file il cui nome contenga la stringa /home seguita da qualsiasi carattere; attenzione però perché un eventuale file /home/utente/script.php non viene processato da eAccelerator in quanto /home compare nel suo nome. Il punto esclamativo indica la non inclusione.
eaccelerator.shm_max indica il numero massimo in byte usati dalla memoria condivisa. Non c’è un limite come c’è per eaccelerator.shm_size. Per limitare la dimensione massima della memoria condivisa a 1 megabyte si può impostare eaccelerator.shm_max=”1M”, anche se è preferibile mettere zero per non restringere la cache. Non ha nulla a che vedere con la massima dimensione di una pagina singola memorizzata.
eaccelerator.shm_ttl quando non c’è più memoria a disposizione di eaccelerator.shm_only le pagine più vecchie, che sono state richieste da prima del valore messo in eaccelerator.shm_ttl, sono cancellate. Mettendo zero le pagine non sono cancellate. Settando eaccelerator.shm_ttl=”600″ il tempo è di 10 minuti (60 sec x 10).
eaccelerator.shm_prune_period simile a eaccelerator.shm_ttl, solo che vengono eliminate le pagine più vecchie.
eaccelerator.shm_only abilita o disabilita la memorizzazione sul disco rigido delle pagine elaborate da eAccelerator. Mettendo eaccelerator.shm_only=”0″ eAccelerator salva le pagine anche sul disco e non solo in memoria. E’ preferibile indicare zero.
eaccelerator.compress attiva la compressione delle pagine per risparmiare memoria. eaccelerator.compress=”0″ lascia le pagine non compresse.
eaccelerator.compress_level indica quanto comprimere le pagine elaborate. Nove è il massimo fattore di compressione.
Load Balancing in High availability
Dopo aver usato per un bel po’ di tempo Pound come bilanciatore di carico per i miei server web, ho deciso di testare una nuova (si fa per dire) soluzione, dato che il suddetto progetto pare non sia piu’ mantenuto. Il candidato ideale mi è sembrato Haproxy che pare essere (oltre che mantenuto), molto piu’ performante di Pound e già che c’ero ho deciso di testarlo in accoppiata con Keepalived per prevenire eventuali failover. Eccovi un esempio di implementazione su Debian:
shared IP=192.168.0.99
192.168.0.100 192.168.0.101 192.168.0.102 192.168.0.103
+——————-+————–+————+———-
| | | |
+–+–+ +—+–+ +—-+–+ +——-+—-+
| lb1 | | lb2 | | http1 | | http2 |
+—–+ +——-+ +——–+ +————-+
haproxy haproxy 2 web servers (Apache)
keepalived keepalived
L’IP (virtuale) shared 192.168.0.99 sarà l’indirizzo pubblico del cluster che in un primo tempo sarà del master (lb1), in caso di failover verrà automaticamente attivato su lb2 tramite appunto Keepalived.
1) Preparazione dei backend web servers Apache (da effettuare su http1/http2):
Dopo aver installato apache2 è necessario procedere con una piccola modifica del file /etc/apache2/apache2.conf modificando il parametro LogFormat nel seguente modo per avere Haproxy configurato come trasparent peoxy:
[...]
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\
"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\
" \"%{User-Agent}i\"" combined
[...]
Adesso sarà necessario creare un piccolo file di testo: ‘/var/www/check.txt’ che verrà controllato da haproxy per capire se il nodo è attivo o meno. A questo punto è necessario risolvere il problema delle statistiche (se presenti) in quanto tutte le interrogazioni al suddetto file da parte di haproxy portano inevitabilmente ad un inquinamento dei report. Sarà necessario quindi modificare la direttiva CustomLog nei VirtualHost (ad esempio default) nel seguente modo:
[...] SetEnvIf Request_URI "^/check\.txt$" dontlog CustomLog /var/log/apache2/access.log combined env=!dontlog [...]
un bel ‘/etc/init.d/apache2 restart’ ed i backend sono pronti.
2) Installazione di Haproxy (da eseguire su lb1/lb2)
Prima di tutto diamo un bel:
apt-get install haproxy
Una volta installato il pacchetto procediamo con la modifica del file di configurazione:
cp /etc/haproxy.cfg /etc/haproxy.cfg_orig cat /dev/null > /etc/haproxy.cfg vi /etc/haproxy.cfg
Nel seguente modo:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#debug
#quiet
user haproxy
group haproxy
defaults
log global
mode http
option httplog
option dontlognull
retries 3
redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen webfarm 192.168.0.99:80
mode http
stats enable
stats auth someuser:somepassword
balance roundrobin
cookie JSESSIONID prefix
option httpclose
option forwardfor
option httpchk HEAD /check.txt HTTP/1.0
server webA 192.168.0.102:80 cookie A check
server webB 192.168.0.103:80 cookie B check
Una volta fatto questo abilitiamo lo startup di Haproxy editando il file ‘/etc/default/haproxy’ e impostando ENABLED da 0 a 1.
3) Installazione di Keepalived (lb1/lb2):
apt-get install keepalived
editiamo il seguente file:
vi /etc/sysctl.conf
inserendo al suo interno:
[...] net.ipv4.ip_nonlocal_bind=1
ed eseguiamo:
sysctl -p
a questo punto editiamo:
vi /etc/keepalived/keepalived.conf
Nel seguente modo:
vrrp_script chk_haproxy { # Requires keepalived-1.1.13
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101 # 101 on master, 100 on backup
virtual_ipaddress {
192.168.0.99
}
track_script {
chk_haproxy
}
}
questa configurazione setta lb1 come Master (priority 101) la stessa configurazione puo’ essere effettuata su lb2 con la sola differenza che priority dovrà essere essettato a 100 (backup o slave che dir si voglia).
Sarà sufficiente adesso dare su entrambe le macchine un bel:
/etc/init.d/keepalived start
e un:
ip addr sh eth0
per verificare che la configurazione sia corretta.
Diamo in fine l’ultimo comando per avviare haproxy:
/etc/init.d/haproxy start
Non resta che verificare al seguente indirizzo http://192.168.0.99/haproxy?stats che tutto sia andato a buon fine
Postfix: Unica istanza e Indirizzi IP/hostname multipli
Mi appunto qui di seguito una semplice configurazione per avere su di un singolo MTA piu’ Indirizzi IP (configurati su piu’ schede di rete virtuali) in modo che il demone (sulla porta 25) risponda con Hostname diversi, tutto questo allo scopo di eludere i sistemi antispam ‘feroci’ tipo quelli implementati da Hotmail e Yahoo.
Dopo aver configurato tutte quante le nostre schede di rete virtuali (ex. eth0:1, eth0:2, eth0:3 … eth0:n) procediamo con il configurare il file /etc/postfix/master.cf (in Debian like) e cambiamo la linea qui sotto da:
smtp inet n - n - - smtpd a: localhost:smtp inet n - n - - smtpd ipaddress-1:smtp inet n - n - - smtpd ipaddress-2:smtp inet n - n - - smtpd -o myhostname=hostname-2 . . . ipaddress-n:smtp inet n - n - - smtpd -o myhostname=hostname-n
Con questa nuova configurazione in pratica bindiamo ogni indirizzo ip su di un relativo hostname (magari sarebbe bene definirli prima nel file /etc/hosts) eccetto che per localhost e per ipadress-1 che risponderà con il regolare hostname.
Proftpd e utenti virtuali
Con questo post voglio inaugurare la serie “basta con l’utilizzo di utenti di sistema” ed iniziare ad appuntarmi un po’ di configurazioni per i demoni piu’ utilizzati relativamente all’utilizzo di utenti virtuali storati in un db MySQL . Cominciamo con qualcosa di semplice: configuriamo il nostro servizio FTP.
Per prima cosa procuriamoci tutto il necessario:
# apt-get install proftpd proftpd-mysql mysql-server
Settiamo una password (su Debian di default è blank)
# mysqladmin -u root password 'QuiLaMiaPassword'
Adesso prepariamo gruppi e utenti:
# groupadd -G 3001 ftpgroup
# useradd -s /bin/false -d /bin/null -c "proftpd user" --uid 3001 -g ftpgroup ftpuser
Adesso cominciamo a preparare Il nostro DB:
# mysql -u root -p
mysql> CREATE DATABASE proftpddb;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT USAGE ON *.* TO proftpduser@localhost IDENTIFIED BY 'proftpdpassword';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON proftpddb.* TO 'proftpduser'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Adesso è il momento di inserire le tabelle necessarie all’interno del nostro DB, per far questo prepariamo un file di testo che chiameremo ‘proftp-mysql.sql’ e lo editiamo inserendo quanto segue:
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '3000',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='ProFTPd group table';
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(80) NOT NULL default '',
uid smallint(6) NOT NULL default '3000',
gid smallint(6) NOT NULL default '3000',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT='ProFTPd user table';
e adesso diamo un bel:
# mysql -u root -p proftpddb < proftpd-mysql.sql
Poi:
# mysql -u proftpduser -p proftpddb
mysql> INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 3001, 'ftpuser');
mysql> INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'firstuser', PASSWORD('userpassword'), 3001, 3001, '/var/proftp/firstuser', '/sbin/nologin', 0, '', '');
Adesso settiamo la $HOME del nostro utente e gli diamo i permessi corretti:
# mkdir /var/proftp
# chown ftpuser:ftpgroup /var/proftp
# chmod 775 /var/proftp
Procediamo Adesso con il setup del nostro demone FTP. Per prima cosa ci spostiamo in /etc/proftpd ed editiamo modules.conf scommentando il modulo relativo a Mysql, dopodiche’ creiamo un nuovo file mysql.conf e lo editiamo inserendo al suo interno:
#Force the use of mysql backend
SQLBackend mysql
# The passwords in MySQL are using its own PASSWORD function
SQLAuthTypes Backend
SQLAuthenticate users* groups*
# details to connect to mysql db
# dbname@host dbuser dbpass
SQLConnectInfo proftpddb@localhost proftpduser proftpdpassword
# Let proFTPd know the name of the columns in the user table
# Mind that this need to match the name in you table
SQLUserInfo ftpuser userid passwd uid gid homedir shell
# Let proFTPd know the name of the columns in the group table
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo ftpgroup groupname gid members
# proftpd will dynamicaly create if the homedir does not yet exist
SQLHomedirOnDemand on
# update counter when a user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
# change modified time anytime a user delete a file or upload one
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
Salviamo ed editiamo proftpd.conf inserendo subito dopo Include /etc/proftpd/modules.conf:
Include /etc/proftpd/mysql.conf
RootLogin off
RequireValidShell off
Adesso restartiamo il servizio e siamo pronti ad effettuare il primo test
Creare lo snaphost di un disco con dd
Mi appunto una serie di comandi per creare lo snaphost di un disco con dd
# dd if=/dev/hda of=/mnt/storage/immagine_disco.img ; bs=512 ; date ; sleep 3600 ; date ; dd if=/dev/hda bs=512 | md5sum ; date ; sleep 3600; date ; dd if=/mnt/storage/immagine_disco.img | md5sum ; date
Ovviamente tutto su una riga.
Pulizia dei pacchetti e files di configurazione in Debian
MI appunto qui di seguito una serie di metodi per tenere il sistema debian pulito da pacchetti non piu’ utilizzati e da files di configurazione imbastarditi:
Deborphan
Il suo scopo è quello di generare una lista di pacchetti `orfani’, ovvero pacchetti che per dipendenza non vengono piu’ utilizzati da nessun software presente sul sistema:
# apt-get install deborphan # deborphan
o si puo’ usare l’opzione –libdevel che crea una lista con le librerie di sviluppo
# deborphan --libdevel
quindi passiamo la lista di pacchetti generata ad apt con:
# apt-get --purge remove `deborphan` # apt-get --purge remove `deborphan --libdev`
File di Configurazione
Con questo comando e’ possibile pulire /etc dai files di configurazione che sono rimasti sul sistema dopo disinstallazioni di pacchetti senza aver utilizzato l’opzione –purge:
# dpkg --purge `COLUMNS=300 dpkg -l | egrep "^rc" | cut -d' ' -f3`
Localepurge
Una volta installato questo software provvede da solo dopo ogni installazione di pacchetti di rimuovere le lingue che non ci interessano
# localepurge
La cache di apt-get
Apt ci mette a disposizione alcuni efficacissimi strumenti per tenere pulita la cache:
# apt-get clean # apt-get autoclean
La cache di apt-build
Lo stesso vale per apt-build:
# apt-build clean-sources # apt-build clean-build # apt-build clean-repository
Ubuntu 7.10 & bluetooth
Come fare? E’ sufficiente aggiungere questo repository al proprio sources.list
deb http://download.tuxfamily.org/blueman ubuntu bluetooth blueman-svn
e validarlo con la chiave gpg appropriata
wgethttp://download.tuxfamily.org/blueman/repository.gpg ; sudo apt-key addrepository.gpg; rm -rfrepository.gpg
Baster? dunque forzare l’aggiornamento del sistema con:
sudo apt-get update
sudo apt-get upgrade
ed installare gli aggiornamenti che vengono proposti.
Alla fine dell’installazione la periferica bluetooth dovrebbe funzionare correttamente senza bisogno di riavviare.
Nel caso in cui non aveste precedentemente installato il bluetooth sul vostro sistema, seguite la guida nel wiki di ubuntu.
E visto che ci siete installate anche Blueman, a mio parere la migliore applicazione per la gestione delle connessioni bluetooth
sudo apt-get install blueman blueman-i18n
ovviamente solo dopo aver aggiunto il repository di cui sopra.
easy
Prossimamente vedremo come accedere al web dal proprio smartphone via bluetooth untilizzando come gateway la propria linux box.