Menu Chiudi

LTSP – Linux Terminal Server Project

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
WordPress Appliance - Powered by TurnKey Linux