Obiettivi
– centralizzare gli applicativi
– installare SOLO quello di cui ho bisogno
– centralizzare la configurazione dei desktop
– utilizzare client “stupidi”
– poter gestire, lato client, dispositivi esterni (chiavette usb, cd)
– poter gestire, lato client, eventuali schede audio
NB. ho evitato l’installazione tramite la versione di Ubuntu alternate (che mi avrebbe risparmiato tantissimo lavoro), per poter avere un controllo completo sul sistema e per riuscire a comprendere a fondo il funzionamento di LTSP.
Obiettivi
– centralizzare gli applicativi
– installare SOLO quello di cui ho bisogno
– centralizzare la configurazione dei desktop
– utilizzare client “stupidi”
– poter gestire, lato client, dispositivi esterni (chiavette usb, cd)
– poter gestire, lato client, eventuali schede audio
NB. ho evitato l’installazione tramite la versione di Ubuntu alternate (che mi avrebbe risparmiato tantissimo lavoro), per poter avere un controllo completo sul sistema e per riuscire a comprendere a fondo il funzionamento di LTSP.
Nello specifico:
– Il server LTSP sarà una Debian Squeeze
– verrà utilizzato un server DHCP separato
– sono state configurate le postazioni di lavoro per effettuare il boot tramite PXE
Configurazione di apt
# cat /etc/apt/sources.list
deb http://ftp.it.debian.org/debian/ squeeze main non-free contrib deb-src http://ftp.it.debian.org/debian/ squeeze main non-free contrib deb http://security.debian.org/ squeeze/updates main deb-src http://security.debian.org/ squeeze/updates main # squeeze-updates, previously known as 'volatile' deb http://ftp.it.debian.org/debian/ squeeze-updates main deb-src http://ftp.it.debian.org/debian/ squeeze-updates main
Installazione server LTSP – http://wiki.debian.org/LTSP/Howto
Dopo aver installato una Debian Squeeze minimale (netinst):
# apt-get install ltsp-server-standalone ltsp-docs ntp # ltsp-build-client
# cat /etc/exports /opt/ltsp *(ro,no_root_squash,async,no_subtree_check)
# /etc/init.d/nfs-kernel-server restart
# cat /etc/default/portmap OPTIONS=""
# /etc/init.d/portmap restart # /etc/init.d/openbsd-inetd restart
# cat /etc/default/tftpd-hpa # /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure"
# /etc/init.d/openbsd-inetd restart # /etc/init.d/tftpd-hpa restart
ulteriori pacchetti installati lato server:
aggiungo i temi per gnome # apt-get install gnome-themes # apt-get install gnome-themes-extras # apt-get install gnome-terminal # apt-get install gnome-screenshot # apt-get install gedit # apt-get install vlc
aggiungo alcuni tools utili per gnome (es. users-admin)
# apt-get install gnome-system-tools
rimuovo l’utility che consente di aggiungere/rimuovere gli applicativi dalle voci di menu
# apt-get remove alacarte
Server di Stampa
aggiungo e configuro il server di stampa cups
# apt-get install cups # apt-get install system-config-printer
configuro eventuali stampanti da condividere agli utenti LTSP
Server Audio
aggiungo e configuro il server audio pulse (per maggiori informazioni cat /usr/share/doc/ltsp-server/README.Debian.sound)
# apt-get install pulseaudio # apt-get install libasound2-plugins # chroot /opt/ltsp/i386 apt-get install pulseaudio-esound-compat alsa-utils libasound2-plugins
# cat /etc/asound.conf
# Make it possible for ALSA forward to pulseaudio on thin clients. # Based on idea from # https://alsa.opensrc.org/Index.php/Default_device_from_environment_variable pcm.!default { @func refer name { @func concat strings [ "pcm." { @func getenv vars [ LTSP_ALSA_DEFAULT ] default "hw:0" } ] } } ctl.!default { @func refer name { @func concat strings [ "ctl." { @func getenv vars [ LTSP_ALSA_DEFAULT ] default "hw:0" } ] } } pcm.pulse { type pulse } ctl.pulse { type pulse }
Configurazione file lts.conf
modificare il file /opt/ltsp/i386/etc/lts.conf i seguenti parametri:
# i due parametri vanno marcati in quanto NON sono più necessari con le ultime versioni di LTSP #SOUND_DAEMON = pulse #SOUND = True # per migliorare le prestazioni lato client LDM_DIRECTX = True NETWORK_COMPRESSION = True
Installazione del Browser
installo un browser e alcuni pacchetti
# apt-get install evince
# apt-get install iceweasel # apt-get install iceweasel-l10n-it # apt-get install ttf-lyx mozplugger # apt-get install flashplugin-nonfree
Installazione applicativi di base
installo OpenOffice.org
# apt-get install openoffice.org - se vogliamo avere a disposizione una serie di clip-art libere da utilizzare nei nostri documenti # apt-get install openclipart* - aggiungo ulteriori font # apt-get install msttcorefonts ttf-liberation ttf-dejavu - installo i pacchetti per la lingua # apt-get install openoffice.org-l10n-it openoffice.org-help-it openoffice.org-hyphenation-it openoffice.org-thesaurus-it
Gestione dei LOG
configuro la gestione centralizzata dei log
# apt-get install syslog-ng
aggiungo al file /etc/syslog-ng/syslog-ng.conf le seguenti righe
# abilitazione gestione centralizzata client ltsp source net-udp { udp(); }; destination remote { file("/var/log/remote/$FULLHOST"); }; log { source(net-udp); destination(remote); };
riavvio il servizio syslog
# /etc/init.d/syslog-ng restart
modifico il file /opt/ltsp/i386/etc/lts.conf aggiungendo l’indirizzo del log-server
SYSLOG_HOST=IP_DEL_SERVER_LTSP
Gestione dei dispositivi rimovibili USB, CD
aggiungo gli utenti al gruppo fuse per consentire la gestione di chiavette usb e cd
nb. il parametro LOCALDEV in lts.conf NON è più necessario, basta che nella chroot del client sia installato ltspfsd
- modificando direttamente il file /etc/group - in alternativa utilizzando l'interfaccia grafica di gnome da Sistema/Amministrazione/Utenti e gruppi
modifico il file /usr/sbin/ltspfsmounter per gestire il mount dei dispositivi esterni nella cartella home di ogni utente
# cat /usr/sbin/ltspfsmounter #!/usr/bin/python import os import sys from subprocess import call import re hook_dirs=list() def run_hooks(mode, mountpoint): executed_hooks=list() valid_filename=re.compile('^[a-zA-Z0-9\-_]*$') for dir in hook_dirs: if os.path.isdir(dir): # get a unique list of hook scripts hook_scripts=list(set(os.listdir(dir))) hook_scripts.sort() for script in hook_scripts: # only run the first script of a given name if executed_hooks.count(script) == 0 and valid_filename.match(script): executed_hooks.append(script) try: call([os.path.join(dir, script), mode, mountpoint]) except: # be very tolerant of failures with hook scripts pass def get_var(name): return os.environ.get(name) def add_ltspfsmount(conn, path, root, dev): hidden_mount = '%s/%s' % (root, dev) lbmount_command = ['lbmount', dev] ltspfs_mount = ['ltspfs', conn+':'+path, root+'/'+dev] if not os.access(root, 0): os.mkdir(root) if not os.access(hidden_mount, 0): os.mkdir(hidden_mount) env = os.environ.copy() try: call(ltspfs_mount, env=env) except OSError, e: print >>sys.stderr, "mount failed:", e try: call(lbmount_command) if os.access(hidden_mount, 0): os.rmdir(hidden_mount) if os.access(root, 0): os.rmdir(root) except OSError, e: print >>sys.stderr, "suid mount failed:", e def remove_ltspfsmount(root, dev): mountpoint=root+"/"+dev lbumount_command=['lbmount', '--umount', dev] ltspfs_umount=['fusermount', '-uzq', root+'/'+dev] try: call(ltspfs_umount) run_hooks('remove', os.path.join(root, dev)) except OSError, e: print >>sys.stderr, "umount failed:", e try: os.rmdir(mountpoint) except OSError, e: print >>sys.stderr, "remove dir failed:", e def main(): if len(sys.argv) < 3: print 'usage--->: %s mountpoint add|remove|cleanup' % sys.argv[0] sys.exit(1) if not os.access('/dev/fuse', 2): sys.stderr.write('/dev/fuse not writeable\n') sys.exit(1) # check if hook dirs are present for dir in ['/etc', '/usr/share', '/usr/lib']: dir=os.path.join(dir, 'ltspfs/mounter.d') if os.path.isdir(dir): hook_dirs.append(dir) path = sys.argv[1] command = sys.argv[2] username = get_var('USER') root = "/home/%s" % get_var('USER') if not get_var('SSH_CONNECTION'): conn = "127.0.0.1" os.putenv('SSH_CONNECTION', '127.0.0.1') else: conn = get_var('SSH_CONNECTION').split()[0] dev = path.split('/')[-1] if command=='add': add_ltspfsmount(conn, path, root, dev) elif command=='remove': remove_ltspfsmount(root, dev) else: print 'unknown command' if __name__ == "__main__": main()
Aggiornamento dell’immagine distribuita ai client stupidi
aggiornare l’immagine che verra’ distribuita ai vari client
# ltsp-update-image --arch i386
Predisposizione di un profilo Gnome di default per tutti gli utenti connessi
Creo il seguente script, utile per la generazione di un profilo “standard” da far utilizzare a tutti gli utenti LTSP
# cat /usr/sbin/ltsp-aggiornaprofili #!/bin/bash aggiornaprofilo(){ # aggiorno SOLO la configurazione del pannello gconftool-2 /apps/panel --dump > /tmp/profiliutenti.xml # per gestire la configurazione di tutto l'ambiente, ad eccezione dei menu, utilizzare la seguente riga # gconftool-2 / --dump > /tmp/profiliutenti.xml # # NB. un "trucco" per capire quali "porzioni" di configurazione sono cambiate tra un profilo e un'altro e' il seguente: # gconftool-2 / --dump > /tmp/profilo1.xml # vario la configurazione ! # gconftool-2 / --dump > /tmp/profilo2.xml # diff /tmp/profilo1.xml /tmp/profilo2.xml > /tmp/differenze.txt # # controllo il contenuto del file /tmp/differenze.txt per individuare quali sezioni sono variate e quali posso # decidere di fare importare al successivo ssh -S ${LDM_SOCKET} ${LDM_SERVER} "/usr/bin/gconftool-2 --load=/etc/profiliutenti.xml" } if [ -n "$1" ] then utente="$1" export -f aggiornaprofilo su $utente -c aggiornaprofilo chmod 644 /tmp/profiliutenti.xml chown root.root /tmp/profiliutenti.xml mv /tmp/profiliutenti.xml /etc/profiliutenti.xml else echo "" echo "Utilizzo: $0 nomeutente" echo "" echo "ATTENZIONE: verra' utilizzato il profilo gnome dell'utente specificato" echo "per la creazione del profilo gnome di tutti gli utenti presenti in LTSP." exit 2 fi
– assegno i permessi di esecuzione allo script
# chmod +x /usr/sbin/ltsp-aggiornaprofili
– lato server installo gconf-editor
# apt-get install gconf-editor
– mi collego a LTSP tramite un utente generico (es. administrator)
– configuro l’ambiente (pannelli, desktop, menu, colori….)
– salvo la configurazione dell’utente generico tramite il nuovo script “/usr/sbin/ltsp-aggiornaprofili”
– entro in modalita’ chroot
# ltsp-chroot
Script eseguito in fase di LOGIN da tutti gli utenti…. NB. fisicamente dal PC-Client il quale invia i comandi al server LTSP tramite ssh !!
– creo un nuovo file che verra’ eseguito dai client in fase di login dell’utente
# cat /usr/share/ldm/rc.d/X02-profiliutente # # Importazione dei profili utenti relativi a Gnome ssh -S ${LDM_SOCKET} ${LDM_SERVER} "/usr/bin/gconftool-2 --load=/etc/profiliutenti.xml" # Abilito eventuali script aggiuntivi per Nautilus ssh -S ${LDM_SOCKET} ${LDM_SERVER} "/etc/aggiornascriptnautilus.sh"
– esco dalla modalità chroot
# exit
– rigenero l’immagine per i client (NB. NON è necessario rigenerare l’immagine dei client dopo aver modificato il file /etc/profiliutenti.xml)
# ltsp-update-image --arch i386
NB.e’ possibile apportare ulteriori modifiche al “profilo di default” modificando le impostazioni dell’utente generico (es. administrator) ed eseguendo nuovamente lo script “/usr/sbin/ltsp-aggiornaprofili utentegenerico”
Abilitare/Disabilitare le voci di menu per tutti gli utenti
Il sistema più rapido che ho trovato per abilitare/disabilitare le voci di menu per tutti gli utenti è il seguente:
# cd /usr/share/applications
la cartella contiene l’elenco di tutti gli applicativi presenti in uno o più menu, per individuare il singolo applicativo
# grep descrizione_presente_nel_menu * # grep Esplorazione * nautilus-browser.desktop:Name[it]=Esplorazione file
modificare il file nautilus-broswer.desktop nel modo seguente:
#Categories=GNOME;GTK;System;Utility;Core; Categories=GNOME;GTK;Core;
in alternativa e’ possibile disabilitare la visualizzazione nel modo seguente:
# grep descrizione_presente_nel_menu * # grep htop * htop.desktop:Exec=htop htop.desktop:Icon=htop
modificare il file htop.desktop aggiungendo la seguente riga:
NoDisplay=true
Privacy – fare in modo che la cartella home di ogni utente NON possa essere letta dagli altri utenti
– verificare che il modulo libpam-modules sia presente nel sistema
# apt-get install libpam-modules
– aggiungere in coda ai file /etc/pam.d/common-session e /etc/pam.d/common-session-noninteractive la seguente riga
session optional pam_umask.so umask=077
– modificare il file /etc/login.defs nel modo seguente
#UMASK 022 UMASK 077
– modificare il file /etc/adduser.conf nel modo seguente
# If DIR_MODE is set, directories will be created with the specified
# mode. Otherwise the default mode 0755 will be used.
#DIR_MODE=0755
DIR_MODE=0750
– modificare i permessi per la cartella /home/root
# chmod 750 /home/root
Aggiungo alcune funzionalità a Nautilus per gestire cartelle e file
# apt-get install nautilus-image-converter # apt-get install file-roller
aggiungo alcuni pacchetti per gestire la compressione/decompressione di file e alcuni script aggiungi a nautilus
# apt-get install unace tar bzip2 gzip zip unzip unrar rar zenity
– preparo un apposito script che verra’ eseguito in fase di login dell’utente per abilitare eventuali script disponibili per Nautilus
# cat /etc/aggiornascriptnautilus.sh #!/bin/bash cd ~/.gnome2/nautilus-scripts/ for nome_script_da_rimuovere in * do if [ -h ~/.gnome2/nautilus-scripts/${nome_script_da_rimuovere} ] then rm ~/.gnome2/nautilus-scripts/${nome_script_da_rimuovere} fi done cd /usr/share/nautilus-scripts/ for nome_script in * do /bin/ln -s ${nome_script} -t ~/.gnome2/nautilus-scripts done cd ~/.gnome2/nautilus-scripts/
– sistemo i permessi di accesso allo script
# chmod o+r /etc/aggiornascriptnautilus.sh # chmod o+x /etc/aggiornascriptnautilus.sh
questo sito mette a disposizione una serie interessante di script che possono essere aggiunti a Nautilus per estenderne le funzionalita’: http://g-scripts.sourceforge.net/index.php
Per attivare un nuovo script lato Nautilus:
- scaricaro lo script desiderato in /usr/share/nautilus-scripts - impostare i permessi di esecuzione per lo script
Abilitare la “teleassistenza” tramite vnc per i client LTSP
- entrare in modalita' chroot # ltsp-chroot - installare x11vnc # apt-get install x11vnc
– preparare gli script per l’avvio e l’arresto automatico del server vnc (lato client)
# /opt/ltsp/i386/usr/share/ldm/rc.d/I99-x11vnc # LDM Script to start x11vnc XAUTH=`find /var/run/ldm-xauth* -type f` start-stop-daemon --start --oknodo --pidfile /var/run/x11vnc.pid --background --nicelevel 15 --make-pidfile --exec /usr/bin/x11vnc -- -display :7 -loop -passwdfile /etc/x11vncpassword -nossl -logfile /var/log/x11vnc -auth $XAUTH
# /opt/ltsp/i386/usr/share/ldm/rc.d/X99-x11vnc # LDM Script to stop x11vnc start-stop-daemon --stop --oknodo --pidfile /var/run/x11vnc.pid
– creare il file /var/log/x11vnc
# touch /var/log/x11vnc
– creo il file che conterra’ la password di autenticazione per la sessione vnc
# echo "thepassword" > /etc/x11vncpassword # chmod 400 /etc/x11vncpassword # chown root:root /etc/x11vncpassword
– esco dalla modalita’ chroot
# exit
– rigenerare l’immagine per il client
# ltsp-update-image --arch i386
Configurazioni particolari per i client
E’ possibile installare pacchetti che verranno utilizzati localmente dai singoli client:
es.
# ltsp-chroot ----> per entrare in chroot sulla cartella di default che contiene i file utilizzati per la generazione dell'immagine inviata al client in fase di boot # apt-get install NOME_PACCHETTO # exit ----> per uscire dalla modalita' chroot # ltsp-update-image --arch i386 ----> per rigenerare l'immagine che verrà inviata ai vari client
Lato client
Lato client è sufficiente abilitare il boot via pxe presente sulla scheda di rete (se la scheda di rete lo permette).
DHCP – dnsmasq
Nello specifico:
– dnsmasq si trova su di una macchina dedicata (es. il gateway di rete)
– tftp è installato sulla stessa macchina su cui gira ltsp
– questa la configurazione adottata per dnsmasq (es. in una rete 192.168.88.0/24, dove 192.168.88.1 è il gateway e 192.168.88.2 è il server ltsp/tftp)
dhcp-range=set:rete,192.168.88.100,192.168.88.200,48h dhcp-option=tag:rete,3,192.168.88.1 dhcp-option=tag:rete,42,192.168.88.1 dhcp-option=tag:rete,17,/opt/ltsp/i386 dhcp-boot=tag:rete,/ltsp/i386/pxelinux.0,srvltsp,192.168.88.2 # # imposto degli ip fissi in base al mac-address della scheda di rete # lo stesso indirizzo verrà utilizzato sul dns di MS per poter accedere # da remoto alle singole postazioni/dispositivi # NB. questo è necessario a causa della scarsa integrazione tra dnsmask e dns/kerberos di MS # dhcp-host=tag:rete,00:12:db:79:45:85,192.168.88.101,clientltsp1 # pc clientltsp1 dhcp-host=tag:rete,00:0b:fc:39:18:2a,192.168.88.102,clientltsp2 # pc clientltsp2 dhcp-host=tag:rete,00:dd:b5:3d:eb:cc,192.168.88.103,clientltsp3 # pc clientltsp3
– e questo quanto presente in /etc/hosts
127.0.0.1 localhost 192.168.88.1 gw.dominio.locale gw 192.168.88.2 srvltsp.dominio.levico srvltsp
DHCP – Microsoft
Lato server DHCP Microsoft sono stati prenotati degli specifici indirizzi IP in base al mac address delle schede di rete dei
client e sono stati impostati alcuni parametri per consentire il corretto boot tramite PXE.
– 012 Nome host: ltsp1clientX.levico.locale
– 017 Percorso radice: /opt/ltsp/i386
– 066 Nome host del server di avvio: 192.168.32.59 (ip del server LTSP)
– 067 Nome del file di avvio: ltsp/i386/pxelinux.0
Link utili:
https://help.ubuntu.com/community/UbuntuLTSP